/ Hex Artifact Content
Login

Artifact 9f21067ff5f0ba1780d39a069da65d54789ae15b:


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 73 74 72 63 6d 70 28  .    if( strcmp(
19200 73 74 64 64 74 2c 20 6c 65 6d 70 2d 3e 74 6f 6b  stddt, lemp->tok
19210 65 6e 74 79 70 65 29 3d 3d 30 20 29 7b 0a 20 20  entype)==0 ){.  
19220 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20      sp->dtnum = 
19230 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
19240 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73  e;.    }.    has
19250 68 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a  h = 0;.    for(j
19260 3d 30 3b 20 73 74 64 64 74 5b 6a 5d 3b 20 6a 2b  =0; stddt[j]; j+
19270 2b 29 7b 0a 20 20 20 20 20 20 68 61 73 68 20 3d  +){.      hash =
19280 20 68 61 73 68 2a 35 33 20 2b 20 73 74 64 64 74   hash*53 + stddt
19290 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  [j];.    }.    h
192a0 61 73 68 20 3d 20 28 68 61 73 68 20 26 20 30 78  ash = (hash & 0x
192b0 37 66 66 66 66 66 66 66 29 25 61 72 72 61 79 73  7fffffff)%arrays
192c0 69 7a 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ize;.    while( 
192d0 74 79 70 65 73 5b 68 61 73 68 5d 20 29 7b 0a 20  types[hash] ){. 
192e0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
192f0 74 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64  types[hash],stdd
19300 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)==0 ){.       
19310 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73   sp->dtnum = has
19320 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 62  h + 1;.        b
19330 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
19340 20 20 20 20 68 61 73 68 2b 2b 3b 0a 20 20 20 20      hash++;.    
19350 20 20 69 66 28 20 68 61 73 68 3e 3d 61 72 72 61    if( hash>=arra
19360 79 73 69 7a 65 20 29 20 68 61 73 68 20 3d 20 30  ysize ) hash = 0
19370 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19380 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30 20 29  types[hash]==0 )
19390 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75  {.      sp->dtnu
193a0 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20 20  m = hash + 1;.  
193b0 20 20 20 20 74 79 70 65 73 5b 68 61 73 68 5d 20      types[hash] 
193c0 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28  = (char*)malloc(
193d0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 74 64   lemonStrlen(std
193e0 64 74 29 2b 31 20 29 3b 0a 20 20 20 20 20 20 69  dt)+1 );.      i
193f0 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d  f( types[hash]==
19400 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  0 ){.        fpr
19410 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74  intf(stderr,"Out
19420 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b   of memory.\n");
19430 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29  .        exit(1)
19440 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19450 73 74 72 63 70 79 28 74 79 70 65 73 5b 68 61 73  strcpy(types[has
19460 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20 20 20 7d  h],stddt);.    }
19470 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e 74  .  }..  /* Print
19480 20 6f 75 74 20 74 68 65 20 64 65 66 69 6e 69 74   out the definit
19490 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45 4e 54 59  ion of YYTOKENTY
194a0 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f 52 54 59  PE and YYMINORTY
194b0 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d 20 6c  PE */.  name = l
194c0 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70  emp->name ? lemp
194d0 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22  ->name : "Parse"
194e0 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c  ;.  lineno = *pl
194f0 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20 6d 68 66  ineno;.  if( mhf
19500 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f  lag ){ fprintf(o
19510 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43  ut,"#if INTERFAC
19520 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  E\n"); lineno++;
19530 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
19540 2c 22 23 64 65 66 69 6e 65 20 25 73 54 4f 4b 45  ,"#define %sTOKE
19550 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e 61 6d 65  NTYPE %s\n",name
19560 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 6f 6b 65  ,.    lemp->toke
19570 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f 6b 65  ntype?lemp->toke
19580 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22 29 3b 20  ntype:"void*"); 
19590 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28   lineno++;.  if(
195a0 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e   mhflag ){ fprin
195b0 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e  tf(out,"#endif\n
195c0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a  "); lineno++; }.
195d0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 74    fprintf(out,"t
195e0 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 5c 6e  ypedef union {\n
195f0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
19600 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25  fprintf(out,"  %
19610 73 54 4f 4b 45 4e 54 59 50 45 20 79 79 30 3b 5c  sTOKENTYPE yy0;\
19620 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  n",name); lineno
19630 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ++;.  for(i=0; i
19640 3c 61 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b 29  <arraysize; i++)
19650 7b 0a 20 20 20 20 69 66 28 20 74 79 70 65 73 5b  {.    if( types[
19660 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  i]==0 ) continue
19670 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
19680 74 2c 22 20 20 25 73 20 79 79 25 64 3b 5c 6e 22  t,"  %s yy%d;\n"
19690 2c 74 79 70 65 73 5b 69 5d 2c 69 2b 31 29 3b 20  ,types[i],i+1); 
196a0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72  lineno++;.    fr
196b0 65 65 28 74 79 70 65 73 5b 69 5d 29 3b 0a 20 20  ee(types[i]);.  
196c0 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 65 72  }.  if( lemp->er
196d0 72 73 79 6d 2d 3e 75 73 65 43 6e 74 20 29 7b 0a  rsym->useCnt ){.
196e0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
196f0 22 20 20 69 6e 74 20 79 79 25 64 3b 5c 6e 22 2c  "  int yy%d;\n",
19700 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74  lemp->errsym->dt
19710 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  num); lineno++;.
19720 20 20 7d 0a 20 20 66 72 65 65 28 73 74 64 64 74    }.  free(stddt
19730 29 3b 0a 20 20 66 72 65 65 28 74 79 70 65 73 29  );.  free(types)
19740 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
19750 22 7d 20 59 59 4d 49 4e 4f 52 54 59 50 45 3b 5c  "} YYMINORTYPE;\
19760 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
19770 20 2a 70 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65   *plineno = line
19780 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  no;.}../*.** Ret
19790 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
197a0 61 20 43 20 64 61 74 61 74 79 70 65 20 61 62 6c  a C datatype abl
197b0 65 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 76  e to represent v
197c0 61 6c 75 65 73 20 62 65 74 77 65 65 6e 0a 2a 2a  alues between.**
197d0 20 6c 77 72 20 61 6e 64 20 75 70 72 2c 20 69 6e   lwr and upr, in
197e0 63 6c 75 73 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  clusive..*/.stat
197f0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d  ic const char *m
19800 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65  inimum_size_type
19810 28 69 6e 74 20 6c 77 72 2c 20 69 6e 74 20 75 70  (int lwr, int up
19820 72 29 7b 0a 20 20 69 66 28 20 6c 77 72 3e 3d 30  r){.  if( lwr>=0
19830 20 29 7b 0a 20 20 20 20 69 66 28 20 75 70 72 3c   ){.    if( upr<
19840 3d 32 35 35 20 29 7b 0a 20 20 20 20 20 20 72 65  =255 ){.      re
19850 74 75 72 6e 20 22 75 6e 73 69 67 6e 65 64 20 63  turn "unsigned c
19860 68 61 72 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  har";.    }else 
19870 69 66 28 20 75 70 72 3c 36 35 35 33 35 20 29 7b  if( upr<65535 ){
19880 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 75  .      return "u
19890 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e  nsigned short in
198a0 74 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t";.    }else{. 
198b0 20 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73       return "uns
198c0 69 67 6e 65 64 20 69 6e 74 22 3b 0a 20 20 20 20  igned int";.    
198d0 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77  }.  }else if( lw
198e0 72 3e 3d 2d 31 32 37 20 26 26 20 75 70 72 3c 3d  r>=-127 && upr<=
198f0 31 32 37 20 29 7b 0a 20 20 20 20 72 65 74 75 72  127 ){.    retur
19900 6e 20 22 73 69 67 6e 65 64 20 63 68 61 72 22 3b  n "signed char";
19910 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72  .  }else if( lwr
19920 3e 3d 2d 33 32 37 36 37 20 26 26 20 75 70 72 3c  >=-32767 && upr<
19930 33 32 37 36 37 20 29 7b 0a 20 20 20 20 72 65 74  32767 ){.    ret
19940 75 72 6e 20 22 73 68 6f 72 74 22 3b 0a 20 20 7d  urn "short";.  }
19950 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
19960 20 22 69 6e 74 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f   "int";.  }.}../
19970 2a 0a 2a 2a 20 45 61 63 68 20 73 74 61 74 65 20  *.** Each state 
19980 63 6f 6e 74 61 69 6e 73 20 61 20 73 65 74 20 6f  contains a set o
19990 66 20 74 6f 6b 65 6e 20 74 72 61 6e 73 61 63 74  f token transact
199a0 69 6f 6e 20 61 6e 64 20 61 20 73 65 74 20 6f 66  ion and a set of
199b0 0a 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20  .** nonterminal 
199c0 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 20 45  transactions.  E
199d0 61 63 68 20 6f 66 20 74 68 65 73 65 20 73 65 74  ach of these set
199e0 73 20 6d 61 6b 65 73 20 61 6e 20 69 6e 73 74 61  s makes an insta
199f0 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  nce.** of the fo
19a00 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
19a10 65 2e 20 20 41 6e 20 61 72 72 61 79 20 6f 66 20  e.  An array of 
19a20 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73  these structures
19a30 20 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6f   is used.** to o
19a40 72 64 65 72 20 74 68 65 20 63 72 65 61 74 69 6f  rder the creatio
19a50 6e 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  n of entries in 
19a60 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20  the yy_action[] 
19a70 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  table..*/.struct
19a80 20 61 78 73 65 74 20 7b 0a 20 20 73 74 72 75 63   axset {.  struc
19a90 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20  t state *stp;   
19aa0 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  /* A pointer to 
19ab0 61 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74  a state */.  int
19ac0 20 69 73 54 6b 6e 3b 20 20 20 20 20 20 20 20 20   isTkn;         
19ad0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65    /* True to use
19ae0 20 74 6f 6b 65 6e 73 2e 20 20 46 61 6c 73 65 20   tokens.  False 
19af0 66 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  for non-terminal
19b00 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63 74 69  s */.  int nActi
19b10 6f 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  on;         /* N
19b20 75 6d 62 65 72 20 6f 66 20 61 63 74 69 6f 6e 73  umber of actions
19b30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f   */.};../*.** Co
19b40 6d 70 61 72 65 20 74 6f 20 61 78 73 65 74 20 73  mpare to axset s
19b50 74 72 75 63 74 75 72 65 73 20 66 6f 72 20 73 6f  tructures for so
19b60 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a  rting purposes.*
19b70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 78 73  /.static int axs
19b80 65 74 5f 63 6f 6d 70 61 72 65 28 63 6f 6e 73 74  et_compare(const
19b90 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20   void *a, const 
19ba0 76 6f 69 64 20 2a 62 29 7b 0a 20 20 73 74 72 75  void *b){.  stru
19bb0 63 74 20 61 78 73 65 74 20 2a 70 31 20 3d 20 28  ct axset *p1 = (
19bc0 73 74 72 75 63 74 20 61 78 73 65 74 2a 29 61 3b  struct axset*)a;
19bd0 0a 20 20 73 74 72 75 63 74 20 61 78 73 65 74 20  .  struct axset 
19be0 2a 70 32 20 3d 20 28 73 74 72 75 63 74 20 61 78  *p2 = (struct ax
19bf0 73 65 74 2a 29 62 3b 0a 20 20 72 65 74 75 72 6e  set*)b;.  return
19c00 20 70 32 2d 3e 6e 41 63 74 69 6f 6e 20 2d 20 70   p2->nAction - p
19c10 31 2d 3e 6e 41 63 74 69 6f 6e 3b 0a 7d 0a 0a 2f  1->nAction;.}../
19c20 2a 0a 2a 2a 20 57 72 69 74 65 20 74 65 78 74 20  *.** Write text 
19c30 6f 6e 20 22 6f 75 74 22 20 74 68 61 74 20 64 65  on "out" that de
19c40 73 63 72 69 62 65 73 20 74 68 65 20 72 75 6c 65  scribes the rule
19c50 20 22 72 70 22 2e 0a 2a 2f 0a 73 74 61 74 69 63   "rp"..*/.static
19c60 20 76 6f 69 64 20 77 72 69 74 65 52 75 6c 65 54   void writeRuleT
19c70 65 78 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73  ext(FILE *out, s
19c80 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b  truct rule *rp){
19c90 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 70 72 69  .  int j;.  fpri
19ca0 6e 74 66 28 6f 75 74 2c 22 25 73 20 3a 3a 3d 22  ntf(out,"%s ::="
19cb0 2c 20 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29  , rp->lhs->name)
19cc0 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 72  ;.  for(j=0; j<r
19cd0 70 2d 3e 6e 72 68 73 3b 20 6a 2b 2b 29 7b 0a 20  p->nrhs; j++){. 
19ce0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
19cf0 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 6a   *sp = rp->rhs[j
19d00 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ];.    fprintf(o
19d10 75 74 2c 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61  ut," %s", sp->na
19d20 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 73 70 2d  me);.    if( sp-
19d30 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d  >type==MULTITERM
19d40 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 6e  INAL ){.      in
19d50 74 20 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b  t k;.      for(k
19d60 3d 31 3b 20 6b 3c 73 70 2d 3e 6e 73 75 62 73 79  =1; k<sp->nsubsy
19d70 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; k++){.       
19d80 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7c 25   fprintf(out,"|%
19d90 73 22 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d  s",sp->subsym[k]
19da0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  ->name);.      }
19db0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f  .    }.  }.}.../
19dc0 2a 20 47 65 6e 65 72 61 74 65 20 43 20 73 6f 75  * Generate C sou
19dd0 72 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65  rce code for the
19de0 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20   parser */.void 
19df0 52 65 70 6f 72 74 54 61 62 6c 65 28 6c 65 6d 70  ReportTable(lemp
19e00 2c 20 6d 68 66 6c 61 67 29 0a 73 74 72 75 63 74  , mhflag).struct
19e10 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e   lemon *lemp;.in
19e20 74 20 6d 68 66 6c 61 67 3b 20 20 20 20 20 2f 2a  t mhflag;     /*
19e30 20 4f 75 74 70 75 74 20 69 6e 20 6d 61 6b 65 68   Output in makeh
19e40 65 61 64 65 72 73 20 66 6f 72 6d 61 74 20 69 66  eaders format if
19e50 20 74 72 75 65 20 2a 2f 0a 7b 0a 20 20 46 49 4c   true */.{.  FIL
19e60 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63  E *out, *in;.  c
19e70 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a  har line[LINESIZ
19e80 45 5d 3b 0a 20 20 69 6e 74 20 20 6c 69 6e 65 6e  E];.  int  linen
19e90 6f 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  o;.  struct stat
19ea0 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74  e *stp;.  struct
19eb0 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 73   action *ap;.  s
19ec0 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
19ed0 20 20 73 74 72 75 63 74 20 61 63 74 74 61 62 20    struct acttab 
19ee0 2a 70 41 63 74 74 61 62 3b 0a 20 20 69 6e 74 20  *pActtab;.  int 
19ef0 69 2c 20 6a 2c 20 6e 3b 0a 20 20 63 68 61 72 20  i, j, n;.  char 
19f00 2a 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6d 6e 54  *name;.  int mnT
19f10 6b 6e 4f 66 73 74 2c 20 6d 78 54 6b 6e 4f 66 73  knOfst, mxTknOfs
19f20 74 3b 0a 20 20 69 6e 74 20 6d 6e 4e 74 4f 66 73  t;.  int mnNtOfs
19f30 74 2c 20 6d 78 4e 74 4f 66 73 74 3b 0a 20 20 73  t, mxNtOfst;.  s
19f40 74 72 75 63 74 20 61 78 73 65 74 20 2a 61 78 3b  truct axset *ax;
19f50 0a 0a 20 20 69 6e 20 3d 20 74 70 6c 74 5f 6f 70  ..  in = tplt_op
19f60 65 6e 28 6c 65 6d 70 29 3b 0a 20 20 69 66 28 20  en(lemp);.  if( 
19f70 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  in==0 ) return;.
19f80 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65    out = file_ope
19f90 6e 28 6c 65 6d 70 2c 22 2e 63 22 2c 22 77 62 22  n(lemp,".c","wb"
19fa0 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20  );.  if( out==0 
19fb0 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e  ){.    fclose(in
19fc0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
19fd0 20 7d 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b   }.  lineno = 1;
19fe0 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
19ff0 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1a000 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1a010 65 6e 65 72 61 74 65 20 74 68 65 20 69 6e 63 6c  enerate the incl
1a020 75 64 65 20 63 6f 64 65 2c 20 69 66 20 61 6e 79  ude code, if any
1a030 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74   */.  tplt_print
1a040 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e  (out,lemp,lemp->
1a050 69 6e 63 6c 75 64 65 2c 26 6c 69 6e 65 6e 6f 29  include,&lineno)
1a060 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29  ;.  if( mhflag )
1a070 7b 0a 20 20 20 20 63 68 61 72 20 2a 6e 61 6d 65  {.    char *name
1a080 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65   = file_makename
1a090 28 6c 65 6d 70 2c 20 22 2e 68 22 29 3b 0a 20 20  (lemp, ".h");.  
1a0a0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1a0b0 69 6e 63 6c 75 64 65 20 5c 22 25 73 5c 22 5c 6e  include \"%s\"\n
1a0c0 22 2c 20 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  ", name); lineno
1a0d0 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 6e 61 6d  ++;.    free(nam
1a0e0 65 29 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78  e);.  }.  tplt_x
1a0f0 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1a100 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1a110 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 23  .  /* Generate #
1a120 64 65 66 69 6e 65 73 20 66 6f 72 20 61 6c 6c 20  defines for all 
1a130 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69 66 28 20  tokens */.  if( 
1a140 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 63 68  mhflag ){.    ch
1a150 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 20 20  ar *prefix;.    
1a160 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66  fprintf(out,"#if
1a170 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20   INTERFACE\n"); 
1a180 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66  lineno++;.    if
1a190 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65  ( lemp->tokenpre
1a1a0 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c  fix ) prefix = l
1a1b0 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78  emp->tokenprefix
1a1c0 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20 20  ;.    else      
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
1a1e0 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 66  efix = "";.    f
1a1f0 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=1; i<lemp->
1a200 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b  nterminal; i++){
1a210 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1a220 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d  ut,"#define %s%-
1a230 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69  30s %2d\n",prefi
1a240 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  x,lemp->symbols[
1a250 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20  i]->name,i);.   
1a260 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20     lineno++;.   
1a270 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f   }.    fprintf(o
1a280 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20  ut,"#endif\n"); 
1a290 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1a2a0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1a2b0 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1a2c0 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1a2d0 72 61 74 65 20 74 68 65 20 64 65 66 69 6e 65 73  rate the defines
1a2e0 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
1a2f0 74 2c 22 23 64 65 66 69 6e 65 20 59 59 43 4f 44  t,"#define YYCOD
1a300 45 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20  ETYPE %s\n",.   
1a310 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79   minimum_size_ty
1a320 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 79 6d  pe(0, lemp->nsym
1a330 62 6f 6c 2b 35 29 29 3b 20 6c 69 6e 65 6e 6f 2b  bol+5)); lineno+
1a340 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
1a350 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 4f 43 4f  ,"#define YYNOCO
1a360 44 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e  DE %d\n",lemp->n
1a370 73 79 6d 62 6f 6c 2b 31 29 3b 20 20 6c 69 6e 65  symbol+1);  line
1a380 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1a390 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 41  out,"#define YYA
1a3a0 43 54 49 4f 4e 54 59 50 45 20 25 73 5c 6e 22 2c  CTIONTYPE %s\n",
1a3b0 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a  .    minimum_siz
1a3c0 65 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e  e_type(0, lemp->
1a3d0 6e 73 74 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75  nstate+lemp->nru
1a3e0 6c 65 2b 35 29 29 3b 20 20 6c 69 6e 65 6e 6f 2b  le+5));  lineno+
1a3f0 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 77  +;.  if( lemp->w
1a400 69 6c 64 63 61 72 64 20 29 7b 0a 20 20 20 20 66  ildcard ){.    f
1a410 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1a420 69 6e 65 20 59 59 57 49 4c 44 43 41 52 44 20 25  ine YYWILDCARD %
1a430 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 6c 65 6d  d\n",.       lem
1a440 70 2d 3e 77 69 6c 64 63 61 72 64 2d 3e 69 6e 64  p->wildcard->ind
1a450 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ex); lineno++;. 
1a460 20 7d 0a 20 20 70 72 69 6e 74 5f 73 74 61 63 6b   }.  print_stack
1a470 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c  _union(out,lemp,
1a480 26 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 3b  &lineno,mhflag);
1a490 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1a4a0 22 23 69 66 6e 64 65 66 20 59 59 53 54 41 43 4b  "#ifndef YYSTACK
1a4b0 44 45 50 54 48 5c 6e 22 29 3b 20 6c 69 6e 65 6e  DEPTH\n"); linen
1a4c0 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  o++;.  if( lemp-
1a4d0 3e 73 74 61 63 6b 73 69 7a 65 20 29 7b 0a 20 20  >stacksize ){.  
1a4e0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1a4f0 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45  define YYSTACKDE
1a500 50 54 48 20 25 73 5c 6e 22 2c 6c 65 6d 70 2d 3e  PTH %s\n",lemp->
1a510 73 74 61 63 6b 73 69 7a 65 29 3b 20 20 6c 69 6e  stacksize);  lin
1a520 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  eno++;.  }else{.
1a530 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1a540 22 23 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b  "#define YYSTACK
1a550 44 45 50 54 48 20 31 30 30 5c 6e 22 29 3b 20 20  DEPTH 100\n");  
1a560 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1a570 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 65  fprintf(out, "#e
1a580 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  ndif\n"); lineno
1a590 2b 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67  ++;.  if( mhflag
1a5a0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1a5b0 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41  out,"#if INTERFA
1a5c0 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  CE\n"); lineno++
1a5d0 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c  ;.  }.  name = l
1a5e0 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70  emp->name ? lemp
1a5f0 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22  ->name : "Parse"
1a600 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 61 72  ;.  if( lemp->ar
1a610 67 20 26 26 20 6c 65 6d 70 2d 3e 61 72 67 5b 30  g && lemp->arg[0
1a620 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  ] ){.    int i;.
1a630 20 20 20 20 69 20 3d 20 6c 65 6d 6f 6e 53 74 72      i = lemonStr
1a640 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72 67 29 3b 0a  len(lemp->arg);.
1a650 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20      while( i>=1 
1a660 26 26 20 69 73 73 70 61 63 65 28 6c 65 6d 70 2d  && isspace(lemp-
1a670 3e 61 72 67 5b 69 2d 31 5d 29 20 29 20 69 2d 2d  >arg[i-1]) ) i--
1a680 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d  ;.    while( i>=
1a690 31 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 6c 65  1 && (isalnum(le
1a6a0 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 7c 7c  mp->arg[i-1]) ||
1a6b0 20 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 3d   lemp->arg[i-1]=
1a6c0 3d 27 5f 27 29 20 29 20 69 2d 2d 3b 0a 20 20 20  ='_') ) i--;.   
1a6d0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1a6e0 65 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45 43  efine %sARG_SDEC
1a6f0 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c 65  L %s;\n",name,le
1a700 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e  mp->arg);  linen
1a710 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
1a720 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1a730 41 52 47 5f 50 44 45 43 4c 20 2c 25 73 5c 6e 22  ARG_PDECL ,%s\n"
1a740 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29  ,name,lemp->arg)
1a750 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
1a760 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1a770 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43  efine %sARG_FETC
1a780 48 20 25 73 20 3d 20 79 79 70 50 61 72 73 65 72  H %s = yypParser
1a790 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ->%s\n",.       
1a7a0 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c 6c            name,l
1a7b0 65 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d 3e  emp->arg,&lemp->
1a7c0 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f  arg[i]);  lineno
1a7d0 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
1a7e0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
1a7f0 52 47 5f 53 54 4f 52 45 20 79 79 70 50 61 72 73  RG_STORE yypPars
1a800 65 72 2d 3e 25 73 20 3d 20 25 73 5c 6e 22 2c 0a  er->%s = %s\n",.
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a820 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72 67   name,&lemp->arg
1a830 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69  [i],&lemp->arg[i
1a840 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ]);  lineno++;. 
1a850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69   }else{.    fpri
1a860 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1a870 20 25 73 41 52 47 5f 53 44 45 43 4c 5c 6e 22 2c   %sARG_SDECL\n",
1a880 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  name);  lineno++
1a890 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1a8a0 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
1a8b0 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b  _PDECL\n",name);
1a8c0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
1a8d0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1a8e0 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43 48  fine %sARG_FETCH
1a8f0 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  \n",name); linen
1a900 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
1a910 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1a920 41 52 47 5f 53 54 4f 52 45 5c 6e 22 2c 6e 61 6d  ARG_STORE\n",nam
1a930 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
1a940 7d 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29  }.  if( mhflag )
1a950 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
1a960 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c  t,"#endif\n"); l
1a970 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66  ineno++;.  }.  f
1a980 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1a990 69 6e 65 20 59 59 4e 53 54 41 54 45 20 25 64 5c  ine YYNSTATE %d\
1a9a0 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 29  n",lemp->nstate)
1a9b0 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ;  lineno++;.  f
1a9c0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1a9d0 69 6e 65 20 59 59 4e 52 55 4c 45 20 25 64 5c 6e  ine YYNRULE %d\n
1a9e0 22 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b 20  ",lemp->nrule); 
1a9f0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28   lineno++;.  if(
1aa00 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 75   lemp->errsym->u
1aa10 73 65 43 6e 74 20 29 7b 0a 20 20 20 20 66 70 72  seCnt ){.    fpr
1aa20 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1aa30 65 20 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c 20  e YYERRORSYMBOL 
1aa40 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73  %d\n",lemp->errs
1aa50 79 6d 2d 3e 69 6e 64 65 78 29 3b 20 20 6c 69 6e  ym->index);  lin
1aa60 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  eno++;.    fprin
1aa70 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1aa80 59 59 45 52 52 53 59 4d 44 54 20 79 79 25 64 5c  YYERRSYMDT yy%d\
1aa90 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d  n",lemp->errsym-
1aaa0 3e 64 74 6e 75 6d 29 3b 20 20 6c 69 6e 65 6e 6f  >dtnum);  lineno
1aab0 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65  ++;.  }.  if( le
1aac0 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b  mp->has_fallback
1aad0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1aae0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 46  out,"#define YYF
1aaf0 41 4c 4c 42 41 43 4b 20 31 5c 6e 22 29 3b 20 20  ALLBACK 1\n");  
1ab00 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1ab10 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1ab20 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1ab30 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1ab40 72 61 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20  rate the action 
1ab50 74 61 62 6c 65 20 61 6e 64 20 69 74 73 20 61 73  table and its as
1ab60 73 6f 63 69 61 74 65 73 3a 0a 20 20 2a 2a 0a 20  sociates:.  **. 
1ab70 20 2a 2a 20 20 79 79 5f 61 63 74 69 6f 6e 5b 5d   **  yy_action[]
1ab80 20 20 20 20 20 20 20 20 41 20 73 69 6e 67 6c 65          A single
1ab90 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
1aba0 67 20 61 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a 20  g all actions.. 
1abb0 20 2a 2a 20 20 79 79 5f 6c 6f 6f 6b 61 68 65 61   **  yy_lookahea
1abc0 64 5b 5d 20 20 20 20 20 41 20 74 61 62 6c 65 20  d[]     A table 
1abd0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c  containing the l
1abe0 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20 65 61 63  ookahead for eac
1abf0 68 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20  h entry in.  ** 
1ac00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac10 20 20 20 20 79 79 5f 61 63 74 69 6f 6e 2e 20 20      yy_action.  
1ac20 55 73 65 64 20 74 6f 20 64 65 74 65 63 74 20 68  Used to detect h
1ac30 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a  ash collisions..
1ac40 20 20 2a 2a 20 20 79 79 5f 73 68 69 66 74 5f 6f    **  yy_shift_o
1ac50 66 73 74 5b 5d 20 20 20 20 46 6f 72 20 65 61 63  fst[]    For eac
1ac60 68 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66  h state, the off
1ac70 73 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69  set into yy_acti
1ac80 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20  on for.  **     
1ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aca0 73 68 69 66 74 69 6e 67 20 74 65 72 6d 69 6e 61  shifting termina
1acb0 6c 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 72 65 64  ls..  **  yy_red
1acc0 75 63 65 5f 6f 66 73 74 5b 5d 20 20 20 46 6f 72  uce_ofst[]   For
1acd0 20 65 61 63 68 20 73 74 61 74 65 2c 20 74 68 65   each state, the
1ace0 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f   offset into yy_
1acf0 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20  action for.  ** 
1ad00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad10 20 20 20 20 73 68 69 66 74 69 6e 67 20 6e 6f 6e      shifting non
1ad20 2d 74 65 72 6d 69 6e 61 6c 73 20 61 66 74 65 72  -terminals after
1ad30 20 61 20 72 65 64 75 63 65 2e 0a 20 20 2a 2a 20   a reduce..  ** 
1ad40 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 20 20   yy_default[]   
1ad50 20 20 20 20 44 65 66 61 75 6c 74 20 61 63 74 69      Default acti
1ad60 6f 6e 20 66 6f 72 20 65 61 63 68 20 73 74 61 74  on for each stat
1ad70 65 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f  e..  */..  /* Co
1ad80 6d 70 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e  mpute the action
1ad90 73 20 6f 6e 20 61 6c 6c 20 73 74 61 74 65 73 20  s on all states 
1ada0 61 6e 64 20 63 6f 75 6e 74 20 74 68 65 6d 20 75  and count them u
1adb0 70 20 2a 2f 0a 20 20 61 78 20 3d 20 63 61 6c 6c  p */.  ax = call
1adc0 6f 63 28 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a  oc(lemp->nstate*
1add0 32 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29  2, sizeof(ax[0])
1ade0 29 3b 0a 20 20 69 66 28 20 61 78 3d 3d 30 20 29  );.  if( ax==0 )
1adf0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
1ae00 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69  derr,"malloc fai
1ae10 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  led\n");.    exi
1ae20 74 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  t(1);.  }.  for(
1ae30 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
1ae40 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
1ae50 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
1ae60 64 5b 69 5d 3b 0a 20 20 20 20 61 78 5b 69 2a 32  d[i];.    ax[i*2
1ae70 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20  ].stp = stp;.   
1ae80 20 61 78 5b 69 2a 32 5d 2e 69 73 54 6b 6e 20 3d   ax[i*2].isTkn =
1ae90 20 31 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e   1;.    ax[i*2].
1aea0 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e  nAction = stp->n
1aeb0 54 6b 6e 41 63 74 3b 0a 20 20 20 20 61 78 5b 69  TknAct;.    ax[i
1aec0 2a 32 2b 31 5d 2e 73 74 70 20 3d 20 73 74 70 3b  *2+1].stp = stp;
1aed0 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 69  .    ax[i*2+1].i
1aee0 73 54 6b 6e 20 3d 20 30 3b 0a 20 20 20 20 61 78  sTkn = 0;.    ax
1aef0 5b 69 2a 32 2b 31 5d 2e 6e 41 63 74 69 6f 6e 20  [i*2+1].nAction 
1af00 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74 3b 0a 20  = stp->nNtAct;. 
1af10 20 7d 0a 20 20 6d 78 54 6b 6e 4f 66 73 74 20 3d   }.  mxTknOfst =
1af20 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 30 3b 0a   mnTknOfst = 0;.
1af30 20 20 6d 78 4e 74 4f 66 73 74 20 3d 20 6d 6e 4e    mxNtOfst = mnN
1af40 74 4f 66 73 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  tOfst = 0;..  /*
1af50 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74   Compute the act
1af60 69 6f 6e 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f  ion table.  In o
1af70 72 64 65 72 20 74 6f 20 74 72 79 20 74 6f 20 6b  rder to try to k
1af80 65 65 70 20 74 68 65 20 73 69 7a 65 20 6f 66 20  eep the size of 
1af90 74 68 65 0a 20 20 2a 2a 20 61 63 74 69 6f 6e 20  the.  ** action 
1afa0 74 61 62 6c 65 20 74 6f 20 61 20 6d 69 6e 69 6d  table to a minim
1afb0 75 6d 2c 20 74 68 65 20 68 65 75 72 69 73 74 69  um, the heuristi
1afc0 63 20 6f 66 20 70 6c 61 63 69 6e 67 20 74 68 65  c of placing the
1afd0 20 6c 61 72 67 65 73 74 20 61 63 74 69 6f 6e 0a   largest action.
1afe0 20 20 2a 2a 20 73 65 74 73 20 66 69 72 73 74 20    ** sets first 
1aff0 69 73 20 75 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  is used..  */.  
1b000 71 73 6f 72 74 28 61 78 2c 20 6c 65 6d 70 2d 3e  qsort(ax, lemp->
1b010 6e 73 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66  nstate*2, sizeof
1b020 28 61 78 5b 30 5d 29 2c 20 61 78 73 65 74 5f 63  (ax[0]), axset_c
1b030 6f 6d 70 61 72 65 29 3b 0a 20 20 70 41 63 74 74  ompare);.  pActt
1b040 61 62 20 3d 20 61 63 74 74 61 62 5f 61 6c 6c 6f  ab = acttab_allo
1b050 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  c();.  for(i=0; 
1b060 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32  i<lemp->nstate*2
1b070 20 26 26 20 61 78 5b 69 5d 2e 6e 41 63 74 69 6f   && ax[i].nActio
1b080 6e 3e 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  n>0; i++){.    s
1b090 74 70 20 3d 20 61 78 5b 69 5d 2e 73 74 70 3b 0a  tp = ax[i].stp;.
1b0a0 20 20 20 20 69 66 28 20 61 78 5b 69 5d 2e 69 73      if( ax[i].is
1b0b0 54 6b 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  Tkn ){.      for
1b0c0 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
1b0d0 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
1b0e0 20 20 20 20 20 20 20 69 6e 74 20 61 63 74 69 6f         int actio
1b0f0 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  n;.        if( a
1b100 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d 6c 65  p->sp->index>=le
1b110 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20  mp->nterminal ) 
1b120 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1b130 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75    action = compu
1b140 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20  te_action(lemp, 
1b150 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ap);.        if(
1b160 20 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74   action<0 ) cont
1b170 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63  inue;.        ac
1b180 74 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63 74  ttab_action(pAct
1b190 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64  tab, ap->sp->ind
1b1a0 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20  ex, action);.   
1b1b0 20 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e     }.      stp->
1b1c0 69 54 6b 6e 4f 66 73 74 20 3d 20 61 63 74 74 61  iTknOfst = actta
1b1d0 62 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61 62  b_insert(pActtab
1b1e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70  );.      if( stp
1b1f0 2d 3e 69 54 6b 6e 4f 66 73 74 3c 6d 6e 54 6b 6e  ->iTknOfst<mnTkn
1b200 4f 66 73 74 20 29 20 6d 6e 54 6b 6e 4f 66 73 74  Ofst ) mnTknOfst
1b210 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74   = stp->iTknOfst
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 3e 6d 78 54 6b 6e 4f  >iTknOfst>mxTknO
1b240 66 73 74 20 29 20 6d 78 54 6b 6e 4f 66 73 74 20  fst ) mxTknOfst 
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 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b270 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
1b280 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
1b290 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t){.        int 
1b2a0 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  action;.        
1b2b0 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
1b2c0 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  x<lemp->ntermina
1b2d0 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
1b2e0 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70        if( ap->sp
1b2f0 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d 70 2d 3e 6e  ->index==lemp->n
1b300 73 79 6d 62 6f 6c 20 29 20 63 6f 6e 74 69 6e 75  symbol ) continu
1b310 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69 6f  e;.        actio
1b320 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69  n = compute_acti
1b330 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20  on(lemp, ap);.  
1b340 20 20 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e        if( action
1b350 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  <0 ) continue;. 
1b360 20 20 20 20 20 20 20 61 63 74 74 61 62 5f 61 63         acttab_ac
1b370 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61 70  tion(pActtab, ap
1b380 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74  ->sp->index, act
1b390 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ion);.      }.  
1b3a0 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74      stp->iNtOfst
1b3b0 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74   = acttab_insert
1b3c0 28 70 41 63 74 74 61 62 29 3b 0a 20 20 20 20 20  (pActtab);.     
1b3d0 20 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73   if( stp->iNtOfs
1b3e0 74 3c 6d 6e 4e 74 4f 66 73 74 20 29 20 6d 6e 4e  t<mnNtOfst ) mnN
1b3f0 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74  tOfst = stp->iNt
1b400 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20  Ofst;.      if( 
1b410 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3e 6d 78 4e  stp->iNtOfst>mxN
1b420 74 4f 66 73 74 20 29 20 6d 78 4e 74 4f 66 73 74  tOfst ) mxNtOfst
1b430 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b   = stp->iNtOfst;
1b440 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 72 65  .    }.  }.  fre
1b450 65 28 61 78 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74  e(ax);..  /* Out
1b460 70 75 74 20 74 68 65 20 79 79 5f 61 63 74 69 6f  put the yy_actio
1b470 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72  n table */.  fpr
1b480 69 6e 74 66 28 6f 75 74 2c 22 73 74 61 74 69 63  intf(out,"static
1b490 20 63 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e 54   const YYACTIONT
1b4a0 59 50 45 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20  YPE yy_action[] 
1b4b0 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  = {\n"); lineno+
1b4c0 2b 3b 0a 20 20 6e 20 3d 20 61 63 74 74 61 62 5f  +;.  n = acttab_
1b4d0 73 69 7a 65 28 70 41 63 74 74 61 62 29 3b 0a 20  size(pActtab);. 
1b4e0 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
1b4f0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61   i++){.    int a
1b500 63 74 69 6f 6e 20 3d 20 61 63 74 74 61 62 5f 79  ction = acttab_y
1b510 79 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c  yaction(pActtab,
1b520 20 69 29 3b 0a 20 20 20 20 69 66 28 20 61 63 74   i);.    if( act
1b530 69 6f 6e 3c 30 20 29 20 61 63 74 69 6f 6e 20 3d  ion<0 ) action =
1b540 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20   lemp->nstate + 
1b550 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20 32 3b  lemp->nrule + 2;
1b560 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20  .    if( j==0 ) 
1b570 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
1b580 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20   %5d */ ", i);. 
1b590 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1b5a0 22 20 25 34 64 2c 22 2c 20 61 63 74 69 6f 6e 29  " %4d,", action)
1b5b0 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c  ;.    if( j==9 |
1b5c0 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20  | i==n-1 ){.    
1b5d0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1b5e0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1b5f0 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20        j = 0;.   
1b600 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b   }else{.      j+
1b610 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  +;.    }.  }.  f
1b620 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c  printf(out, "};\
1b630 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a  n"); lineno++;..
1b640 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
1b650 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 74 61 62  yy_lookahead tab
1b660 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  le */.  fprintf(
1b670 6f 75 74 2c 22 73 74 61 74 69 63 20 63 6f 6e 73  out,"static cons
1b680 74 20 59 59 43 4f 44 45 54 59 50 45 20 79 79 5f  t YYCODETYPE yy_
1b690 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 3d 20 7b 5c  lookahead[] = {\
1b6a0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1b6b0 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
1b6c0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c   i++){.    int l
1b6d0 61 20 3d 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f  a = acttab_yyloo
1b6e0 6b 61 68 65 61 64 28 70 41 63 74 74 61 62 2c 20  kahead(pActtab, 
1b6f0 69 29 3b 0a 20 20 20 20 69 66 28 20 6c 61 3c 30  i);.    if( la<0
1b700 20 29 20 6c 61 20 3d 20 6c 65 6d 70 2d 3e 6e 73   ) la = lemp->ns
1b710 79 6d 62 6f 6c 3b 0a 20 20 20 20 69 66 28 20 6a  ymbol;.    if( j
1b720 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75  ==0 ) fprintf(ou
1b730 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c  t," /* %5d */ ",
1b740 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66   i);.    fprintf
1b750 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6c  (out, " %4d,", l
1b760 61 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39  a);.    if( j==9
1b770 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20   || i==n-1 ){.  
1b780 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b790 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   "\n"); lineno++
1b7a0 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20  ;.      j = 0;. 
1b7b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b7c0 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  j++;.    }.  }. 
1b7d0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d   fprintf(out, "}
1b7e0 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1b7f0 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68  ..  /* Output th
1b800 65 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b  e yy_shift_ofst[
1b810 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72  ] table */.  fpr
1b820 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69  intf(out, "#defi
1b830 6e 65 20 59 59 5f 53 48 49 46 54 5f 55 53 45 5f  ne YY_SHIFT_USE_
1b840 44 46 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e  DFLT (%d)\n", mn
1b850 54 6b 6e 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65  TknOfst-1); line
1b860 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70  no++;.  n = lemp
1b870 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68 69 6c  ->nstate;.  whil
1b880 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e  e( n>0 && lemp->
1b890 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 54 6b  sorted[n-1]->iTk
1b8a0 6e 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54  nOfst==NO_OFFSET
1b8b0 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74   ) n--;.  fprint
1b8c0 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20  f(out, "#define 
1b8d0 59 59 5f 53 48 49 46 54 5f 4d 41 58 20 25 64 5c  YY_SHIFT_MAX %d\
1b8e0 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f  n", n-1); lineno
1b8f0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1b900 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74  t, "static const
1b910 20 25 73 20 79 79 5f 73 68 69 66 74 5f 6f 66 73   %s yy_shift_ofs
1b920 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20  t[] = {\n", .   
1b930 20 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73         minimum_s
1b940 69 7a 65 5f 74 79 70 65 28 6d 6e 54 6b 6e 4f 66  ize_type(mnTknOf
1b950 73 74 2d 31 2c 20 6d 78 54 6b 6e 4f 66 73 74 29  st-1, mxTknOfst)
1b960 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1b970 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
1b980 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73  ++){.    int ofs
1b990 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  t;.    stp = lem
1b9a0 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
1b9b0 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54    ofst = stp->iT
1b9c0 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20  knOfst;.    if( 
1b9d0 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20  ofst==NO_OFFSET 
1b9e0 29 20 6f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66  ) ofst = mnTknOf
1b9f0 73 74 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20  st - 1;.    if( 
1ba00 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f  j==0 ) fprintf(o
1ba10 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22  ut," /* %5d */ "
1ba20 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , i);.    fprint
1ba30 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20  f(out, " %4d,", 
1ba40 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a  ofst);.    if( j
1ba50 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b  ==9 || i==n-1 ){
1ba60 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1ba70 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ut, "\n"); linen
1ba80 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30  o++;.      j = 0
1ba90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1baa0 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     j++;.    }.  
1bab0 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
1bac0 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   "};\n"); lineno
1bad0 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  ++;..  /* Output
1bae0 20 74 68 65 20 79 79 5f 72 65 64 75 63 65 5f 6f   the yy_reduce_o
1baf0 66 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20  fst[] table */. 
1bb00 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
1bb10 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45  define YY_REDUCE
1bb20 5f 55 53 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e  _USE_DFLT (%d)\n
1bb30 22 2c 20 6d 6e 4e 74 4f 66 73 74 2d 31 29 3b 20  ", mnNtOfst-1); 
1bb40 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20  lineno++;.  n = 
1bb50 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20  lemp->nstate;.  
1bb60 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65  while( n>0 && le
1bb70 6d 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d  mp->sorted[n-1]-
1bb80 3e 69 4e 74 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46  >iNtOfst==NO_OFF
1bb90 53 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72  SET ) n--;.  fpr
1bba0 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69  intf(out, "#defi
1bbb0 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 4d 41 58  ne YY_REDUCE_MAX
1bbc0 20 25 64 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69   %d\n", n-1); li
1bbd0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1bbe0 66 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63  f(out, "static c
1bbf0 6f 6e 73 74 20 25 73 20 79 79 5f 72 65 64 75 63  onst %s yy_reduc
1bc00 65 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c  e_ofst[] = {\n",
1bc10 20 0a 20 20 20 20 20 20 20 20 20 20 6d 69 6e 69   .          mini
1bc20 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e  mum_size_type(mn
1bc30 4e 74 4f 66 73 74 2d 31 2c 20 6d 78 4e 74 4f 66  NtOfst-1, mxNtOf
1bc40 73 74 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  st)); lineno++;.
1bc50 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e    for(i=j=0; i<n
1bc60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
1bc70 6f 66 73 74 3b 0a 20 20 20 20 73 74 70 20 3d 20  ofst;.    stp = 
1bc80 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
1bc90 0a 20 20 20 20 6f 66 73 74 20 3d 20 73 74 70 2d  .    ofst = stp-
1bca0 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 69 66  >iNtOfst;.    if
1bcb0 28 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45  ( ofst==NO_OFFSE
1bcc0 54 20 29 20 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f  T ) ofst = mnNtO
1bcd0 66 73 74 20 2d 20 31 3b 0a 20 20 20 20 69 66 28  fst - 1;.    if(
1bce0 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28   j==0 ) fprintf(
1bcf0 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20  out," /* %5d */ 
1bd00 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e  ", i);.    fprin
1bd10 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c  tf(out, " %4d,",
1bd20 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20   ofst);.    if( 
1bd30 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29  j==9 || i==n-1 )
1bd40 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
1bd50 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65  out, "\n"); line
1bd60 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20  no++;.      j = 
1bd70 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1bd80 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20      j++;.    }. 
1bd90 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
1bda0 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  , "};\n"); linen
1bdb0 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  o++;..  /* Outpu
1bdc0 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 63  t the default ac
1bdd0 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tion table */.  
1bde0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74  fprintf(out, "st
1bdf0 61 74 69 63 20 63 6f 6e 73 74 20 59 59 41 43 54  atic const YYACT
1be00 49 4f 4e 54 59 50 45 20 79 79 5f 64 65 66 61 75  IONTYPE yy_defau
1be10 6c 74 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69  lt[] = {\n"); li
1be20 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65  neno++;.  n = le
1be30 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 66 6f  mp->nstate;.  fo
1be40 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
1be50 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  +){.    stp = le
1be60 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
1be70 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70     if( j==0 ) fp
1be80 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25  rintf(out," /* %
1be90 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20  5d */ ", i);.   
1bea0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
1beb0 25 34 64 2c 22 2c 20 73 74 70 2d 3e 69 44 66 6c  %4d,", stp->iDfl
1bec0 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39  t);.    if( j==9
1bed0 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20   || i==n-1 ){.  
1bee0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1bef0 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   "\n"); lineno++
1bf00 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20  ;.      j = 0;. 
1bf10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bf20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  j++;.    }.  }. 
1bf30 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d   fprintf(out, "}
1bf40 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1bf50 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1bf60 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1bf70 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1bf80 65 6e 65 72 61 74 65 20 74 68 65 20 74 61 62 6c  enerate the tabl
1bf90 65 20 6f 66 20 66 61 6c 6c 62 61 63 6b 20 74 6f  e of fallback to
1bfa0 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  kens..  */.  if(
1bfb0 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62   lemp->has_fallb
1bfc0 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ack ){.    for(i
1bfd0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =0; i<lemp->nter
1bfe0 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  minal; i++){.   
1bff0 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
1c000 20 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62   *p = lemp->symb
1c010 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ols[i];.      if
1c020 28 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30  ( p->fallback==0
1c030 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
1c040 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20 30 2c  ntf(out, "    0,
1c050 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 6e 6f 74    /* %10s => not
1c060 68 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 6e  hing */\n", p->n
1c070 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
1c080 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  e{.        fprin
1c090 74 66 28 6f 75 74 2c 20 22 20 20 25 33 64 2c 20  tf(out, "  %3d, 
1c0a0 20 2f 2a 20 25 31 30 73 20 3d 3e 20 25 73 20 2a   /* %10s => %s *
1c0b0 2f 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c 62 61 63  /\n", p->fallbac
1c0c0 6b 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20 20 20  k->index,.      
1c0d0 20 20 20 20 70 2d 3e 6e 61 6d 65 2c 20 70 2d 3e      p->name, p->
1c0e0 66 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d 65 29 3b  fallback->name);
1c0f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c  .      }.      l
1c100 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ineno++;.    }. 
1c110 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
1c120 65 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e 2c 20 6f  emp->name, in, o
1c130 75 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  ut, &lineno);.. 
1c140 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74   /* Generate a t
1c150 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
1c160 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d  the symbolic nam
1c170 65 20 6f 66 20 65 76 65 72 79 20 73 79 6d 62 6f  e of every symbo
1c180 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  l.  */.  for(i=0
1c190 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
1c1a0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 72  l; i++){.    spr
1c1b0 69 6e 74 66 28 6c 69 6e 65 2c 22 5c 22 25 73 5c  intf(line,"\"%s\
1c1c0 22 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  ",",lemp->symbol
1c1d0 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  s[i]->name);.   
1c1e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1c1f0 25 2d 31 35 73 22 2c 6c 69 6e 65 29 3b 0a 20 20  %-15s",line);.  
1c200 20 20 69 66 28 20 28 69 26 33 29 3d 3d 33 20 29    if( (i&3)==3 )
1c210 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c  { fprintf(out,"\
1c220 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d  n"); lineno++; }
1c230 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 26 33 29  .  }.  if( (i&3)
1c240 21 3d 30 20 29 7b 20 66 70 72 69 6e 74 66 28 6f  !=0 ){ fprintf(o
1c250 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  ut,"\n"); lineno
1c260 2b 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ++; }.  tplt_xfe
1c270 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1c280 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1c290 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74   /* Generate a t
1c2a0 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
1c2b0 61 20 74 65 78 74 20 73 74 72 69 6e 67 20 74 68  a text string th
1c2c0 61 74 20 64 65 73 63 72 69 62 65 73 20 65 76 65  at describes eve
1c2d0 72 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69 6e 20  ry.  ** rule in 
1c2e0 74 68 65 20 72 75 6c 65 20 73 65 74 20 6f 66 20  the rule set of 
1c2f0 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 54 68  the grammar.  Th
1c300 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  is information i
1c310 73 20 75 73 65 64 0a 20 20 2a 2a 20 77 68 65 6e  s used.  ** when
1c320 20 74 72 61 63 69 6e 67 20 52 45 44 55 43 45 20   tracing REDUCE 
1c330 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  actions..  */.  
1c340 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65 6d 70  for(i=0, rp=lemp
1c350 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
1c360 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20  p->next, i++){. 
1c370 20 20 20 61 73 73 65 72 74 28 20 72 70 2d 3e 69     assert( rp->i
1c380 6e 64 65 78 3d 3d 69 20 29 3b 0a 20 20 20 20 66  ndex==i );.    f
1c390 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
1c3a0 25 33 64 20 2a 2f 20 5c 22 22 2c 20 69 29 3b 0a  %3d */ \"", i);.
1c3b0 20 20 20 20 77 72 69 74 65 52 75 6c 65 54 65 78      writeRuleTex
1c3c0 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20 20  t(out, rp);.    
1c3d0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22 2c  fprintf(out,"\",
1c3e0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1c3f0 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
1c400 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1c410 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1c420 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1c430 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 65  which executes e
1c440 76 65 72 79 20 74 69 6d 65 20 61 20 73 79 6d 62  very time a symb
1c450 6f 6c 20 69 73 20 70 6f 70 70 65 64 20 66 72 6f  ol is popped fro
1c460 6d 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 63 6b  m.  ** the stack
1c470 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e   while processin
1c480 67 20 65 72 72 6f 72 73 20 6f 72 20 77 68 69 6c  g errors or whil
1c490 65 20 64 65 73 74 72 6f 79 69 6e 67 20 74 68 65  e destroying the
1c4a0 20 70 61 72 73 65 72 2e 20 0a 20 20 2a 2a 20 28   parser. .  ** (
1c4b0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1c4c0 67 65 6e 65 72 61 74 65 20 74 68 65 20 25 64 65  generate the %de
1c4d0 73 74 72 75 63 74 6f 72 20 61 63 74 69 6f 6e 73  structor actions
1c4e0 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d  ).  */.  if( lem
1c4f0 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29 7b 0a  p->tokendest ){.
1c500 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31      int once = 1
1c510 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1c520 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
1c530 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
1c540 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
1c550 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
1c560 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d 3d  ;.      if( sp==
1c570 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21 3d 54  0 || sp->type!=T
1c580 45 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74 69 6e  ERMINAL ) contin
1c590 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e  ue;.      if( on
1c5a0 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  ce ){.        fp
1c5b0 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20  rintf(out, "    
1c5c0 20 20 2f 2a 20 54 45 52 4d 49 4e 41 4c 20 44 65    /* TERMINAL De
1c5d0 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22 29 3b  structor */\n");
1c5e0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
1c5f0 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20     once = 0;.   
1c600 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
1c610 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65  tf(out,"    case
1c620 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22   %d: /* %s */\n"
1c630 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c640 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e  sp->index, sp->n
1c650 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
1c660 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
1c670 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
1c680 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62  ol && lemp->symb
1c690 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65 21 3d 54 45  ols[i]->type!=TE
1c6a0 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b 0a 20 20  RMINAL; i++);.  
1c6b0 20 20 69 66 28 20 69 3c 6c 65 6d 70 2d 3e 6e 73    if( i<lemp->ns
1c6c0 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 65  ymbol ){.      e
1c6d0 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63  mit_destructor_c
1c6e0 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79  ode(out,lemp->sy
1c6f0 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c  mbols[i],lemp,&l
1c700 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 66 70  ineno);.      fp
1c710 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
1c720 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e   break;\n"); lin
1c730 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  eno++;.    }.  }
1c740 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72  .  if( lemp->var
1c750 64 65 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  dest ){.    stru
1c760 63 74 20 73 79 6d 62 6f 6c 20 2a 64 66 6c 74 5f  ct symbol *dflt_
1c770 73 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  sp = 0;.    int 
1c780 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 66 6f  once = 1;.    fo
1c790 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1c7a0 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
1c7b0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
1c7c0 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79  l *sp = lemp->sy
1c7d0 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20  mbols[i];.      
1c7e0 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d  if( sp==0 || sp-
1c7f0 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20  >type==TERMINAL 
1c800 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d  ||.          sp-
1c810 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c 20 73 70 2d  >index<=0 || sp-
1c820 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30 20 29  >destructor!=0 )
1c830 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1c840 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20 20   if( once ){.   
1c850 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1c860 2c 20 22 20 20 20 20 20 20 2f 2a 20 44 65 66 61  , "      /* Defa
1c870 75 6c 74 20 4e 4f 4e 2d 54 45 52 4d 49 4e 41 4c  ult NON-TERMINAL
1c880 20 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e   Destructor */\n
1c890 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1c8a0 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a        once = 0;.
1c8b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70        }.      fp
1c8c0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63  rintf(out,"    c
1c8d0 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f  ase %d: /* %s */
1c8e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1c8f0 20 20 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70     sp->index, sp
1c900 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  ->name); lineno+
1c910 2b 3b 0a 20 20 20 20 20 20 64 66 6c 74 5f 73 70  +;.      dflt_sp
1c920 20 3d 20 73 70 3b 0a 20 20 20 20 7d 0a 20 20 20   = sp;.    }.   
1c930 20 69 66 28 20 64 66 6c 74 5f 73 70 21 3d 30 20   if( dflt_sp!=0 
1c940 29 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f 64 65  ){.      emit_de
1c950 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75  structor_code(ou
1c960 74 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d 70 2c 26  t,dflt_sp,lemp,&
1c970 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  lineno);.    }. 
1c980 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1c990 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29        break;\n")
1c9a0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
1c9b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1c9c0 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
1c9d0 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d  {.    struct sym
1c9e0 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e  bol *sp = lemp->
1c9f0 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
1ca00 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d  if( sp==0 || sp-
1ca10 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20  >type==TERMINAL 
1ca20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f  || sp->destructo
1ca30 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  r==0 ) continue;
1ca40 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1ca50 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f  ,"    case %d: /
1ca60 2a 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20  * %s */\n",.    
1ca70 20 20 20 20 20 20 20 20 73 70 2d 3e 69 6e 64 65          sp->inde
1ca80 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69  x, sp->name); li
1ca90 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20  neno++;..    /* 
1caa0 43 6f 6d 62 69 6e 65 20 64 75 70 6c 69 63 61 74  Combine duplicat
1cab0 65 20 64 65 73 74 72 75 63 74 6f 72 73 20 69 6e  e destructors in
1cac0 74 6f 20 61 20 73 69 6e 67 6c 65 20 63 61 73 65  to a single case
1cad0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b   */.    for(j=i+
1cae0 31 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  1; j<lemp->nsymb
1caf0 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
1cb00 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
1cb10 70 32 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  p2 = lemp->symbo
1cb20 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66 28  ls[j];.      if(
1cb30 20 73 70 32 20 26 26 20 73 70 32 2d 3e 74 79 70   sp2 && sp2->typ
1cb40 65 21 3d 54 45 52 4d 49 4e 41 4c 20 26 26 20 73  e!=TERMINAL && s
1cb50 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 0a 20  p2->destructor. 
1cb60 20 20 20 20 20 20 20 20 20 26 26 20 73 70 32 2d           && sp2-
1cb70 3e 64 74 6e 75 6d 3d 3d 73 70 2d 3e 64 74 6e 75  >dtnum==sp->dtnu
1cb80 6d 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 73  m.          && s
1cb90 74 72 63 6d 70 28 73 70 2d 3e 64 65 73 74 72 75  trcmp(sp->destru
1cba0 63 74 6f 72 2c 73 70 32 2d 3e 64 65 73 74 72 75  ctor,sp2->destru
1cbb0 63 74 6f 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ctor)==0 ){.    
1cbc0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1cbd0 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f  ,"    case %d: /
1cbe0 2a 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20  * %s */\n",.    
1cbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 70 32               sp2
1cc00 2d 3e 69 6e 64 65 78 2c 20 73 70 32 2d 3e 6e 61  ->index, sp2->na
1cc10 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
1cc20 20 20 20 20 20 20 20 20 73 70 32 2d 3e 64 65 73          sp2->des
1cc30 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20  tructor = 0;.   
1cc40 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
1cc50 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f  emit_destructor_
1cc60 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73  code(out,lemp->s
1cc70 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26  ymbols[i],lemp,&
1cc80 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72  lineno);.    fpr
1cc90 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
1cca0 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65  break;\n"); line
1ccb0 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74  no++;.  }.  tplt
1ccc0 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1ccd0 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1cce0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1ccf0 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   code which exec
1cd00 75 74 65 73 20 77 68 65 6e 65 76 65 72 20 74 68  utes whenever th
1cd10 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 6f  e parser stack o
1cd20 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 74 70  verflows */.  tp
1cd30 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d  lt_print(out,lem
1cd40 70 2c 6c 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77  p,lemp->overflow
1cd50 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c  ,&lineno);.  tpl
1cd60 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1cd70 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1cd80 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1cd90 65 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 72  e the table of r
1cda0 75 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ule information 
1cdb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a  .  **.  ** Note:
1cdc0 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e   This code depen
1cdd0 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74  ds on the fact t
1cde0 68 61 74 20 72 75 6c 65 73 20 61 72 65 20 6e 75  hat rules are nu
1cdf0 6d 62 65 72 0a 20 20 2a 2a 20 73 65 71 75 65 6e  mber.  ** sequen
1ce00 74 75 61 6c 6c 79 20 62 65 67 69 6e 6e 69 6e 67  tually beginning
1ce10 20 77 69 74 68 20 30 2e 0a 20 20 2a 2f 0a 20 20   with 0..  */.  
1ce20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  for(rp=lemp->rul
1ce30 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
1ce40 78 74 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  xt){.    fprintf
1ce50 28 6f 75 74 2c 22 20 20 7b 20 25 64 2c 20 25 64  (out,"  { %d, %d
1ce60 20 7d 2c 5c 6e 22 2c 72 70 2d 3e 6c 68 73 2d 3e   },\n",rp->lhs->
1ce70 69 6e 64 65 78 2c 72 70 2d 3e 6e 72 68 73 29 3b  index,rp->nrhs);
1ce80 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1ce90 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1cea0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1ceb0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1cec0 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
1ced0 20 65 78 65 63 75 74 69 6f 6e 20 64 75 72 69 6e   execution durin
1cee0 67 20 65 61 63 68 20 52 45 44 55 43 45 20 61 63  g each REDUCE ac
1cef0 74 69 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 72 70  tion */.  for(rp
1cf00 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
1cf10 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
1cf20 20 20 20 74 72 61 6e 73 6c 61 74 65 5f 63 6f 64     translate_cod
1cf30 65 28 6c 65 6d 70 2c 20 72 70 29 3b 0a 20 20 7d  e(lemp, rp);.  }
1cf40 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
1cf50 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
1cf60 3e 6e 65 78 74 29 7b 0a 20 20 20 20 73 74 72 75  >next){.    stru
1cf70 63 74 20 72 75 6c 65 20 2a 72 70 32 3b 0a 20 20  ct rule *rp2;.  
1cf80 20 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d    if( rp->code==
1cf90 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1cfa0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1cfb0 20 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a       case %d: /*
1cfc0 20 22 2c 20 72 70 2d 3e 69 6e 64 65 78 29 3b 0a   ", rp->index);.
1cfd0 20 20 20 20 77 72 69 74 65 52 75 6c 65 54 65 78      writeRuleTex
1cfe0 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20 20  t(out, rp);.    
1cff0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 2a  fprintf(out, " *
1d000 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  /\n"); lineno++;
1d010 0a 20 20 20 20 66 6f 72 28 72 70 32 3d 72 70 2d  .    for(rp2=rp-
1d020 3e 6e 65 78 74 3b 20 72 70 32 3b 20 72 70 32 3d  >next; rp2; rp2=
1d030 72 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  rp2->next){.    
1d040 20 20 69 66 28 20 72 70 32 2d 3e 63 6f 64 65 3d    if( rp2->code=
1d050 3d 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20  =rp->code ){.   
1d060 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1d070 2c 22 20 20 20 20 20 20 63 61 73 65 20 25 64 3a  ,"      case %d:
1d080 20 2f 2a 20 22 2c 20 72 70 32 2d 3e 69 6e 64 65   /* ", rp2->inde
1d090 78 29 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74  x);.        writ
1d0a0 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72  eRuleText(out, r
1d0b0 70 32 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72  p2);.        fpr
1d0c0 69 6e 74 66 28 6f 75 74 2c 22 20 2a 2f 5c 6e 22  intf(out," */\n"
1d0d0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1d0e0 20 20 20 20 20 72 70 32 2d 3e 63 6f 64 65 20 3d       rp2->code =
1d0f0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1d100 7d 0a 20 20 20 20 65 6d 69 74 5f 63 6f 64 65 28  }.    emit_code(
1d110 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 26 6c 69 6e  out,rp,lemp,&lin
1d120 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  eno);.    fprint
1d130 66 28 6f 75 74 2c 22 20 20 20 20 20 20 20 20 62  f(out,"        b
1d140 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  reak;\n"); linen
1d150 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
1d160 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1d170 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1d180 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1d190 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
1d1a0 74 65 73 20 69 66 20 61 20 70 61 72 73 65 20 66  tes if a parse f
1d1b0 61 69 6c 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70  ails */.  tplt_p
1d1c0 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65  rint(out,lemp,le
1d1d0 6d 70 2d 3e 66 61 69 6c 75 72 65 2c 26 6c 69 6e  mp->failure,&lin
1d1e0 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65  eno);.  tplt_xfe
1d1f0 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1d200 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1d210 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1d220 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
1d230 20 77 68 65 6e 20 61 20 73 79 6e 74 61 78 20 65   when a syntax e
1d240 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 20  rror occurs */. 
1d250 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
1d260 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72  lemp,lemp->error
1d270 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c  ,&lineno);.  tpl
1d280 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1d290 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1d2a0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1d2b0 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
1d2c0 63 75 74 65 73 20 77 68 65 6e 20 74 68 65 20 70  cutes when the p
1d2d0 61 72 73 65 72 20 61 63 63 65 70 74 73 20 69 74  arser accepts it
1d2e0 73 20 69 6e 70 75 74 20 2a 2f 0a 20 20 74 70 6c  s input */.  tpl
1d2f0 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70  t_print(out,lemp
1d300 2c 6c 65 6d 70 2d 3e 61 63 63 65 70 74 2c 26 6c  ,lemp->accept,&l
1d310 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78  ineno);.  tplt_x
1d320 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1d330 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1d340 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 61 6e 79  .  /* Append any
1d350 20 61 64 64 69 74 69 6f 6e 20 63 6f 64 65 20 74   addition code t
1d360 68 65 20 75 73 65 72 20 64 65 73 69 72 65 73 20  he user desires 
1d370 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
1d380 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65  out,lemp,lemp->e
1d390 78 74 72 61 63 6f 64 65 2c 26 6c 69 6e 65 6e 6f  xtracode,&lineno
1d3a0 29 3b 0a 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29  );..  fclose(in)
1d3b0 3b 0a 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b  ;.  fclose(out);
1d3c0 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
1d3d0 20 47 65 6e 65 72 61 74 65 20 61 20 68 65 61 64   Generate a head
1d3e0 65 72 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  er file for the 
1d3f0 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52  parser */.void R
1d400 65 70 6f 72 74 48 65 61 64 65 72 28 6c 65 6d 70  eportHeader(lemp
1d410 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
1d420 6c 65 6d 70 3b 0a 7b 0a 20 20 46 49 4c 45 20 2a  lemp;.{.  FILE *
1d430 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68 61 72  out, *in;.  char
1d440 20 2a 70 72 65 66 69 78 3b 0a 20 20 63 68 61 72   *prefix;.  char
1d450 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b   line[LINESIZE];
1d460 0a 20 20 63 68 61 72 20 70 61 74 74 65 72 6e 5b  .  char pattern[
1d470 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74  LINESIZE];.  int
1d480 20 69 3b 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d   i;..  if( lemp-
1d490 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20 29 20 70  >tokenprefix ) p
1d4a0 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f  refix = lemp->to
1d4b0 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 65 6c 73  kenprefix;.  els
1d4c0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1d4d0 20 20 20 20 20 70 72 65 66 69 78 20 3d 20 22 22       prefix = ""
1d4e0 3b 0a 20 20 69 6e 20 3d 20 66 69 6c 65 5f 6f 70  ;.  in = file_op
1d4f0 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 72 62  en(lemp,".h","rb
1d500 22 29 3b 0a 20 20 69 66 28 20 69 6e 20 29 7b 0a  ");.  if( in ){.
1d510 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c      for(i=1; i<l
1d520 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26  emp->nterminal &
1d530 26 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e  & fgets(line,LIN
1d540 45 53 49 5a 45 2c 69 6e 29 3b 20 69 2b 2b 29 7b  ESIZE,in); i++){
1d550 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 70  .      sprintf(p
1d560 61 74 74 65 72 6e 2c 22 23 64 65 66 69 6e 65 20  attern,"#define 
1d570 25 73 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70  %s%-30s %2d\n",p
1d580 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62  refix,lemp->symb
1d590 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b  ols[i]->name,i);
1d5a0 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
1d5b0 70 28 6c 69 6e 65 2c 70 61 74 74 65 72 6e 29 20  p(line,pattern) 
1d5c0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
1d5d0 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
1d5e0 20 20 20 69 66 28 20 69 3d 3d 6c 65 6d 70 2d 3e     if( i==lemp->
1d5f0 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20 20  nterminal ){.   
1d600 20 20 20 2f 2a 20 4e 6f 20 63 68 61 6e 67 65 20     /* No change 
1d610 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 44 6f  in the file.  Do
1d620 6e 27 74 20 72 65 77 72 69 74 65 20 69 74 2e 20  n't rewrite it. 
1d630 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  */.      return;
1d640 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6f 75 74  .    }.  }.  out
1d650 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d   = file_open(lem
1d660 70 2c 22 2e 68 22 2c 22 77 62 22 29 3b 0a 20 20  p,".h","wb");.  
1d670 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 66  if( out ){.    f
1d680 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=1; i<lemp->
1d690 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b  nterminal; i++){
1d6a0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1d6b0 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d  ut,"#define %s%-
1d6c0 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69  30s %2d\n",prefi
1d6d0 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  x,lemp->symbols[
1d6e0 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20  i]->name,i);.   
1d6f0 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 6f 75   }.    fclose(ou
1d700 74 29 3b 20 20 0a 20 20 7d 0a 20 20 72 65 74 75  t);  .  }.  retu
1d710 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 64 75 63 65  rn;.}../* Reduce
1d720 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1d730 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 2c 20   action tables, 
1d740 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 62 79 20  if possible, by 
1d750 6d 61 6b 69 6e 67 20 75 73 65 0a 2a 2a 20 6f 66  making use.** of
1d760 20 64 65 66 61 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a   defaults..**.**
1d770 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f 6e   In this version
1d780 2c 20 77 65 20 74 61 6b 65 20 74 68 65 20 6d 6f  , we take the mo
1d790 73 74 20 66 72 65 71 75 65 6e 74 20 52 45 44 55  st frequent REDU
1d7a0 43 45 20 61 63 74 69 6f 6e 20 61 6e 64 20 6d 61  CE action and ma
1d7b0 6b 65 0a 2a 2a 20 69 74 20 74 68 65 20 64 65 66  ke.** it the def
1d7c0 61 75 6c 74 2e 20 20 45 78 63 65 70 74 2c 20 74  ault.  Except, t
1d7d0 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66 61 75  here is no defau
1d7e0 6c 74 20 69 66 20 74 68 65 20 77 69 6c 64 63 61  lt if the wildca
1d7f0 72 64 20 74 6f 6b 65 6e 0a 2a 2a 20 69 73 20 61  rd token.** is a
1d800 20 70 6f 73 73 69 62 6c 65 20 6c 6f 6f 6b 2d 61   possible look-a
1d810 68 65 61 64 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f  head..*/.void Co
1d820 6d 70 72 65 73 73 54 61 62 6c 65 73 28 6c 65 6d  mpressTables(lem
1d830 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
1d840 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63  *lemp;.{.  struc
1d850 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20  t state *stp;.  
1d860 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
1d870 70 2c 20 2a 61 70 32 3b 0a 20 20 73 74 72 75 63  p, *ap2;.  struc
1d880 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a 72 70 32  t rule *rp, *rp2
1d890 2c 20 2a 72 62 65 73 74 3b 0a 20 20 69 6e 74 20  , *rbest;.  int 
1d8a0 6e 62 65 73 74 2c 20 6e 3b 0a 20 20 69 6e 74 20  nbest, n;.  int 
1d8b0 69 3b 0a 20 20 69 6e 74 20 75 73 65 73 57 69 6c  i;.  int usesWil
1d8c0 64 63 61 72 64 3b 0a 0a 20 20 66 6f 72 28 69 3d  dcard;..  for(i=
1d8d0 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
1d8e0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  e; i++){.    stp
1d8f0 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
1d900 69 5d 3b 0a 20 20 20 20 6e 62 65 73 74 20 3d 20  i];.    nbest = 
1d910 30 3b 0a 20 20 20 20 72 62 65 73 74 20 3d 20 30  0;.    rbest = 0
1d920 3b 0a 20 20 20 20 75 73 65 73 57 69 6c 64 63 61  ;.    usesWildca
1d930 72 64 20 3d 20 30 3b 0a 0a 20 20 20 20 66 6f 72  rd = 0;..    for
1d940 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
1d950 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
1d960 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70       if( ap->typ
1d970 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70 2d 3e  e==SHIFT && ap->
1d980 73 70 3d 3d 6c 65 6d 70 2d 3e 77 69 6c 64 63 61  sp==lemp->wildca
1d990 72 64 20 29 7b 0a 20 20 20 20 20 20 20 20 75 73  rd ){.        us
1d9a0 65 73 57 69 6c 64 63 61 72 64 20 3d 20 31 3b 0a  esWildcard = 1;.
1d9b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1d9c0 28 20 61 70 2d 3e 74 79 70 65 21 3d 52 45 44 55  ( ap->type!=REDU
1d9d0 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  CE ) continue;. 
1d9e0 20 20 20 20 20 72 70 20 3d 20 61 70 2d 3e 78 2e       rp = ap->x.
1d9f0 72 70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70  rp;.      if( rp
1da00 2d 3e 6c 68 73 53 74 61 72 74 20 29 20 63 6f 6e  ->lhsStart ) con
1da10 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
1da20 20 72 70 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e   rp==rbest ) con
1da30 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 20 3d  tinue;.      n =
1da40 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 61 70   1;.      for(ap
1da50 32 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70 32 3b  2=ap->next; ap2;
1da60 20 61 70 32 3d 61 70 32 2d 3e 6e 65 78 74 29 7b   ap2=ap2->next){
1da70 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70 32  .        if( ap2
1da80 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45 20 29  ->type!=REDUCE )
1da90 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1daa0 20 20 20 72 70 32 20 3d 20 61 70 32 2d 3e 78 2e     rp2 = ap2->x.
1dab0 72 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  rp;.        if( 
1dac0 72 70 32 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e  rp2==rbest ) con
1dad0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
1dae0 66 28 20 72 70 32 3d 3d 72 70 20 29 20 6e 2b 2b  f( rp2==rp ) n++
1daf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1db00 69 66 28 20 6e 3e 6e 62 65 73 74 20 29 7b 0a 20  if( n>nbest ){. 
1db10 20 20 20 20 20 20 20 6e 62 65 73 74 20 3d 20 6e         nbest = n
1db20 3b 0a 20 20 20 20 20 20 20 20 72 62 65 73 74 20  ;.        rbest 
1db30 3d 20 72 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = rp;.      }.  
1db40 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 44 6f 20    }. .    /* Do 
1db50 6e 6f 74 20 6d 61 6b 65 20 61 20 64 65 66 61 75  not make a defau
1db60 6c 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72  lt if the number
1db70 20 6f 66 20 72 75 6c 65 73 20 74 6f 20 64 65 66   of rules to def
1db80 61 75 6c 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e  ault.    ** is n
1db90 6f 74 20 61 74 20 6c 65 61 73 74 20 31 20 6f 72  ot at least 1 or
1dba0 20 69 66 20 74 68 65 20 77 69 6c 64 63 61 72 64   if the wildcard
1dbb0 20 74 6f 6b 65 6e 20 69 73 20 61 20 70 6f 73 73   token is a poss
1dbc0 69 62 6c 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 6b  ible.    ** look
1dbd0 61 68 65 61 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ahead..    */.  
1dbe0 20 20 69 66 28 20 6e 62 65 73 74 3c 31 20 7c 7c    if( nbest<1 ||
1dbf0 20 75 73 65 73 57 69 6c 64 63 61 72 64 20 29 20   usesWildcard ) 
1dc00 63 6f 6e 74 69 6e 75 65 3b 0a 0a 0a 20 20 20 20  continue;...    
1dc10 2f 2a 20 43 6f 6d 62 69 6e 65 20 6d 61 74 63 68  /* Combine match
1dc20 69 6e 67 20 52 45 44 55 43 45 20 61 63 74 69 6f  ing REDUCE actio
1dc30 6e 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  ns into a single
1dc40 20 64 65 66 61 75 6c 74 20 2a 2f 0a 20 20 20 20   default */.    
1dc50 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20  for(ap=stp->ap; 
1dc60 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
1dc70 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  {.      if( ap->
1dc80 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20  type==REDUCE && 
1dc90 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20  ap->x.rp==rbest 
1dca0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
1dcb0 20 20 20 61 73 73 65 72 74 28 20 61 70 20 29 3b     assert( ap );
1dcc0 0a 20 20 20 20 61 70 2d 3e 73 70 20 3d 20 53 79  .    ap->sp = Sy
1dcd0 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75  mbol_new("{defau
1dce0 6c 74 7d 22 29 3b 0a 20 20 20 20 66 6f 72 28 61  lt}");.    for(a
1dcf0 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3b 20  p=ap->next; ap; 
1dd00 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
1dd10 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65      if( ap->type
1dd20 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e  ==REDUCE && ap->
1dd30 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20 61 70  x.rp==rbest ) ap
1dd40 2d 3e 74 79 70 65 20 3d 20 4e 4f 54 5f 55 53 45  ->type = NOT_USE
1dd50 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 70  D;.    }.    stp
1dd60 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f  ->ap = Action_so
1dd70 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20 20 7d  rt(stp->ap);.  }
1dd80 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  .}.../*.** Compa
1dd90 72 65 20 74 77 6f 20 73 74 61 74 65 73 20 66 6f  re two states fo
1dda0 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73  r sorting purpos
1ddb0 65 73 2e 20 20 54 68 65 20 73 6d 61 6c 6c 65 72  es.  The smaller
1ddc0 20 73 74 61 74 65 20 69 73 20 74 68 65 0a 2a 2a   state is the.**
1ddd0 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d 6f   one with the mo
1dde0 73 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20  st non-terminal 
1ddf0 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65  actions.  If the
1de00 79 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  y have the same 
1de10 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 6e 6f 6e  number.** of non
1de20 2d 74 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e  -terminal action
1de30 73 2c 20 74 68 65 6e 20 74 68 65 20 73 6d 61 6c  s, then the smal
1de40 6c 65 72 20 69 73 20 74 68 65 20 6f 6e 65 20 77  ler is the one w
1de50 69 74 68 20 74 68 65 20 6d 6f 73 74 0a 2a 2a 20  ith the most.** 
1de60 74 6f 6b 65 6e 20 61 63 74 69 6f 6e 73 2e 0a 2a  token actions..*
1de70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 61  /.static int sta
1de80 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65 28  teResortCompare(
1de90 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63  const void *a, c
1dea0 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20  onst void *b){. 
1deb0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74   const struct st
1dec0 61 74 65 20 2a 70 41 20 3d 20 2a 28 63 6f 6e 73  ate *pA = *(cons
1ded0 74 20 73 74 72 75 63 74 20 73 74 61 74 65 2a 2a  t struct state**
1dee0 29 61 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  )a;.  const stru
1def0 63 74 20 73 74 61 74 65 20 2a 70 42 20 3d 20 2a  ct state *pB = *
1df00 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74  (const struct st
1df10 61 74 65 2a 2a 29 62 3b 0a 20 20 69 6e 74 20 6e  ate**)b;.  int n
1df20 3b 0a 0a 20 20 6e 20 3d 20 70 42 2d 3e 6e 4e 74  ;..  n = pB->nNt
1df30 41 63 74 20 2d 20 70 41 2d 3e 6e 4e 74 41 63 74  Act - pA->nNtAct
1df40 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a  ;.  if( n==0 ){.
1df50 20 20 20 20 6e 20 3d 20 70 42 2d 3e 6e 54 6b 6e      n = pB->nTkn
1df60 41 63 74 20 2d 20 70 41 2d 3e 6e 54 6b 6e 41 63  Act - pA->nTknAc
1df70 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
1df80 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e  n;.}.../*.** Ren
1df90 75 6d 62 65 72 20 61 6e 64 20 72 65 73 6f 72 74  umber and resort
1dfa0 20 73 74 61 74 65 73 20 73 6f 20 74 68 61 74 20   states so that 
1dfb0 73 74 61 74 65 73 20 77 69 74 68 20 66 65 77 65  states with fewe
1dfc0 72 20 63 68 6f 69 63 65 73 0a 2a 2a 20 6f 63 63  r choices.** occ
1dfd0 75 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ur at the end.  
1dfe0 45 78 63 65 70 74 2c 20 6b 65 65 70 20 73 74 61  Except, keep sta
1dff0 74 65 20 30 20 61 73 20 74 68 65 20 66 69 72 73  te 0 as the firs
1e000 74 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64  t state..*/.void
1e010 20 52 65 73 6f 72 74 53 74 61 74 65 73 28 6c 65   ResortStates(le
1e020 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
1e030 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20   *lemp;.{.  int 
1e040 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
1e050 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74  e *stp;.  struct
1e060 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 0a 20 20   action *ap;..  
1e070 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1e080 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
1e090 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
1e0a0 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 73 74  orted[i];.    st
1e0b0 70 2d 3e 6e 54 6b 6e 41 63 74 20 3d 20 73 74 70  p->nTknAct = stp
1e0c0 2d 3e 6e 4e 74 41 63 74 20 3d 20 30 3b 0a 20 20  ->nNtAct = 0;.  
1e0d0 20 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20 6c    stp->iDflt = l
1e0e0 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65  emp->nstate + le
1e0f0 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 20 20 73  mp->nrule;.    s
1e100 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 4e  tp->iTknOfst = N
1e110 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20 73 74  O_OFFSET;.    st
1e120 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 4e 4f 5f  p->iNtOfst = NO_
1e130 4f 46 46 53 45 54 3b 0a 20 20 20 20 66 6f 72 28  OFFSET;.    for(
1e140 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
1e150 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
1e160 20 20 20 20 69 66 28 20 63 6f 6d 70 75 74 65 5f      if( compute_
1e170 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70 29 3e  action(lemp,ap)>
1e180 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
1e190 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c  ( ap->sp->index<
1e1a0 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  lemp->nterminal 
1e1b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 70  ){.          stp
1e1c0 2d 3e 6e 54 6b 6e 41 63 74 2b 2b 3b 0a 20 20 20  ->nTknAct++;.   
1e1d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
1e1e0 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d  p->sp->index<lem
1e1f0 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20  p->nsymbol ){.  
1e200 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 4e 74          stp->nNt
1e210 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  Act++;.        }
1e220 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1e230 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20 63 6f 6d  stp->iDflt = com
1e240 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70  pute_action(lemp
1e250 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  , ap);.        }
1e260 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1e270 20 7d 0a 20 20 71 73 6f 72 74 28 26 6c 65 6d 70   }.  qsort(&lemp
1e280 2d 3e 73 6f 72 74 65 64 5b 31 5d 2c 20 6c 65 6d  ->sorted[1], lem
1e290 70 2d 3e 6e 73 74 61 74 65 2d 31 2c 20 73 69 7a  p->nstate-1, siz
1e2a0 65 6f 66 28 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  eof(lemp->sorted
1e2b0 5b 30 5d 29 2c 0a 20 20 20 20 20 20 20 20 73 74  [0]),.        st
1e2c0 61 74 65 52 65 73 6f 72 74 43 6f 6d 70 61 72 65  ateResortCompare
1e2d0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1e2e0 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
1e2f0 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 6f  +){.    lemp->so
1e300 72 74 65 64 5b 69 5d 2d 3e 73 74 61 74 65 6e 75  rted[i]->statenu
1e310 6d 20 3d 20 69 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  m = i;.  }.}.../
1e320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e330 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
1e340 22 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  "set.c" ********
1e350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
1e370 0a 2a 2a 20 53 65 74 20 6d 61 6e 69 70 75 6c 61  .** Set manipula
1e380 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 66 6f  tion routines fo
1e390 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  r the LEMON pars
1e3a0 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
1e3b0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 7a  ..static int siz
1e3c0 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74 20 74  e = 0;../* Set t
1e3d0 68 65 20 73 65 74 20 73 69 7a 65 20 2a 2f 0a 76  he set size */.v
1e3e0 6f 69 64 20 53 65 74 53 69 7a 65 28 6e 29 0a 69  oid SetSize(n).i
1e3f0 6e 74 20 6e 3b 0a 7b 0a 20 20 73 69 7a 65 20 3d  nt n;.{.  size =
1e400 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f   n+1;.}../* Allo
1e410 63 61 74 65 20 61 20 6e 65 77 20 73 65 74 20 2a  cate a new set *
1e420 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28 29  /.char *SetNew()
1e430 7b 0a 20 20 63 68 61 72 20 2a 73 3b 0a 20 20 73  {.  char *s;.  s
1e440 20 3d 20 28 63 68 61 72 2a 29 63 61 6c 6c 6f 63   = (char*)calloc
1e450 28 20 73 69 7a 65 2c 20 31 29 3b 0a 20 20 69 66  ( size, 1);.  if
1e460 28 20 73 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78  ( s==0 ){.    ex
1e470 74 65 72 6e 20 76 6f 69 64 20 6d 65 6d 6f 72 79  tern void memory
1e480 5f 65 72 72 6f 72 28 29 3b 0a 20 20 20 20 6d 65  _error();.    me
1e490 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20  mory_error();.  
1e4a0 7d 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a  }.  return s;.}.
1e4b0 0a 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61  ./* Deallocate a
1e4c0 20 73 65 74 20 2a 2f 0a 76 6f 69 64 20 53 65 74   set */.void Set
1e4d0 46 72 65 65 28 73 29 0a 63 68 61 72 20 2a 73 3b  Free(s).char *s;
1e4e0 0a 7b 0a 20 20 66 72 65 65 28 73 29 3b 0a 7d 0a  .{.  free(s);.}.
1e4f0 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  ./* Add a new el
1e500 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 73 65 74  ement to the set
1e510 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
1e520 66 20 74 68 65 20 65 6c 65 6d 65 6e 74 20 77 61  f the element wa
1e530 73 20 61 64 64 65 64 0a 2a 2a 20 61 6e 64 20 46  s added.** and F
1e540 41 4c 53 45 20 69 66 20 69 74 20 77 61 73 20 61  ALSE if it was a
1e550 6c 72 65 61 64 79 20 74 68 65 72 65 2e 20 2a 2f  lready there. */
1e560 0a 69 6e 74 20 53 65 74 41 64 64 28 73 2c 65 29  .int SetAdd(s,e)
1e570 0a 63 68 61 72 20 2a 73 3b 0a 69 6e 74 20 65 3b  .char *s;.int e;
1e580 0a 7b 0a 20 20 69 6e 74 20 72 76 3b 0a 20 20 61  .{.  int rv;.  a
1e590 73 73 65 72 74 28 20 65 3e 3d 30 20 26 26 20 65  ssert( e>=0 && e
1e5a0 3c 73 69 7a 65 20 29 3b 0a 20 20 72 76 20 3d 20  <size );.  rv = 
1e5b0 73 5b 65 5d 3b 0a 20 20 73 5b 65 5d 20 3d 20 31  s[e];.  s[e] = 1
1e5c0 3b 0a 20 20 72 65 74 75 72 6e 20 21 72 76 3b 0a  ;.  return !rv;.
1e5d0 7d 0a 0a 2f 2a 20 41 64 64 20 65 76 65 72 79 20  }../* Add every 
1e5e0 65 6c 65 6d 65 6e 74 20 6f 66 20 73 32 20 74 6f  element of s2 to
1e5f0 20 73 31 2e 20 20 52 65 74 75 72 6e 20 54 52 55   s1.  Return TRU
1e600 45 20 69 66 20 73 31 20 63 68 61 6e 67 65 73 2e  E if s1 changes.
1e610 20 2a 2f 0a 69 6e 74 20 53 65 74 55 6e 69 6f 6e   */.int SetUnion
1e620 28 73 31 2c 73 32 29 0a 63 68 61 72 20 2a 73 31  (s1,s2).char *s1
1e630 3b 0a 63 68 61 72 20 2a 73 32 3b 0a 7b 0a 20 20  ;.char *s2;.{.  
1e640 69 6e 74 20 69 2c 20 70 72 6f 67 72 65 73 73 3b  int i, progress;
1e650 0a 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b  .  progress = 0;
1e660 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
1e670 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ze; i++){.    if
1e680 28 20 73 32 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e  ( s2[i]==0 ) con
1e690 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73  tinue;.    if( s
1e6a0 31 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  1[i]==0 ){.     
1e6b0 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20   progress = 1;. 
1e6c0 20 20 20 20 20 73 31 5b 69 5d 20 3d 20 31 3b 0a       s1[i] = 1;.
1e6d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1e6e0 72 6e 20 70 72 6f 67 72 65 73 73 3b 0a 7d 0a 2f  rn progress;.}./
1e6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e700 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
1e710 66 69 6c 65 20 22 74 61 62 6c 65 2e 63 22 20 2a  file "table.c" *
1e720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
1e740 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74  ** All code in t
1e750 68 69 73 20 66 69 6c 65 20 68 61 73 20 62 65 65  his file has bee
1e760 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  n automatically 
1e770 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f  generated.** fro
1e780 6d 20 61 20 73 70 65 63 69 66 69 63 61 74 69 6f  m a specificatio
1e790 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a  n in the file.**
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74                "t
1e7b0 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68  able.q".** by th
1e7c0 65 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  e associative ar
1e7d0 72 61 79 20 63 6f 64 65 20 62 75 69 6c 64 69 6e  ray code buildin
1e7e0 67 20 70 72 6f 67 72 61 6d 20 22 61 61 67 65 6e  g program "aagen
1e7f0 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69  "..** Do not edi
1e800 74 20 74 68 69 73 20 66 69 6c 65 21 20 20 49 6e  t this file!  In
1e810 73 74 65 61 64 2c 20 65 64 69 74 20 74 68 65 20  stead, edit the 
1e820 73 70 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a  specification.**
1e830 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65 72 75   file, then reru
1e840 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a  n aagen..*/./*.*
1e850 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 6f 63 65  * Code for proce
1e860 73 73 69 6e 67 20 74 61 62 6c 65 73 20 69 6e 20  ssing tables in 
1e870 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
1e880 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
1e890 50 52 49 56 41 54 45 20 69 6e 74 20 73 74 72 68  PRIVATE int strh
1e8a0 61 73 68 28 78 29 0a 63 68 61 72 20 2a 78 3b 0a  ash(x).char *x;.
1e8b0 7b 0a 20 20 69 6e 74 20 68 20 3d 20 30 3b 0a 20  {.  int h = 0;. 
1e8c0 20 77 68 69 6c 65 28 20 2a 78 29 20 68 20 3d 20   while( *x) h = 
1e8d0 68 2a 31 33 20 2b 20 2a 28 78 2b 2b 29 3b 0a 20  h*13 + *(x++);. 
1e8e0 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a   return h;.}../*
1e8f0 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73 74 72 64   Works like strd
1e900 75 70 2c 20 73 6f 72 74 20 6f 66 2e 20 20 53 61  up, sort of.  Sa
1e910 76 65 20 61 20 73 74 72 69 6e 67 20 69 6e 20 6d  ve a string in m
1e920 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72 79 2c 20  alloced memory, 
1e930 62 75 74 0a 2a 2a 20 6b 65 65 70 20 73 74 72 69  but.** keep stri
1e940 6e 67 73 20 69 6e 20 61 20 74 61 62 6c 65 20 73  ngs in a table s
1e950 6f 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  o that the same 
1e960 73 74 72 69 6e 67 20 69 73 20 6e 6f 74 20 69 6e  string is not in
1e970 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e   more.** than on
1e980 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63 68 61 72  e place..*/.char
1e990 20 2a 53 74 72 73 61 66 65 28 79 29 0a 63 68 61   *Strsafe(y).cha
1e9a0 72 20 2a 79 3b 0a 7b 0a 20 20 63 68 61 72 20 2a  r *y;.{.  char *
1e9b0 7a 3b 0a 0a 20 20 69 66 28 20 79 3d 3d 30 20 29  z;..  if( y==0 )
1e9c0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 20 3d   return 0;.  z =
1e9d0 20 53 74 72 73 61 66 65 5f 66 69 6e 64 28 79 29   Strsafe_find(y)
1e9e0 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 26 26 20  ;.  if( z==0 && 
1e9f0 28 7a 3d 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e  (z=malloc( lemon
1ea00 53 74 72 6c 65 6e 28 79 29 2b 31 20 29 29 21 3d  Strlen(y)+1 ))!=
1ea10 30 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28  0 ){.    strcpy(
1ea20 7a 2c 79 29 3b 0a 20 20 20 20 53 74 72 73 61 66  z,y);.    Strsaf
1ea30 65 5f 69 6e 73 65 72 74 28 7a 29 3b 0a 20 20 7d  e_insert(z);.  }
1ea40 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 7a  .  MemoryCheck(z
1ea50 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  );.  return z;.}
1ea60 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
1ea70 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
1ea80 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1ea90 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a  cture for each.*
1eaa0 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  * associative ar
1eab0 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 31 22  ray of type "x1"
1eac0 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 31  ..*/.struct s_x1
1ead0 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20   {.  int size;  
1eae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1eaf0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  The number of av
1eb00 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a  ailable slots. *
1eb10 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
1eb30 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   Must be a power
1eb40 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68   of 2 greater th
1eb50 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  an or */.       
1eb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb70 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f     /*   equal to
1eb80 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e   1 */.  int coun
1eb90 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1eba0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
1ebb0 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c  rently slots fil
1ebc0 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  led */.  struct 
1ebd0 73 5f 78 31 6e 6f 64 65 20 2a 74 62 6c 3b 20 20  s_x1node *tbl;  
1ebe0 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72  /* The data stor
1ebf0 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72  ed here */.  str
1ec00 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 68  uct s_x1node **h
1ec10 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c  t;  /* Hash tabl
1ec20 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f  e for lookups */
1ec30 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  .};../* There is
1ec40 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
1ec50 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
1ec60 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65  for every data e
1ec70 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20  lement.** in an 
1ec80 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
1ec90 79 20 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a  y of type "x1"..
1eca0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1ecb0 74 20 73 5f 78 31 6e 6f 64 65 20 7b 0a 20 20 63  t s_x1node {.  c
1ecc0 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20  har *data;      
1ecd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1ece0 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72  he data */.  str
1ecf0 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 6e 65  uct s_x1node *ne
1ed00 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e  xt;   /* Next en
1ed10 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
1ed20 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75  e hash */.  stru
1ed30 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 66 72  ct s_x1node **fr
1ed40 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  om;  /* Previous
1ed50 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 31 6e 6f 64   link */.} x1nod
1ed60 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  e;../* There is 
1ed70 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63  only one instanc
1ed80 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20  e of the array, 
1ed90 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c  which is the fol
1eda0 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63  lowing */.static
1edb0 20 73 74 72 75 63 74 20 73 5f 78 31 20 2a 78 31   struct s_x1 *x1
1edc0 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  a;../* Allocate 
1edd0 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76  a new associativ
1ede0 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20  e array */.void 
1edf0 53 74 72 73 61 66 65 5f 69 6e 69 74 28 29 7b 0a  Strsafe_init(){.
1ee00 20 20 69 66 28 20 78 31 61 20 29 20 72 65 74 75    if( x1a ) retu
1ee10 72 6e 3b 0a 20 20 78 31 61 20 3d 20 28 73 74 72  rn;.  x1a = (str
1ee20 75 63 74 20 73 5f 78 31 2a 29 6d 61 6c 6c 6f 63  uct s_x1*)malloc
1ee30 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
1ee40 73 5f 78 31 29 20 29 3b 0a 20 20 69 66 28 20 78  s_x1) );.  if( x
1ee50 31 61 20 29 7b 0a 20 20 20 20 78 31 61 2d 3e 73  1a ){.    x1a->s
1ee60 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
1ee70 78 31 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a  x1a->count = 0;.
1ee80 20 20 20 20 78 31 61 2d 3e 74 62 6c 20 3d 20 28      x1a->tbl = (
1ee90 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20  x1node*)malloc( 
1eea0 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
1eeb0 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  1node) + sizeof(
1eec0 78 31 6e 6f 64 65 2a 29 29 2a 31 30 32 34 20 29  x1node*))*1024 )
1eed0 3b 0a 20 20 20 20 69 66 28 20 78 31 61 2d 3e 74  ;.    if( x1a->t
1eee0 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  bl==0 ){.      f
1eef0 72 65 65 28 78 31 61 29 3b 0a 20 20 20 20 20 20  ree(x1a);.      
1ef00 78 31 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  x1a = 0;.    }el
1ef10 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
1ef20 0a 20 20 20 20 20 20 78 31 61 2d 3e 68 74 20 3d  .      x1a->ht =
1ef30 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28 78 31 61   (x1node**)&(x1a
1ef40 2d 3e 74 62 6c 5b 31 30 32 34 5d 29 3b 0a 20 20  ->tbl[1024]);.  
1ef50 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
1ef60 30 32 34 3b 20 69 2b 2b 29 20 78 31 61 2d 3e 68  024; i++) x1a->h
1ef70 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  t[i] = 0;.    }.
1ef80 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20    }.}./* Insert 
1ef90 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  a new record int
1efa0 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65  o the array.  Re
1efb0 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63  turn TRUE if suc
1efc0 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f  cessful..** Prio
1efd0 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20  r data with the 
1efe0 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20  same key is NOT 
1eff0 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69  overwritten */.i
1f000 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72  nt Strsafe_inser
1f010 74 28 64 61 74 61 29 0a 63 68 61 72 20 2a 64 61  t(data).char *da
1f020 74 61 3b 0a 7b 0a 20 20 78 31 6e 6f 64 65 20 2a  ta;.{.  x1node *
1f030 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69  np;.  int h;.  i
1f040 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 31  nt ph;..  if( x1
1f050 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
1f060 0a 20 20 70 68 20 3d 20 73 74 72 68 61 73 68 28  .  ph = strhash(
1f070 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20  data);.  h = ph 
1f080 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x1a->size-1);
1f090 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b  .  np = x1a->ht[
1f0a0 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
1f0b0 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
1f0c0 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61 29  p(np->data,data)
1f0d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
1f0e0 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  An existing entr
1f0f0 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
1f100 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f  key is found. */
1f110 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62  .      /* Fail b
1f120 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65  ecause overwrite
1f130 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20   is not allows. 
1f140 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1f150 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20  0;.    }.    np 
1f160 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
1f170 20 20 69 66 28 20 78 31 61 2d 3e 63 6f 75 6e 74    if( x1a->count
1f180 3e 3d 78 31 61 2d 3e 73 69 7a 65 20 29 7b 0a 20  >=x1a->size ){. 
1f190 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61     /* Need to ma
1f1a0 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  ke the hash tabl
1f1b0 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20  e bigger */.    
1f1c0 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20  int i,size;.    
1f1d0 73 74 72 75 63 74 20 73 5f 78 31 20 61 72 72 61  struct s_x1 arra
1f1e0 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a  y;.    array.siz
1f1f0 65 20 3d 20 73 69 7a 65 20 3d 20 78 31 61 2d 3e  e = size = x1a->
1f200 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61  size*2;.    arra
1f210 79 2e 63 6f 75 6e 74 20 3d 20 78 31 61 2d 3e 63  y.count = x1a->c
1f220 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e  ount;.    array.
1f230 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29 6d  tbl = (x1node*)m
1f240 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69  alloc(.      (si
1f250 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73  zeof(x1node) + s
1f260 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 2a  izeof(x1node*))*
1f270 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  size );.    if( 
1f280 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72  array.tbl==0 ) r
1f290 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69  eturn 0;  /* Fai
1f2a0 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20  l due to malloc 
1f2b0 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61  failure */.    a
1f2c0 72 72 61 79 2e 68 74 20 3d 20 28 78 31 6e 6f 64  rray.ht = (x1nod
1f2d0 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b  e**)&(array.tbl[
1f2e0 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28  size]);.    for(
1f2f0 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b  i=0; i<size; i++
1f300 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20  ) array.ht[i] = 
1f310 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
1f320 69 3c 78 31 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b  i<x1a->count; i+
1f330 2b 29 7b 0a 20 20 20 20 20 20 78 31 6e 6f 64 65  +){.      x1node
1f340 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b   *oldnp, *newnp;
1f350 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26  .      oldnp = &
1f360 28 78 31 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20  (x1a->tbl[i]);. 
1f370 20 20 20 20 20 68 20 3d 20 73 74 72 68 61 73 68       h = strhash
1f380 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26 20  (oldnp->data) & 
1f390 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  (size-1);.      
1f3a0 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e  newnp = &(array.
1f3b0 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69  tbl[i]);.      i
1f3c0 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29  f( array.ht[h] )
1f3d0 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72   array.ht[h]->fr
1f3e0 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65  om = &(newnp->ne
1f3f0 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  xt);.      newnp
1f400 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68  ->next = array.h
1f410 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e  t[h];.      newn
1f420 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d  p->data = oldnp-
1f430 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77  >data;.      new
1f440 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72  np->from = &(arr
1f450 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20  ay.ht[h]);.     
1f460 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e   array.ht[h] = n
1f470 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ewnp;.    }.    
1f480 66 72 65 65 28 78 31 61 2d 3e 74 62 6c 29 3b 0a  free(x1a->tbl);.
1f490 20 20 20 20 2a 78 31 61 20 3d 20 61 72 72 61 79      *x1a = array
1f4a0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  ;.  }.  /* Inser
1f4b0 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a  t the new data *
1f4c0 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 31  /.  h = ph & (x1
1f4d0 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
1f4e0 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 78 31   = &(x1a->tbl[x1
1f4f0 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20  a->count++]);.  
1f500 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b  np->data = data;
1f510 0a 20 20 69 66 28 20 78 31 61 2d 3e 68 74 5b 68  .  if( x1a->ht[h
1f520 5d 20 29 20 78 31 61 2d 3e 68 74 5b 68 5d 2d 3e  ] ) x1a->ht[h]->
1f530 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78  from = &(np->nex
1f540 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d  t);.  np->next =
1f550 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78   x1a->ht[h];.  x
1f560 31 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a  1a->ht[h] = np;.
1f570 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78    np->from = &(x
1f580 31 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65  1a->ht[h]);.  re
1f590 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65  turn 1;.}../* Re
1f5a0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1f5b0 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20  o data assigned 
1f5c0 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79  to the given key
1f5d0 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a  .  Return NULL.*
1f5e0 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79  * if no such key
1f5f0 2e 20 2a 2f 0a 63 68 61 72 20 2a 53 74 72 73 61  . */.char *Strsa
1f600 66 65 5f 66 69 6e 64 28 6b 65 79 29 0a 63 68 61  fe_find(key).cha
1f610 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20  r *key;.{.  int 
1f620 68 3b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b  h;.  x1node *np;
1f630 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d 30 20 29  ..  if( x1a==0 )
1f640 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d   return 0;.  h =
1f650 20 73 74 72 68 61 73 68 28 6b 65 79 29 20 26 20   strhash(key) & 
1f660 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x1a->size-1);. 
1f670 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d   np = x1a->ht[h]
1f680 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
1f690 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
1f6a0 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29 3d 3d 30  np->data,key)==0
1f6b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70   ) break;.    np
1f6c0 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
1f6d0 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e  .  return np ? n
1f6e0 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a  p->data : 0;.}..
1f6f0 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
1f700 74 65 72 20 74 6f 20 74 68 65 20 28 74 65 72 6d  ter to the (term
1f710 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74 65 72 6d 69  inal or nontermi
1f720 6e 61 6c 29 20 73 79 6d 62 6f 6c 20 22 78 22 2e  nal) symbol "x".
1f730 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1f740 20 73 79 6d 62 6f 6c 20 69 66 20 74 68 69 73 20   symbol if this 
1f750 69 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  is the first tim
1f760 65 20 22 78 22 20 68 61 73 20 62 65 65 6e 20 73  e "x" has been s
1f770 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73  een..*/.struct s
1f780 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65  ymbol *Symbol_ne
1f790 77 28 78 29 0a 63 68 61 72 20 2a 78 3b 0a 7b 0a  w(x).char *x;.{.
1f7a0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1f7b0 2a 73 70 3b 0a 0a 20 20 73 70 20 3d 20 53 79 6d  *sp;..  sp = Sym
1f7c0 62 6f 6c 5f 66 69 6e 64 28 78 29 3b 0a 20 20 69  bol_find(x);.  i
1f7d0 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20  f( sp==0 ){.    
1f7e0 73 70 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d  sp = (struct sym
1f7f0 62 6f 6c 20 2a 29 63 61 6c 6c 6f 63 28 31 2c 20  bol *)calloc(1, 
1f800 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79  sizeof(struct sy
1f810 6d 62 6f 6c 29 20 29 3b 0a 20 20 20 20 4d 65 6d  mbol) );.    Mem
1f820 6f 72 79 43 68 65 63 6b 28 73 70 29 3b 0a 20 20  oryCheck(sp);.  
1f830 20 20 73 70 2d 3e 6e 61 6d 65 20 3d 20 53 74 72    sp->name = Str
1f840 73 61 66 65 28 78 29 3b 0a 20 20 20 20 73 70 2d  safe(x);.    sp-
1f850 3e 74 79 70 65 20 3d 20 69 73 75 70 70 65 72 28  >type = isupper(
1f860 2a 78 29 20 3f 20 54 45 52 4d 49 4e 41 4c 20 3a  *x) ? TERMINAL :
1f870 20 4e 4f 4e 54 45 52 4d 49 4e 41 4c 3b 0a 20 20   NONTERMINAL;.  
1f880 20 20 73 70 2d 3e 72 75 6c 65 20 3d 20 30 3b 0a    sp->rule = 0;.
1f890 20 20 20 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b      sp->fallback
1f8a0 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 70 72   = 0;.    sp->pr
1f8b0 65 63 20 3d 20 2d 31 3b 0a 20 20 20 20 73 70 2d  ec = -1;.    sp-
1f8c0 3e 61 73 73 6f 63 20 3d 20 55 4e 4b 3b 0a 20 20  >assoc = UNK;.  
1f8d0 20 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20 3d    sp->firstset =
1f8e0 20 30 3b 0a 20 20 20 20 73 70 2d 3e 6c 61 6d 62   0;.    sp->lamb
1f8f0 64 61 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45  da = LEMON_FALSE
1f900 3b 0a 20 20 20 20 73 70 2d 3e 64 65 73 74 72 75  ;.    sp->destru
1f910 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73 70  ctor = 0;.    sp
1f920 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 20 3d 20 30  ->destLineno = 0
1f930 3b 0a 20 20 20 20 73 70 2d 3e 64 61 74 61 74 79  ;.    sp->dataty
1f940 70 65 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  pe = 0;.    sp->
1f950 75 73 65 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20  useCnt = 0;.    
1f960 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73 70  Symbol_insert(sp
1f970 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a  ,sp->name);.  }.
1f980 20 20 73 70 2d 3e 75 73 65 43 6e 74 2b 2b 3b 0a    sp->useCnt++;.
1f990 20 20 72 65 74 75 72 6e 20 73 70 3b 0a 7d 0a 0a    return sp;.}..
1f9a0 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73  /* Compare two s
1f9b0 79 6d 62 6f 6c 73 20 66 6f 72 20 77 6f 72 6b 69  ymbols for worki
1f9c0 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2a 0a 2a  ng purposes.**.*
1f9d0 2a 20 53 79 6d 62 6f 6c 73 20 74 68 61 74 20 62  * Symbols that b
1f9e0 65 67 69 6e 20 77 69 74 68 20 75 70 70 65 72 20  egin with upper 
1f9f0 63 61 73 65 20 6c 65 74 74 65 72 73 20 28 74 65  case letters (te
1fa00 72 6d 69 6e 61 6c 73 20 6f 72 20 74 6f 6b 65 6e  rminals or token
1fa10 73 29 0a 2a 2a 20 6d 75 73 74 20 73 6f 72 74 20  s).** must sort 
1fa20 62 65 66 6f 72 65 20 73 79 6d 62 6f 6c 73 20 74  before symbols t
1fa30 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 6c  hat begin with l
1fa40 6f 77 65 72 20 63 61 73 65 20 6c 65 74 74 65 72  ower case letter
1fa50 73 0a 2a 2a 20 28 6e 6f 6e 2d 74 65 72 6d 69 6e  s.** (non-termin
1fa60 61 6c 73 29 2e 20 20 4f 74 68 65 72 20 74 68 61  als).  Other tha
1fa70 6e 20 74 68 61 74 2c 20 74 68 65 20 6f 72 64 65  n that, the orde
1fa80 72 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  r does not matte
1fa90 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 66 69 6e 64  r..**.** We find
1faa0 20 65 78 70 65 72 69 6d 65 6e 74 61 6c 6c 79 20   experimentally 
1fab0 74 68 61 74 20 6c 65 61 76 69 6e 67 20 74 68 65  that leaving the
1fac0 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 69   symbols in thei
1fad0 72 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 6f 72  r original.** or
1fae0 64 65 72 20 28 74 68 65 20 6f 72 64 65 72 20 74  der (the order t
1faf0 68 65 79 20 61 70 70 65 61 72 65 64 20 69 6e 20  hey appeared in 
1fb00 74 68 65 20 67 72 61 6d 6d 61 72 20 66 69 6c 65  the grammar file
1fb10 29 20 67 69 76 65 73 20 74 68 65 0a 2a 2a 20 73  ) gives the.** s
1fb20 6d 61 6c 6c 65 73 74 20 70 61 72 73 65 72 20 74  mallest parser t
1fb30 61 62 6c 65 73 20 69 6e 20 53 51 4c 69 74 65 2e  ables in SQLite.
1fb40 0a 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 63 6d  .*/.int Symbolcm
1fb50 70 70 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  pp(struct symbol
1fb60 20 2a 2a 61 2c 20 73 74 72 75 63 74 20 73 79 6d   **a, struct sym
1fb70 62 6f 6c 20 2a 2a 62 29 7b 0a 20 20 69 6e 74 20  bol **b){.  int 
1fb80 69 31 20 3d 20 28 2a 2a 61 29 2e 69 6e 64 65 78  i1 = (**a).index
1fb90 20 2b 20 31 30 30 30 30 30 30 30 2a 28 28 2a 2a   + 10000000*((**
1fba0 61 29 2e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 29 3b  a).name[0]>'Z');
1fbb0 0a 20 20 69 6e 74 20 69 32 20 3d 20 28 2a 2a 62  .  int i2 = (**b
1fbc0 29 2e 69 6e 64 65 78 20 2b 20 31 30 30 30 30 30  ).index + 100000
1fbd0 30 30 2a 28 28 2a 2a 62 29 2e 6e 61 6d 65 5b 30  00*((**b).name[0
1fbe0 5d 3e 27 5a 27 29 3b 0a 20 20 72 65 74 75 72 6e  ]>'Z');.  return
1fbf0 20 69 31 2d 69 32 3b 0a 7d 0a 0a 2f 2a 20 54 68   i1-i2;.}../* Th
1fc00 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
1fc10 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1fc20 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66  wing structure f
1fc30 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63  or each.** assoc
1fc40 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
1fc50 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 73 74  type "x2"..*/.st
1fc60 72 75 63 74 20 73 5f 78 32 20 7b 0a 20 20 69 6e  ruct s_x2 {.  in
1fc70 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
1fc80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
1fc90 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
1fca0 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20   slots. */.     
1fcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcc0 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62       /*   Must b
1fcd0 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67  e a power of 2 g
1fce0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a  reater than or *
1fcf0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1fd00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
1fd10 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20   equal to 1 */. 
1fd20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20   int count;     
1fd30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1fd40 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20  er of currently 
1fd50 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a  slots filled */.
1fd60 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64    struct s_x2nod
1fd70 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20  e *tbl;  /* The 
1fd80 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65  data stored here
1fd90 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
1fda0 32 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20  2node **ht;  /* 
1fdb0 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c  Hash table for l
1fdc0 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ookups */.};../*
1fdd0 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
1fde0 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
1fdf0 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65  tructure for eve
1fe00 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a  ry data element.
1fe10 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61  ** in an associa
1fe20 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
1fe30 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 74 79 70 65  pe "x2"..*/.type
1fe40 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 32 6e  def struct s_x2n
1fe50 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ode {.  struct s
1fe60 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 20 20 20 20  ymbol *data;    
1fe70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fe80 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 63   The data */.  c
1fe90 68 61 72 20 2a 6b 65 79 3b 20 20 20 20 20 20 20  har *key;       
1fea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1feb0 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75  he key */.  stru
1fec0 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 6e 65 78  ct s_x2node *nex
1fed0 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74  t;   /* Next ent
1fee0 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
1fef0 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63   hash */.  struc
1ff00 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 66 72 6f  t s_x2node **fro
1ff10 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20  m;  /* Previous 
1ff20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 32 6e 6f 64 65  link */.} x2node
1ff30 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
1ff40 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  nly one instance
1ff50 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77   of the array, w
1ff60 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c  hich is the foll
1ff70 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20  owing */.static 
1ff80 73 74 72 75 63 74 20 73 5f 78 32 20 2a 78 32 61  struct s_x2 *x2a
1ff90 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  ;../* Allocate a
1ffa0 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65   new associative
1ffb0 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53   array */.void S
1ffc0 79 6d 62 6f 6c 5f 69 6e 69 74 28 29 7b 0a 20 20  ymbol_init(){.  
1ffd0 69 66 28 20 78 32 61 20 29 20 72 65 74 75 72 6e  if( x2a ) return
1ffe0 3b 0a 20 20 78 32 61 20 3d 20 28 73 74 72 75 63  ;.  x2a = (struc
1fff0 74 20 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63 28 20  t s_x2*)malloc( 
20000 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f  sizeof(struct s_
20010 78 32 29 20 29 3b 0a 20 20 69 66 28 20 78 32 61  x2) );.  if( x2a
20020 20 29 7b 0a 20 20 20 20 78 32 61 2d 3e 73 69 7a   ){.    x2a->siz
20030 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 32 61  e = 128;.    x2a
20040 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ->count = 0;.   
20050 20 78 32 61 2d 3e 74 62 6c 20 3d 20 28 78 32 6e   x2a->tbl = (x2n
20060 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20  ode*)malloc( .  
20070 20 20 20 20 28 73 69 7a 65 6f 66 28 78 32 6e 6f      (sizeof(x2no
20080 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e  de) + sizeof(x2n
20090 6f 64 65 2a 29 29 2a 31 32 38 20 29 3b 0a 20 20  ode*))*128 );.  
200a0 20 20 69 66 28 20 78 32 61 2d 3e 74 62 6c 3d 3d    if( x2a->tbl==
200b0 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
200c0 78 32 61 29 3b 0a 20 20 20 20 20 20 78 32 61 20  x2a);.      x2a 
200d0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
200e0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
200f0 20 20 20 78 32 61 2d 3e 68 74 20 3d 20 28 78 32     x2a->ht = (x2
20100 6e 6f 64 65 2a 2a 29 26 28 78 32 61 2d 3e 74 62  node**)&(x2a->tb
20110 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66  l[128]);.      f
20120 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69  or(i=0; i<128; i
20130 2b 2b 29 20 78 32 61 2d 3e 68 74 5b 69 5d 20 3d  ++) x2a->ht[i] =
20140 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   0;.    }.  }.}.
20150 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20  /* Insert a new 
20160 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
20170 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54  array.  Return T
20180 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75  RUE if successfu
20190 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61  l..** Prior data
201a0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
201b0 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72  ey is NOT overwr
201c0 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d  itten */.int Sym
201d0 62 6f 6c 5f 69 6e 73 65 72 74 28 64 61 74 61 2c  bol_insert(data,
201e0 6b 65 79 29 0a 73 74 72 75 63 74 20 73 79 6d 62  key).struct symb
201f0 6f 6c 20 2a 64 61 74 61 3b 0a 63 68 61 72 20 2a  ol *data;.char *
20200 6b 65 79 3b 0a 7b 0a 20 20 78 32 6e 6f 64 65 20  key;.{.  x2node 
20210 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20  *np;.  int h;.  
20220 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78  int ph;..  if( x
20230 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  2a==0 ) return 0
20240 3b 0a 20 20 70 68 20 3d 20 73 74 72 68 61 73 68  ;.  ph = strhash
20250 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70 68 20  (key);.  h = ph 
20260 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x2a->size-1);
20270 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b  .  np = x2a->ht[
20280 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
20290 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
202a0 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d  p(np->key,key)==
202b0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  0 ){.      /* An
202c0 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
202d0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
202e0 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20  y is found. */. 
202f0 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63       /* Fail bec
20300 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69  ause overwrite i
20310 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f  s not allows. */
20320 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
20330 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20  .    }.    np = 
20340 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
20350 69 66 28 20 78 32 61 2d 3e 63 6f 75 6e 74 3e 3d  if( x2a->count>=
20360 78 32 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20  x2a->size ){.   
20370 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65   /* Need to make
20380 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
20390 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e  bigger */.    in
203a0 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74  t i,size;.    st
203b0 72 75 63 74 20 73 5f 78 32 20 61 72 72 61 79 3b  ruct s_x2 array;
203c0 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20  .    array.size 
203d0 3d 20 73 69 7a 65 20 3d 20 78 32 61 2d 3e 73 69  = size = x2a->si
203e0 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e  ze*2;.    array.
203f0 63 6f 75 6e 74 20 3d 20 78 32 61 2d 3e 63 6f 75  count = x2a->cou
20400 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62  nt;.    array.tb
20410 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 6d 61 6c  l = (x2node*)mal
20420 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65  loc(.      (size
20430 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x2node) + siz
20440 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 2a 73 69  eof(x2node*))*si
20450 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72  ze );.    if( ar
20460 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74  ray.tbl==0 ) ret
20470 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20  urn 0;  /* Fail 
20480 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61  due to malloc fa
20490 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72  ilure */.    arr
204a0 61 79 2e 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a  ay.ht = (x2node*
204b0 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69  *)&(array.tbl[si
204c0 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ze]);.    for(i=
204d0 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20  0; i<size; i++) 
204e0 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b  array.ht[i] = 0;
204f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
20500 78 32 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29  x2a->count; i++)
20510 7b 0a 20 20 20 20 20 20 78 32 6e 6f 64 65 20 2a  {.      x2node *
20520 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20  oldnp, *newnp;. 
20530 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78       oldnp = &(x
20540 32 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  2a->tbl[i]);.   
20550 20 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6f     h = strhash(o
20560 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 73 69  ldnp->key) & (si
20570 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77  ze-1);.      new
20580 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c  np = &(array.tbl
20590 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
205a0 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72  array.ht[h] ) ar
205b0 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  ray.ht[h]->from 
205c0 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29  = &(newnp->next)
205d0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e  ;.      newnp->n
205e0 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68  ext = array.ht[h
205f0 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  ];.      newnp->
20600 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79  key = oldnp->key
20610 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64  ;.      newnp->d
20620 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74  ata = oldnp->dat
20630 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  a;.      newnp->
20640 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68  from = &(array.h
20650 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72  t[h]);.      arr
20660 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70  ay.ht[h] = newnp
20670 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
20680 28 78 32 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20  (x2a->tbl);.    
20690 2a 78 32 61 20 3d 20 61 72 72 61 79 3b 0a 20 20  *x2a = array;.  
206a0 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  }.  /* Insert th
206b0 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20  e new data */.  
206c0 68 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73  h = ph & (x2a->s
206d0 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26  ize-1);.  np = &
206e0 28 78 32 61 2d 3e 74 62 6c 5b 78 32 61 2d 3e 63  (x2a->tbl[x2a->c
206f0 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e  ount++]);.  np->
20700 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d  key = key;.  np-
20710 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20  >data = data;.  
20720 69 66 28 20 78 32 61 2d 3e 68 74 5b 68 5d 20 29  if( x2a->ht[h] )
20730 20 78 32 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f   x2a->ht[h]->fro
20740 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b  m = &(np->next);
20750 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 32  .  np->next = x2
20760 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 32 61 2d  a->ht[h];.  x2a-
20770 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e  >ht[h] = np;.  n
20780 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 32 61 2d  p->from = &(x2a-
20790 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72  >ht[h]);.  retur
207a0 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  n 1;.}../* Retur
207b0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  n a pointer to d
207c0 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20  ata assigned to 
207d0 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20  the given key.  
207e0 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69  Return NULL.** i
207f0 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a  f no such key. *
20800 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  /.struct symbol 
20810 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6b 65 79  *Symbol_find(key
20820 29 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20  ).char *key;.{. 
20830 20 69 6e 74 20 68 3b 0a 20 20 78 32 6e 6f 64 65   int h;.  x2node
20840 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 32 61   *np;..  if( x2a
20850 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
20860 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65    h = strhash(ke
20870 79 29 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d  y) & (x2a->size-
20880 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e  1);.  np = x2a->
20890 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
208a0 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  np ){.    if( st
208b0 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79  rcmp(np->key,key
208c0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
208d0 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
208e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70  .  }.  return np
208f0 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b   ? np->data : 0;
20900 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68  .}../* Return th
20910 65 20 6e 2d 74 68 20 64 61 74 61 2e 20 20 52 65  e n-th data.  Re
20920 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 20 69  turn NULL if n i
20930 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20  s out of range. 
20940 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  */.struct symbol
20950 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 6e 29 0a   *Symbol_Nth(n).
20960 69 6e 74 20 6e 3b 0a 7b 0a 20 20 73 74 72 75 63  int n;.{.  struc
20970 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a  t symbol *data;.
20980 20 20 69 66 28 20 78 32 61 20 26 26 20 6e 3e 30    if( x2a && n>0
20990 20 26 26 20 6e 3c 3d 78 32 61 2d 3e 63 6f 75 6e   && n<=x2a->coun
209a0 74 20 29 7b 0a 20 20 20 20 64 61 74 61 20 3d 20  t ){.    data = 
209b0 78 32 61 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e 64 61  x2a->tbl[n-1].da
209c0 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ta;.  }else{.   
209d0 20 64 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20   data = 0;.  }. 
209e0 20 72 65 74 75 72 6e 20 64 61 74 61 3b 0a 7d 0a   return data;.}.
209f0 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  ./* Return the s
20a00 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  ize of the array
20a10 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63   */.int Symbol_c
20a20 6f 75 6e 74 28 29 0a 7b 0a 20 20 72 65 74 75 72  ount().{.  retur
20a30 6e 20 78 32 61 20 3f 20 78 32 61 2d 3e 63 6f 75  n x2a ? x2a->cou
20a40 6e 74 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65  nt : 0;.}../* Re
20a50 74 75 72 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  turn an array of
20a60 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
20a70 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 61 62   data in the tab
20a80 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72 61 79  le..** The array
20a90 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
20aa0 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72  m malloc.  Retur
20ab0 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79  n NULL if memory
20ac0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70   allocation.** p
20ad0 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74  roblems, or if t
20ae0 68 65 20 61 72 72 61 79 20 69 73 20 65 6d 70 74  he array is empt
20af0 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d  y. */.struct sym
20b00 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72  bol **Symbol_arr
20b10 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75 63  ayof().{.  struc
20b20 74 20 73 79 6d 62 6f 6c 20 2a 2a 61 72 72 61 79  t symbol **array
20b30 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a  ;.  int i,size;.
20b40 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72    if( x2a==0 ) r
20b50 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65 20  eturn 0;.  size 
20b60 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x2a->count;.  
20b70 61 72 72 61 79 20 3d 20 28 73 74 72 75 63 74 20  array = (struct 
20b80 73 79 6d 62 6f 6c 20 2a 2a 29 63 61 6c 6c 6f 63  symbol **)calloc
20b90 28 73 69 7a 65 2c 20 73 69 7a 65 6f 66 28 73 74  (size, sizeof(st
20ba0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 29 3b  ruct symbol *));
20bb0 0a 20 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a  .  if( array ){.
20bc0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
20bd0 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b  ize; i++) array[
20be0 69 5d 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 69 5d  i] = x2a->tbl[i]
20bf0 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74  .data;.  }.  ret
20c00 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a  urn array;.}../*
20c10 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 63 6f 6e   Compare two con
20c20 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 69  figurations */.i
20c30 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28 61 2c 62  nt Configcmp(a,b
20c40 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ).struct config 
20c50 2a 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  *a;.struct confi
20c60 67 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20 78 3b  g *b;.{.  int x;
20c70 0a 20 20 78 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e  .  x = a->rp->in
20c80 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64  dex - b->rp->ind
20c90 65 78 3b 0a 20 20 69 66 28 20 78 3d 3d 30 20 29  ex;.  if( x==0 )
20ca0 20 78 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d   x = a->dot - b-
20cb0 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 78  >dot;.  return x
20cc0 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20  ;.}../* Compare 
20cd0 74 77 6f 20 73 74 61 74 65 73 20 2a 2f 0a 50 52  two states */.PR
20ce0 49 56 41 54 45 20 69 6e 74 20 73 74 61 74 65 63  IVATE int statec
20cf0 6d 70 28 61 2c 62 29 0a 73 74 72 75 63 74 20 63  mp(a,b).struct c
20d00 6f 6e 66 69 67 20 2a 61 3b 0a 73 74 72 75 63 74  onfig *a;.struct
20d10 20 63 6f 6e 66 69 67 20 2a 62 3b 0a 7b 0a 20 20   config *b;.{.  
20d20 69 6e 74 20 72 63 3b 0a 20 20 66 6f 72 28 72 63  int rc;.  for(rc
20d30 3d 30 3b 20 72 63 3d 3d 30 20 26 26 20 61 20 26  =0; rc==0 && a &
20d40 26 20 62 3b 20 20 61 3d 61 2d 3e 62 70 2c 20 62  & b;  a=a->bp, b
20d50 3d 62 2d 3e 62 70 29 7b 0a 20 20 20 20 72 63 20  =b->bp){.    rc 
20d60 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d  = a->rp->index -
20d70 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20   b->rp->index;. 
20d80 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72     if( rc==0 ) r
20d90 63 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e  c = a->dot - b->
20da0 64 6f 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  dot;.  }.  if( r
20db0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c==0 ){.    if( 
20dc0 61 20 29 20 72 63 20 3d 20 31 3b 0a 20 20 20 20  a ) rc = 1;.    
20dd0 69 66 28 20 62 20 29 20 72 63 20 3d 20 2d 31 3b  if( b ) rc = -1;
20de0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
20df0 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 73  ;.}../* Hash a s
20e00 74 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45 20  tate */.PRIVATE 
20e10 69 6e 74 20 73 74 61 74 65 68 61 73 68 28 61 29  int statehash(a)
20e20 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
20e30 61 3b 0a 7b 0a 20 20 69 6e 74 20 68 3d 30 3b 0a  a;.{.  int h=0;.
20e40 20 20 77 68 69 6c 65 28 20 61 20 29 7b 0a 20 20    while( a ){.  
20e50 20 20 68 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d    h = h*571 + a-
20e60 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20  >rp->index*37 + 
20e70 61 2d 3e 64 6f 74 3b 0a 20 20 20 20 61 20 3d 20  a->dot;.    a = 
20e80 61 2d 3e 62 70 3b 0a 20 20 7d 0a 20 20 72 65 74  a->bp;.  }.  ret
20e90 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c  urn h;.}../* All
20ea0 6f 63 61 74 65 20 61 20 6e 65 77 20 73 74 61 74  ocate a new stat
20eb0 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 73  e structure */.s
20ec0 74 72 75 63 74 20 73 74 61 74 65 20 2a 53 74 61  truct state *Sta
20ed0 74 65 5f 6e 65 77 28 29 0a 7b 0a 20 20 73 74 72  te_new().{.  str
20ee0 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77 3b 0a  uct state *new;.
20ef0 20 20 6e 65 77 20 3d 20 28 73 74 72 75 63 74 20    new = (struct 
20f00 73 74 61 74 65 20 2a 29 63 61 6c 6c 6f 63 28 31  state *)calloc(1
20f10 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  , sizeof(struct 
20f20 73 74 61 74 65 29 20 29 3b 0a 20 20 4d 65 6d 6f  state) );.  Memo
20f30 72 79 43 68 65 63 6b 28 6e 65 77 29 3b 0a 20 20  ryCheck(new);.  
20f40 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f  return new;.}../
20f50 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
20f60 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
20f70 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
20f80 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61  re for each.** a
20f90 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
20fa0 20 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a   of type "x3"..*
20fb0 2f 0a 73 74 72 75 63 74 20 73 5f 78 33 20 7b 0a  /.struct s_x3 {.
20fc0 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
20fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20fe0 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
20ff0 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20  able slots. */. 
21000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21010 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75           /*   Mu
21020 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
21030 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20   2 greater than 
21040 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
21050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21060 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20  /*   equal to 1 
21070 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20  */.  int count; 
21080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21090 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e  Number of curren
210a0 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64  tly slots filled
210b0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
210c0 33 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20  3node *tbl;  /* 
210d0 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20  The data stored 
210e0 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  here */.  struct
210f0 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 68 74 3b 20   s_x3node **ht; 
21100 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66   /* Hash table f
21110 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b  or lookups */.};
21120 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
21130 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
21140 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
21150 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d   every data elem
21160 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73  ent.** in an ass
21170 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
21180 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a  f type "x3"..*/.
21190 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
211a0 5f 78 33 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75  _x3node {.  stru
211b0 63 74 20 73 74 61 74 65 20 2a 64 61 74 61 3b 20  ct state *data; 
211c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211d0 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
211e0 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
211f0 2a 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  *key;           
21200 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b          /* The k
21210 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ey */.  struct s
21220 5f 78 33 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20  _x3node *next;  
21230 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77   /* Next entry w
21240 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73  ith the same has
21250 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  h */.  struct s_
21260 78 33 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20  x3node **from;  
21270 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b  /* Previous link
21280 20 2a 2f 0a 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f   */.} x3node;../
21290 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  * There is only 
212a0 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
212b0 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68  the array, which
212c0 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   is the followin
212d0 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  g */.static stru
212e0 63 74 20 73 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f  ct s_x3 *x3a;../
212f0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
21300 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
21310 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74 61 74 65  ay */.void State
21320 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78  _init(){.  if( x
21330 33 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78  3a ) return;.  x
21340 33 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78  3a = (struct s_x
21350 33 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  3*)malloc( sizeo
21360 66 28 73 74 72 75 63 74 20 73 5f 78 33 29 20 29  f(struct s_x3) )
21370 3b 0a 20 20 69 66 28 20 78 33 61 20 29 7b 0a 20  ;.  if( x3a ){. 
21380 20 20 20 78 33 61 2d 3e 73 69 7a 65 20 3d 20 31     x3a->size = 1
21390 32 38 3b 0a 20 20 20 20 78 33 61 2d 3e 63 6f 75  28;.    x3a->cou
213a0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 33 61 2d  nt = 0;.    x3a-
213b0 3e 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29  >tbl = (x3node*)
213c0 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28  malloc( .      (
213d0 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b  sizeof(x3node) +
213e0 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29   sizeof(x3node*)
213f0 29 2a 31 32 38 20 29 3b 0a 20 20 20 20 69 66 28  )*128 );.    if(
21400 20 78 33 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a   x3a->tbl==0 ){.
21410 20 20 20 20 20 20 66 72 65 65 28 78 33 61 29 3b        free(x3a);
21420 0a 20 20 20 20 20 20 78 33 61 20 3d 20 30 3b 0a  .      x3a = 0;.
21430 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21440 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 33   int i;.      x3
21450 61 2d 3e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a  a->ht = (x3node*
21460 2a 29 26 28 78 33 61 2d 3e 74 62 6c 5b 31 32 38  *)&(x3a->tbl[128
21470 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ]);.      for(i=
21480 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78  0; i<128; i++) x
21490 33 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  3a->ht[i] = 0;. 
214a0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e     }.  }.}./* In
214b0 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72  sert a new recor
214c0 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79  d into the array
214d0 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
214e0 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a  f successful..**
214f0 20 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68   Prior data with
21500 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
21510 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e   NOT overwritten
21520 20 2a 2f 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e   */.int State_in
21530 73 65 72 74 28 64 61 74 61 2c 6b 65 79 29 0a 73  sert(data,key).s
21540 74 72 75 63 74 20 73 74 61 74 65 20 2a 64 61 74  truct state *dat
21550 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  a;.struct config
21560 20 2a 6b 65 79 3b 0a 7b 0a 20 20 78 33 6e 6f 64   *key;.{.  x3nod
21570 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a  e *np;.  int h;.
21580 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28    int ph;..  if(
21590 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x3a==0 ) return
215a0 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 61 74 65   0;.  ph = state
215b0 68 61 73 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d  hash(key);.  h =
215c0 20 70 68 20 26 20 28 78 33 61 2d 3e 73 69 7a 65   ph & (x3a->size
215d0 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d  -1);.  np = x3a-
215e0 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
215f0 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73   np ){.    if( s
21600 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c  tatecmp(np->key,
21610 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  key)==0 ){.     
21620 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
21630 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
21640 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64  ame key is found
21650 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61  . */.      /* Fa
21660 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77  il because overw
21670 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  rite is not allo
21680 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ws. */.      ret
21690 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
216a0 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
216b0 20 20 7d 0a 20 20 69 66 28 20 78 33 61 2d 3e 63    }.  if( x3a->c
216c0 6f 75 6e 74 3e 3d 78 33 61 2d 3e 73 69 7a 65 20  ount>=x3a->size 
216d0 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74  ){.    /* Need t
216e0 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20  o make the hash 
216f0 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a  table bigger */.
21700 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a      int i,size;.
21710 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 33 20      struct s_x3 
21720 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79  array;.    array
21730 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78  .size = size = x
21740 33 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20  3a->size*2;.    
21750 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 33  array.count = x3
21760 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72  a->count;.    ar
21770 72 61 79 2e 74 62 6c 20 3d 20 28 78 33 6e 6f 64  ray.tbl = (x3nod
21780 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e*)malloc(.     
21790 20 28 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29   (sizeof(x3node)
217a0 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65   + sizeof(x3node
217b0 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20  *))*size );.    
217c0 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30  if( array.tbl==0
217d0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
217e0 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c   Fail due to mal
217f0 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20  loc failure */. 
21800 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78     array.ht = (x
21810 33 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e  3node**)&(array.
21820 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20  tbl[size]);.    
21830 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
21840 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69   i++) array.ht[i
21850 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  ] = 0;.    for(i
21860 3d 30 3b 20 69 3c 78 33 61 2d 3e 63 6f 75 6e 74  =0; i<x3a->count
21870 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 33  ; i++){.      x3
21880 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65  node *oldnp, *ne
21890 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70  wnp;.      oldnp
218a0 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 69 5d   = &(x3a->tbl[i]
218b0 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74 61  );.      h = sta
218c0 74 65 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65  tehash(oldnp->ke
218d0 79 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20  y) & (size-1);. 
218e0 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61       newnp = &(a
218f0 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20  rray.tbl[i]);.  
21900 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74      if( array.ht
21910 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68  [h] ) array.ht[h
21920 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e  ]->from = &(newn
21930 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20  p->next);.      
21940 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72  newnp->next = ar
21950 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20  ray.ht[h];.     
21960 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c   newnp->key = ol
21970 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20  dnp->key;.      
21980 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c  newnp->data = ol
21990 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20  dnp->data;.     
219a0 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26   newnp->from = &
219b0 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20  (array.ht[h]);. 
219c0 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d       array.ht[h]
219d0 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a   = newnp;.    }.
219e0 20 20 20 20 66 72 65 65 28 78 33 61 2d 3e 74 62      free(x3a->tb
219f0 6c 29 3b 0a 20 20 20 20 2a 78 33 61 20 3d 20 61  l);.    *x3a = a
21a00 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  rray;.  }.  /* I
21a10 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61  nsert the new da
21a20 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26  ta */.  h = ph &
21a30 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x3a->size-1);.
21a40 20 20 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62    np = &(x3a->tb
21a50 6c 5b 78 33 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29  l[x3a->count++])
21a60 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65  ;.  np->key = ke
21a70 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20  y;.  np->data = 
21a80 64 61 74 61 3b 0a 20 20 69 66 28 20 78 33 61 2d  data;.  if( x3a-
21a90 3e 68 74 5b 68 5d 20 29 20 78 33 61 2d 3e 68 74  >ht[h] ) x3a->ht
21aa0 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70  [h]->from = &(np
21ab0 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e  ->next);.  np->n
21ac0 65 78 74 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d  ext = x3a->ht[h]
21ad0 3b 0a 20 20 78 33 61 2d 3e 68 74 5b 68 5d 20 3d  ;.  x3a->ht[h] =
21ae0 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20   np;.  np->from 
21af0 3d 20 26 28 78 33 61 2d 3e 68 74 5b 68 5d 29 3b  = &(x3a->ht[h]);
21b00 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
21b10 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
21b20 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69  ter to data assi
21b30 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65  gned to the give
21b40 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e  n key.  Return N
21b50 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63  ULL.** if no suc
21b60 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74  h key. */.struct
21b70 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 66 69   state *State_fi
21b80 6e 64 28 6b 65 79 29 0a 73 74 72 75 63 74 20 63  nd(key).struct c
21b90 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20  onfig *key;.{.  
21ba0 69 6e 74 20 68 3b 0a 20 20 78 33 6e 6f 64 65 20  int h;.  x3node 
21bb0 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d  *np;..  if( x3a=
21bc0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
21bd0 20 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b   h = statehash(k
21be0 65 79 29 20 26 20 28 78 33 61 2d 3e 73 69 7a 65  ey) & (x3a->size
21bf0 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d  -1);.  np = x3a-
21c00 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
21c10 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73   np ){.    if( s
21c20 74 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c  tatecmp(np->key,
21c30 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  key)==0 ) break;
21c40 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
21c50 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
21c60 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a   np ? np->data :
21c70 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   0;.}../* Return
21c80 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
21c90 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74  nters to all dat
21ca0 61 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  a in the table..
21cb0 2a 2a 20 54 68 65 20 61 72 72 61 79 20 69 73 20  ** The array is 
21cc0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
21cd0 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55  lloc.  Return NU
21ce0 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c  LL if memory all
21cf0 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c  ocation.** probl
21d00 65 6d 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61  ems, or if the a
21d10 72 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a  rray is empty. *
21d20 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  /.struct state *
21d30 2a 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28 29  *State_arrayof()
21d40 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  .{.  struct stat
21d50 65 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74  e **array;.  int
21d60 20 69 2c 73 69 7a 65 3b 0a 20 20 69 66 28 20 78   i,size;.  if( x
21d70 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  3a==0 ) return 0
21d80 3b 0a 20 20 73 69 7a 65 20 3d 20 78 33 61 2d 3e  ;.  size = x3a->
21d90 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d  count;.  array =
21da0 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a   (struct state *
21db0 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)malloc( sizeof
21dc0 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29  (struct state *)
21dd0 2a 73 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 61  *size );.  if( a
21de0 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72 28  rray ){.    for(
21df0 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b  i=0; i<size; i++
21e00 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78 33 61  ) array[i] = x3a
21e10 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20  ->tbl[i].data;. 
21e20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 72 61   }.  return arra
21e30 79 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20  y;.}../* Hash a 
21e40 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f  configuration */
21e50 0a 50 52 49 56 41 54 45 20 69 6e 74 20 63 6f 6e  .PRIVATE int con
21e60 66 69 67 68 61 73 68 28 61 29 0a 73 74 72 75 63  fighash(a).struc
21e70 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 7b 0a 20  t config *a;.{. 
21e80 20 69 6e 74 20 68 3d 30 3b 0a 20 20 68 20 3d 20   int h=0;.  h = 
21e90 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69  h*571 + a->rp->i
21ea0 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74  ndex*37 + a->dot
21eb0 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a  ;.  return h;.}.
21ec0 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  ./* There is one
21ed0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
21ee0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
21ef0 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a  ture for each.**
21f00 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
21f10 61 79 20 6f 66 20 74 79 70 65 20 22 78 34 22 2e  ay of type "x4".
21f20 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 34 20  .*/.struct s_x4 
21f30 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20  {.  int size;   
21f40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21f50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
21f60 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f  ilable slots. */
21f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21f80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
21f90 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20  Must be a power 
21fa0 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61  of 2 greater tha
21fb0 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  n or */.        
21fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fd0 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20    /*   equal to 
21fe0 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74  1 */.  int count
21ff0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
22000 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72  * Number of curr
22010 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c  ently slots fill
22020 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ed */.  struct s
22030 5f 78 34 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f  _x4node *tbl;  /
22040 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72 65  * The data store
22050 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75  d here */.  stru
22060 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 68 74  ct s_x4node **ht
22070 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65  ;  /* Hash table
22080 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a   for lookups */.
22090 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  };../* There is 
220a0 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
220b0 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66  this structure f
220c0 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65 6c  or every data el
220d0 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61  ement.** in an a
220e0 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
220f0 20 6f 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a   of type "x4"..*
22100 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
22110 20 73 5f 78 34 6e 6f 64 65 20 7b 0a 20 20 73 74   s_x4node {.  st
22120 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74  ruct config *dat
22130 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
22140 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20      /* The data 
22150 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34  */.  struct s_x4
22160 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a  node *next;   /*
22170 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68   Next entry with
22180 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a   the same hash *
22190 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e  /.  struct s_x4n
221a0 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20  ode **from;  /* 
221b0 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f  Previous link */
221c0 0a 7d 20 78 34 6e 6f 64 65 3b 0a 0a 2f 2a 20 54  .} x4node;../* T
221d0 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65  here is only one
221e0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
221f0 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73   array, which is
22200 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a   the following *
22210 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
22220 73 5f 78 34 20 2a 78 34 61 3b 0a 0a 2f 2a 20 41  s_x4 *x4a;../* A
22230 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73  llocate a new as
22240 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
22250 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  */.void Configta
22260 62 6c 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66  ble_init(){.  if
22270 28 20 78 34 61 20 29 20 72 65 74 75 72 6e 3b 0a  ( x4a ) return;.
22280 20 20 78 34 61 20 3d 20 28 73 74 72 75 63 74 20    x4a = (struct 
22290 73 5f 78 34 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  s_x4*)malloc( si
222a0 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 34  zeof(struct s_x4
222b0 29 20 29 3b 0a 20 20 69 66 28 20 78 34 61 20 29  ) );.  if( x4a )
222c0 7b 0a 20 20 20 20 78 34 61 2d 3e 73 69 7a 65 20  {.    x4a->size 
222d0 3d 20 36 34 3b 0a 20 20 20 20 78 34 61 2d 3e 63  = 64;.    x4a->c
222e0 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 34  ount = 0;.    x4
222f0 61 2d 3e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65  a->tbl = (x4node
22300 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20  *)malloc( .     
22310 20 28 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29   (sizeof(x4node)
22320 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65   + sizeof(x4node
22330 2a 29 29 2a 36 34 20 29 3b 0a 20 20 20 20 69 66  *))*64 );.    if
22340 28 20 78 34 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b  ( x4a->tbl==0 ){
22350 0a 20 20 20 20 20 20 66 72 65 65 28 78 34 61 29  .      free(x4a)
22360 3b 0a 20 20 20 20 20 20 78 34 61 20 3d 20 30 3b  ;.      x4a = 0;
22370 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22380 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78    int i;.      x
22390 34 61 2d 3e 68 74 20 3d 20 28 78 34 6e 6f 64 65  4a->ht = (x4node
223a0 2a 2a 29 26 28 78 34 61 2d 3e 74 62 6c 5b 36 34  **)&(x4a->tbl[64
223b0 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ]);.      for(i=
223c0 30 3b 20 69 3c 36 34 3b 20 69 2b 2b 29 20 78 34  0; i<64; i++) x4
223d0 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  a->ht[i] = 0;.  
223e0 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73    }.  }.}./* Ins
223f0 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
22400 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e   into the array.
22410 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
22420 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20   successful..** 
22430 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20  Prior data with 
22440 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
22450 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20  NOT overwritten 
22460 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61 62  */.int Configtab
22470 6c 65 5f 69 6e 73 65 72 74 28 64 61 74 61 29 0a  le_insert(data).
22480 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64  struct config *d
22490 61 74 61 3b 0a 7b 0a 20 20 78 34 6e 6f 64 65 20  ata;.{.  x4node 
224a0 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20  *np;.  int h;.  
224b0 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78  int ph;..  if( x
224c0 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  4a==0 ) return 0
224d0 3b 0a 20 20 70 68 20 3d 20 63 6f 6e 66 69 67 68  ;.  ph = configh
224e0 61 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d  ash(data);.  h =
224f0 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65   ph & (x4a->size
22500 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d  -1);.  np = x4a-
22510 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
22520 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 43   np ){.    if( C
22530 6f 6e 66 69 67 63 6d 70 28 6e 70 2d 3e 64 61 74  onfigcmp(np->dat
22540 61 2c 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20  a,data)==0 ){.  
22550 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
22560 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  ng entry with th
22570 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f  e same key is fo
22580 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  und. */.      /*
22590 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76   Fail because ov
225a0 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61  erwrite is not a
225b0 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20  llows. */.      
225c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
225d0 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
225e0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 34 61  t;.  }.  if( x4a
225f0 2d 3e 63 6f 75 6e 74 3e 3d 78 34 61 2d 3e 73 69  ->count>=x4a->si
22600 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65  ze ){.    /* Nee
22610 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61  d to make the ha
22620 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20  sh table bigger 
22630 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a  */.    int i,siz
22640 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f  e;.    struct s_
22650 78 34 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72  x4 array;.    ar
22660 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20  ray.size = size 
22670 3d 20 78 34 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20  = x4a->size*2;. 
22680 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d     array.count =
22690 20 78 34 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20   x4a->count;.   
226a0 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 34   array.tbl = (x4
226b0 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20  node*)malloc(.  
226c0 20 20 20 20 28 73 69 7a 65 6f 66 28 78 34 6e 6f      (sizeof(x4no
226d0 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e  de) + sizeof(x4n
226e0 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20  ode*))*size );. 
226f0 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c     if( array.tbl
22700 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
22710 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20   /* Fail due to 
22720 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a  malloc failure *
22730 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d  /.    array.ht =
22740 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 61 72 72   (x4node**)&(arr
22750 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20  ay.tbl[size]);. 
22760 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
22770 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68  ze; i++) array.h
22780 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f  t[i] = 0;.    fo
22790 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f  r(i=0; i<x4a->co
227a0 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unt; i++){.     
227b0 20 78 34 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20   x4node *oldnp, 
227c0 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c  *newnp;.      ol
227d0 64 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c  dnp = &(x4a->tbl
227e0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20  [i]);.      h = 
227f0 63 6f 6e 66 69 67 68 61 73 68 28 6f 6c 64 6e 70  confighash(oldnp
22800 2d 3e 64 61 74 61 29 20 26 20 28 73 69 7a 65 2d  ->data) & (size-
22810 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20  1);.      newnp 
22820 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d  = &(array.tbl[i]
22830 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72  );.      if( arr
22840 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79  ay.ht[h] ) array
22850 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  .ht[h]->from = &
22860 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  (newnp->next);. 
22870 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74       newnp->next
22880 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a   = array.ht[h];.
22890 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74        newnp->dat
228a0 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b  a = oldnp->data;
228b0 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72  .      newnp->fr
228c0 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b  om = &(array.ht[
228d0 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79  h]);.      array
228e0 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a  .ht[h] = newnp;.
228f0 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78      }.    free(x
22900 34 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78  4a->tbl);.    *x
22910 34 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a  4a = array;.  }.
22920 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
22930 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20  new data */.  h 
22940 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a  = ph & (x4a->siz
22950 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78  e-1);.  np = &(x
22960 34 61 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63 6f 75  4a->tbl[x4a->cou
22970 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61  nt++]);.  np->da
22980 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28  ta = data;.  if(
22990 20 78 34 61 2d 3e 68 74 5b 68 5d 20 29 20 78 34   x4a->ht[h] ) x4
229a0 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  a->ht[h]->from =
229b0 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20   &(np->next);.  
229c0 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 34 61 2d 3e  np->next = x4a->
229d0 68 74 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e 68 74  ht[h];.  x4a->ht
229e0 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e  [h] = np;.  np->
229f0 66 72 6f 6d 20 3d 20 26 28 78 34 61 2d 3e 68 74  from = &(x4a->ht
22a00 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  [h]);.  return 1
22a10 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
22a20 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
22a30 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65   assigned to the
22a40 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74   given key.  Ret
22a50 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e  urn NULL.** if n
22a60 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73  o such key. */.s
22a70 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
22a80 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 6b  nfigtable_find(k
22a90 65 79 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  ey).struct confi
22aa0 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20  g *key;.{.  int 
22ab0 68 3b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b  h;.  x4node *np;
22ac0 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29  ..  if( x4a==0 )
22ad0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d   return 0;.  h =
22ae0 20 63 6f 6e 66 69 67 68 61 73 68 28 6b 65 79 29   confighash(key)
22af0 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29   & (x4a->size-1)
22b00 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74  ;.  np = x4a->ht
22b10 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
22b20 20 29 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e 66   ){.    if( Conf
22b30 69 67 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 6b  igcmp(np->data,k
22b40 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ey)==0 ) break;.
22b50 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
22b60 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
22b70 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20  np ? np->data : 
22b80 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 6d 6f 76 65 20  0;.}../* Remove 
22b90 61 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68  all data from th
22ba0 65 20 74 61 62 6c 65 2e 20 20 50 61 73 73 20 65  e table.  Pass e
22bb0 61 63 68 20 64 61 74 61 20 74 6f 20 74 68 65 20  ach data to the 
22bc0 66 75 6e 63 74 69 6f 6e 20 22 66 22 0a 2a 2a 20  function "f".** 
22bd0 61 73 20 69 74 20 69 73 20 72 65 6d 6f 76 65 64  as it is removed
22be0 2e 20 20 28 22 66 22 20 6d 61 79 20 62 65 20 6e  .  ("f" may be n
22bf0 75 6c 6c 20 74 6f 20 61 76 6f 69 64 20 74 68 69  ull to avoid thi
22c00 73 20 73 74 65 70 2e 29 20 2a 2f 0a 76 6f 69 64  s step.) */.void
22c10 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65   Configtable_cle
22c20 61 72 28 66 29 0a 69 6e 74 28 2a 66 29 28 2f 2a  ar(f).int(*f)(/*
22c30 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
22c40 20 2a 2f 29 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b   */);.{.  int i;
22c50 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20 7c 7c  .  if( x4a==0 ||
22c60 20 78 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30 20 29   x4a->count==0 )
22c70 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 66   return;.  if( f
22c80 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34   ) for(i=0; i<x4
22c90 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 28  a->count; i++) (
22ca0 2a 66 29 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 2e  *f)(x4a->tbl[i].
22cb0 64 61 74 61 29 3b 0a 20 20 66 6f 72 28 69 3d 30  data);.  for(i=0
22cc0 3b 20 69 3c 78 34 61 2d 3e 73 69 7a 65 3b 20 69  ; i<x4a->size; i
22cd0 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d  ++) x4a->ht[i] =
22ce0 20 30 3b 0a 20 20 78 34 61 2d 3e 63 6f 75 6e 74   0;.  x4a->count
22cf0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a   = 0;.  return;.
22d00 7d 0a                                            }.