/ Hex Artifact Content
Login

Artifact 3088e4dec7f93c6b0925cf5bac04c8b7c8688835:


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: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
38f0: 20 72 63 20 3d 20 61 70 32 20 2d 20 61 70 31 3b   rc = ap2 - ap1;
3900: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
3910: 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 70 61 72  ;.}../* Sort par
3920: 73 65 72 20 61 63 74 69 6f 6e 73 20 2a 2f 0a 73  ser actions */.s
3930: 74 61 74 69 63 20 73 74 72 75 63 74 20 61 63 74  tatic struct act
3940: 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74  ion *Action_sort
3950: 28 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  (.  struct actio
3960: 6e 20 2a 61 70 0a 29 7b 0a 20 20 61 70 20 3d 20  n *ap.){.  ap = 
3970: 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  (struct action *
3980: 29 6d 73 6f 72 74 28 28 63 68 61 72 20 2a 29 61  )msort((char *)a
3990: 70 2c 28 63 68 61 72 20 2a 2a 29 26 61 70 2d 3e  p,(char **)&ap->
39a0: 6e 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20  next,.          
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39c0: 20 20 20 20 28 69 6e 74 28 2a 29 28 63 6f 6e 73      (int(*)(cons
39d0: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
39e0: 61 72 2a 29 29 61 63 74 69 6f 6e 63 6d 70 29 3b  ar*))actioncmp);
39f0: 0a 20 20 72 65 74 75 72 6e 20 61 70 3b 0a 7d 0a  .  return ap;.}.
3a00: 0a 76 6f 69 64 20 41 63 74 69 6f 6e 5f 61 64 64  .void Action_add
3a10: 28 61 70 70 2c 74 79 70 65 2c 73 70 2c 61 72 67  (app,type,sp,arg
3a20: 29 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  ).struct action 
3a30: 2a 2a 61 70 70 3b 0a 65 6e 75 6d 20 65 5f 61 63  **app;.enum e_ac
3a40: 74 69 6f 6e 20 74 79 70 65 3b 0a 73 74 72 75 63  tion type;.struc
3a50: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 63 68  t symbol *sp;.ch
3a60: 61 72 20 2a 61 72 67 3b 0a 7b 0a 20 20 73 74 72  ar *arg;.{.  str
3a70: 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 3b  uct action *new;
3a80: 0a 20 20 6e 65 77 20 3d 20 41 63 74 69 6f 6e 5f  .  new = Action_
3a90: 6e 65 77 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e 65  new();.  new->ne
3aa0: 78 74 20 3d 20 2a 61 70 70 3b 0a 20 20 2a 61 70  xt = *app;.  *ap
3ab0: 70 20 3d 20 6e 65 77 3b 0a 20 20 6e 65 77 2d 3e  p = new;.  new->
3ac0: 74 79 70 65 20 3d 20 74 79 70 65 3b 0a 20 20 6e  type = type;.  n
3ad0: 65 77 2d 3e 73 70 20 3d 20 73 70 3b 0a 20 20 69  ew->sp = sp;.  i
3ae0: 66 28 20 74 79 70 65 3d 3d 53 48 49 46 54 20 29  f( type==SHIFT )
3af0: 7b 0a 20 20 20 20 6e 65 77 2d 3e 78 2e 73 74 70  {.    new->x.stp
3b00: 20 3d 20 28 73 74 72 75 63 74 20 73 74 61 74 65   = (struct state
3b10: 20 2a 29 61 72 67 3b 0a 20 20 7d 65 6c 73 65 7b   *)arg;.  }else{
3b20: 0a 20 20 20 20 6e 65 77 2d 3e 78 2e 72 70 20 3d  .    new->x.rp =
3b30: 20 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 29   (struct rule *)
3b40: 61 72 67 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a  arg;.  }.}./****
3b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3b60: 2a 2a 20 4e 65 77 20 63 6f 64 65 20 74 6f 20 69  ** New code to i
3b70: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 22 61 63  mplement the "ac
3b80: 74 74 61 62 22 20 6d 6f 64 75 6c 65 20 2a 2a 2a  ttab" module ***
3b90: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
3ba0: 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 6d 70 6c  This module impl
3bb0: 65 6d 65 6e 74 73 20 72 6f 75 74 69 6e 65 73 20  ements routines 
3bc0: 75 73 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  use to construct
3bd0: 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d   the yy_action[]
3be0: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a   table..*/../*.*
3bf0: 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66 20 74  * The state of t
3c00: 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62  he yy_action tab
3c10: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
3c20: 63 74 69 6f 6e 20 69 73 20 61 6e 20 69 6e 73 74  ction is an inst
3c30: 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66  ance of.** the f
3c40: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
3c50: 72 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  re.*/.typedef st
3c60: 72 75 63 74 20 61 63 74 74 61 62 20 61 63 74 74  ruct acttab actt
3c70: 61 62 3b 0a 73 74 72 75 63 74 20 61 63 74 74 61  ab;.struct actta
3c80: 62 20 7b 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f  b {.  int nActio
3c90: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3ca0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3cb0: 75 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 41  used slots in aA
3cc0: 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ction[] */.  int
3cd0: 20 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20 20   nActionAlloc;  
3ce0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f            /* Slo
3cf0: 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ts allocated for
3d00: 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20   aAction[] */.  
3d10: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 69 6e 74  struct {.    int
3d20: 20 6c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20   lookahead;     
3d30: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
3d40: 20 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61   of the lookahea
3d50: 64 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 69  d token */.    i
3d60: 6e 74 20 61 63 74 69 6f 6e 3b 20 20 20 20 20 20  nt action;      
3d70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 74            /* Act
3d80: 69 6f 6e 20 74 6f 20 74 61 6b 65 20 6f 6e 20 74  ion to take on t
3d90: 68 65 20 67 69 76 65 6e 20 6c 6f 6f 6b 61 68 65  he given lookahe
3da0: 61 64 20 2a 2f 0a 20 20 7d 20 2a 61 41 63 74 69  ad */.  } *aActi
3db0: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
3dc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 79 79 5f 61       /* The yy_a
3dd0: 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 75 6e  ction[] table un
3de0: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
3df0: 20 2a 2f 0a 20 20 20 20 2a 61 4c 6f 6f 6b 61 68   */.    *aLookah
3e00: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
3e10: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e     /* A single n
3e20: 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  ew transaction s
3e30: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e 4c 6f  et */.  int mnLo
3e40: 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20  okahead;        
3e50: 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20       /* Minimum 
3e60: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f  aLookahead[].loo
3e70: 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  kahead */.  int 
3e80: 6d 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  mnAction;       
3e90: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69           /* Acti
3ea0: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
3eb0: 74 68 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2a  th mnLookahead *
3ec0: 2f 0a 20 20 69 6e 74 20 6d 78 4c 6f 6f 6b 61 68  /.  int mxLookah
3ed0: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
3ee0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 4c 6f 6f   /* Maximum aLoo
3ef0: 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65  kahead[].lookahe
3f00: 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  ad */.  int nLoo
3f10: 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20  kahead;         
3f20: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 73 6c 6f       /* Used slo
3f30: 74 73 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64  ts in aLookahead
3f40: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  [] */.  int nLoo
3f50: 6b 61 68 65 61 64 41 6c 6c 6f 63 3b 20 20 20 20  kaheadAlloc;    
3f60: 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c       /* Slots al
3f70: 6c 6f 63 61 74 65 64 20 69 6e 20 61 4c 6f 6f 6b  located in aLook
3f80: 61 68 65 61 64 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f  ahead[] */.};../
3f90: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
3fa0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3fb0: 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20  n the yy_action 
3fc0: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
3fd0: 20 61 63 74 74 61 62 5f 73 69 7a 65 28 58 29 20   acttab_size(X) 
3fe0: 28 28 58 29 2d 3e 6e 41 63 74 69 6f 6e 29 0a 0a  ((X)->nAction)..
3ff0: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 66 6f 72  /* The value for
4000: 20 74 68 65 20 4e 2d 74 68 20 65 6e 74 72 79 20   the N-th entry 
4010: 69 6e 20 79 79 5f 61 63 74 69 6f 6e 20 2a 2f 0a  in yy_action */.
4020: 23 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f 79  #define acttab_y
4030: 79 61 63 74 69 6f 6e 28 58 2c 4e 29 20 20 28 28  yaction(X,N)  ((
4040: 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 61  X)->aAction[N].a
4050: 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76  ction)../* The v
4060: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 4e 2d 74  alue for the N-t
4070: 68 20 65 6e 74 72 79 20 69 6e 20 79 79 5f 6c 6f  h entry in yy_lo
4080: 6f 6b 61 68 65 61 64 20 2a 2f 0a 23 64 65 66 69  okahead */.#defi
4090: 6e 65 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b  ne acttab_yylook
40a0: 61 68 65 61 64 28 58 2c 4e 29 20 20 28 28 58 29  ahead(X,N)  ((X)
40b0: 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 6c 6f 6f  ->aAction[N].loo
40c0: 6b 61 68 65 61 64 29 0a 0a 2f 2a 20 46 72 65 65  kahead)../* Free
40d0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
40e0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
40f0: 67 69 76 65 6e 20 61 63 74 74 61 62 20 2a 2f 0a  given acttab */.
4100: 76 6f 69 64 20 61 63 74 74 61 62 5f 66 72 65 65  void acttab_free
4110: 28 61 63 74 74 61 62 20 2a 70 29 7b 0a 20 20 66  (acttab *p){.  f
4120: 72 65 65 28 20 70 2d 3e 61 41 63 74 69 6f 6e 20  ree( p->aAction 
4130: 29 3b 0a 20 20 66 72 65 65 28 20 70 2d 3e 61 4c  );.  free( p->aL
4140: 6f 6f 6b 61 68 65 61 64 20 29 3b 0a 20 20 66 72  ookahead );.  fr
4150: 65 65 28 20 70 20 29 3b 0a 7d 0a 0a 2f 2a 20 41  ee( p );.}../* A
4160: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 63  llocate a new ac
4170: 74 74 61 62 20 73 74 72 75 63 74 75 72 65 20 2a  ttab structure *
4180: 2f 0a 61 63 74 74 61 62 20 2a 61 63 74 74 61 62  /.acttab *acttab
4190: 5f 61 6c 6c 6f 63 28 76 6f 69 64 29 7b 0a 20 20  _alloc(void){.  
41a0: 61 63 74 74 61 62 20 2a 70 20 3d 20 63 61 6c 6c  acttab *p = call
41b0: 6f 63 28 20 31 2c 20 73 69 7a 65 6f 66 28 2a 70  oc( 1, sizeof(*p
41c0: 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  ) );.  if( p==0 
41d0: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
41e0: 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f  tderr,"Unable to
41f0: 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
4200: 20 66 6f 72 20 61 20 6e 65 77 20 61 63 74 74 61   for a new actta
4210: 62 2e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  b.");.    exit(1
4220: 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  );.  }.  memset(
4230: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
4240: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d  );.  return p;.}
4250: 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 61  ../* Add a new a
4260: 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 75 72  ction to the cur
4270: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
4280: 20 73 65 74 0a 2a 2f 0a 76 6f 69 64 20 61 63 74   set.*/.void act
4290: 74 61 62 5f 61 63 74 69 6f 6e 28 61 63 74 74 61  tab_action(actta
42a0: 62 20 2a 70 2c 20 69 6e 74 20 6c 6f 6f 6b 61 68  b *p, int lookah
42b0: 65 61 64 2c 20 69 6e 74 20 61 63 74 69 6f 6e 29  ead, int action)
42c0: 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b  {.  if( p->nLook
42d0: 61 68 65 61 64 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61  ahead>=p->nLooka
42e0: 68 65 61 64 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  headAlloc ){.   
42f0: 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c   p->nLookaheadAl
4300: 6c 6f 63 20 2b 3d 20 32 35 3b 0a 20 20 20 20 70  loc += 25;.    p
4310: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 72  ->aLookahead = r
4320: 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 4c 6f 6f 6b  ealloc( p->aLook
4330: 61 68 65 61 64 2c 0a 20 20 20 20 20 20 20 20 20  ahead,.         
4340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4350: 20 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c      sizeof(p->aL
4360: 6f 6f 6b 61 68 65 61 64 5b 30 5d 29 2a 70 2d 3e  ookahead[0])*p->
4370: 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20  nLookaheadAlloc 
4380: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4c  );.    if( p->aL
4390: 6f 6f 6b 61 68 65 61 64 3d 3d 30 20 29 7b 0a 20  ookahead==0 ){. 
43a0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
43b0: 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  err,"malloc fail
43c0: 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78  ed\n");.      ex
43d0: 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  it(1);.    }.  }
43e0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61  .  if( p->nLooka
43f0: 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70  head==0 ){.    p
4400: 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20  ->mxLookahead = 
4410: 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 70  lookahead;.    p
4420: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20  ->mnLookahead = 
4430: 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 70  lookahead;.    p
4440: 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20 61 63 74  ->mnAction = act
4450: 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ion;.  }else{.  
4460: 20 20 69 66 28 20 70 2d 3e 6d 78 4c 6f 6f 6b 61    if( p->mxLooka
4470: 68 65 61 64 3c 6c 6f 6f 6b 61 68 65 61 64 20 29  head<lookahead )
4480: 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20   p->mxLookahead 
4490: 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20  = lookahead;.   
44a0: 20 69 66 28 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68   if( p->mnLookah
44b0: 65 61 64 3e 6c 6f 6f 6b 61 68 65 61 64 20 29 7b  ead>lookahead ){
44c0: 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b  .      p->mnLook
44d0: 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61  ahead = lookahea
44e0: 64 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 41 63  d;.      p->mnAc
44f0: 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20  tion = action;. 
4500: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c     }.  }.  p->aL
4510: 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f  ookahead[p->nLoo
4520: 6b 61 68 65 61 64 5d 2e 6c 6f 6f 6b 61 68 65 61  kahead].lookahea
4530: 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20  d = lookahead;. 
4540: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 70   p->aLookahead[p
4550: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e 61 63  ->nLookahead].ac
4560: 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20  tion = action;. 
4570: 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 2b 2b   p->nLookahead++
4580: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
4590: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
45a0: 65 74 20 62 75 69 6c 74 20 75 70 20 77 69 74 68  et built up with
45b0: 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20   prior calls to 
45c0: 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 29 0a  acttab_action().
45d0: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72  ** into the curr
45e0: 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  ent action table
45f0: 2e 20 20 54 68 65 6e 20 72 65 73 65 74 20 74 68  .  Then reset th
4600: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  e transaction se
4610: 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 61 6e 20  t back.** to an 
4620: 65 6d 70 74 79 20 73 65 74 20 69 6e 20 70 72 65  empty set in pre
4630: 70 61 72 61 74 69 6f 6e 20 66 6f 72 20 61 20 6e  paration for a n
4640: 65 77 20 72 6f 75 6e 64 20 6f 66 20 61 63 74 74  ew round of actt
4650: 61 62 5f 61 63 74 69 6f 6e 28 29 20 63 61 6c 6c  ab_action() call
4660: 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
4670: 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20  the offset into 
4680: 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
4690: 20 6f 66 20 74 68 65 20 6e 65 77 20 74 72 61 6e   of the new tran
46a0: 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
46b0: 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 61 63  acttab_insert(ac
46c0: 74 74 61 62 20 2a 70 29 7b 0a 20 20 69 6e 74 20  ttab *p){.  int 
46d0: 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 61 73  i, j, k, n;.  as
46e0: 73 65 72 74 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68  sert( p->nLookah
46f0: 65 61 64 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ead>0 );..  /* M
4700: 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65  ake sure we have
4710: 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
4720: 20 68 6f 6c 64 20 74 68 65 20 65 78 70 61 6e 64   hold the expand
4730: 65 64 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 0a  ed action table.
4740: 20 20 2a 2a 20 69 6e 20 74 68 65 20 77 6f 72 73    ** in the wors
4750: 74 20 63 61 73 65 2e 20 20 54 68 65 20 77 6f 72  t case.  The wor
4760: 73 74 20 63 61 73 65 20 6f 63 63 75 72 73 20 69  st case occurs i
4770: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
4780: 6e 20 73 65 74 0a 20 20 2a 2a 20 6d 75 73 74 20  n set.  ** must 
4790: 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  be appended to t
47a0: 68 65 20 63 75 72 72 65 6e 74 20 61 63 74 69 6f  he current actio
47b0: 6e 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 6e  n table.  */.  n
47c0: 20 3d 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61   = p->mxLookahea
47d0: 64 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 2d 3e  d + 1;.  if( p->
47e0: 6e 41 63 74 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70  nAction + n >= p
47f0: 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 29  ->nActionAlloc )
4800: 7b 0a 20 20 20 20 69 6e 74 20 6f 6c 64 41 6c 6c  {.    int oldAll
4810: 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41  oc = p->nActionA
4820: 6c 6c 6f 63 3b 0a 20 20 20 20 70 2d 3e 6e 41 63  lloc;.    p->nAc
4830: 74 69 6f 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  tionAlloc = p->n
4840: 41 63 74 69 6f 6e 20 2b 20 6e 20 2b 20 70 2d 3e  Action + n + p->
4850: 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 2b 20 32  nActionAlloc + 2
4860: 30 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f  0;.    p->aActio
4870: 6e 20 3d 20 72 65 61 6c 6c 6f 63 28 20 70 2d 3e  n = realloc( p->
4880: 61 41 63 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20  aAction,.       
4890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
48a0: 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61 41 63     sizeof(p->aAc
48b0: 74 69 6f 6e 5b 30 5d 29 2a 70 2d 3e 6e 41 63 74  tion[0])*p->nAct
48c0: 69 6f 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69  ionAlloc);.    i
48d0: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 3d 3d 30  f( p->aAction==0
48e0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
48f0: 66 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63  f(stderr,"malloc
4900: 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20   failed\n");.   
4910: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
4920: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6f 6c 64 41  }.    for(i=oldA
4930: 6c 6c 6f 63 3b 20 69 3c 70 2d 3e 6e 41 63 74 69  lloc; i<p->nActi
4940: 6f 6e 41 6c 6c 6f 63 3b 20 69 2b 2b 29 7b 0a 20  onAlloc; i++){. 
4950: 20 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b       p->aAction[
4960: 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 2d  i].lookahead = -
4970: 31 3b 0a 20 20 20 20 20 20 70 2d 3e 61 41 63 74  1;.      p->aAct
4980: 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e 20 3d 20  ion[i].action = 
4990: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  -1;.    }.  }.. 
49a0: 20 2f 2a 20 53 63 61 6e 20 74 68 65 20 65 78 69   /* Scan the exi
49b0: 73 74 69 6e 67 20 61 63 74 69 6f 6e 20 74 61 62  sting action tab
49c0: 6c 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  le looking for a
49d0: 6e 20 6f 66 66 73 65 74 20 77 68 65 72 65 20 77  n offset where w
49e0: 65 20 63 61 6e 0a 20 20 2a 2a 20 69 6e 73 65 72  e can.  ** inser
49f0: 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  t the current tr
4a00: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e 20 20  ansaction set.  
4a10: 46 61 6c 6c 20 6f 75 74 20 6f 66 20 74 68 65 20  Fall out of the 
4a20: 6c 6f 6f 70 20 77 68 65 6e 20 74 68 61 74 0a 20  loop when that. 
4a30: 20 2a 2a 20 6f 66 66 73 65 74 20 69 73 20 66 6f   ** offset is fo
4a40: 75 6e 64 2e 20 20 49 6e 20 74 68 65 20 77 6f 72  und.  In the wor
4a50: 73 74 20 63 61 73 65 2c 20 77 65 20 66 61 6c 6c  st case, we fall
4a60: 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
4a70: 20 77 68 65 6e 0a 20 20 2a 2a 20 69 20 72 65 61   when.  ** i rea
4a80: 63 68 65 73 20 70 2d 3e 6e 41 63 74 69 6f 6e 2c  ches p->nAction,
4a90: 20 77 68 69 63 68 20 6d 65 61 6e 73 20 77 65 20   which means we 
4aa0: 61 70 70 65 6e 64 20 74 68 65 20 6e 65 77 20 74  append the new t
4ab0: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e 0a  ransaction set..
4ac0: 20 20 2a 2a 0a 20 20 2a 2a 20 69 20 69 73 20 74    **.  ** i is t
4ad0: 68 65 20 69 6e 64 65 78 20 69 6e 20 70 2d 3e 61  he index in p->a
4ae0: 41 63 74 69 6f 6e 5b 5d 20 77 68 65 72 65 20 70  Action[] where p
4af0: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 69 73  ->mnLookahead is
4b00: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
4b10: 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 41 63 74 69    for(i=p->nActi
4b20: 6f 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  on-1; i>=0; i--)
4b30: 7b 0a 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c  {.    /* First l
4b40: 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 78 69 73 74  ook for an exist
4b50: 69 6e 67 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  ing action table
4b60: 20 65 6e 74 72 79 20 74 68 61 74 20 63 61 6e 20   entry that can 
4b70: 62 65 20 72 65 75 73 65 64 20 2a 2f 0a 20 20 20  be reused */.   
4b80: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
4b90: 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 70 2d  i].lookahead==p-
4ba0: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a  >mnLookahead ){.
4bb0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63        if( p->aAc
4bc0: 74 69 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e 21 3d  tion[i].action!=
4bd0: 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 29 20 63 6f  p->mnAction ) co
4be0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f  ntinue;.      fo
4bf0: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f  r(j=0; j<p->nLoo
4c00: 6b 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20  kahead; j++){.  
4c10: 20 20 20 20 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f        k = p->aLo
4c20: 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61  okahead[j].looka
4c30: 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b  head - p->mnLook
4c40: 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20 20 20  ahead + i;.     
4c50: 20 20 20 69 66 28 20 6b 3c 30 20 7c 7c 20 6b 3e     if( k<0 || k>
4c60: 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20 62 72  =p->nAction ) br
4c70: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28  eak;.        if(
4c80: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a   p->aLookahead[j
4c90: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 21 3d 70 2d 3e  ].lookahead!=p->
4ca0: 61 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61  aAction[k].looka
4cb0: 68 65 61 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  head ) break;.  
4cc0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f        if( p->aLo
4cd0: 6f 6b 61 68 65 61 64 5b 6a 5d 2e 61 63 74 69 6f  okahead[j].actio
4ce0: 6e 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d  n!=p->aAction[k]
4cf0: 2e 61 63 74 69 6f 6e 20 29 20 62 72 65 61 6b 3b  .action ) break;
4d00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4d10: 66 28 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  f( j<p->nLookahe
4d20: 61 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ad ) continue;. 
4d30: 20 20 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20       n = 0;.    
4d40: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
4d50: 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20  nAction; j++){. 
4d60: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41         if( p->aA
4d70: 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65  ction[j].lookahe
4d80: 61 64 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ad<0 ) continue;
4d90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
4da0: 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61  aAction[j].looka
4db0: 68 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f  head==j+p->mnLoo
4dc0: 6b 61 68 65 61 64 2d 69 20 29 20 6e 2b 2b 3b 0a  kahead-i ) n++;.
4dd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4de0: 28 20 6e 3d 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  ( n==p->nLookahe
4df0: 61 64 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  ad ){.        br
4e00: 65 61 6b 3b 20 20 2f 2a 20 53 61 6d 65 20 61 73  eak;  /* Same as
4e10: 20 61 20 70 72 69 6f 72 20 74 72 61 6e 73 61 63   a prior transac
4e20: 74 69 6f 6e 20 73 65 74 20 2a 2f 0a 20 20 20 20  tion set */.    
4e30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
4e40: 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 2f  if( i<0 ){.    /
4e50: 2a 20 49 66 20 6e 6f 20 72 65 75 73 61 62 6c 65  * If no reusable
4e60: 20 65 6e 74 72 79 20 69 73 20 66 6f 75 6e 64 2c   entry is found,
4e70: 20 6c 6f 6f 6b 20 66 6f 72 20 61 6e 20 65 6d 70   look for an emp
4e80: 74 79 20 73 6c 6f 74 20 2a 2f 0a 20 20 20 20 66  ty slot */.    f
4e90: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 41 63  or(i=0; i<p->nAc
4ea0: 74 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tion; i++){.    
4eb0: 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e    if( p->aAction
4ec0: 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20  [i].lookahead<0 
4ed0: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  ){.        for(j
4ee0: 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68  =0; j<p->nLookah
4ef0: 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ead; j++){.     
4f00: 20 20 20 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f       k = p->aLoo
4f10: 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68  kahead[j].lookah
4f20: 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61  ead - p->mnLooka
4f30: 68 65 61 64 20 2b 20 69 3b 0a 20 20 20 20 20 20  head + i;.      
4f40: 20 20 20 20 69 66 28 20 6b 3c 30 20 29 20 62 72      if( k<0 ) br
4f50: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eak;.          i
4f60: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d  f( p->aAction[k]
4f70: 2e 6c 6f 6f 6b 61 68 65 61 64 3e 3d 30 20 29 20  .lookahead>=0 ) 
4f80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4f90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70  .        if( j<p
4fa0: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63  ->nLookahead ) c
4fb0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
4fc0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e   for(j=0; j<p->n
4fd0: 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  Action; j++){.  
4fe0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
4ff0: 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68  Action[j].lookah
5000: 65 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b  ead==j+p->mnLook
5010: 61 68 65 61 64 2d 69 20 29 20 62 72 65 61 6b 3b  ahead-i ) break;
5020: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5030: 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 41 63     if( j==p->nAc
5040: 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  tion ){.        
5050: 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 46 69 74    break;  /* Fit
5060: 73 20 69 6e 20 65 6d 70 74 79 20 73 6c 6f 74 73  s in empty slots
5070: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
5080: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5090: 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 72 61 6e    /* Insert tran
50a0: 73 61 63 74 69 6f 6e 20 73 65 74 20 61 74 20 69  saction set at i
50b0: 6e 64 65 78 20 69 2e 20 2a 2f 0a 20 20 66 6f 72  ndex i. */.  for
50c0: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b  (j=0; j<p->nLook
50d0: 61 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ahead; j++){.   
50e0: 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65   k = p->aLookahe
50f0: 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20  ad[j].lookahead 
5100: 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  - p->mnLookahead
5110: 20 2b 20 69 3b 0a 20 20 20 20 70 2d 3e 61 41 63   + i;.    p->aAc
5120: 74 69 6f 6e 5b 6b 5d 20 3d 20 70 2d 3e 61 4c 6f  tion[k] = p->aLo
5130: 6f 6b 61 68 65 61 64 5b 6a 5d 3b 0a 20 20 20 20  okahead[j];.    
5140: 69 66 28 20 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f  if( k>=p->nActio
5150: 6e 20 29 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 3d  n ) p->nAction =
5160: 20 6b 2b 31 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e   k+1;.  }.  p->n
5170: 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 30 3b 0a 0a  Lookahead = 0;..
5180: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
5190: 6f 66 66 73 65 74 20 74 68 61 74 20 69 73 20 61  offset that is a
51a0: 64 64 65 64 20 74 6f 20 74 68 65 20 6c 6f 6f 6b  dded to the look
51b0: 61 68 65 61 64 20 69 6e 20 6f 72 64 65 72 20 74  ahead in order t
51c0: 6f 20 67 65 74 20 74 68 65 0a 20 20 2a 2a 20 69  o get the.  ** i
51d0: 6e 64 65 78 20 69 6e 74 6f 20 79 79 5f 61 63 74  ndex into yy_act
51e0: 69 6f 6e 20 6f 66 20 74 68 65 20 61 63 74 69 6f  ion of the actio
51f0: 6e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 69 20  n */.  return i 
5200: 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  - p->mnLookahead
5210: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
5220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
5230: 6d 20 74 68 65 20 66 69 6c 65 20 22 62 75 69 6c  m the file "buil
5240: 64 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  d.c" ***********
5250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5260: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  **/./*.** Routin
5270: 65 73 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 69  es to constructi
5280: 6f 6e 20 74 68 65 20 66 69 6e 69 74 65 20 73 74  on the finite st
5290: 61 74 65 20 6d 61 63 68 69 6e 65 20 66 6f 72 20  ate machine for 
52a0: 74 68 65 20 4c 45 4d 4f 4e 0a 2a 2a 20 70 61 72  the LEMON.** par
52b0: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
52c0: 2f 0a 0a 2f 2a 20 46 69 6e 64 20 61 20 70 72 65  /../* Find a pre
52d0: 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6f  cedence symbol o
52e0: 66 20 65 76 65 72 79 20 72 75 6c 65 20 69 6e 20  f every rule in 
52f0: 74 68 65 20 67 72 61 6d 6d 61 72 2e 0a 2a 2a 20  the grammar..** 
5300: 0a 2a 2a 20 54 68 6f 73 65 20 72 75 6c 65 73 20  .** Those rules 
5310: 77 68 69 63 68 20 68 61 76 65 20 61 20 70 72 65  which have a pre
5320: 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 63  cedence symbol c
5330: 6f 64 65 64 20 69 6e 20 74 68 65 20 69 6e 70 75  oded in the inpu
5340: 74 0a 2a 2a 20 67 72 61 6d 6d 61 72 20 75 73 69  t.** grammar usi
5350: 6e 67 20 74 68 65 20 22 5b 73 79 6d 62 6f 6c 5d  ng the "[symbol]
5360: 22 20 63 6f 6e 73 74 72 75 63 74 20 77 69 6c 6c  " construct will
5370: 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 74 68   already have th
5380: 65 0a 2a 2a 20 72 70 2d 3e 70 72 65 63 73 79 6d  e.** rp->precsym
5390: 20 66 69 65 6c 64 20 66 69 6c 6c 65 64 2e 20 20   field filled.  
53a0: 4f 74 68 65 72 20 72 75 6c 65 73 20 74 61 6b 65  Other rules take
53b0: 20 61 73 20 74 68 65 69 72 20 70 72 65 63 65 64   as their preced
53c0: 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 74  ence.** symbol t
53d0: 68 65 20 66 69 72 73 74 20 52 48 53 20 73 79 6d  he first RHS sym
53e0: 62 6f 6c 20 77 69 74 68 20 61 20 64 65 66 69 6e  bol with a defin
53f0: 65 64 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20  ed precedence.  
5400: 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
5410: 6e 6f 74 20 52 48 53 20 73 79 6d 62 6f 6c 73 20  not RHS symbols 
5420: 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 70  with a defined p
5430: 72 65 63 65 64 65 6e 63 65 2c 20 74 68 65 20 70  recedence, the p
5440: 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73 79 6d  recedence.** sym
5450: 62 6f 6c 20 66 69 65 6c 64 20 69 73 20 6c 65 66  bol field is lef
5460: 74 20 62 6c 61 6e 6b 2e 0a 2a 2f 0a 76 6f 69 64  t blank..*/.void
5470: 20 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64 65   FindRulePrecede
5480: 6e 63 65 73 28 78 70 29 0a 73 74 72 75 63 74 20  nces(xp).struct 
5490: 6c 65 6d 6f 6e 20 2a 78 70 3b 0a 7b 0a 20 20 73  lemon *xp;.{.  s
54a0: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
54b0: 20 20 66 6f 72 28 72 70 3d 78 70 2d 3e 72 75 6c    for(rp=xp->rul
54c0: 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
54d0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d  xt){.    if( rp-
54e0: 3e 70 72 65 63 73 79 6d 3d 3d 30 20 29 7b 0a 20  >precsym==0 ){. 
54f0: 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20       int i, j;. 
5500: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
5510: 72 70 2d 3e 6e 72 68 73 20 26 26 20 72 70 2d 3e  rp->nrhs && rp->
5520: 70 72 65 63 73 79 6d 3d 3d 30 3b 20 69 2b 2b 29  precsym==0; i++)
5530: 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
5540: 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70   symbol *sp = rp
5550: 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20  ->rhs[i];.      
5560: 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
5570: 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b  MULTITERMINAL ){
5580: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a  .          for(j
5590: 3d 30 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79  =0; j<sp->nsubsy
55a0: 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  m; j++){.       
55b0: 20 20 20 20 20 69 66 28 20 73 70 2d 3e 73 75 62       if( sp->sub
55c0: 73 79 6d 5b 6a 5d 2d 3e 70 72 65 63 3e 3d 30 20  sym[j]->prec>=0 
55d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
55e0: 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 73   rp->precsym = s
55f0: 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 3b 0a 20 20  p->subsym[j];.  
5600: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
5610: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
5620: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5630: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
5640: 70 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20  p->prec>=0 ){.  
5650: 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63          rp->prec
5660: 73 79 6d 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d  sym = rp->rhs[i]
5670: 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20  ;..}.      }.   
5680: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b   }.  }.  return;
5690: 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20 61 6c 6c 20  .}../* Find all 
56a0: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68 69  nonterminals whi
56b0: 63 68 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  ch will generate
56c0: 20 74 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e   the empty strin
56d0: 67 2e 0a 2a 2a 20 54 68 65 6e 20 67 6f 20 62 61  g..** Then go ba
56e0: 63 6b 20 61 6e 64 20 63 6f 6d 70 75 74 65 20 74  ck and compute t
56f0: 68 65 20 66 69 72 73 74 20 73 65 74 73 20 6f 66  he first sets of
5700: 20 65 76 65 72 79 20 6e 6f 6e 74 65 72 6d 69 6e   every nontermin
5710: 61 6c 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  al..** The first
5720: 20 73 65 74 20 69 73 20 74 68 65 20 73 65 74 20   set is the set 
5730: 6f 66 20 61 6c 6c 20 74 65 72 6d 69 6e 61 6c 20  of all terminal 
5740: 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 63 61  symbols which ca
5750: 6e 20 62 65 67 69 6e 0a 2a 2a 20 61 20 73 74 72  n begin.** a str
5760: 69 6e 67 20 67 65 6e 65 72 61 74 65 64 20 62 79  ing generated by
5770: 20 74 68 61 74 20 6e 6f 6e 74 65 72 6d 69 6e 61   that nontermina
5780: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46  l..*/.void FindF
5790: 69 72 73 74 53 65 74 73 28 6c 65 6d 70 29 0a 73  irstSets(lemp).s
57a0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
57b0: 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  p;.{.  int i, j;
57c0: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
57d0: 72 70 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65  rp;.  int progre
57e0: 73 73 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ss;..  for(i=0; 
57f0: 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
5800: 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d   i++){.    lemp-
5810: 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6c 61 6d  >symbols[i]->lam
5820: 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53  bda = LEMON_FALS
5830: 45 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6c  E;.  }.  for(i=l
5840: 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
5850: 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
5860: 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d   i++){.    lemp-
5870: 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 66 69 72  >symbols[i]->fir
5880: 73 74 73 65 74 20 3d 20 53 65 74 4e 65 77 28 29  stset = SetNew()
5890: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73  ;.  }..  /* Firs
58a0: 74 20 63 6f 6d 70 75 74 65 20 61 6c 6c 20 6c 61  t compute all la
58b0: 6d 62 64 61 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20  mbdas */.  do{. 
58c0: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b     progress = 0;
58d0: 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  .    for(rp=lemp
58e0: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
58f0: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
5900: 69 66 28 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d  if( rp->lhs->lam
5910: 62 64 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  bda ) continue;.
5920: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
5930: 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
5940: 0a 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74  .         struct
5950: 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70   symbol *sp = rp
5960: 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20  ->rhs[i];.      
5970: 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 21     if( sp->type!
5980: 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d  =TERMINAL || sp-
5990: 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46  >lambda==LEMON_F
59a0: 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 20 20  ALSE ) break;.  
59b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
59c0: 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 7b 0a 20  i==rp->nrhs ){. 
59d0: 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e         rp->lhs->
59e0: 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 54  lambda = LEMON_T
59f0: 52 55 45 3b 0a 20 20 20 20 20 20 20 20 70 72 6f  RUE;.        pro
5a00: 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20  gress = 1;.     
5a10: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c   }.    }.  }whil
5a20: 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 0a  e( progress );..
5a30: 20 20 2f 2a 20 4e 6f 77 20 63 6f 6d 70 75 74 65    /* Now compute
5a40: 20 61 6c 6c 20 66 69 72 73 74 20 73 65 74 73 20   all first sets 
5a50: 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 73 74 72  */.  do{.    str
5a60: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 31 2c 20  uct symbol *s1, 
5a70: 2a 73 32 3b 0a 20 20 20 20 70 72 6f 67 72 65 73  *s2;.    progres
5a80: 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 72  s = 0;.    for(r
5a90: 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
5aa0: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
5ab0: 20 20 20 20 20 20 73 31 20 3d 20 72 70 2d 3e 6c        s1 = rp->l
5ac0: 68 73 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  hs;.      for(i=
5ad0: 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
5ae0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 32 20  ++){.        s2 
5af0: 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20  = rp->rhs[i];.  
5b00: 20 20 20 20 20 20 69 66 28 20 73 32 2d 3e 74 79        if( s2->ty
5b10: 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  pe==TERMINAL ){.
5b20: 20 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65            progre
5b30: 73 73 20 2b 3d 20 53 65 74 41 64 64 28 73 31 2d  ss += SetAdd(s1-
5b40: 3e 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 69 6e  >firstset,s2->in
5b50: 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dex);.          
5b60: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
5b70: 65 6c 73 65 20 69 66 28 20 73 32 2d 3e 74 79 70  else if( s2->typ
5b80: 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
5b90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f   ){.          fo
5ba0: 72 28 6a 3d 30 3b 20 6a 3c 73 32 2d 3e 6e 73 75  r(j=0; j<s2->nsu
5bb0: 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  bsym; j++){.    
5bc0: 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73          progress
5bd0: 20 2b 3d 20 53 65 74 41 64 64 28 73 31 2d 3e 66   += SetAdd(s1->f
5be0: 69 72 73 74 73 65 74 2c 73 32 2d 3e 73 75 62 73  irstset,s2->subs
5bf0: 79 6d 5b 6a 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20  ym[j]->index);. 
5c00: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5c10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 65 6c       break;..}el
5c20: 73 65 20 69 66 28 20 73 31 3d 3d 73 32 20 29 7b  se if( s1==s2 ){
5c30: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
5c40: 31 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e  1->lambda==LEMON
5c50: 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a  _FALSE ) break;.
5c60: 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20  .}else{.        
5c70: 20 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65    progress += Se
5c80: 74 55 6e 69 6f 6e 28 73 31 2d 3e 66 69 72 73 74  tUnion(s1->first
5c90: 73 65 74 2c 73 32 2d 3e 66 69 72 73 74 73 65 74  set,s2->firstset
5ca0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
5cb0: 20 73 32 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d   s2->lambda==LEM
5cc0: 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b  ON_FALSE ) break
5cd0: 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20  ;..}.      }.   
5ce0: 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f   }.  }while( pro
5cf0: 67 72 65 73 73 20 29 3b 0a 20 20 72 65 74 75 72  gress );.  retur
5d00: 6e 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65  n;.}../* Compute
5d10: 20 61 6c 6c 20 4c 52 28 30 29 20 73 74 61 74 65   all LR(0) state
5d20: 73 20 66 6f 72 20 74 68 65 20 67 72 61 6d 6d 61  s for the gramma
5d30: 72 2e 20 20 4c 69 6e 6b 73 0a 2a 2a 20 61 72 65  r.  Links.** are
5d40: 20 61 64 64 65 64 20 74 6f 20 62 65 74 77 65 65   added to betwee
5d50: 6e 20 73 6f 6d 65 20 73 74 61 74 65 73 20 73 6f  n some states so
5d60: 20 74 68 61 74 20 74 68 65 20 4c 52 28 31 29 20   that the LR(1) 
5d70: 66 6f 6c 6c 6f 77 20 73 65 74 73 0a 2a 2a 20 63  follow sets.** c
5d80: 61 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6c  an be computed l
5d90: 61 74 65 72 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  ater..*/.PRIVATE
5da0: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 67   struct state *g
5db0: 65 74 73 74 61 74 65 28 2f 2a 20 73 74 72 75 63  etstate(/* struc
5dc0: 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 20 20  t lemon * */);  
5dd0: 2f 2a 20 66 6f 72 77 61 72 64 20 72 65 66 65 72  /* forward refer
5de0: 65 6e 63 65 20 2a 2f 0a 76 6f 69 64 20 46 69 6e  ence */.void Fin
5df0: 64 53 74 61 74 65 73 28 6c 65 6d 70 29 0a 73 74  dStates(lemp).st
5e00: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
5e10: 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  ;.{.  struct sym
5e20: 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63  bol *sp;.  struc
5e30: 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 43  t rule *rp;..  C
5e40: 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 29  onfiglist_init()
5e50: 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  ;..  /* Find the
5e60: 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f   start symbol */
5e70: 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61  .  if( lemp->sta
5e80: 72 74 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 53  rt ){.    sp = S
5e90: 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d  ymbol_find(lemp-
5ea0: 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 69 66 28  >start);.    if(
5eb0: 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   sp==0 ){.      
5ec0: 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66  ErrorMsg(lemp->f
5ed0: 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20  ilename,0,."The 
5ee0: 73 70 65 63 69 66 69 65 64 20 73 74 61 72 74 20  specified start 
5ef0: 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 69 73  symbol \"%s\" is
5f00: 20 6e 6f 74 20 5c 0a 69 6e 20 61 20 6e 6f 6e 74   not \.in a nont
5f10: 65 72 6d 69 6e 61 6c 20 6f 66 20 74 68 65 20 67  erminal of the g
5f20: 72 61 6d 6d 61 72 2e 20 20 5c 22 25 73 5c 22 20  rammar.  \"%s\" 
5f30: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 73 20  will be used as 
5f40: 74 68 65 20 73 74 61 72 74 20 5c 0a 73 79 6d 62  the start \.symb
5f50: 6f 6c 20 69 6e 73 74 65 61 64 2e 22 2c 6c 65 6d  ol instead.",lem
5f60: 70 2d 3e 73 74 61 72 74 2c 6c 65 6d 70 2d 3e 72  p->start,lemp->r
5f70: 75 6c 65 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b  ule->lhs->name);
5f80: 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  .      lemp->err
5f90: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73  orcnt++;.      s
5fa0: 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e  p = lemp->rule->
5fb0: 6c 68 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  lhs;.    }.  }el
5fc0: 73 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d  se{.    sp = lem
5fd0: 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20  p->rule->lhs;.  
5fe0: 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
5ff0: 65 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62  e the start symb
6000: 6f 6c 20 64 6f 65 73 6e 27 74 20 6f 63 63 75 72  ol doesn't occur
6010: 20 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61   on the right-ha
6020: 6e 64 20 73 69 64 65 20 6f 66 0a 20 20 2a 2a 20  nd side of.  ** 
6030: 61 6e 79 20 72 75 6c 65 2e 20 20 52 65 70 6f 72  any rule.  Repor
6040: 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69 74  t an error if it
6050: 20 64 6f 65 73 2e 20 20 28 59 41 43 43 20 77 6f   does.  (YACC wo
6060: 75 6c 64 20 67 65 6e 65 72 61 74 65 20 61 20 6e  uld generate a n
6070: 65 77 0a 20 20 2a 2a 20 73 74 61 72 74 20 73 79  ew.  ** start sy
6080: 6d 62 6f 6c 20 69 6e 20 74 68 69 73 20 63 61 73  mbol in this cas
6090: 65 2e 29 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d  e.) */.  for(rp=
60a0: 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
60b0: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
60c0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
60d0: 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
60e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
60f0: 28 20 72 70 2d 3e 72 68 73 5b 69 5d 3d 3d 73 70  ( rp->rhs[i]==sp
6100: 20 29 7b 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a   ){   /* FIX ME:
6110: 20 20 44 65 61 6c 20 77 69 74 68 20 6d 75 6c 74    Deal with mult
6120: 69 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20  iterminals */.  
6130: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c        ErrorMsg(l
6140: 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c  emp->filename,0,
6150: 0a 22 54 68 65 20 73 74 61 72 74 20 73 79 6d 62  ."The start symb
6160: 6f 6c 20 5c 22 25 73 5c 22 20 6f 63 63 75 72 73  ol \"%s\" occurs
6170: 20 6f 6e 20 74 68 65 20 5c 0a 72 69 67 68 74 2d   on the \.right-
6180: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 72  hand side of a r
6190: 75 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 72  ule. This will r
61a0: 65 73 75 6c 74 20 69 6e 20 61 20 70 61 72 73 65  esult in a parse
61b0: 72 20 77 68 69 63 68 20 5c 0a 64 6f 65 73 20 6e  r which \.does n
61c0: 6f 74 20 77 6f 72 6b 20 70 72 6f 70 65 72 6c 79  ot work properly
61d0: 2e 22 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  .",sp->name);.  
61e0: 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
61f0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
6200: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
6210: 54 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67  The basis config
6220: 75 72 61 74 69 6f 6e 20 73 65 74 20 66 6f 72 20  uration set for 
6230: 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65 0a  the first state.
6240: 20 20 2a 2a 20 69 73 20 61 6c 6c 20 72 75 6c 65    ** is all rule
6250: 73 20 77 68 69 63 68 20 68 61 76 65 20 74 68 65  s which have the
6260: 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 61 73   start symbol as
6270: 20 74 68 65 69 72 0a 20 20 2a 2a 20 6c 65 66 74   their.  ** left
6280: 2d 68 61 6e 64 20 73 69 64 65 20 2a 2f 0a 20 20  -hand side */.  
6290: 66 6f 72 28 72 70 3d 73 70 2d 3e 72 75 6c 65 3b  for(rp=sp->rule;
62a0: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
62b0: 6c 68 73 29 7b 0a 20 20 20 20 73 74 72 75 63 74  lhs){.    struct
62c0: 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 70 3b   config *newcfp;
62d0: 0a 20 20 20 20 72 70 2d 3e 6c 68 73 53 74 61 72  .    rp->lhsStar
62e0: 74 20 3d 20 31 3b 0a 20 20 20 20 6e 65 77 63 66  t = 1;.    newcf
62f0: 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61  p = Configlist_a
6300: 64 64 62 61 73 69 73 28 72 70 2c 30 29 3b 0a 20  ddbasis(rp,0);. 
6310: 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66 70     SetAdd(newcfp
6320: 2d 3e 66 77 73 2c 30 29 3b 0a 20 20 7d 0a 0a 20  ->fws,0);.  }.. 
6330: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
6340: 66 69 72 73 74 20 73 74 61 74 65 2e 20 20 41 6c  first state.  Al
6350: 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 20 77  l other states w
6360: 69 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 6f 6d 70  ill be.  ** comp
6370: 75 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  uted automatical
6380: 6c 79 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  ly during the co
6390: 6d 70 75 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mputation of the
63a0: 20 66 69 72 73 74 20 6f 6e 65 2e 0a 20 20 2a 2a   first one..  **
63b0: 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f   The returned po
63c0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72  inter to the fir
63d0: 73 74 20 73 74 61 74 65 20 69 73 20 6e 6f 74 20  st state is not 
63e0: 75 73 65 64 2e 20 2a 2f 0a 20 20 28 76 6f 69 64  used. */.  (void
63f0: 29 67 65 74 73 74 61 74 65 28 6c 65 6d 70 29 3b  )getstate(lemp);
6400: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
6410: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
6420: 72 20 74 6f 20 61 20 73 74 61 74 65 20 77 68 69  r to a state whi
6430: 63 68 20 69 73 20 64 65 73 63 72 69 62 65 64 20  ch is described 
6440: 62 79 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  by the configura
6450: 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 20 77 68 69  tion.** list whi
6460: 63 68 20 68 61 73 20 62 65 65 6e 20 62 75 69 6c  ch has been buil
6470: 74 20 66 72 6f 6d 20 63 61 6c 6c 73 20 74 6f 20  t from calls to 
6480: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 2e 0a  Configlist_add..
6490: 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
64a0: 62 75 69 6c 64 73 68 69 66 74 73 28 2f 2a 20 73  buildshifts(/* s
64b0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20 73  truct lemon *, s
64c0: 74 72 75 63 74 20 73 74 61 74 65 20 2a 20 2a 2f  truct state * */
64d0: 29 3b 20 2f 2a 20 46 6f 72 77 64 20 72 65 66 20  ); /* Forwd ref 
64e0: 2a 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75 63  */.PRIVATE struc
64f0: 74 20 73 74 61 74 65 20 2a 67 65 74 73 74 61 74  t state *getstat
6500: 65 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  e(lemp).struct l
6510: 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
6520: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
6530: 66 70 2c 20 2a 62 70 3b 0a 20 20 73 74 72 75 63  fp, *bp;.  struc
6540: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 0a 20  t state *stp;.. 
6550: 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
6560: 73 6f 72 74 65 64 20 62 61 73 69 73 20 6f 66 20  sorted basis of 
6570: 74 68 65 20 6e 65 77 20 73 74 61 74 65 2e 20 20  the new state.  
6580: 54 68 65 20 62 61 73 69 73 20 77 61 73 20 63 6f  The basis was co
6590: 6e 73 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 62  nstructed.  ** b
65a0: 79 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f  y prior calls to
65b0: 20 22 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64   "Configlist_add
65c0: 62 61 73 69 73 28 29 22 2e 20 2a 2f 0a 20 20 43  basis()". */.  C
65d0: 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 62 61  onfiglist_sortba
65e0: 73 69 73 28 29 3b 0a 20 20 62 70 20 3d 20 43 6f  sis();.  bp = Co
65f0: 6e 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28 29  nfiglist_basis()
6600: 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61 20 73 74  ;..  /* Get a st
6610: 61 74 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ate with the sam
6620: 65 20 62 61 73 69 73 20 2a 2f 0a 20 20 73 74 70  e basis */.  stp
6630: 20 3d 20 53 74 61 74 65 5f 66 69 6e 64 28 62 70   = State_find(bp
6640: 29 3b 0a 20 20 69 66 28 20 73 74 70 20 29 7b 0a  );.  if( stp ){.
6650: 20 20 20 20 2f 2a 20 41 20 73 74 61 74 65 20 77      /* A state w
6660: 69 74 68 20 74 68 65 20 73 61 6d 65 20 62 61 73  ith the same bas
6670: 69 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  is already exist
6680: 73 21 20 20 43 6f 70 79 20 61 6c 6c 20 74 68 65  s!  Copy all the
6690: 20 66 6f 6c 6c 6f 77 2d 73 65 74 0a 20 20 20 20   follow-set.    
66a0: 2a 2a 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  ** propagation l
66b0: 69 6e 6b 73 20 66 72 6f 6d 20 74 68 65 20 73 74  inks from the st
66c0: 61 74 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72  ate under constr
66d0: 75 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 0a  uction into the.
66e0: 20 20 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69      ** preexisti
66f0: 6e 67 20 73 74 61 74 65 2c 20 74 68 65 6e 20 72  ng state, then r
6700: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
6710: 74 6f 20 74 68 65 20 70 72 65 65 78 69 73 74 69  to the preexisti
6720: 6e 67 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20  ng state */.    
6730: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 78  struct config *x
6740: 2c 20 2a 79 3b 0a 20 20 20 20 66 6f 72 28 78 3d  , *y;.    for(x=
6750: 62 70 2c 20 79 3d 73 74 70 2d 3e 62 70 3b 20 78  bp, y=stp->bp; x
6760: 20 26 26 20 79 3b 20 78 3d 78 2d 3e 62 70 2c 20   && y; x=x->bp, 
6770: 79 3d 79 2d 3e 62 70 29 7b 0a 20 20 20 20 20 20  y=y->bp){.      
6780: 50 6c 69 6e 6b 5f 63 6f 70 79 28 26 79 2d 3e 62  Plink_copy(&y->b
6790: 70 6c 70 2c 78 2d 3e 62 70 6c 70 29 3b 0a 20 20  plp,x->bplp);.  
67a0: 20 20 20 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65      Plink_delete
67b0: 28 78 2d 3e 66 70 6c 70 29 3b 0a 20 20 20 20 20  (x->fplp);.     
67c0: 20 78 2d 3e 66 70 6c 70 20 3d 20 78 2d 3e 62 70   x->fplp = x->bp
67d0: 6c 70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  lp = 0;.    }.  
67e0: 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69    cfp = Configli
67f0: 73 74 5f 72 65 74 75 72 6e 28 29 3b 0a 20 20 20  st_return();.   
6800: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28   Configlist_eat(
6810: 63 66 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  cfp);.  }else{. 
6820: 20 20 20 2f 2a 20 54 68 69 73 20 72 65 61 6c 6c     /* This reall
6830: 79 20 69 73 20 61 20 6e 65 77 20 73 74 61 74 65  y is a new state
6840: 2e 20 20 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c  .  Construct all
6850: 20 74 68 65 20 64 65 74 61 69 6c 73 20 2a 2f 0a   the details */.
6860: 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63      Configlist_c
6870: 6c 6f 73 75 72 65 28 6c 65 6d 70 29 3b 20 20 20  losure(lemp);   
6880: 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
6890: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c  configuration cl
68a0: 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 43 6f 6e  osure */.    Con
68b0: 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 29 3b 20  figlist_sort(); 
68c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72            /* Sor
68d0: 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  t the configurat
68e0: 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20  ion closure */. 
68f0: 20 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c     cfp = Configl
6900: 69 73 74 5f 72 65 74 75 72 6e 28 29 3b 20 20 20  ist_return();   
6910: 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72  /* Get a pointer
6920: 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 20 6c   to the config l
6930: 69 73 74 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d  ist */.    stp =
6940: 20 53 74 61 74 65 5f 6e 65 77 28 29 3b 20 20 20   State_new();   
6950: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77          /* A new
6960: 20 73 74 61 74 65 20 73 74 72 75 63 74 75 72 65   state structure
6970: 20 2a 2f 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68   */.    MemoryCh
6980: 65 63 6b 28 73 74 70 29 3b 0a 20 20 20 20 73 74  eck(stp);.    st
6990: 70 2d 3e 62 70 20 3d 20 62 70 3b 20 20 20 20 20  p->bp = bp;     
69a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
69b0: 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69  member the confi
69c0: 67 75 72 61 74 69 6f 6e 20 62 61 73 69 73 20 2a  guration basis *
69d0: 2f 0a 20 20 20 20 73 74 70 2d 3e 63 66 70 20 3d  /.    stp->cfp =
69e0: 20 63 66 70 3b 20 20 20 20 20 20 20 20 20 20 20   cfp;           
69f0: 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74     /* Remember t
6a00: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
6a10: 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20   closure */.    
6a20: 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 20 3d 20  stp->statenum = 
6a30: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b 2b 3b 20  lemp->nstate++; 
6a40: 2f 2a 20 45 76 65 72 79 20 73 74 61 74 65 20 67  /* Every state g
6a50: 65 74 73 20 61 20 73 65 71 75 65 6e 63 65 20 6e  ets a sequence n
6a60: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 73 74 70  umber */.    stp
6a70: 2d 3e 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20  ->ap = 0;       
6a80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20            /* No 
6a90: 61 63 74 69 6f 6e 73 2c 20 79 65 74 2e 20 2a 2f  actions, yet. */
6aa0: 0a 20 20 20 20 53 74 61 74 65 5f 69 6e 73 65 72  .    State_inser
6ab0: 74 28 73 74 70 2c 73 74 70 2d 3e 62 70 29 3b 20  t(stp,stp->bp); 
6ac0: 20 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65 20    /* Add to the 
6ad0: 73 74 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20  state table */. 
6ae0: 20 20 20 62 75 69 6c 64 73 68 69 66 74 73 28 6c     buildshifts(l
6af0: 65 6d 70 2c 73 74 70 29 3b 20 20 20 20 20 20 20  emp,stp);       
6b00: 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 63  /* Recursively c
6b10: 6f 6d 70 75 74 65 20 73 75 63 63 65 73 73 6f 72  ompute successor
6b20: 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 7d 0a 20   states */.  }. 
6b30: 20 72 65 74 75 72 6e 20 73 74 70 3b 0a 7d 0a 0a   return stp;.}..
6b40: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
6b50: 65 20 69 66 20 74 77 6f 20 73 79 6d 62 6f 6c 73  e if two symbols
6b60: 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 0a 2a   are the same..*
6b70: 2f 0a 69 6e 74 20 73 61 6d 65 5f 73 79 6d 62 6f  /.int same_symbo
6b80: 6c 28 61 2c 62 29 0a 73 74 72 75 63 74 20 73 79  l(a,b).struct sy
6b90: 6d 62 6f 6c 20 2a 61 3b 0a 73 74 72 75 63 74 20  mbol *a;.struct 
6ba0: 73 79 6d 62 6f 6c 20 2a 62 3b 0a 7b 0a 20 20 69  symbol *b;.{.  i
6bb0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 61 3d 3d 62  nt i;.  if( a==b
6bc0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
6bd0: 66 28 20 61 2d 3e 74 79 70 65 21 3d 4d 55 4c 54  f( a->type!=MULT
6be0: 49 54 45 52 4d 49 4e 41 4c 20 29 20 72 65 74 75  ITERMINAL ) retu
6bf0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 62 2d 3e 74  rn 0;.  if( b->t
6c00: 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype!=MULTITERMIN
6c10: 41 4c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  AL ) return 0;. 
6c20: 20 69 66 28 20 61 2d 3e 6e 73 75 62 73 79 6d 21   if( a->nsubsym!
6c30: 3d 62 2d 3e 6e 73 75 62 73 79 6d 20 29 20 72 65  =b->nsubsym ) re
6c40: 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d  turn 0;.  for(i=
6c50: 30 3b 20 69 3c 61 2d 3e 6e 73 75 62 73 79 6d 3b  0; i<a->nsubsym;
6c60: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
6c70: 2d 3e 73 75 62 73 79 6d 5b 69 5d 21 3d 62 2d 3e  ->subsym[i]!=b->
6c80: 73 75 62 73 79 6d 5b 69 5d 20 29 20 72 65 74 75  subsym[i] ) retu
6c90: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
6ca0: 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73  rn 1;.}../* Cons
6cb0: 74 72 75 63 74 20 61 6c 6c 20 73 75 63 63 65 73  truct all succes
6cc0: 73 6f 72 20 73 74 61 74 65 73 20 74 6f 20 74 68  sor states to th
6cd0: 65 20 67 69 76 65 6e 20 73 74 61 74 65 2e 20 20  e given state.  
6ce0: 41 20 22 73 75 63 63 65 73 73 6f 72 22 0a 2a 2a  A "successor".**
6cf0: 20 73 74 61 74 65 20 69 73 20 61 6e 79 20 73 74   state is any st
6d00: 61 74 65 20 77 68 69 63 68 20 63 61 6e 20 62 65  ate which can be
6d10: 20 72 65 61 63 68 65 64 20 62 79 20 61 20 73 68   reached by a sh
6d20: 69 66 74 20 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 50  ift action..*/.P
6d30: 52 49 56 41 54 45 20 76 6f 69 64 20 62 75 69 6c  RIVATE void buil
6d40: 64 73 68 69 66 74 73 28 6c 65 6d 70 2c 73 74 70  dshifts(lemp,stp
6d50: 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
6d60: 6c 65 6d 70 3b 0a 73 74 72 75 63 74 20 73 74 61  lemp;.struct sta
6d70: 74 65 20 2a 73 74 70 3b 20 20 20 20 20 2f 2a 20  te *stp;     /* 
6d80: 54 68 65 20 73 74 61 74 65 20 66 72 6f 6d 20 77  The state from w
6d90: 68 69 63 68 20 73 75 63 63 65 73 73 6f 72 73 20  hich successors 
6da0: 61 72 65 20 63 6f 6d 70 75 74 65 64 20 2a 2f 0a  are computed */.
6db0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
6dc0: 67 20 2a 63 66 70 3b 20 20 2f 2a 20 46 6f 72 20  g *cfp;  /* For 
6dd0: 6c 6f 6f 70 69 6e 67 20 74 68 72 75 20 74 68 65  looping thru the
6de0: 20 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72 65 20   config closure 
6df0: 6f 66 20 22 73 74 70 22 20 2a 2f 0a 20 20 73 74  of "stp" */.  st
6e00: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 63 66  ruct config *bcf
6e10: 70 3b 20 2f 2a 20 46 6f 72 20 74 68 65 20 69 6e  p; /* For the in
6e20: 6e 65 72 20 6c 6f 6f 70 20 6f 6e 20 63 6f 6e 66  ner loop on conf
6e30: 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73  ig closure of "s
6e40: 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  tp" */.  struct 
6e50: 63 6f 6e 66 69 67 20 2a 6e 65 77 3b 20 20 2f 2a  config *new;  /*
6e60: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
6e70: 62 6f 6c 20 2a 73 70 3b 20 20 20 2f 2a 20 53 79  bol *sp;   /* Sy
6e80: 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  mbol following t
6e90: 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67  he dot in config
6ea0: 75 72 61 74 69 6f 6e 20 22 63 66 70 22 20 2a 2f  uration "cfp" */
6eb0: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
6ec0: 20 2a 62 73 70 3b 20 20 2f 2a 20 53 79 6d 62 6f   *bsp;  /* Symbo
6ed0: 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  l following the 
6ee0: 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61  dot in configura
6ef0: 74 69 6f 6e 20 22 62 63 66 70 22 20 2a 2f 0a 20  tion "bcfp" */. 
6f00: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 6e   struct state *n
6f10: 65 77 73 74 70 3b 20 2f 2a 20 41 20 70 6f 69 6e  ewstp; /* A poin
6f20: 74 65 72 20 74 6f 20 61 20 73 75 63 63 65 73 73  ter to a success
6f30: 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f  or state */..  /
6f40: 2a 20 45 61 63 68 20 63 6f 6e 66 69 67 75 72 61  * Each configura
6f50: 74 69 6f 6e 20 62 65 63 6f 6d 65 73 20 63 6f 6d  tion becomes com
6f60: 70 6c 65 74 65 20 61 66 74 65 72 20 69 74 20 63  plete after it c
6f70: 6f 6e 74 69 62 75 74 65 73 20 74 6f 20 61 20 73  ontibutes to a s
6f80: 75 63 63 65 73 73 6f 72 0a 20 20 2a 2a 20 73 74  uccessor.  ** st
6f90: 61 74 65 2e 20 20 49 6e 69 74 69 61 6c 6c 79 2c  ate.  Initially,
6fa0: 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69   all configurati
6fb0: 6f 6e 73 20 61 72 65 20 69 6e 63 6f 6d 70 6c 65  ons are incomple
6fc0: 74 65 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d  te */.  for(cfp=
6fd0: 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63  stp->cfp; cfp; c
6fe0: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 20 63 66  fp=cfp->next) cf
6ff0: 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f  p->status = INCO
7000: 4d 50 4c 45 54 45 3b 0a 0a 20 20 2f 2a 20 4c 6f  MPLETE;..  /* Lo
7010: 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63  op through all c
7020: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 6f 66  onfigurations of
7030: 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22   the state "stp"
7040: 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74   */.  for(cfp=st
7050: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
7060: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
7070: 20 69 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73   if( cfp->status
7080: 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e  ==COMPLETE ) con
7090: 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72  tinue;    /* Alr
70a0: 65 61 64 79 20 75 73 65 64 20 62 79 20 69 6e 6e  eady used by inn
70b0: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  er loop */.    i
70c0: 66 28 20 63 66 70 2d 3e 64 6f 74 3e 3d 63 66 70  f( cfp->dot>=cfp
70d0: 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e  ->rp->nrhs ) con
70e0: 74 69 6e 75 65 3b 20 20 2f 2a 20 43 61 6e 27 74  tinue;  /* Can't
70f0: 20 73 68 69 66 74 20 74 68 69 73 20 63 6f 6e 66   shift this conf
7100: 69 67 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67  ig */.    Config
7110: 6c 69 73 74 5f 72 65 73 65 74 28 29 3b 20 20 20  list_reset();   
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7130: 20 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20     /* Reset the 
7140: 6e 65 77 20 63 6f 6e 66 69 67 20 73 65 74 20 2a  new config set *
7150: 2f 0a 20 20 20 20 73 70 20 3d 20 63 66 70 2d 3e  /.    sp = cfp->
7160: 72 70 2d 3e 72 68 73 5b 63 66 70 2d 3e 64 6f 74  rp->rhs[cfp->dot
7170: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
7180: 2a 20 53 79 6d 62 6f 6c 20 61 66 74 65 72 20 74  * Symbol after t
7190: 68 65 20 64 6f 74 20 2a 2f 0a 0a 20 20 20 20 2f  he dot */..    /
71a0: 2a 20 46 6f 72 20 65 76 65 72 79 20 63 6f 6e 66  * For every conf
71b0: 69 67 75 72 61 74 69 6f 6e 20 69 6e 20 74 68 65  iguration in the
71c0: 20 73 74 61 74 65 20 22 73 74 70 22 20 77 68 69   state "stp" whi
71d0: 63 68 20 68 61 73 20 74 68 65 20 73 79 6d 62 6f  ch has the symbo
71e0: 6c 20 22 73 70 22 0a 20 20 20 20 2a 2a 20 66 6f  l "sp".    ** fo
71f0: 6c 6c 6f 77 69 6e 67 20 69 74 73 20 64 6f 74 2c  llowing its dot,
7200: 20 61 64 64 20 74 68 65 20 73 61 6d 65 20 63 6f   add the same co
7210: 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 74  nfiguration to t
7220: 68 65 20 62 61 73 69 73 20 73 65 74 20 75 6e 64  he basis set und
7230: 65 72 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72  er.    ** constr
7240: 75 63 74 69 6f 6e 20 62 75 74 20 77 69 74 68 20  uction but with 
7250: 74 68 65 20 64 6f 74 20 73 68 69 66 74 65 64 20  the dot shifted 
7260: 6f 6e 65 20 73 79 6d 62 6f 6c 20 74 6f 20 74 68  one symbol to th
7270: 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
7280: 66 6f 72 28 62 63 66 70 3d 63 66 70 3b 20 62 63  for(bcfp=cfp; bc
7290: 66 70 3b 20 62 63 66 70 3d 62 63 66 70 2d 3e 6e  fp; bcfp=bcfp->n
72a0: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
72b0: 62 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f  bcfp->status==CO
72c0: 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75  MPLETE ) continu
72d0: 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79  e;    /* Already
72e0: 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 69   used */.      i
72f0: 66 28 20 62 63 66 70 2d 3e 64 6f 74 3e 3d 62 63  f( bcfp->dot>=bc
7300: 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63  fp->rp->nrhs ) c
7310: 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 43 61 6e 27  ontinue; /* Can'
7320: 74 20 73 68 69 66 74 20 74 68 69 73 20 6f 6e 65  t shift this one
7330: 20 2a 2f 0a 20 20 20 20 20 20 62 73 70 20 3d 20   */.      bsp = 
7340: 62 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 62 63  bcfp->rp->rhs[bc
7350: 66 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20  fp->dot];       
7360: 20 20 20 20 2f 2a 20 47 65 74 20 73 79 6d 62 6f      /* Get symbo
7370: 6c 20 61 66 74 65 72 20 64 6f 74 20 2a 2f 0a 20  l after dot */. 
7380: 20 20 20 20 20 69 66 28 20 21 73 61 6d 65 5f 73       if( !same_s
7390: 79 6d 62 6f 6c 28 62 73 70 2c 73 70 29 20 29 20  ymbol(bsp,sp) ) 
73a0: 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20 20 2f  continue;      /
73b0: 2a 20 4d 75 73 74 20 62 65 20 73 61 6d 65 20 61  * Must be same a
73c0: 73 20 66 6f 72 20 22 63 66 70 22 20 2a 2f 0a 20  s for "cfp" */. 
73d0: 20 20 20 20 20 62 63 66 70 2d 3e 73 74 61 74 75       bcfp->statu
73e0: 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 20 20 20  s = COMPLETE;   
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7400: 2a 20 4d 61 72 6b 20 74 68 69 73 20 63 6f 6e 66  * Mark this conf
7410: 69 67 20 61 73 20 75 73 65 64 20 2a 2f 0a 20 20  ig as used */.  
7420: 20 20 20 20 6e 65 77 20 3d 20 43 6f 6e 66 69 67      new = Config
7430: 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 62 63  list_addbasis(bc
7440: 66 70 2d 3e 72 70 2c 62 63 66 70 2d 3e 64 6f 74  fp->rp,bcfp->dot
7450: 2b 31 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b  +1);.      Plink
7460: 5f 61 64 64 28 26 6e 65 77 2d 3e 62 70 6c 70 2c  _add(&new->bplp,
7470: 62 63 66 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  bcfp);.    }..  
7480: 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74    /* Get a point
7490: 65 72 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  er to the state 
74a0: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 68 65  described by the
74b0: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61   basis configura
74c0: 74 69 6f 6e 20 73 65 74 0a 20 20 20 20 2a 2a 20  tion set.    ** 
74d0: 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
74e0: 68 65 20 70 72 65 63 65 64 69 6e 67 20 6c 6f 6f  he preceding loo
74f0: 70 20 2a 2f 0a 20 20 20 20 6e 65 77 73 74 70 20  p */.    newstp 
7500: 3d 20 67 65 74 73 74 61 74 65 28 6c 65 6d 70 29  = getstate(lemp)
7510: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74  ;..    /* The st
7520: 61 74 65 20 22 6e 65 77 73 74 70 22 20 69 73 20  ate "newstp" is 
7530: 72 65 61 63 68 65 64 20 66 72 6f 6d 20 74 68 65  reached from the
7540: 20 73 74 61 74 65 20 22 73 74 70 22 20 62 79 20   state "stp" by 
7550: 61 20 73 68 69 66 74 20 61 63 74 69 6f 6e 0a 20  a shift action. 
7560: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 79 6d     ** on the sym
7570: 62 6f 6c 20 22 73 70 22 20 2a 2f 0a 20 20 20 20  bol "sp" */.    
7580: 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55  if( sp->type==MU
7590: 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
75a0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
75b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 70 2d    for(i=0; i<sp-
75c0: 3e 6e 73 75 62 73 79 6d 3b 20 69 2b 2b 29 7b 0a  >nsubsym; i++){.
75d0: 20 20 20 20 20 20 20 20 41 63 74 69 6f 6e 5f 61          Action_a
75e0: 64 64 28 26 73 74 70 2d 3e 61 70 2c 53 48 49 46  dd(&stp->ap,SHIF
75f0: 54 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 69 5d 2c  T,sp->subsym[i],
7600: 28 63 68 61 72 2a 29 6e 65 77 73 74 70 29 3b 0a  (char*)newstp);.
7610: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
7620: 65 7b 0a 20 20 20 20 20 20 41 63 74 69 6f 6e 5f  e{.      Action_
7630: 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 53 48 49  add(&stp->ap,SHI
7640: 46 54 2c 73 70 2c 28 63 68 61 72 20 2a 29 6e 65  FT,sp,(char *)ne
7650: 77 73 74 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  wstp);.    }.  }
7660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72  .}../*.** Constr
7670: 75 63 74 20 74 68 65 20 70 72 6f 70 61 67 61 74  uct the propagat
7680: 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2f 0a 76 6f 69  ion links.*/.voi
7690: 64 20 46 69 6e 64 4c 69 6e 6b 73 28 6c 65 6d 70  d FindLinks(lemp
76a0: 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
76b0: 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b  lemp;.{.  int i;
76c0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
76d0: 20 2a 63 66 70 2c 20 2a 6f 74 68 65 72 3b 0a 20   *cfp, *other;. 
76e0: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
76f0: 74 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  tp;.  struct pli
7700: 6e 6b 20 2a 70 6c 70 3b 0a 0a 20 20 2f 2a 20 48  nk *plp;..  /* H
7710: 6f 75 73 65 6b 65 65 70 69 6e 67 20 64 65 74 61  ousekeeping deta
7720: 69 6c 3a 0a 20 20 2a 2a 20 41 64 64 20 74 6f 20  il:.  ** Add to 
7730: 65 76 65 72 79 20 70 72 6f 70 61 67 61 74 65 20  every propagate 
7740: 6c 69 6e 6b 20 61 20 70 6f 69 6e 74 65 72 20 62  link a pointer b
7750: 61 63 6b 20 74 6f 20 74 68 65 20 73 74 61 74 65  ack to the state
7760: 20 74 6f 0a 20 20 2a 2a 20 77 68 69 63 68 20 74   to.  ** which t
7770: 68 65 20 6c 69 6e 6b 20 69 73 20 61 74 74 61 63  he link is attac
7780: 68 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  hed. */.  for(i=
7790: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
77a0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  e; i++){.    stp
77b0: 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
77c0: 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d  i];.    for(cfp=
77d0: 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63  stp->cfp; cfp; c
77e0: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20  fp=cfp->next){. 
77f0: 20 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20       cfp->stp = 
7800: 73 74 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  stp;.    }.  }..
7810: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c    /* Convert all
7820: 20 62 61 63 6b 6c 69 6e 6b 73 20 69 6e 74 6f 20   backlinks into 
7830: 66 6f 72 77 61 72 64 20 6c 69 6e 6b 73 2e 20 20  forward links.  
7840: 4f 6e 6c 79 20 74 68 65 20 66 6f 72 77 61 72 64  Only the forward
7850: 0a 20 20 2a 2a 20 6c 69 6e 6b 73 20 61 72 65 20  .  ** links are 
7860: 75 73 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c  used in the foll
7870: 6f 77 2d 73 65 74 20 63 6f 6d 70 75 74 61 74 69  ow-set computati
7880: 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  on. */.  for(i=0
7890: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
78a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
78b0: 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
78c0: 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73  ];.    for(cfp=s
78d0: 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66  tp->cfp; cfp; cf
78e0: 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=cfp->next){.  
78f0: 20 20 20 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d      for(plp=cfp-
7900: 3e 62 70 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d  >bplp; plp; plp=
7910: 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  plp->next){.    
7920: 20 20 20 20 6f 74 68 65 72 20 3d 20 70 6c 70 2d      other = plp-
7930: 3e 63 66 70 3b 0a 20 20 20 20 20 20 20 20 50 6c  >cfp;.        Pl
7940: 69 6e 6b 5f 61 64 64 28 26 6f 74 68 65 72 2d 3e  ink_add(&other->
7950: 66 70 6c 70 2c 63 66 70 29 3b 0a 20 20 20 20 20  fplp,cfp);.     
7960: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
7970: 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 66  /* Compute all f
7980: 6f 6c 6c 6f 77 73 65 74 73 2e 0a 2a 2a 0a 2a 2a  ollowsets..**.**
7990: 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20 69 73 20   A followset is 
79a0: 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 73  the set of all s
79b0: 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 63 61 6e  ymbols which can
79c0: 20 63 6f 6d 65 20 69 6d 6d 65 64 69 61 74 65 6c   come immediatel
79d0: 79 0a 2a 2a 20 61 66 74 65 72 20 61 20 63 6f 6e  y.** after a con
79e0: 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  figuration..*/.v
79f0: 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65  oid FindFollowSe
7a00: 74 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20  ts(lemp).struct 
7a10: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20  lemon *lemp;.{. 
7a20: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
7a30: 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20   config *cfp;.  
7a40: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c  struct plink *pl
7a50: 70 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73  p;.  int progres
7a60: 73 3b 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 3b  s;.  int change;
7a70: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ..  for(i=0; i<l
7a80: 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
7a90: 29 7b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 6c  ){.    for(cfp=l
7aa0: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e  emp->sorted[i]->
7ab0: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
7ac0: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
7ad0: 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e  cfp->status = IN
7ae0: 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 7d 0a  COMPLETE;.    }.
7af0: 20 20 7d 0a 20 20 0a 20 20 64 6f 7b 0a 20 20 20    }.  .  do{.   
7b00: 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20   progress = 0;. 
7b10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65     for(i=0; i<le
7b20: 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
7b30: 7b 0a 20 20 20 20 20 20 66 6f 72 28 63 66 70 3d  {.      for(cfp=
7b40: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d  lemp->sorted[i]-
7b50: 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63  >cfp; cfp; cfp=c
7b60: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  fp->next){.     
7b70: 20 20 20 69 66 28 20 63 66 70 2d 3e 73 74 61 74     if( cfp->stat
7b80: 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63  us==COMPLETE ) c
7b90: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
7ba0: 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 66 70   for(plp=cfp->fp
7bb0: 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70  lp; plp; plp=plp
7bc0: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
7bd0: 20 20 20 63 68 61 6e 67 65 20 3d 20 53 65 74 55     change = SetU
7be0: 6e 69 6f 6e 28 70 6c 70 2d 3e 63 66 70 2d 3e 66  nion(plp->cfp->f
7bf0: 77 73 2c 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20  ws,cfp->fws);.  
7c00: 20 20 20 20 20 20 20 20 69 66 28 20 63 68 61 6e          if( chan
7c10: 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
7c20: 20 20 70 6c 70 2d 3e 63 66 70 2d 3e 73 74 61 74    plp->cfp->stat
7c30: 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b  us = INCOMPLETE;
7c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f  .            pro
7c50: 67 72 65 73 73 20 3d 20 31 3b 0a 09 20 20 7d 0a  gress = 1;..  }.
7c60: 09 7d 0a 20 20 20 20 20 20 20 20 63 66 70 2d 3e  .}.        cfp->
7c70: 73 74 61 74 75 73 20 3d 20 43 4f 4d 50 4c 45 54  status = COMPLET
7c80: 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
7c90: 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72  .  }while( progr
7ca0: 65 73 73 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  ess );.}..static
7cb0: 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63 6f 6e   int resolve_con
7cc0: 66 6c 69 63 74 28 29 3b 0a 0a 2f 2a 20 43 6f 6d  flict();../* Com
7cd0: 70 75 74 65 20 74 68 65 20 72 65 64 75 63 65 20  pute the reduce 
7ce0: 61 63 74 69 6f 6e 73 2c 20 61 6e 64 20 72 65 73  actions, and res
7cf0: 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73 2e 0a  olve conflicts..
7d00: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 41 63 74 69  */.void FindActi
7d10: 6f 6e 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74  ons(lemp).struct
7d20: 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a   lemon *lemp;.{.
7d30: 20 20 69 6e 74 20 69 2c 6a 3b 0a 20 20 73 74 72    int i,j;.  str
7d40: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
7d50: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
7d60: 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 73  *stp;.  struct s
7d70: 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72  ymbol *sp;.  str
7d80: 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20  uct rule *rp;.. 
7d90: 20 2f 2a 20 41 64 64 20 61 6c 6c 20 6f 66 20 74   /* Add all of t
7da0: 68 65 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e  he reduce action
7db0: 73 20 0a 20 20 2a 2a 20 41 20 72 65 64 75 63 65  s .  ** A reduce
7dc0: 20 61 63 74 69 6f 6e 20 69 73 20 61 64 64 65 64   action is added
7dd0: 20 66 6f 72 20 65 61 63 68 20 65 6c 65 6d 65 6e   for each elemen
7de0: 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 73  t of the follows
7df0: 65 74 20 6f 66 0a 20 20 2a 2a 20 61 20 63 6f 6e  et of.  ** a con
7e00: 66 69 67 75 72 61 74 69 6f 6e 20 77 68 69 63 68  figuration which
7e10: 20 68 61 73 20 69 74 73 20 64 6f 74 20 61 74 20   has its dot at 
7e20: 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67 68  the extreme righ
7e30: 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  t..  */.  for(i=
7e40: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
7e50: 65 3b 20 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c 6f  e; i++){   /* Lo
7e60: 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73 74 61 74  op over all stat
7e70: 65 73 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20  es */.    stp = 
7e80: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
7e90: 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70  .    for(cfp=stp
7ea0: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
7eb0: 63 66 70 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a 20  cfp->next){  /* 
7ec0: 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 63 6f  Loop over all co
7ed0: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a  nfigurations */.
7ee0: 20 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e 72        if( cfp->r
7ef0: 70 2d 3e 6e 72 68 73 3d 3d 63 66 70 2d 3e 64 6f  p->nrhs==cfp->do
7f00: 74 20 29 7b 20 20 20 20 20 20 20 20 2f 2a 20 49  t ){        /* I
7f10: 73 20 64 6f 74 20 61 74 20 65 78 74 72 65 6d 65  s dot at extreme
7f20: 20 72 69 67 68 74 3f 20 2a 2f 0a 20 20 20 20 20   right? */.     
7f30: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65     for(j=0; j<le
7f40: 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a  mp->nterminal; j
7f50: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
7f60: 66 28 20 53 65 74 46 69 6e 64 28 63 66 70 2d 3e  f( SetFind(cfp->
7f70: 66 77 73 2c 6a 29 20 29 7b 0a 20 20 20 20 20 20  fws,j) ){.      
7f80: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20 72        /* Add a r
7f90: 65 64 75 63 65 20 61 63 74 69 6f 6e 20 74 6f 20  educe action to 
7fa0: 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20  the state "stp" 
7fb0: 77 68 69 63 68 20 77 69 6c 6c 20 72 65 64 75 63  which will reduc
7fc0: 65 20 62 79 20 74 68 65 0a 20 20 20 20 20 20 20  e by the.       
7fd0: 20 20 20 20 20 2a 2a 20 72 75 6c 65 20 22 63 66       ** rule "cf
7fe0: 70 2d 3e 72 70 22 20 69 66 20 74 68 65 20 6c 6f  p->rp" if the lo
7ff0: 6f 6b 61 68 65 61 64 20 73 79 6d 62 6f 6c 20 69  okahead symbol i
8000: 73 20 22 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  s "lemp->symbols
8010: 5b 6a 5d 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  [j]" */.        
8020: 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26      Action_add(&
8030: 73 74 70 2d 3e 61 70 2c 52 45 44 55 43 45 2c 6c  stp->ap,REDUCE,l
8040: 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2c  emp->symbols[j],
8050: 28 63 68 61 72 20 2a 29 63 66 70 2d 3e 72 70 29  (char *)cfp->rp)
8060: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 09 7d  ;.          }..}
8070: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8080: 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65   }..  /* Add the
8090: 20 61 63 63 65 70 74 69 6e 67 20 74 6f 6b 65 6e   accepting token
80a0: 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   */.  if( lemp->
80b0: 73 74 61 72 74 20 29 7b 0a 20 20 20 20 73 70 20  start ){.    sp 
80c0: 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65  = Symbol_find(le
80d0: 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20  mp->start);.    
80e0: 69 66 28 20 73 70 3d 3d 30 20 29 20 73 70 20 3d  if( sp==0 ) sp =
80f0: 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73   lemp->rule->lhs
8100: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
8110: 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e  p = lemp->rule->
8120: 6c 68 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 64  lhs;.  }.  /* Ad
8130: 64 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 73  d to the first s
8140: 74 61 74 65 20 28 77 68 69 63 68 20 69 73 20 61  tate (which is a
8150: 6c 77 61 79 73 20 74 68 65 20 73 74 61 72 74 69  lways the starti
8160: 6e 67 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  ng state of the.
8170: 20 20 2a 2a 20 66 69 6e 69 74 65 20 73 74 61 74    ** finite stat
8180: 65 20 6d 61 63 68 69 6e 65 29 20 61 6e 20 61 63  e machine) an ac
8190: 74 69 6f 6e 20 74 6f 20 41 43 43 45 50 54 20 69  tion to ACCEPT i
81a0: 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20  f the lookahead 
81b0: 69 73 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72  is the.  ** star
81c0: 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 20 20  t nonterminal.  
81d0: 2a 2f 0a 20 20 41 63 74 69 6f 6e 5f 61 64 64 28  */.  Action_add(
81e0: 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d  &lemp->sorted[0]
81f0: 2d 3e 61 70 2c 41 43 43 45 50 54 2c 73 70 2c 30  ->ap,ACCEPT,sp,0
8200: 29 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  );..  /* Resolve
8210: 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20   conflicts */.  
8220: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
8230: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
8240: 20 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e     struct action
8250: 20 2a 61 70 2c 20 2a 6e 61 70 3b 0a 20 20 20 20   *ap, *nap;.    
8260: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
8270: 70 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  p;.    stp = lem
8280: 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
8290: 20 20 2f 2a 20 61 73 73 65 72 74 28 20 73 74 70    /* assert( stp
82a0: 2d 3e 61 70 20 29 3b 20 2a 2f 0a 20 20 20 20 73  ->ap ); */.    s
82b0: 74 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f  tp->ap = Action_
82c0: 73 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20  sort(stp->ap);. 
82d0: 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
82e0: 70 3b 20 61 70 20 26 26 20 61 70 2d 3e 6e 65 78  p; ap && ap->nex
82f0: 74 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b  t; ap=ap->next){
8300: 0a 20 20 20 20 20 20 66 6f 72 28 6e 61 70 3d 61  .      for(nap=a
8310: 70 2d 3e 6e 65 78 74 3b 20 6e 61 70 20 26 26 20  p->next; nap && 
8320: 6e 61 70 2d 3e 73 70 3d 3d 61 70 2d 3e 73 70 3b  nap->sp==ap->sp;
8330: 20 6e 61 70 3d 6e 61 70 2d 3e 6e 65 78 74 29 7b   nap=nap->next){
8340: 0a 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  .         /* The
8350: 20 74 77 6f 20 61 63 74 69 6f 6e 73 20 22 61 70   two actions "ap
8360: 22 20 61 6e 64 20 22 6e 61 70 22 20 68 61 76 65  " and "nap" have
8370: 20 74 68 65 20 73 61 6d 65 20 6c 6f 6f 6b 61 68   the same lookah
8380: 65 61 64 2e 0a 20 20 20 20 20 20 20 20 20 2a 2a  ead..         **
8390: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63   Figure out whic
83a0: 68 20 6f 6e 65 20 73 68 6f 75 6c 64 20 62 65 20  h one should be 
83b0: 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  used */.        
83c0: 20 6c 65 6d 70 2d 3e 6e 63 6f 6e 66 6c 69 63 74   lemp->nconflict
83d0: 20 2b 3d 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66   += resolve_conf
83e0: 6c 69 63 74 28 61 70 2c 6e 61 70 2c 6c 65 6d 70  lict(ap,nap,lemp
83f0: 2d 3e 65 72 72 73 79 6d 29 3b 0a 20 20 20 20 20  ->errsym);.     
8400: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
8410: 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72  /* Report an err
8420: 6f 72 20 66 6f 72 20 65 61 63 68 20 72 75 6c 65  or for each rule
8430: 20 74 68 61 74 20 63 61 6e 20 6e 65 76 65 72 20   that can never 
8440: 62 65 20 72 65 64 75 63 65 64 2e 20 2a 2f 0a 20  be reduced. */. 
8450: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
8460: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
8470: 65 78 74 29 20 72 70 2d 3e 63 61 6e 52 65 64 75  ext) rp->canRedu
8480: 63 65 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45  ce = LEMON_FALSE
8490: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
84a0: 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
84b0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 61 63  ){.    struct ac
84c0: 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 20 20 66 6f  tion *ap;.    fo
84d0: 72 28 61 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65  r(ap=lemp->sorte
84e0: 64 5b 69 5d 2d 3e 61 70 3b 20 61 70 3b 20 61 70  d[i]->ap; ap; ap
84f0: 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
8500: 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d    if( ap->type==
8510: 52 45 44 55 43 45 20 29 20 61 70 2d 3e 78 2e 72  REDUCE ) ap->x.r
8520: 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d 20 4c  p->canReduce = L
8530: 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20 7d  EMON_TRUE;.    }
8540: 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65  .  }.  for(rp=le
8550: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
8560: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
8570: 69 66 28 20 72 70 2d 3e 63 61 6e 52 65 64 75 63  if( rp->canReduc
8580: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
8590: 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
85a0: 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75  >filename,rp->ru
85b0: 6c 65 6c 69 6e 65 2c 22 54 68 69 73 20 72 75 6c  leline,"This rul
85c0: 65 20 63 61 6e 20 6e 6f 74 20 62 65 20 72 65 64  e can not be red
85d0: 75 63 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c  uced.\n");.    l
85e0: 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
85f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c  .  }.}../* Resol
8600: 76 65 20 61 20 63 6f 6e 66 6c 69 63 74 20 62 65  ve a conflict be
8610: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
8620: 76 65 6e 20 61 63 74 69 6f 6e 73 2e 20 20 49 66  ven actions.  If
8630: 20 74 68 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74   the.** conflict
8640: 20 63 61 6e 27 74 20 62 65 20 72 65 73 6f 6c 76   can't be resolv
8650: 65 64 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  ed, return non-z
8660: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f  ero..**.** NO LO
8670: 4e 47 45 52 20 54 52 55 45 3a 0a 2a 2a 20 20 20  NGER TRUE:.**   
8680: 54 6f 20 72 65 73 6f 6c 76 65 20 61 20 63 6f 6e  To resolve a con
8690: 66 6c 69 63 74 2c 20 66 69 72 73 74 20 6c 6f 6f  flict, first loo
86a0: 6b 20 74 6f 20 73 65 65 20 69 66 20 65 69 74 68  k to see if eith
86b0: 65 72 20 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 69  er action.**   i
86c0: 73 20 6f 6e 20 61 6e 20 65 72 72 6f 72 20 72 75  s on an error ru
86d0: 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  le.  In that cas
86e0: 65 2c 20 74 61 6b 65 20 74 68 65 20 61 63 74 69  e, take the acti
86f0: 6f 6e 20 77 68 69 63 68 0a 2a 2a 20 20 20 69 73  on which.**   is
8700: 20 6e 6f 74 20 61 73 73 6f 63 69 61 74 65 64 20   not associated 
8710: 77 69 74 68 20 74 68 65 20 65 72 72 6f 72 20 72  with the error r
8720: 75 6c 65 2e 20 20 49 66 20 6e 65 69 74 68 65 72  ule.  If neither
8730: 20 6f 72 20 62 6f 74 68 0a 2a 2a 20 20 20 61 63   or both.**   ac
8740: 74 69 6f 6e 73 20 61 72 65 20 61 73 73 6f 63 69  tions are associ
8750: 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72  ated with an err
8760: 6f 72 20 72 75 6c 65 2c 20 74 68 65 6e 20 74 72  or rule, then tr
8770: 79 20 74 6f 0a 2a 2a 20 20 20 75 73 65 20 70 72  y to.**   use pr
8780: 65 63 65 64 65 6e 63 65 20 74 6f 20 72 65 73 6f  ecedence to reso
8790: 6c 76 65 20 74 68 65 20 63 6f 6e 66 6c 69 63 74  lve the conflict
87a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65  ..**.** If eithe
87b0: 72 20 61 63 74 69 6f 6e 20 69 73 20 61 20 53 48  r action is a SH
87c0: 49 46 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73  IFT, then it mus
87d0: 74 20 62 65 20 61 70 78 2e 20 20 54 68 69 73 0a  t be apx.  This.
87e0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 6e 27  ** function won'
87f0: 74 20 77 6f 72 6b 20 69 66 20 61 70 78 2d 3e 74  t work if apx->t
8800: 79 70 65 3d 3d 52 45 44 55 43 45 20 61 6e 64 20  ype==REDUCE and 
8810: 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54  apy->type==SHIFT
8820: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8830: 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74  resolve_conflict
8840: 28 61 70 78 2c 61 70 79 2c 65 72 72 73 79 6d 29  (apx,apy,errsym)
8850: 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  .struct action *
8860: 61 70 78 3b 0a 73 74 72 75 63 74 20 61 63 74 69  apx;.struct acti
8870: 6f 6e 20 2a 61 70 79 3b 0a 73 74 72 75 63 74 20  on *apy;.struct 
8880: 73 79 6d 62 6f 6c 20 2a 65 72 72 73 79 6d 3b 20  symbol *errsym; 
8890: 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 73    /* The error s
88a0: 79 6d 62 6f 6c 20 28 69 66 20 64 65 66 69 6e 65  ymbol (if define
88b0: 64 2e 20 20 4e 55 4c 4c 20 6f 74 68 65 72 77 69  d.  NULL otherwi
88c0: 73 65 29 20 2a 2f 0a 7b 0a 20 20 73 74 72 75 63  se) */.{.  struc
88d0: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 78 2c 20 2a  t symbol *spx, *
88e0: 73 70 79 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e  spy;.  int errcn
88f0: 74 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  t = 0;.  assert(
8900: 20 61 70 78 2d 3e 73 70 3d 3d 61 70 79 2d 3e 73   apx->sp==apy->s
8910: 70 20 29 3b 20 20 2f 2a 20 4f 74 68 65 72 77 69  p );  /* Otherwi
8920: 73 65 20 74 68 65 72 65 20 77 6f 75 6c 64 20 62  se there would b
8930: 65 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  e no conflict */
8940: 0a 20 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65  .  if( apx->type
8950: 3d 3d 53 48 49 46 54 20 26 26 20 61 70 79 2d 3e  ==SHIFT && apy->
8960: 74 79 70 65 3d 3d 53 48 49 46 54 20 29 7b 0a 20  type==SHIFT ){. 
8970: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 53     apy->type = S
8980: 53 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 65  SCONFLICT;.    e
8990: 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69  rrcnt++;.  }.  i
89a0: 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48  f( apx->type==SH
89b0: 49 46 54 20 26 26 20 61 70 79 2d 3e 74 79 70 65  IFT && apy->type
89c0: 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20  ==REDUCE ){.    
89d0: 73 70 78 20 3d 20 61 70 78 2d 3e 73 70 3b 0a 20  spx = apx->sp;. 
89e0: 20 20 20 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e     spy = apy->x.
89f0: 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20  rp->precsym;.   
8a00: 20 69 66 28 20 73 70 79 3d 3d 30 20 7c 7c 20 73   if( spy==0 || s
8a10: 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 20 73 70  px->prec<0 || sp
8a20: 79 2d 3e 70 72 65 63 3c 30 20 29 7b 0a 20 20 20  y->prec<0 ){.   
8a30: 20 20 20 2f 2a 20 4e 6f 74 20 65 6e 6f 75 67 68     /* Not enough
8a40: 20 70 72 65 63 65 64 65 6e 63 65 20 69 6e 66 6f   precedence info
8a50: 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  rmation. */.    
8a60: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 53 52    apy->type = SR
8a70: 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20  CONFLICT;.      
8a80: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65  errcnt++;.    }e
8a90: 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65  lse if( spx->pre
8aa0: 63 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b 20 20  c>spy->prec ){  
8ab0: 20 20 2f 2a 20 4c 6f 77 65 72 20 70 72 65 63 65    /* Lower prece
8ac0: 64 65 6e 63 65 20 77 69 6e 73 20 2a 2f 0a 20 20  dence wins */.  
8ad0: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20      apy->type = 
8ae0: 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20  RD_RESOLVED;.   
8af0: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e   }else if( spx->
8b00: 70 72 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29  prec<spy->prec )
8b10: 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  {.      apx->typ
8b20: 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b  e = SH_RESOLVED;
8b30: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
8b40: 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70  px->prec==spy->p
8b50: 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f  rec && spx->asso
8b60: 63 3d 3d 52 49 47 48 54 20 29 7b 20 2f 2a 20 55  c==RIGHT ){ /* U
8b70: 73 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20  se operator */. 
8b80: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d       apy->type =
8b90: 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 20 20 20   RD_RESOLVED;   
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8bb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73            /* ass
8bc0: 6f 63 69 61 74 69 76 69 74 79 20 2a 2f 0a 20 20  ociativity */.  
8bd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d    }else if( spx-
8be0: 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63  >prec==spy->prec
8bf0: 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d   && spx->assoc==
8c00: 4c 45 46 54 20 29 7b 20 20 2f 2a 20 74 6f 20 62  LEFT ){  /* to b
8c10: 72 65 61 6b 20 74 69 65 20 2a 2f 0a 20 20 20 20  reak tie */.    
8c20: 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 53 48    apx->type = SH
8c30: 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d  _RESOLVED;.    }
8c40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
8c50: 72 74 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73  rt( spx->prec==s
8c60: 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d  py->prec && spx-
8c70: 3e 61 73 73 6f 63 3d 3d 4e 4f 4e 45 20 29 3b 0a  >assoc==NONE );.
8c80: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20        apy->type 
8c90: 3d 20 53 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20  = SRCONFLICT;.  
8ca0: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
8cb0: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
8cc0: 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43  apx->type==REDUC
8cd0: 45 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d  E && apy->type==
8ce0: 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 73 70  REDUCE ){.    sp
8cf0: 78 20 3d 20 61 70 78 2d 3e 78 2e 72 70 2d 3e 70  x = apx->x.rp->p
8d00: 72 65 63 73 79 6d 3b 0a 20 20 20 20 73 70 79 20  recsym;.    spy 
8d10: 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65  = apy->x.rp->pre
8d20: 63 73 79 6d 3b 0a 20 20 20 20 69 66 28 20 73 70  csym;.    if( sp
8d30: 78 3d 3d 30 20 7c 7c 20 73 70 79 3d 3d 30 20 7c  x==0 || spy==0 |
8d40: 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c  | spx->prec<0 ||
8d50: 0a 20 20 20 20 73 70 79 2d 3e 70 72 65 63 3c 30  .    spy->prec<0
8d60: 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73   || spx->prec==s
8d70: 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20  py->prec ){.    
8d80: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 52    apy->type = RR
8d90: 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20  CONFLICT;.      
8da0: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65  errcnt++;.    }e
8db0: 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65  lse if( spx->pre
8dc0: 63 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20  c>spy->prec ){. 
8dd0: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d       apy->type =
8de0: 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   RD_RESOLVED;.  
8df0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d    }else if( spx-
8e00: 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72 65 63 20  >prec<spy->prec 
8e10: 29 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79  ){.      apx->ty
8e20: 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44  pe = RD_RESOLVED
8e30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
8e40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20  .    assert( .  
8e50: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53      apx->type==S
8e60: 48 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20  H_RESOLVED ||.  
8e70: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52      apx->type==R
8e80: 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20  D_RESOLVED ||.  
8e90: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53      apx->type==S
8ea0: 53 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20  SCONFLICT ||.   
8eb0: 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 52     apx->type==SR
8ec0: 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20  CONFLICT ||.    
8ed0: 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 52 43    apx->type==RRC
8ee0: 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20  ONFLICT ||.     
8ef0: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 5f 52   apy->type==SH_R
8f00: 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20  ESOLVED ||.     
8f10: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 44 5f 52   apy->type==RD_R
8f20: 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20  ESOLVED ||.     
8f30: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 53 43 4f   apy->type==SSCO
8f40: 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20  NFLICT ||.      
8f50: 61 70 79 2d 3e 74 79 70 65 3d 3d 53 52 43 4f 4e  apy->type==SRCON
8f60: 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61  FLICT ||.      a
8f70: 70 79 2d 3e 74 79 70 65 3d 3d 52 52 43 4f 4e 46  py->type==RRCONF
8f80: 4c 49 43 54 0a 20 20 20 20 29 3b 0a 20 20 20 20  LICT.    );.    
8f90: 2f 2a 20 54 68 65 20 52 45 44 55 43 45 2f 53 48  /* The REDUCE/SH
8fa0: 49 46 54 20 63 61 73 65 20 63 61 6e 6e 6f 74 20  IFT case cannot 
8fb0: 68 61 70 70 65 6e 20 62 65 63 61 75 73 65 20 53  happen because S
8fc0: 48 49 46 54 73 20 63 6f 6d 65 20 62 65 66 6f 72  HIFTs come befor
8fd0: 65 0a 20 20 20 20 2a 2a 20 52 45 44 55 43 45 73  e.    ** REDUCEs
8fe0: 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e 20 20 49   on the list.  I
8ff0: 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
9000: 70 6f 69 6e 74 20 69 74 20 6d 75 73 74 20 62 65  point it must be
9010: 20 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20   because.    ** 
9020: 74 68 65 20 70 61 72 73 65 72 20 63 6f 6e 66 6c  the parser confl
9030: 69 63 74 20 68 61 64 20 61 6c 72 65 61 64 79 20  ict had already 
9040: 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a  been resolved. *
9050: 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65  /.  }.  return e
9060: 72 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  rrcnt;.}./******
9070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
9080: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 63  From the file "c
9090: 6f 6e 66 69 67 6c 69 73 74 2e 63 22 20 2a 2a 2a  onfiglist.c" ***
90a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
90b0: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f  ******/./*.** Ro
90c0: 75 74 69 6e 65 73 20 74 6f 20 70 72 6f 63 65 73  utines to proces
90d0: 73 69 6e 67 20 61 20 63 6f 6e 66 69 67 75 72 61  sing a configura
90e0: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 62 75  tion list and bu
90f0: 69 6c 64 69 6e 67 20 61 20 73 74 61 74 65 0a 2a  ilding a state.*
9100: 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70  * in the LEMON p
9110: 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
9120: 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 73 74 72 75  .*/..static stru
9130: 63 74 20 63 6f 6e 66 69 67 20 2a 66 72 65 65 6c  ct config *freel
9140: 69 73 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  ist = 0;      /*
9150: 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20 63 6f   List of free co
9160: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a  nfigurations */.
9170: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f  static struct co
9180: 6e 66 69 67 20 2a 63 75 72 72 65 6e 74 20 3d 20  nfig *current = 
9190: 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20  0;       /* Top 
91a0: 6f 66 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69  of list of confi
91b0: 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  gurations */.sta
91c0: 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69  tic struct confi
91d0: 67 20 2a 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d  g **currentend =
91e0: 20 30 3b 20 20 20 2f 2a 20 4c 61 73 74 20 6f 6e   0;   /* Last on
91f0: 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 73   list of configs
9200: 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
9210: 74 20 63 6f 6e 66 69 67 20 2a 62 61 73 69 73 20  t config *basis 
9220: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
9230: 54 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 62  Top of list of b
9240: 61 73 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a  asis configs */.
9250: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f  static struct co
9260: 6e 66 69 67 20 2a 2a 62 61 73 69 73 65 6e 64 20  nfig **basisend 
9270: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 45 6e 64 20  = 0;     /* End 
9280: 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73  of list of basis
9290: 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20   configs */../* 
92a0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
92b0: 20 74 6f 20 61 20 6e 65 77 20 63 6f 6e 66 69 67   to a new config
92c0: 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41  uration */.PRIVA
92d0: 54 45 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  TE struct config
92e0: 20 2a 6e 65 77 63 6f 6e 66 69 67 28 29 7b 0a 20   *newconfig(){. 
92f0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
9300: 6e 65 77 3b 0a 20 20 69 66 28 20 66 72 65 65 6c  new;.  if( freel
9310: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ist==0 ){.    in
9320: 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74  t i;.    int amt
9330: 20 3d 20 33 3b 0a 20 20 20 20 66 72 65 65 6c 69   = 3;.    freeli
9340: 73 74 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e  st = (struct con
9350: 66 69 67 20 2a 29 63 61 6c 6c 6f 63 28 20 61 6d  fig *)calloc( am
9360: 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  t, sizeof(struct
9370: 20 63 6f 6e 66 69 67 29 20 29 3b 0a 20 20 20 20   config) );.    
9380: 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20  if( freelist==0 
9390: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
93a0: 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20  (stderr,"Unable 
93b0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
93c0: 72 79 20 66 6f 72 20 61 20 6e 65 77 20 63 6f 6e  ry for a new con
93d0: 66 69 67 75 72 61 74 69 6f 6e 2e 22 29 3b 0a 20  figuration.");. 
93e0: 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
93f0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
9400: 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66   i<amt-1; i++) f
9410: 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20  reelist[i].next 
9420: 3d 20 26 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d  = &freelist[i+1]
9430: 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 5b 61  ;.    freelist[a
9440: 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a  mt-1].next = 0;.
9450: 20 20 7d 0a 20 20 6e 65 77 20 3d 20 66 72 65 65    }.  new = free
9460: 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74  list;.  freelist
9470: 20 3d 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78   = freelist->nex
9480: 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 3b  t;.  return new;
9490: 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 66 69  .}../* The confi
94a0: 67 75 72 61 74 69 6f 6e 20 22 6f 6c 64 22 20 69  guration "old" i
94b0: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 64  s no longer used
94c0: 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64   */.PRIVATE void
94d0: 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 6f 6c   deleteconfig(ol
94e0: 64 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  d).struct config
94f0: 20 2a 6f 6c 64 3b 0a 7b 0a 20 20 6f 6c 64 2d 3e   *old;.{.  old->
9500: 6e 65 78 74 20 3d 20 66 72 65 65 6c 69 73 74 3b  next = freelist;
9510: 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20 6f 6c  .  freelist = ol
9520: 64 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c  d;.}../* Initial
9530: 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69 67 75  ized the configu
9540: 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75 69 6c  ration list buil
9550: 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  der */.void Conf
9560: 69 67 6c 69 73 74 5f 69 6e 69 74 28 29 7b 0a 20  iglist_init(){. 
9570: 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20   current = 0;.  
9580: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 75  currentend = &cu
9590: 72 72 65 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d  rrent;.  basis =
95a0: 20 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d   0;.  basisend =
95b0: 20 26 62 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69   &basis;.  Confi
95c0: 67 74 61 62 6c 65 5f 69 6e 69 74 28 29 3b 0a 20  gtable_init();. 
95d0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49   return;.}../* I
95e0: 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20 63  nitialized the c
95f0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
9600: 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69  t builder */.voi
9610: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73  d Configlist_res
9620: 65 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20  et(){.  current 
9630: 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e  = 0;.  currenten
9640: 64 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20 20  d = &current;.  
9650: 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73  basis = 0;.  bas
9660: 69 73 65 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a  isend = &basis;.
9670: 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c    Configtable_cl
9680: 65 61 72 28 30 29 3b 0a 20 20 72 65 74 75 72 6e  ear(0);.  return
9690: 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 6e 6f 74  ;.}../* Add anot
96a0: 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  her configuratio
96b0: 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75  n to the configu
96c0: 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73  ration list */.s
96d0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
96e0: 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 72 70 2c  nfiglist_add(rp,
96f0: 64 6f 74 29 0a 73 74 72 75 63 74 20 72 75 6c 65  dot).struct rule
9700: 20 2a 72 70 3b 20 20 20 20 2f 2a 20 54 68 65 20   *rp;    /* The 
9710: 72 75 6c 65 20 2a 2f 0a 69 6e 74 20 64 6f 74 3b  rule */.int dot;
9720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
9730: 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 52 48  ndex into the RH
9740: 53 20 6f 66 20 74 68 65 20 72 75 6c 65 20 77 68  S of the rule wh
9750: 65 72 65 20 74 68 65 20 64 6f 74 20 67 6f 65 73  ere the dot goes
9760: 20 2a 2f 0a 7b 0a 20 20 73 74 72 75 63 74 20 63   */.{.  struct c
9770: 6f 6e 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65  onfig *cfp, mode
9780: 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  l;..  assert( cu
9790: 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20  rrentend!=0 );. 
97a0: 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a   model.rp = rp;.
97b0: 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f    model.dot = do
97c0: 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69  t;.  cfp = Confi
97d0: 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64  gtable_find(&mod
97e0: 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d  el);.  if( cfp==
97f0: 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e  0 ){.    cfp = n
9800: 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20  ewconfig();.    
9810: 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20  cfp->rp = rp;.  
9820: 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74    cfp->dot = dot
9830: 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d  ;.    cfp->fws =
9840: 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63   SetNew();.    c
9850: 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20  fp->stp = 0;.   
9860: 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70   cfp->fplp = cfp
9870: 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20  ->bplp = 0;.    
9880: 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20  cfp->next = 0;. 
9890: 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a     cfp->bp = 0;.
98a0: 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20      *currentend 
98b0: 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65  = cfp;.    curre
98c0: 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65  ntend = &cfp->ne
98d0: 78 74 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61  xt;.    Configta
98e0: 62 6c 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b  ble_insert(cfp);
98f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66  .  }.  return cf
9900: 70 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 62  p;.}../* Add a b
9910: 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  asis configurati
9920: 6f 6e 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67  on to the config
9930: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  uration list */.
9940: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
9950: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73  onfiglist_addbas
9960: 69 73 28 72 70 2c 64 6f 74 29 0a 73 74 72 75 63  is(rp,dot).struc
9970: 74 20 72 75 6c 65 20 2a 72 70 3b 0a 69 6e 74 20  t rule *rp;.int 
9980: 64 6f 74 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  dot;.{.  struct 
9990: 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64  config *cfp, mod
99a0: 65 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 62  el;..  assert( b
99b0: 61 73 69 73 65 6e 64 21 3d 30 20 29 3b 0a 20 20  asisend!=0 );.  
99c0: 61 73 73 65 72 74 28 20 63 75 72 72 65 6e 74 65  assert( currente
99d0: 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65 6c  nd!=0 );.  model
99e0: 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64 65  .rp = rp;.  mode
99f0: 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 63  l.dot = dot;.  c
9a00: 66 70 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c 65  fp = Configtable
9a10: 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a 20  _find(&model);. 
9a20: 20 69 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a 20   if( cfp==0 ){. 
9a30: 20 20 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e 66     cfp = newconf
9a40: 69 67 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 72  ig();.    cfp->r
9a50: 70 20 3d 20 72 70 3b 0a 20 20 20 20 63 66 70 2d  p = rp;.    cfp-
9a60: 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20 20  >dot = dot;.    
9a70: 63 66 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e 65  cfp->fws = SetNe
9a80: 77 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73 74  w();.    cfp->st
9a90: 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e  p = 0;.    cfp->
9aa0: 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c 70  fplp = cfp->bplp
9ab0: 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 6e   = 0;.    cfp->n
9ac0: 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 63 66 70  ext = 0;.    cfp
9ad0: 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a 63  ->bp = 0;.    *c
9ae0: 75 72 72 65 6e 74 65 6e 64 20 3d 20 63 66 70 3b  urrentend = cfp;
9af0: 0a 20 20 20 20 63 75 72 72 65 6e 74 65 6e 64 20  .    currentend 
9b00: 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20  = &cfp->next;.  
9b10: 20 20 2a 62 61 73 69 73 65 6e 64 20 3d 20 63 66    *basisend = cf
9b20: 70 3b 0a 20 20 20 20 62 61 73 69 73 65 6e 64 20  p;.    basisend 
9b30: 3d 20 26 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20  = &cfp->bp;.    
9b40: 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65  Configtable_inse
9b50: 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72  rt(cfp);.  }.  r
9b60: 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a  eturn cfp;.}../*
9b70: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6c 6f   Compute the clo
9b80: 73 75 72 65 20 6f 66 20 74 68 65 20 63 6f 6e 66  sure of the conf
9b90: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a  iguration list *
9ba0: 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  /.void Configlis
9bb0: 74 5f 63 6c 6f 73 75 72 65 28 6c 65 6d 70 29 0a  t_closure(lemp).
9bc0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
9bd0: 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 63  mp;.{.  struct c
9be0: 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6e 65 77  onfig *cfp, *new
9bf0: 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75  cfp;.  struct ru
9c00: 6c 65 20 2a 72 70 2c 20 2a 6e 65 77 72 70 3b 0a  le *rp, *newrp;.
9c10: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
9c20: 2a 73 70 2c 20 2a 78 73 70 3b 0a 20 20 69 6e 74  *sp, *xsp;.  int
9c30: 20 69 2c 20 64 6f 74 3b 0a 0a 20 20 61 73 73 65   i, dot;..  asse
9c40: 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d  rt( currentend!=
9c50: 30 20 29 3b 0a 20 20 66 6f 72 28 63 66 70 3d 63  0 );.  for(cfp=c
9c60: 75 72 72 65 6e 74 3b 20 63 66 70 3b 20 63 66 70  urrent; cfp; cfp
9c70: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
9c80: 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20   rp = cfp->rp;. 
9c90: 20 20 20 64 6f 74 20 3d 20 63 66 70 2d 3e 64 6f     dot = cfp->do
9ca0: 74 3b 0a 20 20 20 20 69 66 28 20 64 6f 74 3e 3d  t;.    if( dot>=
9cb0: 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69  rp->nrhs ) conti
9cc0: 6e 75 65 3b 0a 20 20 20 20 73 70 20 3d 20 72 70  nue;.    sp = rp
9cd0: 2d 3e 72 68 73 5b 64 6f 74 5d 3b 0a 20 20 20 20  ->rhs[dot];.    
9ce0: 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f  if( sp->type==NO
9cf0: 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  NTERMINAL ){.   
9d00: 20 20 20 69 66 28 20 73 70 2d 3e 72 75 6c 65 3d     if( sp->rule=
9d10: 3d 30 20 26 26 20 73 70 21 3d 6c 65 6d 70 2d 3e  =0 && sp!=lemp->
9d20: 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20  errsym ){.      
9d30: 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
9d40: 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 6c 69  >filename,rp->li
9d50: 6e 65 2c 22 4e 6f 6e 74 65 72 6d 69 6e 61 6c 20  ne,"Nonterminal 
9d60: 5c 22 25 73 5c 22 20 68 61 73 20 6e 6f 20 72 75  \"%s\" has no ru
9d70: 6c 65 73 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  les.",.         
9d80: 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
9d90: 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
9da0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nt++;.      }.  
9db0: 20 20 20 20 66 6f 72 28 6e 65 77 72 70 3d 73 70      for(newrp=sp
9dc0: 2d 3e 72 75 6c 65 3b 20 6e 65 77 72 70 3b 20 6e  ->rule; newrp; n
9dd0: 65 77 72 70 3d 6e 65 77 72 70 2d 3e 6e 65 78 74  ewrp=newrp->next
9de0: 6c 68 73 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  lhs){.        ne
9df0: 77 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73  wcfp = Configlis
9e00: 74 5f 61 64 64 28 6e 65 77 72 70 2c 30 29 3b 0a  t_add(newrp,0);.
9e10: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 64 6f          for(i=do
9e20: 74 2b 31 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  t+1; i<rp->nrhs;
9e30: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
9e40: 20 78 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69   xsp = rp->rhs[i
9e50: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ];.          if(
9e60: 20 78 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d   xsp->type==TERM
9e70: 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
9e80: 20 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66      SetAdd(newcf
9e90: 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 69 6e 64 65  p->fws,xsp->inde
9ea0: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  x);.            
9eb0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
9ec0: 20 7d 65 6c 73 65 20 69 66 28 20 78 73 70 2d 3e   }else if( xsp->
9ed0: 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
9ee0: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NAL ){.         
9ef0: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20     int k;.      
9f00: 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b        for(k=0; k
9f10: 3c 78 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b  <xsp->nsubsym; k
9f20: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
9f30: 20 20 20 53 65 74 41 64 64 28 6e 65 77 63 66 70     SetAdd(newcfp
9f40: 2d 3e 66 77 73 2c 20 78 73 70 2d 3e 73 75 62 73  ->fws, xsp->subs
9f50: 79 6d 5b 6b 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20  ym[k]->index);. 
9f60: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
9f70: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9f80: 09 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20  .  }else{.      
9f90: 20 20 20 20 20 20 53 65 74 55 6e 69 6f 6e 28 6e        SetUnion(n
9fa0: 65 77 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e  ewcfp->fws,xsp->
9fb0: 66 69 72 73 74 73 65 74 29 3b 0a 20 20 20 20 20  firstset);.     
9fc0: 20 20 20 20 20 20 20 69 66 28 20 78 73 70 2d 3e         if( xsp->
9fd0: 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41  lambda==LEMON_FA
9fe0: 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 09 20 20  LSE ) break;..  
9ff0: 7d 0a 09 7d 0a 20 20 20 20 20 20 20 20 69 66 28  }..}.        if(
a000: 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 50   i==rp->nrhs ) P
a010: 6c 69 6e 6b 5f 61 64 64 28 26 63 66 70 2d 3e 66  link_add(&cfp->f
a020: 70 6c 70 2c 6e 65 77 63 66 70 29 3b 0a 20 20 20  plp,newcfp);.   
a030: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
a040: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53   return;.}../* S
a050: 6f 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ort the configur
a060: 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f  ation list */.vo
a070: 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f  id Configlist_so
a080: 72 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20  rt(){.  current 
a090: 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  = (struct config
a0a0: 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20 2a   *)msort((char *
a0b0: 29 63 75 72 72 65 6e 74 2c 28 63 68 61 72 20 2a  )current,(char *
a0c0: 2a 29 26 28 63 75 72 72 65 6e 74 2d 3e 6e 65 78  *)&(current->nex
a0d0: 74 29 2c 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20  t),Configcmp);. 
a0e0: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b   currentend = 0;
a0f0: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
a100: 20 53 6f 72 74 20 74 68 65 20 62 61 73 69 73 20   Sort the basis 
a110: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
a120: 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  st */.void Confi
a130: 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28  glist_sortbasis(
a140: 29 7b 0a 20 20 62 61 73 69 73 20 3d 20 28 73 74  ){.  basis = (st
a150: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 6d 73  ruct config *)ms
a160: 6f 72 74 28 28 63 68 61 72 20 2a 29 63 75 72 72  ort((char *)curr
a170: 65 6e 74 2c 28 63 68 61 72 20 2a 2a 29 26 28 63  ent,(char **)&(c
a180: 75 72 72 65 6e 74 2d 3e 62 70 29 2c 43 6f 6e 66  urrent->bp),Conf
a190: 69 67 63 6d 70 29 3b 0a 20 20 62 61 73 69 73 65  igcmp);.  basise
a1a0: 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  nd = 0;.  return
a1b0: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
a1c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
a1d0: 68 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66  head of the conf
a1e0: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  iguration list a
a1f0: 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  nd.** reset the 
a200: 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63  list */.struct c
a210: 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73  onfig *Configlis
a220: 74 5f 72 65 74 75 72 6e 28 29 7b 0a 20 20 73 74  t_return(){.  st
a230: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64  ruct config *old
a240: 3b 0a 20 20 6f 6c 64 20 3d 20 63 75 72 72 65 6e  ;.  old = curren
a250: 74 3b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30  t;.  current = 0
a260: 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d  ;.  currentend =
a270: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64   0;.  return old
a280: 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
a290: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
a2a0: 68 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66  head of the conf
a2b0: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61  iguration list a
a2c0: 6e 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  nd.** reset the 
a2d0: 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63  list */.struct c
a2e0: 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73  onfig *Configlis
a2f0: 74 5f 62 61 73 69 73 28 29 7b 0a 20 20 73 74 72  t_basis(){.  str
a300: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b  uct config *old;
a310: 0a 20 20 6f 6c 64 20 3d 20 62 61 73 69 73 3b 0a  .  old = basis;.
a320: 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62    basis = 0;.  b
a330: 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72  asisend = 0;.  r
a340: 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a  eturn old;.}../*
a350: 20 46 72 65 65 20 61 6c 6c 20 65 6c 65 6d 65 6e   Free all elemen
a360: 74 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ts of the given 
a370: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
a380: 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  st */.void Confi
a390: 67 6c 69 73 74 5f 65 61 74 28 63 66 70 29 0a 73  glist_eat(cfp).s
a3a0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
a3b0: 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  p;.{.  struct co
a3c0: 6e 66 69 67 20 2a 6e 65 78 74 63 66 70 3b 0a 20  nfig *nextcfp;. 
a3d0: 20 66 6f 72 28 3b 20 63 66 70 3b 20 63 66 70 3d   for(; cfp; cfp=
a3e0: 6e 65 78 74 63 66 70 29 7b 0a 20 20 20 20 6e 65  nextcfp){.    ne
a3f0: 78 74 63 66 70 20 3d 20 63 66 70 2d 3e 6e 65 78  xtcfp = cfp->nex
a400: 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63  t;.    assert( c
a410: 66 70 2d 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a 20  fp->fplp==0 );. 
a420: 20 20 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e     assert( cfp->
a430: 62 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 69  bplp==0 );.    i
a440: 66 28 20 63 66 70 2d 3e 66 77 73 20 29 20 53 65  f( cfp->fws ) Se
a450: 74 46 72 65 65 28 63 66 70 2d 3e 66 77 73 29 3b  tFree(cfp->fws);
a460: 0a 20 20 20 20 64 65 6c 65 74 65 63 6f 6e 66 69  .    deleteconfi
a470: 67 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65  g(cfp);.  }.  re
a480: 74 75 72 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  turn;.}./*******
a490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
a4a0: 74 68 65 20 66 69 6c 65 20 22 65 72 72 6f 72 2e  the file "error.
a4b0: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
a4c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a4d0: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65  ****/./*.** Code
a4e0: 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 65 72   for printing er
a4f0: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a  ror message..*/.
a500: 0a 2f 2a 20 46 69 6e 64 20 61 20 67 6f 6f 64 20  ./* Find a good 
a510: 70 6c 61 63 65 20 74 6f 20 62 72 65 61 6b 20 22  place to break "
a520: 6d 73 67 22 20 73 6f 20 74 68 61 74 20 69 74 73  msg" so that its
a530: 20 6c 65 6e 67 74 68 20 69 73 20 61 74 20 6c 65   length is at le
a540: 61 73 74 20 22 6d 69 6e 22 0a 2a 2a 20 62 75 74  ast "min".** but
a550: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 22 6d   no more than "m
a560: 61 78 22 2e 20 20 4d 61 6b 65 20 74 68 65 20 70  ax".  Make the p
a570: 6f 69 6e 74 20 61 73 20 63 6c 6f 73 65 20 74 6f  oint as close to
a580: 20 6d 61 78 20 61 73 20 70 6f 73 73 69 62 6c 65   max as possible
a590: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a5a0: 66 69 6e 64 62 72 65 61 6b 28 6d 73 67 2c 6d 69  findbreak(msg,mi
a5b0: 6e 2c 6d 61 78 29 0a 63 68 61 72 20 2a 6d 73 67  n,max).char *msg
a5c0: 3b 0a 69 6e 74 20 6d 69 6e 3b 0a 69 6e 74 20 6d  ;.int min;.int m
a5d0: 61 78 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 73 70  ax;.{.  int i,sp
a5e0: 6f 74 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20  ot;.  char c;.  
a5f0: 66 6f 72 28 69 3d 73 70 6f 74 3d 6d 69 6e 3b 20  for(i=spot=min; 
a600: 69 3c 3d 6d 61 78 3b 20 69 2b 2b 29 7b 0a 20 20  i<=max; i++){.  
a610: 20 20 63 20 3d 20 6d 73 67 5b 69 5d 3b 0a 20 20    c = msg[i];.  
a620: 20 20 69 66 28 20 63 3d 3d 27 5c 74 27 20 29 20    if( c=='\t' ) 
a630: 6d 73 67 5b 69 5d 20 3d 20 27 20 27 3b 0a 20 20  msg[i] = ' ';.  
a640: 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b    if( c=='\n' ){
a650: 20 6d 73 67 5b 69 5d 20 3d 20 27 20 27 3b 20 73   msg[i] = ' '; s
a660: 70 6f 74 20 3d 20 69 3b 20 62 72 65 61 6b 3b 20  pot = i; break; 
a670: 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29  }.    if( c==0 )
a680: 7b 20 73 70 6f 74 20 3d 20 69 3b 20 62 72 65 61  { spot = i; brea
a690: 6b 3b 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d  k; }.    if( c==
a6a0: 27 2d 27 20 26 26 20 69 3c 6d 61 78 2d 31 20 29  '-' && i<max-1 )
a6b0: 20 73 70 6f 74 20 3d 20 69 2b 31 3b 0a 20 20 20   spot = i+1;.   
a6c0: 20 69 66 28 20 63 3d 3d 27 20 27 20 29 20 73 70   if( c==' ' ) sp
a6d0: 6f 74 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65  ot = i;.  }.  re
a6e0: 74 75 72 6e 20 73 70 6f 74 3b 0a 7d 0a 0a 2f 2a  turn spot;.}../*
a6f0: 0a 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 6d 65  .** The error me
a700: 73 73 61 67 65 20 69 73 20 73 70 6c 69 74 20 61  ssage is split a
a710: 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 20 6c  cross multiple l
a720: 69 6e 65 73 20 69 66 20 6e 65 63 65 73 73 61 72  ines if necessar
a730: 79 2e 20 20 54 68 65 0a 2a 2a 20 73 70 6c 69 74  y.  The.** split
a740: 73 20 6f 63 63 75 72 20 61 74 20 61 20 73 70 61  s occur at a spa
a750: 63 65 2c 20 69 66 20 74 68 65 72 65 20 69 73 20  ce, if there is 
a760: 61 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  a space availabl
a770: 65 20 6e 65 61 72 20 74 68 65 20 65 6e 64 0a 2a  e near the end.*
a780: 2a 20 6f 66 20 74 68 65 20 6c 69 6e 65 2e 0a 2a  * of the line..*
a790: 2f 0a 23 64 65 66 69 6e 65 20 45 52 52 4d 53 47  /.#define ERRMSG
a7a0: 53 49 5a 45 20 20 31 30 30 30 30 20 2f 2a 20 48  SIZE  10000 /* H
a7b0: 6f 70 65 20 74 68 69 73 20 69 73 20 62 69 67 20  ope this is big 
a7c0: 65 6e 6f 75 67 68 2e 20 20 4e 6f 20 77 61 79 20  enough.  No way 
a7d0: 74 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 20 2a  to error check *
a7e0: 2f 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45 57 49  /.#define LINEWI
a7f0: 44 54 48 20 20 20 20 20 20 37 39 20 2f 2a 20 4d  DTH      79 /* M
a800: 61 78 20 77 69 64 74 68 20 6f 66 20 61 6e 79 20  ax width of any 
a810: 6f 75 74 70 75 74 20 6c 69 6e 65 20 2a 2f 0a 23  output line */.#
a820: 64 65 66 69 6e 65 20 50 52 45 46 49 58 4c 49 4d  define PREFIXLIM
a830: 49 54 20 20 20 20 33 30 20 2f 2a 20 4d 61 78 20  IT    30 /* Max 
a840: 77 69 64 74 68 20 6f 66 20 74 68 65 20 70 72 65  width of the pre
a850: 66 69 78 20 6f 6e 20 65 61 63 68 20 6c 69 6e 65  fix on each line
a860: 20 2a 2f 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73   */.void ErrorMs
a870: 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69  g(const char *fi
a880: 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 6c 69 6e 65  lename, int line
a890: 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  no, const char *
a8a0: 66 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  format, ...){.  
a8b0: 63 68 61 72 20 65 72 72 6d 73 67 5b 45 52 52 4d  char errmsg[ERRM
a8c0: 53 47 53 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20  SGSIZE];.  char 
a8d0: 70 72 65 66 69 78 5b 50 52 45 46 49 58 4c 49 4d  prefix[PREFIXLIM
a8e0: 49 54 2b 31 30 5d 3b 0a 20 20 69 6e 74 20 65 72  IT+10];.  int er
a8f0: 72 6d 73 67 73 69 7a 65 3b 0a 20 20 69 6e 74 20  rmsgsize;.  int 
a900: 70 72 65 66 69 78 73 69 7a 65 3b 0a 20 20 69 6e  prefixsize;.  in
a910: 74 20 61 76 61 69 6c 61 62 6c 65 77 69 64 74 68  t availablewidth
a920: 3b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  ;.  va_list ap;.
a930: 20 20 69 6e 74 20 65 6e 64 2c 20 72 65 73 74 61    int end, resta
a940: 72 74 2c 20 62 61 73 65 3b 0a 0a 20 20 76 61 5f  rt, base;..  va_
a950: 73 74 61 72 74 28 61 70 2c 20 66 6f 72 6d 61 74  start(ap, format
a960: 29 3b 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20  );.  /* Prepare 
a970: 61 20 70 72 65 66 69 78 20 74 6f 20 62 65 20 70  a prefix to be p
a980: 72 65 70 65 6e 64 65 64 20 74 6f 20 65 76 65 72  repended to ever
a990: 79 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 2a 2f  y output line */
a9a0: 0a 20 20 69 66 28 20 6c 69 6e 65 6e 6f 3e 30 20  .  if( lineno>0 
a9b0: 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 70  ){.    sprintf(p
a9c0: 72 65 66 69 78 2c 22 25 2e 2a 73 3a 25 64 3a 20  refix,"%.*s:%d: 
a9d0: 22 2c 50 52 45 46 49 58 4c 49 4d 49 54 2d 31 30  ",PREFIXLIMIT-10
a9e0: 2c 66 69 6c 65 6e 61 6d 65 2c 6c 69 6e 65 6e 6f  ,filename,lineno
a9f0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
aa00: 73 70 72 69 6e 74 66 28 70 72 65 66 69 78 2c 22  sprintf(prefix,"
aa10: 25 2e 2a 73 3a 20 22 2c 50 52 45 46 49 58 4c 49  %.*s: ",PREFIXLI
aa20: 4d 49 54 2d 31 30 2c 66 69 6c 65 6e 61 6d 65 29  MIT-10,filename)
aa30: 3b 0a 20 20 7d 0a 20 20 70 72 65 66 69 78 73 69  ;.  }.  prefixsi
aa40: 7a 65 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  ze = lemonStrlen
aa50: 28 70 72 65 66 69 78 29 3b 0a 20 20 61 76 61 69  (prefix);.  avai
aa60: 6c 61 62 6c 65 77 69 64 74 68 20 3d 20 4c 49 4e  lablewidth = LIN
aa70: 45 57 49 44 54 48 20 2d 20 70 72 65 66 69 78 73  EWIDTH - prefixs
aa80: 69 7a 65 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  ize;..  /* Gener
aa90: 61 74 65 20 74 68 65 20 65 72 72 6f 72 20 6d 65  ate the error me
aaa0: 73 73 61 67 65 20 2a 2f 0a 20 20 76 73 70 72 69  ssage */.  vspri
aab0: 6e 74 66 28 65 72 72 6d 73 67 2c 66 6f 72 6d 61  ntf(errmsg,forma
aac0: 74 2c 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  t,ap);.  va_end(
aad0: 61 70 29 3b 0a 20 20 65 72 72 6d 73 67 73 69 7a  ap);.  errmsgsiz
aae0: 65 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  e = lemonStrlen(
aaf0: 65 72 72 6d 73 67 29 3b 0a 20 20 2f 2a 20 52 65  errmsg);.  /* Re
ab00: 6d 6f 76 65 20 74 72 61 69 6c 69 6e 67 20 27 5c  move trailing '\
ab10: 6e 27 73 20 66 72 6f 6d 20 74 68 65 20 65 72 72  n's from the err
ab20: 6f 72 20 6d 65 73 73 61 67 65 2e 20 2a 2f 0a 20  or message. */. 
ab30: 20 77 68 69 6c 65 28 20 65 72 72 6d 73 67 73 69   while( errmsgsi
ab40: 7a 65 3e 30 20 26 26 20 65 72 72 6d 73 67 5b 65  ze>0 && errmsg[e
ab50: 72 72 6d 73 67 73 69 7a 65 2d 31 5d 3d 3d 27 5c  rrmsgsize-1]=='\
ab60: 6e 27 20 29 7b 0a 20 20 20 20 20 65 72 72 6d 73  n' ){.     errms
ab70: 67 5b 2d 2d 65 72 72 6d 73 67 73 69 7a 65 5d 20  g[--errmsgsize] 
ab80: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50  = 0;.  }..  /* P
ab90: 72 69 6e 74 20 74 68 65 20 65 72 72 6f 72 20 6d  rint the error m
aba0: 65 73 73 61 67 65 20 2a 2f 0a 20 20 62 61 73 65  essage */.  base
abb0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 65   = 0;.  while( e
abc0: 72 72 6d 73 67 5b 62 61 73 65 5d 21 3d 30 20 29  rrmsg[base]!=0 )
abd0: 7b 0a 20 20 20 20 65 6e 64 20 3d 20 72 65 73 74  {.    end = rest
abe0: 61 72 74 20 3d 20 66 69 6e 64 62 72 65 61 6b 28  art = findbreak(
abf0: 26 65 72 72 6d 73 67 5b 62 61 73 65 5d 2c 30 2c  &errmsg[base],0,
ac00: 61 76 61 69 6c 61 62 6c 65 77 69 64 74 68 29 3b  availablewidth);
ac10: 0a 20 20 20 20 72 65 73 74 61 72 74 20 2b 3d 20  .    restart += 
ac20: 62 61 73 65 3b 0a 20 20 20 20 77 68 69 6c 65 28  base;.    while(
ac30: 20 65 72 72 6d 73 67 5b 72 65 73 74 61 72 74 5d   errmsg[restart]
ac40: 3d 3d 27 20 27 20 29 20 72 65 73 74 61 72 74 2b  ==' ' ) restart+
ac50: 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  +;.    fprintf(s
ac60: 74 64 6f 75 74 2c 22 25 73 25 2e 2a 73 5c 6e 22  tdout,"%s%.*s\n"
ac70: 2c 70 72 65 66 69 78 2c 65 6e 64 2c 26 65 72 72  ,prefix,end,&err
ac80: 6d 73 67 5b 62 61 73 65 5d 29 3b 0a 20 20 20 20  msg[base]);.    
ac90: 62 61 73 65 20 3d 20 72 65 73 74 61 72 74 3b 0a  base = restart;.
aca0: 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a    }.}./*********
acb0: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
acc0: 20 66 69 6c 65 20 22 6d 61 69 6e 2e 63 22 20 2a   file "main.c" *
acd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ace0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
acf0: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20  ***/./*.** Main 
ad00: 70 72 6f 67 72 61 6d 20 66 69 6c 65 20 66 6f 72  program file for
ad10: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
ad20: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
ad30: 0a 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 6f 75  ./* Report an ou
ad40: 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64  t-of-memory cond
ad50: 69 74 69 6f 6e 20 61 6e 64 20 61 62 6f 72 74 2e  ition and abort.
ad60: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a    This function.
ad70: 2a 2a 20 69 73 20 75 73 65 64 20 6d 6f 73 74 6c  ** is used mostl
ad80: 79 20 62 79 20 74 68 65 20 22 4d 65 6d 6f 72 79  y by the "Memory
ad90: 43 68 65 63 6b 22 20 6d 61 63 72 6f 20 69 6e 20  Check" macro in 
ada0: 73 74 72 75 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64  struct.h.*/.void
adb0: 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 7b   memory_error(){
adc0: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
add0: 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r,"Out of memory
ade0: 2e 20 20 41 62 6f 72 74 69 6e 67 2e 2e 2e 5c 6e  .  Aborting...\n
adf0: 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d  ");.  exit(1);.}
ae00: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 44 65  ..static int nDe
ae10: 66 69 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 2f  fine = 0;      /
ae20: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 2d 44 20 6f  * Number of -D o
ae30: 70 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 63 6f  ptions on the co
ae40: 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a 73 74  mmand line */.st
ae50: 61 74 69 63 20 63 68 61 72 20 2a 2a 61 7a 44 65  atic char **azDe
ae60: 66 69 6e 65 20 3d 20 30 3b 20 20 2f 2a 20 4e 61  fine = 0;  /* Na
ae70: 6d 65 20 6f 66 20 74 68 65 20 2d 44 20 6d 61 63  me of the -D mac
ae80: 72 6f 73 20 2a 2f 0a 0a 2f 2a 20 54 68 69 73 20  ros */../* This 
ae90: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
aea0: 64 20 77 69 74 68 20 74 68 65 20 61 72 67 75 6d  d with the argum
aeb0: 65 6e 74 20 74 6f 20 65 61 63 68 20 2d 44 20 63  ent to each -D c
aec0: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
aed0: 6f 6e 2e 0a 2a 2a 20 41 64 64 20 74 68 65 20 6d  on..** Add the m
aee0: 61 63 72 6f 20 64 65 66 69 6e 65 64 20 74 6f 20  acro defined to 
aef0: 74 68 65 20 61 7a 44 65 66 69 6e 65 20 61 72 72  the azDefine arr
af00: 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ay..*/.static vo
af10: 69 64 20 68 61 6e 64 6c 65 5f 44 5f 6f 70 74 69  id handle_D_opti
af20: 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63  on(char *z){.  c
af30: 68 61 72 20 2a 2a 70 61 7a 3b 0a 20 20 6e 44 65  har **paz;.  nDe
af40: 66 69 6e 65 2b 2b 3b 0a 20 20 61 7a 44 65 66 69  fine++;.  azDefi
af50: 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 61 7a 44  ne = realloc(azD
af60: 65 66 69 6e 65 2c 20 73 69 7a 65 6f 66 28 61 7a  efine, sizeof(az
af70: 44 65 66 69 6e 65 5b 30 5d 29 2a 6e 44 65 66 69  Define[0])*nDefi
af80: 6e 65 29 3b 0a 20 20 69 66 28 20 61 7a 44 65 66  ne);.  if( azDef
af90: 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70  ine==0 ){.    fp
afa0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6f 75  rintf(stderr,"ou
afb0: 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b  t of memory\n");
afc0: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
afd0: 7d 0a 20 20 70 61 7a 20 3d 20 26 61 7a 44 65 66  }.  paz = &azDef
afe0: 69 6e 65 5b 6e 44 65 66 69 6e 65 2d 31 5d 3b 0a  ine[nDefine-1];.
aff0: 20 20 2a 70 61 7a 20 3d 20 6d 61 6c 6c 6f 63 28    *paz = malloc(
b000: 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 29 2b   lemonStrlen(z)+
b010: 31 20 29 3b 0a 20 20 69 66 28 20 2a 70 61 7a 3d  1 );.  if( *paz=
b020: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
b030: 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20 6f 66  f(stderr,"out of
b040: 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
b050: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
b060: 73 74 72 63 70 79 28 2a 70 61 7a 2c 20 7a 29 3b  strcpy(*paz, z);
b070: 0a 20 20 66 6f 72 28 7a 3d 2a 70 61 7a 3b 20 2a  .  for(z=*paz; *
b080: 7a 20 26 26 20 2a 7a 21 3d 27 3d 27 3b 20 7a 2b  z && *z!='='; z+
b090: 2b 29 7b 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d  +){}.  *z = 0;.}
b0a0: 0a 0a 0a 2f 2a 20 54 68 65 20 6d 61 69 6e 20 70  .../* The main p
b0b0: 72 6f 67 72 61 6d 2e 20 20 50 61 72 73 65 20 74  rogram.  Parse t
b0c0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
b0d0: 61 6e 64 20 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a  and do it... */.
b0e0: 69 6e 74 20 6d 61 69 6e 28 61 72 67 63 2c 61 72  int main(argc,ar
b0f0: 67 76 29 0a 69 6e 74 20 61 72 67 63 3b 0a 63 68  gv).int argc;.ch
b100: 61 72 20 2a 2a 61 72 67 76 3b 0a 7b 0a 20 20 73  ar **argv;.{.  s
b110: 74 61 74 69 63 20 69 6e 74 20 76 65 72 73 69 6f  tatic int versio
b120: 6e 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  n = 0;.  static 
b130: 69 6e 74 20 72 70 66 6c 61 67 20 3d 20 30 3b 0a  int rpflag = 0;.
b140: 20 20 73 74 61 74 69 63 20 69 6e 74 20 62 61 73    static int bas
b150: 69 73 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74  isflag = 0;.  st
b160: 61 74 69 63 20 69 6e 74 20 63 6f 6d 70 72 65 73  atic int compres
b170: 73 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  s = 0;.  static 
b180: 69 6e 74 20 71 75 69 65 74 20 3d 20 30 3b 0a 20  int quiet = 0;. 
b190: 20 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 74   static int stat
b1a0: 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 73 74  istics = 0;.  st
b1b0: 61 74 69 63 20 69 6e 74 20 6d 68 66 6c 61 67 20  atic int mhflag 
b1c0: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
b1d0: 74 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20  t nolinenosflag 
b1e0: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 73 74  = 0;.  static st
b1f0: 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 6f  ruct s_options o
b200: 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20  ptions[] = {.   
b210: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 62 22 2c   {OPT_FLAG, "b",
b220: 20 28 63 68 61 72 2a 29 26 62 61 73 69 73 66 6c   (char*)&basisfl
b230: 61 67 2c 20 22 50 72 69 6e 74 20 6f 6e 6c 79 20  ag, "Print only 
b240: 74 68 65 20 62 61 73 69 73 20 69 6e 20 72 65 70  the basis in rep
b250: 6f 72 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ort."},.    {OPT
b260: 5f 46 4c 41 47 2c 20 22 63 22 2c 20 28 63 68 61  _FLAG, "c", (cha
b270: 72 2a 29 26 63 6f 6d 70 72 65 73 73 2c 20 22 44  r*)&compress, "D
b280: 6f 6e 27 74 20 63 6f 6d 70 72 65 73 73 20 74 68  on't compress th
b290: 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 22  e action table."
b2a0: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 53 54 52  },.    {OPT_FSTR
b2b0: 2c 20 22 44 22 2c 20 28 63 68 61 72 2a 29 68 61  , "D", (char*)ha
b2c0: 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f 6e 2c 20 22  ndle_D_option, "
b2d0: 44 65 66 69 6e 65 20 61 6e 20 25 69 66 64 65 66  Define an %ifdef
b2e0: 20 6d 61 63 72 6f 2e 22 7d 2c 0a 20 20 20 20 7b   macro."},.    {
b2f0: 4f 50 54 5f 46 4c 41 47 2c 20 22 67 22 2c 20 28  OPT_FLAG, "g", (
b300: 63 68 61 72 2a 29 26 72 70 66 6c 61 67 2c 20 22  char*)&rpflag, "
b310: 50 72 69 6e 74 20 67 72 61 6d 6d 61 72 20 77 69  Print grammar wi
b320: 74 68 6f 75 74 20 61 63 74 69 6f 6e 73 2e 22 7d  thout actions."}
b330: 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  ,.    {OPT_FLAG,
b340: 20 22 6d 22 2c 20 28 63 68 61 72 2a 29 26 6d 68   "m", (char*)&mh
b350: 66 6c 61 67 2c 20 22 4f 75 74 70 75 74 20 61 20  flag, "Output a 
b360: 6d 61 6b 65 68 65 61 64 65 72 73 20 63 6f 6d 70  makeheaders comp
b370: 61 74 69 62 6c 65 20 66 69 6c 65 2e 22 7d 2c 0a  atible file."},.
b380: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
b390: 6c 22 2c 20 28 63 68 61 72 2a 29 26 6e 6f 6c 69  l", (char*)&noli
b3a0: 6e 65 6e 6f 73 66 6c 61 67 2c 20 22 44 6f 20 6e  nenosflag, "Do n
b3b0: 6f 74 20 70 72 69 6e 74 20 23 6c 69 6e 65 20 73  ot print #line s
b3c0: 74 61 74 65 6d 65 6e 74 73 2e 22 7d 2c 0a 20 20  tatements."},.  
b3d0: 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 71 22    {OPT_FLAG, "q"
b3e0: 2c 20 28 63 68 61 72 2a 29 26 71 75 69 65 74 2c  , (char*)&quiet,
b3f0: 20 22 28 51 75 69 65 74 29 20 44 6f 6e 27 74 20   "(Quiet) Don't 
b400: 70 72 69 6e 74 20 74 68 65 20 72 65 70 6f 72 74  print the report
b410: 20 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f   file."},.    {O
b420: 50 54 5f 46 4c 41 47 2c 20 22 73 22 2c 20 28 63  PT_FLAG, "s", (c
b430: 68 61 72 2a 29 26 73 74 61 74 69 73 74 69 63 73  har*)&statistics
b440: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b460: 20 20 20 20 20 22 50 72 69 6e 74 20 70 61 72 73       "Print pars
b470: 65 72 20 73 74 61 74 73 20 74 6f 20 73 74 61 6e  er stats to stan
b480: 64 61 72 64 20 6f 75 74 70 75 74 2e 22 7d 2c 0a  dard output."},.
b490: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
b4a0: 78 22 2c 20 28 63 68 61 72 2a 29 26 76 65 72 73  x", (char*)&vers
b4b0: 69 6f 6e 2c 20 22 50 72 69 6e 74 20 74 68 65 20  ion, "Print the 
b4c0: 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 2e 22  version number."
b4d0: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47  },.    {OPT_FLAG
b4e0: 2c 30 2c 30 2c 30 7d 0a 20 20 7d 3b 0a 20 20 69  ,0,0,0}.  };.  i
b4f0: 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 6c  nt i;.  struct l
b500: 65 6d 6f 6e 20 6c 65 6d 3b 0a 0a 20 20 4f 70 74  emon lem;..  Opt
b510: 49 6e 69 74 28 61 72 67 76 2c 6f 70 74 69 6f 6e  Init(argv,option
b520: 73 2c 73 74 64 65 72 72 29 3b 0a 20 20 69 66 28  s,stderr);.  if(
b530: 20 76 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20   version ){.    
b540: 20 70 72 69 6e 74 66 28 22 4c 65 6d 6f 6e 20 76   printf("Lemon v
b550: 65 72 73 69 6f 6e 20 31 2e 30 5c 6e 22 29 3b 0a  ersion 1.0\n");.
b560: 20 20 20 20 20 65 78 69 74 28 30 29 3b 20 0a 20       exit(0); . 
b570: 20 7d 0a 20 20 69 66 28 20 4f 70 74 4e 41 72 67   }.  if( OptNArg
b580: 73 28 29 21 3d 31 20 29 7b 0a 20 20 20 20 66 70  s()!=1 ){.    fp
b590: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 78  rintf(stderr,"Ex
b5a0: 61 63 74 6c 79 20 6f 6e 65 20 66 69 6c 65 6e 61  actly one filena
b5b0: 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 72  me argument is r
b5c0: 65 71 75 69 72 65 64 2e 5c 6e 22 29 3b 0a 20 20  equired.\n");.  
b5d0: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
b5e0: 20 6d 65 6d 73 65 74 28 26 6c 65 6d 2c 20 30 2c   memset(&lem, 0,
b5f0: 20 73 69 7a 65 6f 66 28 6c 65 6d 29 29 3b 0a 20   sizeof(lem));. 
b600: 20 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3d 20   lem.errorcnt = 
b610: 30 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  0;..  /* Initial
b620: 69 7a 65 20 74 68 65 20 6d 61 63 68 69 6e 65 20  ize the machine 
b630: 2a 2f 0a 20 20 53 74 72 73 61 66 65 5f 69 6e 69  */.  Strsafe_ini
b640: 74 28 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 69 6e  t();.  Symbol_in
b650: 69 74 28 29 3b 0a 20 20 53 74 61 74 65 5f 69 6e  it();.  State_in
b660: 69 74 28 29 3b 0a 20 20 6c 65 6d 2e 61 72 67 76  it();.  lem.argv
b670: 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a 20 20 6c  0 = argv[0];.  l
b680: 65 6d 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 4f 70  em.filename = Op
b690: 74 41 72 67 28 30 29 3b 0a 20 20 6c 65 6d 2e 62  tArg(0);.  lem.b
b6a0: 61 73 69 73 66 6c 61 67 20 3d 20 62 61 73 69 73  asisflag = basis
b6b0: 66 6c 61 67 3b 0a 20 20 6c 65 6d 2e 6e 6f 6c 69  flag;.  lem.noli
b6c0: 6e 65 6e 6f 73 66 6c 61 67 20 3d 20 6e 6f 6c 69  nenosflag = noli
b6d0: 6e 65 6e 6f 73 66 6c 61 67 3b 0a 20 20 53 79 6d  nenosflag;.  Sym
b6e0: 62 6f 6c 5f 6e 65 77 28 22 24 22 29 3b 0a 20 20  bol_new("$");.  
b6f0: 6c 65 6d 2e 65 72 72 73 79 6d 20 3d 20 53 79 6d  lem.errsym = Sym
b700: 62 6f 6c 5f 6e 65 77 28 22 65 72 72 6f 72 22 29  bol_new("error")
b710: 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d 2d 3e  ;.  lem.errsym->
b720: 75 73 65 43 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f  useCnt = 0;..  /
b730: 2a 20 50 61 72 73 65 20 74 68 65 20 69 6e 70 75  * Parse the inpu
b740: 74 20 66 69 6c 65 20 2a 2f 0a 20 20 50 61 72 73  t file */.  Pars
b750: 65 28 26 6c 65 6d 29 3b 0a 20 20 69 66 28 20 6c  e(&lem);.  if( l
b760: 65 6d 2e 65 72 72 6f 72 63 6e 74 20 29 20 65 78  em.errorcnt ) ex
b770: 69 74 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 29  it(lem.errorcnt)
b780: 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 6e 72 75 6c  ;.  if( lem.nrul
b790: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  e==0 ){.    fpri
b7a0: 6e 74 66 28 73 74 64 65 72 72 2c 22 45 6d 70 74  ntf(stderr,"Empt
b7b0: 79 20 67 72 61 6d 6d 61 72 2e 5c 6e 22 29 3b 0a  y grammar.\n");.
b7c0: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
b7d0: 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74 20 61 6e 64  ..  /* Count and
b7e0: 20 69 6e 64 65 78 20 74 68 65 20 73 79 6d 62 6f   index the symbo
b7f0: 6c 73 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  ls of the gramma
b800: 72 20 2a 2f 0a 20 20 6c 65 6d 2e 6e 73 79 6d 62  r */.  lem.nsymb
b810: 6f 6c 20 3d 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e  ol = Symbol_coun
b820: 74 28 29 3b 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65  t();.  Symbol_ne
b830: 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a  w("{default}");.
b840: 20 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 20 3d 20    lem.symbols = 
b850: 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29  Symbol_arrayof()
b860: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  ;.  for(i=0; i<=
b870: 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  lem.nsymbol; i++
b880: 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d  ) lem.symbols[i]
b890: 2d 3e 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 71  ->index = i;.  q
b8a0: 73 6f 72 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73  sort(lem.symbols
b8b0: 2c 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 2b 31 2c 73  ,lem.nsymbol+1,s
b8c0: 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d  izeof(struct sym
b8d0: 62 6f 6c 2a 29 2c 0a 20 20 20 20 20 20 20 20 28  bol*),.        (
b8e0: 69 6e 74 28 2a 29 28 29 29 53 79 6d 62 6f 6c 63  int(*)())Symbolc
b8f0: 6d 70 70 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  mpp);.  for(i=0;
b900: 20 69 3c 3d 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b   i<=lem.nsymbol;
b910: 20 69 2b 2b 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c   i++) lem.symbol
b920: 73 5b 69 5d 2d 3e 69 6e 64 65 78 20 3d 20 69 3b  s[i]->index = i;
b930: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 73 75 70  .  for(i=1; isup
b940: 70 65 72 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b  per(lem.symbols[
b950: 69 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 3b 20 69 2b  i]->name[0]); i+
b960: 2b 29 3b 0a 20 20 6c 65 6d 2e 6e 74 65 72 6d 69  +);.  lem.ntermi
b970: 6e 61 6c 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20 47  nal = i;..  /* G
b980: 65 6e 65 72 61 74 65 20 61 20 72 65 70 72 69 6e  enerate a reprin
b990: 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72  t of the grammar
b9a0: 2c 20 69 66 20 72 65 71 75 65 73 74 65 64 20 6f  , if requested o
b9b0: 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  n the command li
b9c0: 6e 65 20 2a 2f 0a 20 20 69 66 28 20 72 70 66 6c  ne */.  if( rpfl
b9d0: 61 67 20 29 7b 0a 20 20 20 20 52 65 70 72 69 6e  ag ){.    Reprin
b9e0: 74 28 26 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73 65  t(&lem);.  }else
b9f0: 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  {.    /* Initial
ba00: 69 7a 65 20 74 68 65 20 73 69 7a 65 20 66 6f 72  ize the size for
ba10: 20 61 6c 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64 20   all follow and 
ba20: 66 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20 20  first sets */.  
ba30: 20 20 53 65 74 53 69 7a 65 28 6c 65 6d 2e 6e 74    SetSize(lem.nt
ba40: 65 72 6d 69 6e 61 6c 2b 31 29 3b 0a 0a 20 20 20  erminal+1);..   
ba50: 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 70 72 65   /* Find the pre
ba60: 63 65 64 65 6e 63 65 20 66 6f 72 20 65 76 65 72  cedence for ever
ba70: 79 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c  y production rul
ba80: 65 20 28 74 68 61 74 20 68 61 73 20 6f 6e 65 29  e (that has one)
ba90: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 52 75 6c 65   */.    FindRule
baa0: 50 72 65 63 65 64 65 6e 63 65 73 28 26 6c 65 6d  Precedences(&lem
bab0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75  );..    /* Compu
bac0: 74 65 20 74 68 65 20 6c 61 6d 62 64 61 2d 6e 6f  te the lambda-no
bad0: 6e 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 74  nterminals and t
bae0: 68 65 20 66 69 72 73 74 2d 73 65 74 73 20 66 6f  he first-sets fo
baf0: 72 20 65 76 65 72 79 0a 20 20 20 20 2a 2a 20 6e  r every.    ** n
bb00: 6f 6e 74 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20 20  onterminal */.  
bb10: 20 20 46 69 6e 64 46 69 72 73 74 53 65 74 73 28    FindFirstSets(
bb20: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  &lem);..    /* C
bb30: 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30 29  ompute all LR(0)
bb40: 20 73 74 61 74 65 73 2e 20 20 41 6c 73 6f 20 72   states.  Also r
bb50: 65 63 6f 72 64 20 66 6f 6c 6c 6f 77 2d 73 65 74  ecord follow-set
bb60: 20 70 72 6f 70 61 67 61 74 69 6f 6e 0a 20 20 20   propagation.   
bb70: 20 2a 2a 20 6c 69 6e 6b 73 20 73 6f 20 74 68 61   ** links so tha
bb80: 74 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74  t the follow-set
bb90: 20 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65 64   can be computed
bba0: 20 6c 61 74 65 72 20 2a 2f 0a 20 20 20 20 6c 65   later */.    le
bbb0: 6d 2e 6e 73 74 61 74 65 20 3d 20 30 3b 0a 20 20  m.nstate = 0;.  
bbc0: 20 20 46 69 6e 64 53 74 61 74 65 73 28 26 6c 65    FindStates(&le
bbd0: 6d 29 3b 0a 20 20 20 20 6c 65 6d 2e 73 6f 72 74  m);.    lem.sort
bbe0: 65 64 20 3d 20 53 74 61 74 65 5f 61 72 72 61 79  ed = State_array
bbf0: 6f 66 28 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 69  of();..    /* Ti
bc00: 65 20 75 70 20 6c 6f 6f 73 65 20 65 6e 64 73 20  e up loose ends 
bc10: 6f 6e 20 74 68 65 20 70 72 6f 70 61 67 61 74 69  on the propagati
bc20: 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20 20  on links */.    
bc30: 46 69 6e 64 4c 69 6e 6b 73 28 26 6c 65 6d 29 3b  FindLinks(&lem);
bc40: 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65  ..    /* Compute
bc50: 20 74 68 65 20 66 6f 6c 6c 6f 77 20 73 65 74 20   the follow set 
bc60: 6f 66 20 65 76 65 72 79 20 72 65 64 75 63 69 62  of every reducib
bc70: 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  le configuration
bc80: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46 6f 6c 6c   */.    FindFoll
bc90: 6f 77 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20  owSets(&lem);.. 
bca0: 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68     /* Compute th
bcb0: 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 20  e action tables 
bcc0: 2a 2f 0a 20 20 20 20 46 69 6e 64 41 63 74 69 6f  */.    FindActio
bcd0: 6e 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f  ns(&lem);..    /
bce0: 2a 20 43 6f 6d 70 72 65 73 73 20 74 68 65 20 61  * Compress the a
bcf0: 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a  ction tables */.
bd00: 20 20 20 20 69 66 28 20 63 6f 6d 70 72 65 73 73      if( compress
bd10: 3d 3d 30 20 29 20 43 6f 6d 70 72 65 73 73 54 61  ==0 ) CompressTa
bd20: 62 6c 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20  bles(&lem);..   
bd30: 20 2f 2a 20 52 65 6f 72 64 65 72 20 61 6e 64 20   /* Reorder and 
bd40: 72 65 6e 75 6d 62 65 72 20 74 68 65 20 73 74 61  renumber the sta
bd50: 74 65 73 20 73 6f 20 74 68 61 74 20 73 74 61 74  tes so that stat
bd60: 65 73 20 77 69 74 68 20 66 65 77 65 72 20 63 68  es with fewer ch
bd70: 6f 69 63 65 73 0a 20 20 20 20 2a 2a 20 6f 63 63  oices.    ** occ
bd80: 75 72 20 61 74 20 74 68 65 20 65 6e 64 2e 20 2a  ur at the end. *
bd90: 2f 0a 20 20 20 20 52 65 73 6f 72 74 53 74 61 74  /.    ResortStat
bda0: 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f  es(&lem);..    /
bdb0: 2a 20 47 65 6e 65 72 61 74 65 20 61 20 72 65 70  * Generate a rep
bdc0: 6f 72 74 20 6f 66 20 74 68 65 20 70 61 72 73 65  ort of the parse
bdd0: 72 20 67 65 6e 65 72 61 74 65 64 2e 20 20 28 74  r generated.  (t
bde0: 68 65 20 22 79 2e 6f 75 74 70 75 74 22 20 66 69  he "y.output" fi
bdf0: 6c 65 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  le) */.    if( !
be00: 71 75 69 65 74 20 29 20 52 65 70 6f 72 74 4f 75  quiet ) ReportOu
be10: 74 70 75 74 28 26 6c 65 6d 29 3b 0a 0a 20 20 20  tput(&lem);..   
be20: 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
be30: 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72   source code for
be40: 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 20   the parser */. 
be50: 20 20 20 52 65 70 6f 72 74 54 61 62 6c 65 28 26     ReportTable(&
be60: 6c 65 6d 2c 20 6d 68 66 6c 61 67 29 3b 0a 0a 20  lem, mhflag);.. 
be70: 20 20 20 2f 2a 20 50 72 6f 64 75 63 65 20 61 20     /* Produce a 
be80: 68 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72 20  header file for 
be90: 75 73 65 20 62 79 20 74 68 65 20 73 63 61 6e 6e  use by the scann
bea0: 65 72 2e 20 20 28 54 68 69 73 20 73 74 65 70 20  er.  (This step 
beb0: 69 73 0a 20 20 20 20 2a 2a 20 6f 6d 69 74 74 65  is.    ** omitte
bec0: 64 20 69 66 20 74 68 65 20 22 2d 6d 22 20 6f 70  d if the "-m" op
bed0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 65 63  tion is used bec
bee0: 61 75 73 65 20 6d 61 6b 65 68 65 61 64 65 72 73  ause makeheaders
bef0: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65 6e   will.    ** gen
bf00: 65 72 61 74 65 20 74 68 65 20 66 69 6c 65 20 66  erate the file f
bf10: 6f 72 20 75 73 2e 29 20 2a 2f 0a 20 20 20 20 69  or us.) */.    i
bf20: 66 28 20 21 6d 68 66 6c 61 67 20 29 20 52 65 70  f( !mhflag ) Rep
bf30: 6f 72 74 48 65 61 64 65 72 28 26 6c 65 6d 29 3b  ortHeader(&lem);
bf40: 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 69  .  }.  if( stati
bf50: 73 74 69 63 73 20 29 7b 0a 20 20 20 20 70 72 69  stics ){.    pri
bf60: 6e 74 66 28 22 50 61 72 73 65 72 20 73 74 61 74  ntf("Parser stat
bf70: 69 73 74 69 63 73 3a 20 25 64 20 74 65 72 6d 69  istics: %d termi
bf80: 6e 61 6c 73 2c 20 25 64 20 6e 6f 6e 74 65 72 6d  nals, %d nonterm
bf90: 69 6e 61 6c 73 2c 20 25 64 20 72 75 6c 65 73 5c  inals, %d rules\
bfa0: 6e 22 2c 0a 20 20 20 20 20 20 6c 65 6d 2e 6e 74  n",.      lem.nt
bfb0: 65 72 6d 69 6e 61 6c 2c 20 6c 65 6d 2e 6e 73 79  erminal, lem.nsy
bfc0: 6d 62 6f 6c 20 2d 20 6c 65 6d 2e 6e 74 65 72 6d  mbol - lem.nterm
bfd0: 69 6e 61 6c 2c 20 6c 65 6d 2e 6e 72 75 6c 65 29  inal, lem.nrule)
bfe0: 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 20  ;.    printf("  
bff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c000: 20 25 64 20 73 74 61 74 65 73 2c 20 25 64 20 70   %d states, %d p
c010: 61 72 73 65 72 20 74 61 62 6c 65 20 65 6e 74 72  arser table entr
c020: 69 65 73 2c 20 25 64 20 63 6f 6e 66 6c 69 63 74  ies, %d conflict
c030: 73 5c 6e 22 2c 0a 20 20 20 20 20 20 6c 65 6d 2e  s\n",.      lem.
c040: 6e 73 74 61 74 65 2c 20 6c 65 6d 2e 74 61 62 6c  nstate, lem.tabl
c050: 65 73 69 7a 65 2c 20 6c 65 6d 2e 6e 63 6f 6e 66  esize, lem.nconf
c060: 6c 69 63 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  lict);.  }.  if(
c070: 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 29   lem.nconflict )
c080: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
c090: 64 65 72 72 2c 22 25 64 20 70 61 72 73 69 6e 67  derr,"%d parsing
c0a0: 20 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22 2c 6c   conflicts.\n",l
c0b0: 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20  em.nconflict);. 
c0c0: 20 7d 0a 20 20 65 78 69 74 28 6c 65 6d 2e 65 72   }.  exit(lem.er
c0d0: 72 6f 72 63 6e 74 20 2b 20 6c 65 6d 2e 6e 63 6f  rorcnt + lem.nco
c0e0: 6e 66 6c 69 63 74 29 3b 0a 20 20 72 65 74 75 72  nflict);.  retur
c0f0: 6e 20 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20  n (lem.errorcnt 
c100: 2b 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29  + lem.nconflict)
c110: 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
c120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
c130: 68 65 20 66 69 6c 65 20 22 6d 73 6f 72 74 2e 63  he file "msort.c
c140: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
c150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c160: 2a 2f 0a 2f 2a 0a 2a 2a 20 41 20 67 65 6e 65 72  */./*.** A gener
c170: 69 63 20 6d 65 72 67 65 2d 73 6f 72 74 20 70 72  ic merge-sort pr
c180: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 55 53 41  ogram..**.** USA
c190: 47 45 3a 0a 2a 2a 20 4c 65 74 20 22 70 74 72 22  GE:.** Let "ptr"
c1a0: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
c1b0: 20 73 6f 6d 65 20 73 74 72 75 63 74 75 72 65 20   some structure 
c1c0: 77 68 69 63 68 20 69 73 20 61 74 20 74 68 65 20  which is at the 
c1d0: 68 65 61 64 20 6f 66 0a 2a 2a 20 61 20 6e 75 6c  head of.** a nul
c1e0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 73  l-terminated lis
c1f0: 74 2e 20 20 54 68 65 6e 20 74 6f 20 73 6f 72 74  t.  Then to sort
c200: 20 74 68 65 20 6c 69 73 74 20 63 61 6c 6c 3a 0a   the list call:.
c210: 2a 2a 0a 2a 2a 20 20 20 20 20 70 74 72 20 3d 20  **.**     ptr = 
c220: 6d 73 6f 72 74 28 70 74 72 2c 26 28 70 74 72 2d  msort(ptr,&(ptr-
c230: 3e 6e 65 78 74 29 2c 63 6d 70 66 6e 63 29 3b 0a  >next),cmpfnc);.
c240: 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 6f  **.** In the abo
c250: 76 65 2c 20 22 63 6d 70 66 6e 63 22 20 69 73 20  ve, "cmpfnc" is 
c260: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
c270: 75 6e 63 74 69 6f 6e 20 77 68 69 63 68 20 63 6f  unction which co
c280: 6d 70 61 72 65 73 0a 2a 2a 20 74 77 6f 20 69 6e  mpares.** two in
c290: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 73  stances of the s
c2a0: 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65 74  tructure and ret
c2b0: 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65 72 2c  urns an integer,
c2c0: 20 61 73 20 69 6e 0a 2a 2a 20 73 74 72 63 6d 70   as in.** strcmp
c2d0: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72  .  The second ar
c2e0: 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
c2f0: 74 65 72 20 74 6f 20 74 68 65 20 70 6f 69 6e 74  ter to the point
c300: 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 65 63  er to the.** sec
c310: 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ond element of t
c320: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20  he linked list. 
c330: 20 54 68 69 73 20 61 64 64 72 65 73 73 20 69 73   This address is
c340: 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65   used to compute
c350: 0a 2a 2a 20 74 68 65 20 6f 66 66 73 65 74 20 74  .** the offset t
c360: 6f 20 74 68 65 20 22 6e 65 78 74 22 20 66 69 65  o the "next" fie
c370: 6c 64 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  ld within the st
c380: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6f 66  ructure.  The of
c390: 66 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 22  fset to.** the "
c3a0: 6e 65 78 74 22 20 66 69 65 6c 64 20 6d 75 73 74  next" field must
c3b0: 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 66 6f 72   be constant for
c3c0: 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20   all structures 
c3d0: 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a  in the list..**.
c3e0: 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  ** The function 
c3f0: 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20 70 6f  returns a new po
c400: 69 6e 74 65 72 20 77 68 69 63 68 20 69 73 20 74  inter which is t
c410: 68 65 20 68 65 61 64 20 6f 66 20 74 68 65 20 6c  he head of the l
c420: 69 73 74 0a 2a 2a 20 61 66 74 65 72 20 73 6f 72  ist.** after sor
c430: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 4c 47 4f  ting..**.** ALGO
c440: 52 49 54 48 4d 3a 0a 2a 2a 20 4d 65 72 67 65 2d  RITHM:.** Merge-
c450: 73 6f 72 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  sort..*/../*.** 
c460: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
c470: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74 72   to the next str
c480: 75 63 74 75 72 65 20 69 6e 20 74 68 65 20 6c 69  ucture in the li
c490: 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 23 64  nked list..*/.#d
c4a0: 65 66 69 6e 65 20 4e 45 58 54 28 41 29 20 28 2a  efine NEXT(A) (*
c4b0: 28 63 68 61 72 2a 2a 29 28 28 28 75 6e 73 69 67  (char**)(((unsig
c4c0: 6e 65 64 20 6c 6f 6e 67 29 41 29 2b 6f 66 66 73  ned long)A)+offs
c4d0: 65 74 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75  et))../*.** Inpu
c4e0: 74 73 3a 0a 2a 2a 20 20 20 61 3a 20 20 20 20 20  ts:.**   a:     
c4f0: 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c    A sorted, null
c500: 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b  -terminated link
c510: 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62  ed list.  (May b
c520: 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a  e null)..**   b:
c530: 20 20 20 20 20 20 20 41 20 73 6f 72 74 65 64 2c         A sorted,
c540: 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64   null-terminated
c550: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28   linked list.  (
c560: 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a  May be null)..**
c570: 20 20 20 63 6d 70 3a 20 20 20 20 20 41 20 70 6f     cmp:     A po
c580: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6d  inter to the com
c590: 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
c5a0: 2e 0a 2a 2a 20 20 20 6f 66 66 73 65 74 3a 20 20  ..**   offset:  
c5b0: 4f 66 66 73 65 74 20 69 6e 20 74 68 65 20 73 74  Offset in the st
c5c0: 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20 22  ructure to the "
c5d0: 6e 65 78 74 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a  next" field..**.
c5e0: 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a  ** Return Value:
c5f0: 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20  .**   A pointer 
c600: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 61  to the head of a
c610: 20 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e   sorted list con
c620: 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d  taining the elem
c630: 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 62 6f 74  ents.**   of bot
c640: 68 20 61 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a  h a and b..**.**
c650: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2a   Side effects:.*
c660: 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22 20 70  *   The "next" p
c670: 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65 6d  ointers for elem
c680: 65 6e 74 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ents in the list
c690: 73 20 61 20 61 6e 64 20 62 20 61 72 65 0a 2a 2a  s a and b are.**
c6a0: 20 20 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73     changed..*/.s
c6b0: 74 61 74 69 63 20 63 68 61 72 20 2a 6d 65 72 67  tatic char *merg
c6c0: 65 28 0a 20 20 63 68 61 72 20 2a 61 2c 0a 20 20  e(.  char *a,.  
c6d0: 63 68 61 72 20 2a 62 2c 0a 20 20 69 6e 74 20 28  char *b,.  int (
c6e0: 2a 63 6d 70 29 28 63 6f 6e 73 74 20 63 68 61 72  *cmp)(const char
c6f0: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 0a  *,const char*),.
c700: 20 20 69 6e 74 20 6f 66 66 73 65 74 0a 29 7b 0a    int offset.){.
c710: 20 20 63 68 61 72 20 2a 70 74 72 2c 20 2a 68 65    char *ptr, *he
c720: 61 64 3b 0a 0a 20 20 69 66 28 20 61 3d 3d 30 20  ad;..  if( a==0 
c730: 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 62 3b  ){.    head = b;
c740: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 3d 3d  .  }else if( b==
c750: 30 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20  0 ){.    head = 
c760: 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
c770: 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c  if( (*cmp)(a,b)<
c780: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 20  =0 ){.      ptr 
c790: 3d 20 61 3b 0a 20 20 20 20 20 20 61 20 3d 20 4e  = a;.      a = N
c7a0: 45 58 54 28 61 29 3b 0a 20 20 20 20 7d 65 6c 73  EXT(a);.    }els
c7b0: 65 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 62  e{.      ptr = b
c7c0: 3b 0a 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54  ;.      b = NEXT
c7d0: 28 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  (b);.    }.    h
c7e0: 65 61 64 20 3d 20 70 74 72 3b 0a 20 20 20 20 77  ead = ptr;.    w
c7f0: 68 69 6c 65 28 20 61 20 26 26 20 62 20 29 7b 0a  hile( a && b ){.
c800: 20 20 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29        if( (*cmp)
c810: 28 61 2c 62 29 3c 3d 30 20 29 7b 0a 20 20 20 20  (a,b)<=0 ){.    
c820: 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20      NEXT(ptr) = 
c830: 61 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d  a;.        ptr =
c840: 20 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20   a;.        a = 
c850: 4e 45 58 54 28 61 29 3b 0a 20 20 20 20 20 20 7d  NEXT(a);.      }
c860: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4e 45  else{.        NE
c870: 58 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 20  XT(ptr) = b;.   
c880: 20 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20       ptr = b;.  
c890: 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62        b = NEXT(b
c8a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
c8b0: 0a 20 20 20 20 69 66 28 20 61 20 29 20 4e 45 58  .    if( a ) NEX
c8c0: 54 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20  T(ptr) = a;.    
c8d0: 65 6c 73 65 20 20 20 20 4e 45 58 54 28 70 74 72  else    NEXT(ptr
c8e0: 29 20 3d 20 62 3b 0a 20 20 7d 0a 20 20 72 65 74  ) = b;.  }.  ret
c8f0: 75 72 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a  urn head;.}../*.
c900: 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20  ** Inputs:.**   
c910: 6c 69 73 74 3a 20 20 20 20 20 20 50 6f 69 6e 74  list:      Point
c920: 65 72 20 74 6f 20 61 20 73 69 6e 67 6c 79 2d 6c  er to a singly-l
c930: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 73 74  inked list of st
c940: 72 75 63 74 75 72 65 73 2e 0a 2a 2a 20 20 20 6e  ructures..**   n
c950: 65 78 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65  ext:      Pointe
c960: 72 20 74 6f 20 70 6f 69 6e 74 65 72 20 74 6f 20  r to pointer to 
c970: 74 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65  the second eleme
c980: 6e 74 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a  nt of the list..
c990: 2a 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 20 20  **   cmp:       
c9a0: 41 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  A comparison fun
c9b0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ction..**.** Ret
c9c0: 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20  urn Value:.**   
c9d0: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
c9e0: 20 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65   head of a sorte
c9f0: 64 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e  d list containin
ca00: 67 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a  g the elements.*
ca10: 2a 20 20 20 6f 72 67 69 6e 61 6c 6c 79 20 69 6e  *   orginally in
ca20: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64   list..**.** Sid
ca30: 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20  e effects:.**   
ca40: 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74  The "next" point
ca50: 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73  ers for elements
ca60: 20 69 6e 20 6c 69 73 74 20 61 72 65 20 63 68 61   in list are cha
ca70: 6e 67 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  nged..*/.#define
ca80: 20 4c 49 53 54 53 49 5a 45 20 33 30 0a 73 74 61   LISTSIZE 30.sta
ca90: 74 69 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28  tic char *msort(
caa0: 0a 20 20 63 68 61 72 20 2a 6c 69 73 74 2c 0a 20  .  char *list,. 
cab0: 20 63 68 61 72 20 2a 2a 6e 65 78 74 2c 0a 20 20   char **next,.  
cac0: 69 6e 74 20 28 2a 63 6d 70 29 28 63 6f 6e 73 74  int (*cmp)(const
cad0: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
cae0: 72 2a 29 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65  r*).){.  unsigne
caf0: 64 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 0a 20  d long offset;. 
cb00: 20 63 68 61 72 20 2a 65 70 3b 0a 20 20 63 68 61   char *ep;.  cha
cb10: 72 20 2a 73 65 74 5b 4c 49 53 54 53 49 5a 45 5d  r *set[LISTSIZE]
cb20: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6f 66 66  ;.  int i;.  off
cb30: 73 65 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  set = (unsigned 
cb40: 6c 6f 6e 67 29 6e 65 78 74 20 2d 20 28 75 6e 73  long)next - (uns
cb50: 69 67 6e 65 64 20 6c 6f 6e 67 29 6c 69 73 74 3b  igned long)list;
cb60: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49  .  for(i=0; i<LI
cb70: 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 73 65 74  STSIZE; i++) set
cb80: 5b 69 5d 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  [i] = 0;.  while
cb90: 28 20 6c 69 73 74 20 29 7b 0a 20 20 20 20 65 70  ( list ){.    ep
cba0: 20 3d 20 6c 69 73 74 3b 0a 20 20 20 20 6c 69 73   = list;.    lis
cbb0: 74 20 3d 20 4e 45 58 54 28 6c 69 73 74 29 3b 0a  t = NEXT(list);.
cbc0: 20 20 20 20 4e 45 58 54 28 65 70 29 20 3d 20 30      NEXT(ep) = 0
cbd0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
cbe0: 3c 4c 49 53 54 53 49 5a 45 2d 31 20 26 26 20 73  <LISTSIZE-1 && s
cbf0: 65 74 5b 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b 0a  et[i]!=0; i++){.
cc00: 20 20 20 20 20 20 65 70 20 3d 20 6d 65 72 67 65        ep = merge
cc10: 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f  (ep,set[i],cmp,o
cc20: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 65  ffset);.      se
cc30: 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  t[i] = 0;.    }.
cc40: 20 20 20 20 73 65 74 5b 69 5d 20 3d 20 65 70 3b      set[i] = ep;
cc50: 0a 20 20 7d 0a 20 20 65 70 20 3d 20 30 3b 0a 20  .  }.  ep = 0;. 
cc60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54   for(i=0; i<LIST
cc70: 53 49 5a 45 3b 20 69 2b 2b 29 20 69 66 28 20 73  SIZE; i++) if( s
cc80: 65 74 5b 69 5d 20 29 20 65 70 20 3d 20 6d 65 72  et[i] ) ep = mer
cc90: 67 65 28 73 65 74 5b 69 5d 2c 65 70 2c 63 6d 70  ge(set[i],ep,cmp
cca0: 2c 6f 66 66 73 65 74 29 3b 0a 20 20 72 65 74 75  ,offset);.  retu
ccb0: 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  rn ep;.}./******
ccc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ccd0: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
cce0: 20 22 6f 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a   "option.c" ****
ccf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cd00: 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20 63  ******/.static c
cd10: 68 61 72 20 2a 2a 61 72 67 76 3b 0a 73 74 61 74  har **argv;.stat
cd20: 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69  ic struct s_opti
cd30: 6f 6e 73 20 2a 6f 70 3b 0a 73 74 61 74 69 63 20  ons *op;.static 
cd40: 46 49 4c 45 20 2a 65 72 72 73 74 72 65 61 6d 3b  FILE *errstream;
cd50: 0a 0a 23 64 65 66 69 6e 65 20 49 53 4f 50 54 28  ..#define ISOPT(
cd60: 58 29 20 28 28 58 29 5b 30 5d 3d 3d 27 2d 27 7c  X) ((X)[0]=='-'|
cd70: 7c 28 58 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73 74  |(X)[0]=='+'||st
cd80: 72 63 68 72 28 28 58 29 2c 27 3d 27 29 21 3d 30  rchr((X),'=')!=0
cd90: 29 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  )../*.** Print t
cda0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
cdb0: 77 69 74 68 20 61 20 63 61 72 72 6f 74 20 70 6f  with a carrot po
cdc0: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6b 2d  inting to the k-
cdd0: 74 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20  th character.** 
cde0: 6f 66 20 74 68 65 20 6e 2d 74 68 20 66 69 65 6c  of the n-th fiel
cdf0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
ce00: 64 20 65 72 72 6c 69 6e 65 28 6e 2c 6b 2c 65 72  d errline(n,k,er
ce10: 72 29 0a 69 6e 74 20 6e 3b 0a 69 6e 74 20 6b 3b  r).int n;.int k;
ce20: 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20  .FILE *err;.{.  
ce30: 69 6e 74 20 73 70 63 6e 74 2c 20 69 3b 0a 20 20  int spcnt, i;.  
ce40: 69 66 28 20 61 72 67 76 5b 30 5d 20 29 20 66 70  if( argv[0] ) fp
ce50: 72 69 6e 74 66 28 65 72 72 2c 22 25 73 22 2c 61  rintf(err,"%s",a
ce60: 72 67 76 5b 30 5d 29 3b 0a 20 20 73 70 63 6e 74  rgv[0]);.  spcnt
ce70: 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61   = lemonStrlen(a
ce80: 72 67 76 5b 30 5d 29 20 2b 20 31 3b 0a 20 20 66  rgv[0]) + 1;.  f
ce90: 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26 20 61  or(i=1; i<n && a
cea0: 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  rgv[i]; i++){.  
ceb0: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 20    fprintf(err," 
cec0: 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20  %s",argv[i]);.  
ced0: 20 20 73 70 63 6e 74 20 2b 3d 20 6c 65 6d 6f 6e    spcnt += lemon
cee0: 53 74 72 6c 65 6e 28 61 72 67 76 5b 69 5d 29 2b  Strlen(argv[i])+
cef0: 31 3b 0a 20 20 7d 0a 20 20 73 70 63 6e 74 20 2b  1;.  }.  spcnt +
cf00: 3d 20 6b 3b 0a 20 20 66 6f 72 28 3b 20 61 72 67  = k;.  for(; arg
cf10: 76 5b 69 5d 3b 20 69 2b 2b 29 20 66 70 72 69 6e  v[i]; i++) fprin
cf20: 74 66 28 65 72 72 2c 22 20 25 73 22 2c 61 72 67  tf(err," %s",arg
cf30: 76 5b 69 5d 29 3b 0a 20 20 69 66 28 20 73 70 63  v[i]);.  if( spc
cf40: 6e 74 3c 32 30 20 29 7b 0a 20 20 20 20 66 70 72  nt<20 ){.    fpr
cf50: 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73 5e  intf(err,"\n%*s^
cf60: 2d 2d 20 68 65 72 65 5c 6e 22 2c 73 70 63 6e 74  -- here\n",spcnt
cf70: 2c 22 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ,"");.  }else{. 
cf80: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
cf90: 5c 6e 25 2a 73 68 65 72 65 20 2d 2d 5e 5c 6e 22  \n%*shere --^\n"
cfa0: 2c 73 70 63 6e 74 2d 37 2c 22 22 29 3b 0a 20 20  ,spcnt-7,"");.  
cfb0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
cfc0: 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  n the index of t
cfd0: 68 65 20 4e 2d 74 68 20 6e 6f 6e 2d 73 77 69 74  he N-th non-swit
cfe0: 63 68 20 61 72 67 75 6d 65 6e 74 2e 20 20 52 65  ch argument.  Re
cff0: 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 4e 20  turn -1.** if N 
d000: 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e  is out of range.
d010: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
d020: 72 67 69 6e 64 65 78 28 6e 29 0a 69 6e 74 20 6e  rgindex(n).int n
d030: 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ;.{.  int i;.  i
d040: 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20 30 3b  nt dashdash = 0;
d050: 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30 20 26  .  if( argv!=0 &
d060: 26 20 2a 61 72 67 76 21 3d 30 20 29 7b 0a 20 20  & *argv!=0 ){.  
d070: 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b    for(i=1; argv[
d080: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
d090: 69 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20  if( dashdash || 
d0a0: 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29 20  !ISOPT(argv[i]) 
d0b0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
d0c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a  ==0 ) return i;.
d0d0: 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20          n--;.   
d0e0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73     }.      if( s
d0f0: 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d  trcmp(argv[i],"-
d100: 2d 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61 73  -")==0 ) dashdas
d110: 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  h = 1;.    }.  }
d120: 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a  .  return -1;.}.
d130: 0a 73 74 61 74 69 63 20 63 68 61 72 20 65 6d 73  .static char ems
d140: 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61 6e 64 20 6c  g[] = "Command l
d150: 69 6e 65 20 73 79 6e 74 61 78 20 65 72 72 6f 72  ine syntax error
d160: 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  : ";../*.** Proc
d170: 65 73 73 20 61 20 66 6c 61 67 20 63 6f 6d 6d 61  ess a flag comma
d180: 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74  nd line argument
d190: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d1a0: 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 2c 65 72  handleflags(i,er
d1b0: 72 29 0a 69 6e 74 20 69 3b 0a 46 49 4c 45 20 2a  r).int i;.FILE *
d1c0: 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a  err;.{.  int v;.
d1d0: 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30    int errcnt = 0
d1e0: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72  ;.  int j;.  for
d1f0: 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65  (j=0; op[j].labe
d200: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; j++){.    if(
d210: 20 73 74 72 6e 63 6d 70 28 26 61 72 67 76 5b 69   strncmp(&argv[i
d220: 5d 5b 31 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c  ][1],op[j].label
d230: 2c 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b  ,lemonStrlen(op[
d240: 6a 5d 2e 6c 61 62 65 6c 29 29 3d 3d 30 20 29 20  j].label))==0 ) 
d250: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 76 20 3d  break;.  }.  v =
d260: 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27   argv[i][0]=='-'
d270: 20 3f 20 31 20 3a 20 30 3b 0a 20 20 69 66 28 20   ? 1 : 0;.  if( 
d280: 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29  op[j].label==0 )
d290: 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20 29 7b  {.    if( err ){
d2a0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65  .      fprintf(e
d2b0: 72 72 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20  rr,"%sundefined 
d2c0: 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29  option.\n",emsg)
d2d0: 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28  ;.      errline(
d2e0: 69 2c 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a  i,1,err);.    }.
d2f0: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
d300: 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e  }else if( op[j].
d310: 74 79 70 65 3d 3d 4f 50 54 5f 46 4c 41 47 20 29  type==OPT_FLAG )
d320: 7b 0a 20 20 20 20 2a 28 28 69 6e 74 2a 29 6f 70  {.    *((int*)op
d330: 5b 6a 5d 2e 61 72 67 29 20 3d 20 76 3b 0a 20 20  [j].arg) = v;.  
d340: 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e  }else if( op[j].
d350: 74 79 70 65 3d 3d 4f 50 54 5f 46 46 4c 41 47 20  type==OPT_FFLAG 
d360: 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64 28 2a  ){.    (*(void(*
d370: 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29  )())(op[j].arg))
d380: 28 76 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  (v);.  }else if(
d390: 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54   op[j].type==OPT
d3a0: 5f 46 53 54 52 20 29 7b 0a 20 20 20 20 28 2a 28  _FSTR ){.    (*(
d3b0: 76 6f 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d  void(*)())(op[j]
d3c0: 2e 61 72 67 29 29 28 26 61 72 67 76 5b 69 5d 5b  .arg))(&argv[i][
d3d0: 32 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  2]);.  }else{.  
d3e0: 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20    if( err ){.   
d3f0: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
d400: 25 73 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65  %smissing argume
d410: 6e 74 20 6f 6e 20 73 77 69 74 63 68 2e 5c 6e 22  nt on switch.\n"
d420: 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72  ,emsg);.      er
d430: 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a  rline(i,1,err);.
d440: 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74      }.    errcnt
d450: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
d460: 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a   errcnt;.}../*.*
d470: 2a 20 50 72 6f 63 65 73 73 20 61 20 63 6f 6d 6d  * Process a comm
d480: 61 6e 64 20 6c 69 6e 65 20 73 77 69 74 63 68 20  and line switch 
d490: 77 68 69 63 68 20 68 61 73 20 61 6e 20 61 72 67  which has an arg
d4a0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
d4b0: 20 69 6e 74 20 68 61 6e 64 6c 65 73 77 69 74 63   int handleswitc
d4c0: 68 28 69 2c 65 72 72 29 0a 69 6e 74 20 69 3b 0a  h(i,err).int i;.
d4d0: 46 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69  FILE *err;.{.  i
d4e0: 6e 74 20 6c 76 20 3d 20 30 3b 0a 20 20 64 6f 75  nt lv = 0;.  dou
d4f0: 62 6c 65 20 64 76 20 3d 20 30 2e 30 3b 0a 20 20  ble dv = 0.0;.  
d500: 63 68 61 72 20 2a 73 76 20 3d 20 30 2c 20 2a 65  char *sv = 0, *e
d510: 6e 64 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a  nd;.  char *cp;.
d520: 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 65    int j;.  int e
d530: 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 63 70 20  rrcnt = 0;.  cp 
d540: 3d 20 73 74 72 63 68 72 28 61 72 67 76 5b 69 5d  = strchr(argv[i]
d550: 2c 27 3d 27 29 3b 0a 20 20 61 73 73 65 72 74 28  ,'=');.  assert(
d560: 20 63 70 21 3d 30 20 29 3b 0a 20 20 2a 63 70 20   cp!=0 );.  *cp 
d570: 3d 20 30 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  = 0;.  for(j=0; 
d580: 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b  op[j].label; j++
d590: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
d5a0: 70 28 61 72 67 76 5b 69 5d 2c 6f 70 5b 6a 5d 2e  p(argv[i],op[j].
d5b0: 6c 61 62 65 6c 29 3d 3d 30 20 29 20 62 72 65 61  label)==0 ) brea
d5c0: 6b 3b 0a 20 20 7d 0a 20 20 2a 63 70 20 3d 20 27  k;.  }.  *cp = '
d5d0: 3d 27 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e  =';.  if( op[j].
d5e0: 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  label==0 ){.    
d5f0: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
d600: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
d610: 75 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e  undefined option
d620: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
d630: 20 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72    errline(i,0,er
d640: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72  r);.    }.    er
d650: 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  rcnt++;.  }else{
d660: 0a 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 73  .    cp++;.    s
d670: 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70  witch( op[j].typ
d680: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
d690: 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20  OPT_FLAG:.      
d6a0: 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a  case OPT_FFLAG:.
d6b0: 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20          if( err 
d6c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  ){.          fpr
d6d0: 69 6e 74 66 28 65 72 72 2c 22 25 73 6f 70 74 69  intf(err,"%sopti
d6e0: 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61  on requires an a
d6f0: 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67  rgument.\n",emsg
d700: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 72 72  );.          err
d710: 6c 69 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20  line(i,0,err);. 
d720: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d730: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20   errcnt++;.     
d740: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d750: 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20  case OPT_DBL:.  
d760: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42      case OPT_FDB
d770: 4c 3a 0a 20 20 20 20 20 20 20 20 64 76 20 3d 20  L:.        dv = 
d780: 73 74 72 74 6f 64 28 63 70 2c 26 65 6e 64 29 3b  strtod(cp,&end);
d790: 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a 65 6e  .        if( *en
d7a0: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  d ){.          i
d7b0: 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
d7c0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
d7d0: 72 2c 22 25 73 69 6c 6c 65 67 61 6c 20 63 68 61  r,"%sillegal cha
d7e0: 72 61 63 74 65 72 20 69 6e 20 66 6c 6f 61 74 69  racter in floati
d7f0: 6e 67 2d 70 6f 69 6e 74 20 61 72 67 75 6d 65 6e  ng-point argumen
d800: 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20  t.\n",emsg);.   
d810: 20 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65           errline
d820: 28 69 2c 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f  (i,((unsigned lo
d830: 6e 67 29 65 6e 64 29 2d 28 75 6e 73 69 67 6e 65  ng)end)-(unsigne
d840: 64 20 6c 6f 6e 67 29 61 72 67 76 5b 69 5d 2c 65  d long)argv[i],e
d850: 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rr);.          }
d860: 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 63 6e  .          errcn
d870: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
d880: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d890: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54      case OPT_INT
d8a0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
d8b0: 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c  _FINT:.        l
d8c0: 76 20 3d 20 73 74 72 74 6f 6c 28 63 70 2c 26 65  v = strtol(cp,&e
d8d0: 6e 64 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69  nd,0);.        i
d8e0: 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20  f( *end ){.     
d8f0: 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a       if( err ){.
d900: 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69              fpri
d910: 6e 74 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67  ntf(err,"%silleg
d920: 61 6c 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  al character in 
d930: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
d940: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
d950: 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28          errline(
d960: 69 2c 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  i,((unsigned lon
d970: 67 29 65 6e 64 29 2d 28 75 6e 73 69 67 6e 65 64  g)end)-(unsigned
d980: 20 6c 6f 6e 67 29 61 72 67 76 5b 69 5d 2c 65 72   long)argv[i],er
d990: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
d9a0: 20 20 20 20 20 20 20 20 20 20 65 72 72 63 6e 74            errcnt
d9b0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
d9c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d9d0: 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a     case OPT_STR:
d9e0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
d9f0: 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 73 76  FSTR:.        sv
da00: 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 20 20 62   = cp;.        b
da10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
da20: 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79  switch( op[j].ty
da30: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
da40: 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20   OPT_FLAG:.     
da50: 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a   case OPT_FFLAG:
da60: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
da70: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44        case OPT_D
da80: 42 4c 3a 0a 20 20 20 20 20 20 20 20 2a 28 64 6f  BL:.        *(do
da90: 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67  uble*)(op[j].arg
daa0: 29 20 3d 20 64 76 3b 0a 20 20 20 20 20 20 20 20  ) = dv;.        
dab0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
dac0: 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20  e OPT_FDBL:.    
dad0: 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 29      (*(void(*)()
dae0: 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 64 76  )(op[j].arg))(dv
daf0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
db00: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
db10: 5f 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 2a 28  _INT:.        *(
db20: 69 6e 74 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  int*)(op[j].arg)
db30: 20 3d 20 6c 76 3b 0a 20 20 20 20 20 20 20 20 62   = lv;.        b
db40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
db50: 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20   OPT_FINT:.     
db60: 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 29 29     (*(void(*)())
db70: 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 28 69 6e  (op[j].arg))((in
db80: 74 29 6c 76 29 3b 0a 20 20 20 20 20 20 20 20 62  t)lv);.        b
db90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
dba0: 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20   OPT_STR:.      
dbb0: 20 20 2a 28 63 68 61 72 2a 2a 29 28 6f 70 5b 6a    *(char**)(op[j
dbc0: 5d 2e 61 72 67 29 20 3d 20 73 76 3b 0a 20 20 20  ].arg) = sv;.   
dbd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dbe0: 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a    case OPT_FSTR:
dbf0: 0a 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64  .        (*(void
dc00: 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67  (*)())(op[j].arg
dc10: 29 29 28 73 76 29 3b 0a 20 20 20 20 20 20 20 20  ))(sv);.        
dc20: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
dc30: 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74  .  return errcnt
dc40: 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e 69 74  ;.}..int OptInit
dc50: 28 61 2c 6f 2c 65 72 72 29 0a 63 68 61 72 20 2a  (a,o,err).char *
dc60: 2a 61 3b 0a 73 74 72 75 63 74 20 73 5f 6f 70 74  *a;.struct s_opt
dc70: 69 6f 6e 73 20 2a 6f 3b 0a 46 49 4c 45 20 2a 65  ions *o;.FILE *e
dc80: 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 65 72 72 63  rr;.{.  int errc
dc90: 6e 74 20 3d 20 30 3b 0a 20 20 61 72 67 76 20 3d  nt = 0;.  argv =
dca0: 20 61 3b 0a 20 20 6f 70 20 3d 20 6f 3b 0a 20 20   a;.  op = o;.  
dcb0: 65 72 72 73 74 72 65 61 6d 20 3d 20 65 72 72 3b  errstream = err;
dcc0: 0a 20 20 69 66 28 20 61 72 67 76 20 26 26 20 2a  .  if( argv && *
dcd0: 61 72 67 76 20 26 26 20 6f 70 20 29 7b 0a 20 20  argv && op ){.  
dce0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
dcf0: 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69  (i=1; argv[i]; i
dd00: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
dd10: 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2b 27 20 7c  rgv[i][0]=='+' |
dd20: 7c 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d  | argv[i][0]=='-
dd30: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72  ' ){.        err
dd40: 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 66 6c 61  cnt += handlefla
dd50: 67 73 28 69 2c 65 72 72 29 3b 0a 20 20 20 20 20  gs(i,err);.     
dd60: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 68   }else if( strch
dd70: 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 20 29  r(argv[i],'=') )
dd80: 7b 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74  {.        errcnt
dd90: 20 2b 3d 20 68 61 6e 64 6c 65 73 77 69 74 63 68   += handleswitch
dda0: 28 69 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 7d  (i,err);.      }
ddb0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
ddc0: 20 65 72 72 63 6e 74 3e 30 20 29 7b 0a 20 20 20   errcnt>0 ){.   
ddd0: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 56 61   fprintf(err,"Va
dde0: 6c 69 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  lid command line
ddf0: 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 5c 22 25   options for \"%
de00: 73 5c 22 20 61 72 65 3a 5c 6e 22 2c 2a 61 29 3b  s\" are:\n",*a);
de10: 0a 20 20 20 20 4f 70 74 50 72 69 6e 74 28 29 3b  .    OptPrint();
de20: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
de30: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
de40: 0a 69 6e 74 20 4f 70 74 4e 41 72 67 73 28 29 7b  .int OptNArgs(){
de50: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
de60: 20 20 69 6e 74 20 64 61 73 68 64 61 73 68 20 3d    int dashdash =
de70: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   0;.  int i;.  i
de80: 66 28 20 61 72 67 76 21 3d 30 20 26 26 20 61 72  f( argv!=0 && ar
de90: 67 76 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20 20  gv[0]!=0 ){.    
dea0: 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d  for(i=1; argv[i]
deb0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
dec0: 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20 21 49  ( dashdash || !I
ded0: 53 4f 50 54 28 61 72 67 76 5b 69 5d 29 20 29 20  SOPT(argv[i]) ) 
dee0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  cnt++;.      if(
def0: 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c   strcmp(argv[i],
df00: 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73 68 64  "--")==0 ) dashd
df10: 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ash = 1;.    }. 
df20: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 3b   }.  return cnt;
df30: 0a 7d 0a 0a 63 68 61 72 20 2a 4f 70 74 41 72 67  .}..char *OptArg
df40: 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 69  (n).int n;.{.  i
df50: 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61 72 67 69  nt i;.  i = argi
df60: 6e 64 65 78 28 6e 29 3b 0a 20 20 72 65 74 75 72  ndex(n);.  retur
df70: 6e 20 69 3e 3d 30 20 3f 20 61 72 67 76 5b 69 5d  n i>=0 ? argv[i]
df80: 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70   : 0;.}..void Op
df90: 74 45 72 72 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b  tErr(n).int n;.{
dfa0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20  .  int i;.  i = 
dfb0: 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 69  argindex(n);.  i
dfc0: 66 28 20 69 3e 3d 30 20 29 20 65 72 72 6c 69 6e  f( i>=0 ) errlin
dfd0: 65 28 69 2c 30 2c 65 72 72 73 74 72 65 61 6d 29  e(i,0,errstream)
dfe0: 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 50 72 69  ;.}..void OptPri
dff0: 6e 74 28 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nt(){.  int i;. 
e000: 20 69 6e 74 20 6d 61 78 2c 20 6c 65 6e 3b 0a 20   int max, len;. 
e010: 20 6d 61 78 20 3d 20 30 3b 0a 20 20 66 6f 72 28   max = 0;.  for(
e020: 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c  i=0; op[i].label
e030: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6e 20  ; i++){.    len 
e040: 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70  = lemonStrlen(op
e050: 5b 69 5d 2e 6c 61 62 65 6c 29 20 2b 20 31 3b 0a  [i].label) + 1;.
e060: 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 69      switch( op[i
e070: 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  ].type ){.      
e080: 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20  case OPT_FLAG:. 
e090: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46       case OPT_FF
e0a0: 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65  LAG:.        bre
e0b0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
e0c0: 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61  PT_INT:.      ca
e0d0: 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20  se OPT_FINT:.   
e0e0: 20 20 20 20 20 6c 65 6e 20 2b 3d 20 39 3b 20 20       len += 9;  
e0f0: 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f       /* length o
e100: 66 20 22 3c 69 6e 74 65 67 65 72 3e 22 20 2a 2f  f "<integer>" */
e110: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e120: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44        case OPT_D
e130: 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  BL:.      case O
e140: 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20  PT_FDBL:.       
e150: 20 6c 65 6e 20 2b 3d 20 36 3b 20 20 20 20 20 20   len += 6;      
e160: 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c   /* length of "<
e170: 72 65 61 6c 3e 22 20 2a 2f 0a 20 20 20 20 20 20  real>" */.      
e180: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
e190: 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20  ase OPT_STR:.   
e1a0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52     case OPT_FSTR
e1b0: 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d  :.        len +=
e1c0: 20 38 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e   8;       /* len
e1d0: 67 74 68 20 6f 66 20 22 3c 73 74 72 69 6e 67 3e  gth of "<string>
e1e0: 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  " */.        bre
e1f0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ak;.    }.    if
e200: 28 20 6c 65 6e 3e 6d 61 78 20 29 20 6d 61 78 20  ( len>max ) max 
e210: 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72  = len;.  }.  for
e220: 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65  (i=0; op[i].labe
e230: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69  l; i++){.    swi
e240: 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70 65 20  tch( op[i].type 
e250: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  ){.      case OP
e260: 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61  T_FLAG:.      ca
e270: 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20  se OPT_FFLAG:.  
e280: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
e290: 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 2d 2a 73  rstream,"  -%-*s
e2a0: 20 20 25 73 5c 6e 22 2c 6d 61 78 2c 6f 70 5b 69    %s\n",max,op[i
e2b0: 5d 2e 6c 61 62 65 6c 2c 6f 70 5b 69 5d 2e 6d 65  ].label,op[i].me
e2c0: 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  ssage);.        
e2d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
e2e0: 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20  e OPT_INT:.     
e2f0: 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a   case OPT_FINT:.
e300: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
e310: 65 72 72 73 74 72 65 61 6d 2c 22 20 20 25 73 3d  errstream,"  %s=
e320: 3c 69 6e 74 65 67 65 72 3e 25 2a 73 20 20 25 73  <integer>%*s  %s
e330: 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c  \n",op[i].label,
e340: 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29  .          (int)
e350: 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e  (max-lemonStrlen
e360: 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 39 29  (op[i].label)-9)
e370: 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67  ,"",op[i].messag
e380: 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
e390: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
e3a0: 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73  T_DBL:.      cas
e3b0: 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20  e OPT_FDBL:.    
e3c0: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73      fprintf(errs
e3d0: 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 72 65 61  tream,"  %s=<rea
e3e0: 6c 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b  l>%*s  %s\n",op[
e3f0: 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20  i].label,.      
e400: 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65      (int)(max-le
e410: 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e  monStrlen(op[i].
e420: 6c 61 62 65 6c 29 2d 36 29 2c 22 22 2c 6f 70 5b  label)-6),"",op[
e430: 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20  i].message);.   
e440: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e450: 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a    case OPT_STR:.
e460: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
e470: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 66 70 72  STR:.        fpr
e480: 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22  intf(errstream,"
e490: 20 20 25 73 3d 3c 73 74 72 69 6e 67 3e 25 2a 73    %s=<string>%*s
e4a0: 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61    %s\n",op[i].la
e4b0: 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28  bel,.          (
e4c0: 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74  int)(max-lemonSt
e4d0: 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c  rlen(op[i].label
e4e0: 29 2d 38 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65  )-8),"",op[i].me
e4f0: 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  ssage);.        
e500: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
e510: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
e520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
e530: 20 74 68 65 20 66 69 6c 65 20 22 70 61 72 73 65   the file "parse
e540: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
e550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e560: 2f 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 20 66 69  /./*.** Input fi
e570: 6c 65 20 70 61 72 73 65 72 20 66 6f 72 20 74 68  le parser for th
e580: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
e590: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
e5a0: 20 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   The state of th
e5b0: 65 20 70 61 72 73 65 72 20 2a 2f 0a 73 74 72 75  e parser */.stru
e5c0: 63 74 20 70 73 74 61 74 65 20 7b 0a 20 20 63 68  ct pstate {.  ch
e5d0: 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20  ar *filename;   
e5e0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
e5f0: 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
e600: 0a 20 20 69 6e 74 20 74 6f 6b 65 6e 6c 69 6e 65  .  int tokenline
e610: 6e 6f 3b 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65  no;      /* Line
e620: 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63 68 20  number at which 
e630: 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20 73 74  current token st
e640: 61 72 74 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72  arts */.  int er
e650: 72 6f 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20  rorcnt;         
e660: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72  /* Number of err
e670: 6f 72 73 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  ors so far */.  
e680: 63 68 61 72 20 2a 74 6f 6b 65 6e 73 74 61 72 74  char *tokenstart
e690: 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  ;     /* Text of
e6a0: 20 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20 2a   current token *
e6b0: 2f 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  /.  struct lemon
e6c0: 20 2a 67 70 3b 20 20 20 20 20 2f 2a 20 47 6c 6f   *gp;     /* Glo
e6d0: 62 61 6c 20 73 74 61 74 65 20 76 65 63 74 6f 72  bal state vector
e6e0: 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 73 74 61   */.  enum e_sta
e6f0: 74 65 20 7b 0a 20 20 20 20 49 4e 49 54 49 41 4c  te {.    INITIAL
e700: 49 5a 45 2c 0a 20 20 20 20 57 41 49 54 49 4e 47  IZE,.    WAITING
e710: 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
e720: 45 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46  E,.    WAITING_F
e730: 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 2c  OR_DECL_KEYWORD,
e740: 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  .    WAITING_FOR
e750: 5f 44 45 43 4c 5f 41 52 47 2c 0a 20 20 20 20 57  _DECL_ARG,.    W
e760: 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45  AITING_FOR_PRECE
e770: 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20  DENCE_SYMBOL,.  
e780: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52    WAITING_FOR_AR
e790: 52 4f 57 2c 0a 20 20 20 20 49 4e 5f 52 48 53 2c  ROW,.    IN_RHS,
e7a0: 0a 20 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f 31  .    LHS_ALIAS_1
e7b0: 2c 0a 20 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f  ,.    LHS_ALIAS_
e7c0: 32 2c 0a 20 20 20 20 4c 48 53 5f 41 4c 49 41 53  2,.    LHS_ALIAS
e7d0: 5f 33 2c 0a 20 20 20 20 52 48 53 5f 41 4c 49 41  _3,.    RHS_ALIA
e7e0: 53 5f 31 2c 0a 20 20 20 20 52 48 53 5f 41 4c 49  S_1,.    RHS_ALI
e7f0: 41 53 5f 32 2c 0a 20 20 20 20 50 52 45 43 45 44  AS_2,.    PRECED
e800: 45 4e 43 45 5f 4d 41 52 4b 5f 31 2c 0a 20 20 20  ENCE_MARK_1,.   
e810: 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b   PRECEDENCE_MARK
e820: 5f 32 2c 0a 20 20 20 20 52 45 53 59 4e 43 5f 41  _2,.    RESYNC_A
e830: 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 2c  FTER_RULE_ERROR,
e840: 0a 20 20 20 20 52 45 53 59 4e 43 5f 41 46 54 45  .    RESYNC_AFTE
e850: 52 5f 44 45 43 4c 5f 45 52 52 4f 52 2c 0a 20 20  R_DECL_ERROR,.  
e860: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45    WAITING_FOR_DE
e870: 53 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 2c  STRUCTOR_SYMBOL,
e880: 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  .    WAITING_FOR
e890: 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c  _DATATYPE_SYMBOL
e8a0: 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f  ,.    WAITING_FO
e8b0: 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 2c 0a 20  R_FALLBACK_ID,. 
e8c0: 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57     WAITING_FOR_W
e8d0: 49 4c 44 43 41 52 44 5f 49 44 0a 20 20 7d 20 73  ILDCARD_ID.  } s
e8e0: 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  tate;           
e8f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
e900: 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 72 73  tate of the pars
e910: 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  er */.  struct s
e920: 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b  ymbol *fallback;
e930: 20 20 20 2f 2a 20 54 68 65 20 66 61 6c 6c 62 61     /* The fallba
e940: 63 6b 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74  ck token */.  st
e950: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73  ruct symbol *lhs
e960: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74  ;        /* Left
e970: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63 75  -hand side of cu
e980: 72 72 65 6e 74 20 72 75 6c 65 20 2a 2f 0a 20 20  rrent rule */.  
e990: 63 68 61 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20  char *lhsalias; 
e9a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
e9b0: 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20  ias for the LHS 
e9c0: 2a 2f 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20 20  */.  int nrhs;  
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 69 67  /* Number of rig
e9f0: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 73 79 6d  ht-hand side sym
ea00: 62 6f 6c 73 20 73 65 65 6e 20 2a 2f 0a 20 20 73  bols seen */.  s
ea10: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 72 68  truct symbol *rh
ea20: 73 5b 4d 41 58 52 48 53 5d 3b 20 20 2f 2a 20 52  s[MAXRHS];  /* R
ea30: 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20  HS symbols */.  
ea40: 63 68 61 72 20 2a 61 6c 69 61 73 5b 4d 41 58 52  char *alias[MAXR
ea50: 48 53 5d 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c  HS];       /* Al
ea60: 69 61 73 65 73 20 66 6f 72 20 65 61 63 68 20 52  iases for each R
ea70: 48 53 20 73 79 6d 62 6f 6c 20 28 6f 72 20 4e 55  HS symbol (or NU
ea80: 4c 4c 29 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  LL) */.  struct 
ea90: 72 75 6c 65 20 2a 70 72 65 76 72 75 6c 65 3b 20  rule *prevrule; 
eaa0: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
eab0: 72 75 6c 65 20 70 61 72 73 65 64 20 2a 2f 0a 20  rule parsed */. 
eac0: 20 63 68 61 72 20 2a 64 65 63 6c 6b 65 79 77 6f   char *declkeywo
ead0: 72 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4b  rd;         /* K
eae0: 65 79 77 6f 72 64 20 6f 66 20 61 20 64 65 63 6c  eyword of a decl
eaf0: 61 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61  aration */.  cha
eb00: 72 20 2a 2a 64 65 63 6c 61 72 67 73 6c 6f 74 3b  r **declargslot;
eb10: 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
eb20: 20 74 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e   the declaration
eb30: 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
eb40: 20 62 65 20 70 75 74 20 2a 2f 0a 20 20 69 6e 74   be put */.  int
eb50: 20 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f   insertLineMacro
eb60: 3b 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 23  ;       /* Add #
eb70: 6c 69 6e 65 20 62 65 66 6f 72 65 20 64 65 63 6c  line before decl
eb80: 61 72 61 74 69 6f 6e 20 69 6e 73 65 72 74 20 2a  aration insert *
eb90: 2f 0a 20 20 69 6e 74 20 2a 64 65 63 6c 6c 69 6e  /.  int *decllin
eba0: 65 6e 6f 73 6c 6f 74 3b 20 20 20 20 20 20 20 2f  enoslot;       /
ebb0: 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74 65  * Where to write
ebc0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6c 69 6e   declaration lin
ebd0: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 65 6e  e number */.  en
ebe0: 75 6d 20 65 5f 61 73 73 6f 63 20 64 65 63 6c 61  um e_assoc decla
ebf0: 73 73 6f 63 3b 20 20 20 20 2f 2a 20 41 73 73 69  ssoc;    /* Assi
ec00: 67 6e 20 74 68 69 73 20 61 73 73 6f 63 69 61 74  gn this associat
ec10: 69 6f 6e 20 74 6f 20 64 65 63 6c 20 61 72 67 75  ion to decl argu
ec20: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 70  ments */.  int p
ec30: 72 65 63 63 6f 75 6e 74 65 72 3b 20 20 20 20 20  reccounter;     
ec40: 20 20 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20        /* Assign 
ec50: 74 68 69 73 20 70 72 65 63 65 64 65 6e 63 65 20  this precedence 
ec60: 74 6f 20 64 65 63 6c 20 61 72 67 75 6d 65 6e 74  to decl argument
ec70: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  s */.  struct ru
ec80: 6c 65 20 2a 66 69 72 73 74 72 75 6c 65 3b 20 20  le *firstrule;  
ec90: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
eca0: 66 69 72 73 74 20 72 75 6c 65 20 69 6e 20 74 68  first rule in th
ecb0: 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 73  e grammar */.  s
ecc0: 74 72 75 63 74 20 72 75 6c 65 20 2a 6c 61 73 74  truct rule *last
ecd0: 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 6f 69  rule;     /* Poi
ece0: 6e 74 65 72 20 74 6f 20 74 68 65 20 6d 6f 73 74  nter to the most
ecf0: 20 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64   recently parsed
ed00: 20 72 75 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20   rule */.};../* 
ed10: 50 61 72 73 65 20 61 20 73 69 6e 67 6c 65 20 74  Parse a single t
ed20: 6f 6b 65 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76  oken */.static v
ed30: 6f 69 64 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65  oid parseonetoke
ed40: 6e 28 70 73 70 29 0a 73 74 72 75 63 74 20 70 73  n(psp).struct ps
ed50: 74 61 74 65 20 2a 70 73 70 3b 0a 7b 0a 20 20 63  tate *psp;.{.  c
ed60: 68 61 72 20 2a 78 3b 0a 20 20 78 20 3d 20 53 74  har *x;.  x = St
ed70: 72 73 61 66 65 28 70 73 70 2d 3e 74 6f 6b 65 6e  rsafe(psp->token
ed80: 73 74 61 72 74 29 3b 20 20 20 20 20 2f 2a 20 53  start);     /* S
ed90: 61 76 65 20 74 68 65 20 74 6f 6b 65 6e 20 70 65  ave the token pe
eda0: 72 6d 61 6e 65 6e 74 6c 79 20 2a 2f 0a 23 69 66  rmanently */.#if
edb0: 20 30 0a 20 20 70 72 69 6e 74 66 28 22 25 73 3a   0.  printf("%s:
edc0: 25 64 3a 20 54 6f 6b 65 6e 3d 5b 25 73 5d 20 73  %d: Token=[%s] s
edd0: 74 61 74 65 3d 25 64 5c 6e 22 2c 70 73 70 2d 3e  tate=%d\n",psp->
ede0: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
edf0: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 78  kenlineno,.    x
ee00: 2c 70 73 70 2d 3e 73 74 61 74 65 29 3b 0a 23 65  ,psp->state);.#e
ee10: 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28 20 70  ndif.  switch( p
ee20: 73 70 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20  sp->state ){.   
ee30: 20 63 61 73 65 20 49 4e 49 54 49 41 4c 49 5a 45   case INITIALIZE
ee40: 3a 0a 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65  :.      psp->pre
ee50: 76 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  vrule = 0;.     
ee60: 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65   psp->preccounte
ee70: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70  r = 0;.      psp
ee80: 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20 70 73  ->firstrule = ps
ee90: 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 30 3b  p->lastrule = 0;
eea0: 0a 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e  .      psp->gp->
eeb0: 6e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20  nrule = 0;.     
eec0: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 74 6f   /* Fall thru to
eed0: 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20   next case */.  
eee0: 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
eef0: 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3a  OR_DECL_OR_RULE:
ef00: 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
ef10: 3d 27 25 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='%' ){.        
ef20: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
ef30: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45  TING_FOR_DECL_KE
ef40: 59 57 4f 52 44 3b 0a 20 20 20 20 20 20 7d 65 6c  YWORD;.      }el
ef50: 73 65 20 69 66 28 20 69 73 6c 6f 77 65 72 28 78  se if( islower(x
ef60: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
ef70: 70 73 70 2d 3e 6c 68 73 20 3d 20 53 79 6d 62 6f  psp->lhs = Symbo
ef80: 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20  l_new(x);.      
ef90: 20 20 70 73 70 2d 3e 6e 72 68 73 20 3d 20 30 3b    psp->nrhs = 0;
efa0: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68  .        psp->lh
efb0: 73 61 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20  salias = 0;.    
efc0: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
efd0: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52   WAITING_FOR_ARR
efe0: 4f 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  OW;.      }else 
eff0: 69 66 28 20 78 5b 30 5d 3d 3d 27 7b 27 20 29 7b  if( x[0]=='{' ){
f000: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70  .        if( psp
f010: 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b  ->prevrule==0 ){
f020: 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
f030: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
f040: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
f050: 6e 6f 2c 0a 22 54 68 65 72 65 20 69 73 20 6e 6f  no,."There is no
f060: 20 70 72 69 6f 72 20 72 75 6c 65 20 6f 70 6f 6e   prior rule opon
f070: 20 77 68 69 63 68 20 74 6f 20 61 74 74 61 63 68   which to attach
f080: 20 74 68 65 20 63 6f 64 65 20 5c 0a 66 72 61 67   the code \.frag
f090: 6d 65 6e 74 20 77 68 69 63 68 20 62 65 67 69 6e  ment which begin
f0a0: 73 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 2e 22  s on this line."
f0b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
f0c0: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 09 7d  ->errorcnt++;..}
f0d0: 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72  else if( psp->pr
f0e0: 65 76 72 75 6c 65 2d 3e 63 6f 64 65 21 3d 30 20  evrule->code!=0 
f0f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
f100: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
f110: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
f120: 6e 65 6e 6f 2c 0a 22 43 6f 64 65 20 66 72 61 67  neno,."Code frag
f130: 6d 65 6e 74 20 62 65 67 69 6e 6e 69 6e 67 20 6f  ment beginning o
f140: 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e  n this line is n
f150: 6f 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74  ot the first \.t
f160: 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65  o follow the pre
f170: 76 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20  vious rule.");. 
f180: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
f190: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
f1a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f1b0: 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
f1c0: 2d 3e 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f  ->line = psp->to
f1d0: 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20  kenlineno;.     
f1e0: 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75       psp->prevru
f1f0: 6c 65 2d 3e 63 6f 64 65 20 3d 20 26 78 5b 31 5d  le->code = &x[1]
f200: 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65  ;..}.      }else
f210: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 5b 27 20 29   if( x[0]=='[' )
f220: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
f230: 74 61 74 65 20 3d 20 50 52 45 43 45 44 45 4e 43  tate = PRECEDENC
f240: 45 5f 4d 41 52 4b 5f 31 3b 0a 20 20 20 20 20 20  E_MARK_1;.      
f250: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
f260: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
f270: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
f280: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
f290: 20 20 22 54 6f 6b 65 6e 20 5c 22 25 73 5c 22 20    "Token \"%s\" 
f2a0: 73 68 6f 75 6c 64 20 62 65 20 65 69 74 68 65 72  should be either
f2b0: 20 5c 22 25 25 5c 22 20 6f 72 20 61 20 6e 6f 6e   \"%%\" or a non
f2c0: 74 65 72 6d 69 6e 61 6c 20 6e 61 6d 65 2e 22 2c  terminal name.",
f2d0: 0a 20 20 20 20 20 20 20 20 20 20 78 29 3b 0a 20  .          x);. 
f2e0: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
f2f0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
f300: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f310: 20 63 61 73 65 20 50 52 45 43 45 44 45 4e 43 45   case PRECEDENCE
f320: 5f 4d 41 52 4b 5f 31 3a 0a 20 20 20 20 20 20 69  _MARK_1:.      i
f330: 66 28 20 21 69 73 75 70 70 65 72 28 78 5b 30 5d  f( !isupper(x[0]
f340: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  ) ){.        Err
f350: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
f360: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
f370: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
f380: 22 54 68 65 20 70 72 65 63 65 64 65 6e 63 65 20  "The precedence 
f390: 73 79 6d 62 6f 6c 20 6d 75 73 74 20 62 65 20 61  symbol must be a
f3a0: 20 74 65 72 6d 69 6e 61 6c 2e 22 29 3b 0a 20 20   terminal.");.  
f3b0: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
f3c0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  cnt++;.      }el
f3d0: 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76  se if( psp->prev
f3e0: 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rule==0 ){.     
f3f0: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
f400: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
f410: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
f420: 20 20 20 20 20 20 22 54 68 65 72 65 20 69 73 20        "There is 
f430: 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65 20 74 6f  no prior rule to
f440: 20 61 73 73 69 67 6e 20 70 72 65 63 65 64 65 6e   assign preceden
f450: 63 65 20 5c 22 5b 25 73 5d 5c 22 2e 22 2c 78 29  ce \"[%s]\".",x)
f460: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
f470: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
f480: 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e   }else if( psp->
f490: 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63 73 79  prevrule->precsy
f4a0: 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m!=0 ){.        
f4b0: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
f4c0: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
f4d0: 6e 6c 69 6e 65 6e 6f 2c 0a 22 50 72 65 63 65 64  nlineno,."Preced
f4e0: 65 6e 63 65 20 6d 61 72 6b 20 6f 6e 20 74 68 69  ence mark on thi
f4f0: 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 68  s line is not th
f500: 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c  e first \.to fol
f510: 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f 75 73  low the previous
f520: 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20   rule.");.      
f530: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
f540: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
f550: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
f560: 76 72 75 6c 65 2d 3e 70 72 65 63 73 79 6d 20 3d  vrule->precsym =
f570: 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
f580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 73        }.      ps
f590: 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43 45  p->state = PRECE
f5a0: 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3b 0a 20 20  DENCE_MARK_2;.  
f5b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
f5c0: 61 73 65 20 50 52 45 43 45 44 45 4e 43 45 5f 4d  ase PRECEDENCE_M
f5d0: 41 52 4b 5f 32 3a 0a 20 20 20 20 20 20 69 66 28  ARK_2:.      if(
f5e0: 20 78 5b 30 5d 21 3d 27 5d 27 20 29 7b 0a 20 20   x[0]!=']' ){.  
f5f0: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
f600: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
f610: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
f620: 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e           "Missin
f630: 67 20 5c 22 5d 5c 22 20 6f 6e 20 70 72 65 63 65  g \"]\" on prece
f640: 64 65 6e 63 65 20 6d 61 72 6b 2e 22 29 3b 0a 20  dence mark.");. 
f650: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
f660: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
f670: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
f680: 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
f690: 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20  ECL_OR_RULE;.   
f6a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
f6b0: 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41  se WAITING_FOR_A
f6c0: 52 52 4f 57 3a 0a 20 20 20 20 20 20 69 66 28 20  RROW:.      if( 
f6d0: 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31  x[0]==':' && x[1
f6e0: 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d  ]==':' && x[2]==
f6f0: 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '=' ){.        p
f700: 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52  sp->state = IN_R
f710: 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  HS;.      }else 
f720: 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 29 7b  if( x[0]=='(' ){
f730: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
f740: 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f  ate = LHS_ALIAS_
f750: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
f760: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
f770: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
f780: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
f790: 0a 20 20 20 20 20 20 20 20 20 20 22 45 78 70 65  .          "Expe
f7a0: 63 74 65 64 20 74 6f 20 73 65 65 20 61 20 5c 22  cted to see a \"
f7b0: 3a 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  :\" following th
f7c0: 65 20 4c 48 53 20 73 79 6d 62 6f 6c 20 5c 22 25  e LHS symbol \"%
f7d0: 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  s\".",.         
f7e0: 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29   psp->lhs->name)
f7f0: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
f800: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
f810: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f820: 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
f830: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
f840: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f850: 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53    case LHS_ALIAS
f860: 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20 69 73  _1:.      if( is
f870: 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20  alpha(x[0]) ){. 
f880: 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 61         psp->lhsa
f890: 6c 69 61 73 20 3d 20 78 3b 0a 20 20 20 20 20 20  lias = x;.      
f8a0: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c    psp->state = L
f8b0: 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20 20 20  HS_ALIAS_2;.    
f8c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
f8d0: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
f8e0: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
f8f0: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
f900: 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73 20 6e      "\"%s\" is n
f910: 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69 61 73  ot a valid alias
f920: 20 66 6f 72 20 74 68 65 20 4c 48 53 20 5c 22 25   for the LHS \"%
f930: 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  s\"\n",.        
f940: 20 20 78 2c 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61    x,psp->lhs->na
f950: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  me);.        psp
f960: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
f970: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
f980: 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
f990: 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
f9a0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
f9b0: 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c  .    case LHS_AL
f9c0: 49 41 53 5f 32 3a 0a 20 20 20 20 20 20 69 66 28  IAS_2:.      if(
f9d0: 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20 20   x[0]==')' ){.  
f9e0: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
f9f0: 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3b 0a   = LHS_ALIAS_3;.
fa00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fa10: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
fa20: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
fa30: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
fa40: 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67          "Missing
fa50: 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67   \")\" following
fa60: 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d 65 20   LHS alias name 
fa70: 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68  \"%s\".",psp->lh
fa80: 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20  salias);.       
fa90: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
faa0: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
fab0: 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
fac0: 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
fad0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
fae0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48  eak;.    case LH
faf0: 53 5f 41 4c 49 41 53 5f 33 3a 0a 20 20 20 20 20  S_ALIAS_3:.     
fb00: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26   if( x[0]==':' &
fb10: 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78  & x[1]==':' && x
fb20: 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20  [2]=='=' ){.    
fb30: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
fb40: 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d   IN_RHS;.      }
fb50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
fb60: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
fb70: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
fb80: 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
fb90: 20 22 4d 69 73 73 69 6e 67 20 5c 22 2d 3e 5c 22   "Missing \"->\"
fba0: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 5c 22 25 73   following: \"%s
fbb0: 28 25 73 29 5c 22 2e 22 2c 0a 20 20 20 20 20 20  (%s)\".",.      
fbc0: 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e       psp->lhs->n
fbd0: 61 6d 65 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61  ame,psp->lhsalia
fbe0: 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  s);.        psp-
fbf0: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
fc00: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
fc10: 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
fc20: 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
fc30: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
fc40: 20 20 20 20 63 61 73 65 20 49 4e 5f 52 48 53 3a      case IN_RHS:
fc50: 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
fc60: 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='.' ){.        
fc70: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
fc80: 0a 20 20 20 20 20 20 20 20 72 70 20 3d 20 28 73  .        rp = (s
fc90: 74 72 75 63 74 20 72 75 6c 65 20 2a 29 63 61 6c  truct rule *)cal
fca0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75  loc( sizeof(stru
fcb0: 63 74 20 72 75 6c 65 29 20 2b 20 0a 20 20 20 20  ct rule) + .    
fcc0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
fcd0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a  struct symbol*)*
fce0: 70 73 70 2d 3e 6e 72 68 73 20 2b 20 73 69 7a 65  psp->nrhs + size
fcf0: 6f 66 28 63 68 61 72 2a 29 2a 70 73 70 2d 3e 6e  of(char*)*psp->n
fd00: 72 68 73 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  rhs, 1);.       
fd10: 20 69 66 28 20 72 70 3d 3d 30 20 29 7b 0a 20 20   if( rp==0 ){.  
fd20: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
fd30: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
fd40: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
fd50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 61  .            "Ca
fd60: 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 65 6e 6f  n't allocate eno
fd70: 75 67 68 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74  ugh memory for t
fd80: 68 69 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20  his rule.");.   
fd90: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
fda0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
fdb0: 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20    psp->prevrule 
fdc0: 3d 20 30 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20  = 0;..}else{.   
fdd0: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
fde0: 20 20 20 20 20 20 20 20 72 70 2d 3e 72 75 6c 65          rp->rule
fdf0: 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65  line = psp->toke
fe00: 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20  nlineno;.       
fe10: 20 20 20 72 70 2d 3e 72 68 73 20 3d 20 28 73 74     rp->rhs = (st
fe20: 72 75 63 74 20 73 79 6d 62 6f 6c 2a 2a 29 26 72  ruct symbol**)&r
fe30: 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  p[1];.          
fe40: 72 70 2d 3e 72 68 73 61 6c 69 61 73 20 3d 20 28  rp->rhsalias = (
fe50: 63 68 61 72 2a 2a 29 26 28 72 70 2d 3e 72 68 73  char**)&(rp->rhs
fe60: 5b 70 73 70 2d 3e 6e 72 68 73 5d 29 3b 0a 20 20  [psp->nrhs]);.  
fe70: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
fe80: 20 69 3c 70 73 70 2d 3e 6e 72 68 73 3b 20 69 2b   i<psp->nrhs; i+
fe90: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
fea0: 72 70 2d 3e 72 68 73 5b 69 5d 20 3d 20 70 73 70  rp->rhs[i] = psp
feb0: 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20  ->rhs[i];.      
fec0: 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69        rp->rhsali
fed0: 61 73 5b 69 5d 20 3d 20 70 73 70 2d 3e 61 6c 69  as[i] = psp->ali
fee0: 61 73 5b 69 5d 3b 0a 09 20 20 7d 0a 20 20 20 20  as[i];..  }.    
fef0: 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 20 3d 20        rp->lhs = 
ff00: 70 73 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20  psp->lhs;.      
ff10: 20 20 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73      rp->lhsalias
ff20: 20 3d 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73   = psp->lhsalias
ff30: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
ff40: 6e 72 68 73 20 3d 20 70 73 70 2d 3e 6e 72 68 73  nrhs = psp->nrhs
ff50: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
ff60: 63 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  code = 0;.      
ff70: 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20      rp->precsym 
ff80: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
ff90: 70 2d 3e 69 6e 64 65 78 20 3d 20 70 73 70 2d 3e  p->index = psp->
ffa0: 67 70 2d 3e 6e 72 75 6c 65 2b 2b 3b 0a 20 20 20  gp->nrule++;.   
ffb0: 20 20 20 20 20 20 20 72 70 2d 3e 6e 65 78 74 6c         rp->nextl
ffc0: 68 73 20 3d 20 72 70 2d 3e 6c 68 73 2d 3e 72 75  hs = rp->lhs->ru
ffd0: 6c 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  le;.          rp
ffe0: 2d 3e 6c 68 73 2d 3e 72 75 6c 65 20 3d 20 72 70  ->lhs->rule = rp
fff0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
10000 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  next = 0;.      
10010 20 20 20 20 69 66 28 20 70 73 70 2d 3e 66 69 72      if( psp->fir
10020 73 74 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  strule==0 ){.   
10030 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66 69           psp->fi
10040 72 73 74 72 75 6c 65 20 3d 20 70 73 70 2d 3e 6c  rstrule = psp->l
10050 61 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a 09 20  astrule = rp;.. 
10060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10070 20 20 20 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c      psp->lastrul
10080 65 2d 3e 6e 65 78 74 20 3d 20 72 70 3b 0a 20 20  e->next = rp;.  
10090 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c            psp->l
100a0 61 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a 09 20  astrule = rp;.. 
100b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 73 70   }.          psp
100c0 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 72 70 3b  ->prevrule = rp;
100d0 0a 09 7d 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ..}.        psp-
100e0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
100f0 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
10100 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
10110 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29  f( isalpha(x[0])
10120 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
10130 70 73 70 2d 3e 6e 72 68 73 3e 3d 4d 41 58 52 48  psp->nrhs>=MAXRH
10140 53 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  S ){.          E
10150 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
10160 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
10170 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
10180 20 20 20 20 22 54 6f 6f 20 6d 61 6e 79 20 73 79      "Too many sy
10190 6d 62 6f 6c 73 20 6f 6e 20 52 48 53 20 6f 66 20  mbols on RHS of 
101a0 72 75 6c 65 20 62 65 67 69 6e 6e 69 6e 67 20 61  rule beginning a
101b0 74 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20  t \"%s\".",.    
101c0 20 20 20 20 20 20 20 20 78 29 3b 0a 20 20 20 20          x);.    
101d0 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
101e0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
101f0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
10200 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
10210 45 52 52 4f 52 3b 0a 09 7d 65 6c 73 65 7b 0a 20  ERROR;..}else{. 
10220 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 72 68           psp->rh
10230 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20 53  s[psp->nrhs] = S
10240 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
10250 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61 6c 69          psp->ali
10260 61 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20  as[psp->nrhs] = 
10270 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  0;.          psp
10280 2d 3e 6e 72 68 73 2b 2b 3b 0a 09 7d 0a 20 20 20  ->nrhs++;..}.   
10290 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 78 5b     }else if( (x[
102a0 30 5d 3d 3d 27 7c 27 20 7c 7c 20 78 5b 30 5d 3d  0]=='|' || x[0]=
102b0 3d 27 2f 27 29 20 26 26 20 70 73 70 2d 3e 6e 72  ='/') && psp->nr
102c0 68 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  hs>0 ){.        
102d0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6d  struct symbol *m
102e0 73 70 20 3d 20 70 73 70 2d 3e 72 68 73 5b 70 73  sp = psp->rhs[ps
102f0 70 2d 3e 6e 72 68 73 2d 31 5d 3b 0a 20 20 20 20  p->nrhs-1];.    
10300 20 20 20 20 69 66 28 20 6d 73 70 2d 3e 74 79 70      if( msp->typ
10310 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e!=MULTITERMINAL
10320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
10330 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6f 72 69  ruct symbol *ori
10340 67 73 70 20 3d 20 6d 73 70 3b 0a 20 20 20 20 20  gsp = msp;.     
10350 20 20 20 20 20 6d 73 70 20 3d 20 63 61 6c 6c 6f       msp = callo
10360 63 28 31 2c 73 69 7a 65 6f 66 28 2a 6d 73 70 29  c(1,sizeof(*msp)
10370 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  );.          mem
10380 73 65 74 28 6d 73 70 2c 20 30 2c 20 73 69 7a 65  set(msp, 0, size
10390 6f 66 28 2a 6d 73 70 29 29 3b 0a 20 20 20 20 20  of(*msp));.     
103a0 20 20 20 20 20 6d 73 70 2d 3e 74 79 70 65 20 3d       msp->type =
103b0 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 3b 0a   MULTITERMINAL;.
103c0 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e            msp->n
103d0 73 75 62 73 79 6d 20 3d 20 31 3b 0a 20 20 20 20  subsym = 1;.    
103e0 20 20 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79        msp->subsy
103f0 6d 20 3d 20 63 61 6c 6c 6f 63 28 31 2c 73 69 7a  m = calloc(1,siz
10400 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
10410 6c 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l*));.          
10420 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 20 3d  msp->subsym[0] =
10430 20 6f 72 69 67 73 70 3b 0a 20 20 20 20 20 20 20   origsp;.       
10440 20 20 20 6d 73 70 2d 3e 6e 61 6d 65 20 3d 20 6f     msp->name = o
10450 72 69 67 73 70 2d 3e 6e 61 6d 65 3b 0a 20 20 20  rigsp->name;.   
10460 20 20 20 20 20 20 20 70 73 70 2d 3e 72 68 73 5b         psp->rhs[
10470 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 6d  psp->nrhs-1] = m
10480 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sp;.        }.  
10490 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73        msp->nsubs
104a0 79 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73  ym++;.        ms
104b0 70 2d 3e 73 75 62 73 79 6d 20 3d 20 72 65 61 6c  p->subsym = real
104c0 6c 6f 63 28 6d 73 70 2d 3e 73 75 62 73 79 6d 2c  loc(msp->subsym,
104d0 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
104e0 79 6d 62 6f 6c 2a 29 2a 6d 73 70 2d 3e 6e 73 75  ymbol*)*msp->nsu
104f0 62 73 79 6d 29 3b 0a 20 20 20 20 20 20 20 20 6d  bsym);.        m
10500 73 70 2d 3e 73 75 62 73 79 6d 5b 6d 73 70 2d 3e  sp->subsym[msp->
10510 6e 73 75 62 73 79 6d 2d 31 5d 20 3d 20 53 79 6d  nsubsym-1] = Sym
10520 62 6f 6c 5f 6e 65 77 28 26 78 5b 31 5d 29 3b 0a  bol_new(&x[1]);.
10530 20 20 20 20 20 20 20 20 69 66 28 20 69 73 6c 6f          if( islo
10540 77 65 72 28 78 5b 31 5d 29 20 7c 7c 20 69 73 6c  wer(x[1]) || isl
10550 6f 77 65 72 28 6d 73 70 2d 3e 73 75 62 73 79 6d  ower(msp->subsym
10560 5b 30 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 20 29 7b  [0]->name[0]) ){
10570 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
10580 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
10590 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
105a0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
105b0 22 43 61 6e 6e 6f 74 20 66 6f 72 6d 20 61 20 63  "Cannot form a c
105c0 6f 6d 70 6f 75 6e 64 20 63 6f 6e 74 61 69 6e 69  ompound containi
105d0 6e 67 20 61 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  ng a non-termina
105e0 6c 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  l");.          p
105f0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
10600 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10610 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d  }else if( x[0]==
10620 27 28 27 20 26 26 20 70 73 70 2d 3e 6e 72 68 73  '(' && psp->nrhs
10630 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  >0 ){.        ps
10640 70 2d 3e 73 74 61 74 65 20 3d 20 52 48 53 5f 41  p->state = RHS_A
10650 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65  LIAS_1;.      }e
10660 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
10670 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
10680 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
10690 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
106a0 22 49 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74  "Illegal charact
106b0 65 72 20 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c  er on RHS of rul
106c0 65 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a  e: \"%s\".",x);.
106d0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
106e0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
106f0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
10700 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
10710 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
10720 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10730 63 61 73 65 20 52 48 53 5f 41 4c 49 41 53 5f 31  case RHS_ALIAS_1
10740 3a 0a 20 20 20 20 20 20 69 66 28 20 69 73 61 6c  :.      if( isal
10750 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  pha(x[0]) ){.   
10760 20 20 20 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b       psp->alias[
10770 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 78  psp->nrhs-1] = x
10780 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
10790 74 61 74 65 20 3d 20 52 48 53 5f 41 4c 49 41 53  tate = RHS_ALIAS
107a0 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _2;.      }else{
107b0 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
107c0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
107d0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
107e0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 25  ,.          "\"%
107f0 73 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c  s\" is not a val
10800 69 64 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65  id alias for the
10810 20 52 48 53 20 73 79 6d 62 6f 6c 20 5c 22 25 73   RHS symbol \"%s
10820 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  \"\n",.         
10830 20 78 2c 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d   x,psp->rhs[psp-
10840 3e 6e 72 68 73 2d 31 5d 2d 3e 6e 61 6d 65 29 3b  >nrhs-1]->name);
10850 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
10860 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
10870 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
10880 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
10890 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
108a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
108b0 20 63 61 73 65 20 52 48 53 5f 41 4c 49 41 53 5f   case RHS_ALIAS_
108c0 32 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  2:.      if( x[0
108d0 5d 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20  ]==')' ){.      
108e0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49    psp->state = I
108f0 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c  N_RHS;.      }el
10900 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
10910 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
10920 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
10930 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
10940 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f  Missing \")\" fo
10950 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69 61  llowing LHS alia
10960 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c  s name \"%s\".",
10970 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a  psp->lhsalias);.
10980 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
10990 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
109a0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
109b0 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
109c0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
109d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
109e0 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
109f0 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3a 0a 20  _DECL_KEYWORD:. 
10a00 20 20 20 20 20 69 66 28 20 69 73 61 6c 70 68 61       if( isalpha
10a10 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
10a20 20 20 70 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f    psp->declkeywo
10a30 72 64 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  rd = x;.        
10a40 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
10a50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73   = 0;.        ps
10a60 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f  p->decllinenoslo
10a70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
10a80 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
10a90 63 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  cro = 1;.       
10aa0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
10ab0 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41  ITING_FOR_DECL_A
10ac0 52 47 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  RG;.        if( 
10ad0 73 74 72 63 6d 70 28 78 2c 22 6e 61 6d 65 22 29  strcmp(x,"name")
10ae0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10af0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10b00 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6e  t = &(psp->gp->n
10b10 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
10b20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d  psp->insertLineM
10b30 61 63 72 6f 20 3d 20 30 3b 0a 09 7d 65 6c 73 65  acro = 0;..}else
10b40 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 69   if( strcmp(x,"i
10b50 6e 63 6c 75 64 65 22 29 3d 3d 30 20 29 7b 0a 20  nclude")==0 ){. 
10b60 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
10b70 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
10b80 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64 65 29 3b  p->gp->include);
10b90 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63  ..}else if( strc
10ba0 6d 70 28 78 2c 22 63 6f 64 65 22 29 3d 3d 30 20  mp(x,"code")==0 
10bb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
10bc0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
10bd0 26 28 70 73 70 2d 3e 67 70 2d 3e 65 78 74 72 61  &(psp->gp->extra
10be0 63 6f 64 65 29 3b 0a 09 7d 65 6c 73 65 20 69 66  code);..}else if
10bf0 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65  ( strcmp(x,"toke
10c00 6e 5f 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d  n_destructor")==
10c10 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
10c20 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
10c30 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65  = &psp->gp->toke
10c40 6e 64 65 73 74 3b 0a 09 7d 65 6c 73 65 20 69 66  ndest;..}else if
10c50 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65 66 61  ( strcmp(x,"defa
10c60 75 6c 74 5f 64 65 73 74 72 75 63 74 6f 72 22 29  ult_destructor")
10c70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10c80 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10c90 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 76 61  t = &psp->gp->va
10ca0 72 64 65 73 74 3b 0a 09 7d 65 6c 73 65 20 69 66  rdest;..}else if
10cb0 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65  ( strcmp(x,"toke
10cc0 6e 5f 70 72 65 66 69 78 22 29 3d 3d 30 20 29 7b  n_prefix")==0 ){
10cd0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10ce0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70  declargslot = &p
10cf0 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 70 72 65  sp->gp->tokenpre
10d00 66 69 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70  fix;.          p
10d10 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
10d20 63 72 6f 20 3d 20 30 3b 0a 09 7d 65 6c 73 65 20  cro = 0;..}else 
10d30 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 79  if( strcmp(x,"sy
10d40 6e 74 61 78 5f 65 72 72 6f 72 22 29 3d 3d 30 20  ntax_error")==0 
10d50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
10d60 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
10d70 26 28 70 73 70 2d 3e 67 70 2d 3e 65 72 72 6f 72  &(psp->gp->error
10d80 29 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74  );..}else if( st
10d90 72 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 61 63  rcmp(x,"parse_ac
10da0 63 65 70 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  cept")==0 ){.   
10db0 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
10dc0 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
10dd0 3e 67 70 2d 3e 61 63 63 65 70 74 29 3b 0a 09 7d  >gp->accept);..}
10de0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10df0 78 2c 22 70 61 72 73 65 5f 66 61 69 6c 75 72 65  x,"parse_failure
10e00 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10e10 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
10e20 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
10e30 3e 66 61 69 6c 75 72 65 29 3b 0a 09 7d 65 6c 73  >failure);..}els
10e40 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
10e50 73 74 61 63 6b 5f 6f 76 65 72 66 6c 6f 77 22 29  stack_overflow")
10e60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10e70 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10e80 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6f  t = &(psp->gp->o
10e90 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20 20 20 20  verflow);.      
10ea0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
10eb0 6d 70 28 78 2c 22 65 78 74 72 61 5f 61 72 67 75  mp(x,"extra_argu
10ec0 6d 65 6e 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ment")==0 ){.   
10ed0 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
10ee0 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
10ef0 3e 67 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20 20  >gp->arg);.     
10f00 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74       psp->insert
10f10 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20  LineMacro = 0;. 
10f20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
10f30 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e   strcmp(x,"token
10f40 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20  _type")==0 ){.  
10f50 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
10f60 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
10f70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 29  ->gp->tokentype)
10f80 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
10f90 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
10fa0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
10fb0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
10fc0 2c 22 64 65 66 61 75 6c 74 5f 74 79 70 65 22 29  ,"default_type")
10fd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10fe0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10ff0 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 76  t = &(psp->gp->v
11000 61 72 74 79 70 65 29 3b 0a 20 20 20 20 20 20 20  artype);.       
11010 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
11020 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20  neMacro = 0;.   
11030 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
11040 74 72 63 6d 70 28 78 2c 22 73 74 61 63 6b 5f 73  trcmp(x,"stack_s
11050 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ize")==0 ){.    
11060 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
11070 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
11080 67 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b 0a  gp->stacksize);.
11090 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69            psp->i
110a0 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d  nsertLineMacro =
110b0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
110c0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
110d0 73 74 61 72 74 5f 73 79 6d 62 6f 6c 22 29 3d 3d  start_symbol")==
110e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
110f0 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
11100 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74 61  = &(psp->gp->sta
11110 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  rt);.          p
11120 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
11130 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cro = 0;.       
11140 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
11150 70 28 78 2c 22 6c 65 66 74 22 29 3d 3d 30 20 29  p(x,"left")==0 )
11160 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
11170 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a  >preccounter++;.
11180 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
11190 65 63 6c 61 73 73 6f 63 20 3d 20 4c 45 46 54 3b  eclassoc = LEFT;
111a0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
111b0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
111c0 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53  FOR_PRECEDENCE_S
111d0 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d  YMBOL;.        }
111e0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
111f0 78 2c 22 72 69 67 68 74 22 29 3d 3d 30 20 29 7b  x,"right")==0 ){
11200 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11210 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  preccounter++;. 
11220 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
11230 63 6c 61 73 73 6f 63 20 3d 20 52 49 47 48 54 3b  classoc = RIGHT;
11240 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11250 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
11260 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53  FOR_PRECEDENCE_S
11270 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d  YMBOL;.        }
11280 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
11290 78 2c 22 6e 6f 6e 61 73 73 6f 63 22 29 3d 3d 30  x,"nonassoc")==0
112a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
112b0 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b  p->preccounter++
112c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
112d0 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 4e 4f 4e  >declassoc = NON
112e0 45 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  E;.          psp
112f0 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
11300 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45  G_FOR_PRECEDENCE
11310 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73 65 20  _SYMBOL;..}else 
11320 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65  if( strcmp(x,"de
11330 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b  structor")==0 ){
11340 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11350 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
11360 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53  FOR_DESTRUCTOR_S
11370 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73 65 20 69 66  YMBOL;..}else if
11380 28 20 73 74 72 63 6d 70 28 78 2c 22 74 79 70 65  ( strcmp(x,"type
11390 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
113a0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
113b0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41  WAITING_FOR_DATA
113c0 54 59 50 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20  TYPE_SYMBOL;.   
113d0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
113e0 74 72 63 6d 70 28 78 2c 22 66 61 6c 6c 62 61 63  trcmp(x,"fallbac
113f0 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  k")==0 ){.      
11400 20 20 20 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63      psp->fallbac
11410 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  k = 0;.         
11420 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
11430 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41  ITING_FOR_FALLBA
11440 43 4b 5f 49 44 3b 0a 20 20 20 20 20 20 20 20 7d  CK_ID;.        }
11450 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
11460 78 2c 22 77 69 6c 64 63 61 72 64 22 29 3d 3d 30  x,"wildcard")==0
11470 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
11480 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
11490 4e 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f  NG_FOR_WILDCARD_
114a0 49 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ID;.        }els
114b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  e{.          Err
114c0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
114d0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
114e0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
114f0 20 20 22 55 6e 6b 6e 6f 77 6e 20 64 65 63 6c 61    "Unknown decla
11500 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20  ration keyword: 
11510 5c 22 25 25 25 73 5c 22 2e 22 2c 78 29 3b 0a 20  \"%%%s\".",x);. 
11520 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
11530 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
11540 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
11550 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45   RESYNC_AFTER_DE
11560 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20  CL_ERROR;..}.   
11570 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11580 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
11590 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
115a0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
115b0 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 64 65       "Illegal de
115c0 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f 72  claration keywor
115d0 64 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a  d: \"%s\".",x);.
115e0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
115f0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
11600 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
11610 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
11620 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
11630 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11640 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
11650 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d 42  _DESTRUCTOR_SYMB
11660 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69  OL:.      if( !i
11670 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a  salpha(x[0]) ){.
11680 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11690 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
116a0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
116b0 0a 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62  .          "Symb
116c0 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20  ol name missing 
116d0 61 66 74 65 72 20 25 64 65 73 74 72 75 63 74 6f  after %destructo
116e0 72 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20  r keyword");.   
116f0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
11700 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
11710 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
11720 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
11730 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
11740 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
11750 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d  symbol *sp = Sym
11760 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
11770 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
11780 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73 74  slot = &sp->dest
11790 72 75 63 74 6f 72 3b 0a 20 20 20 20 20 20 20 20  ructor;.        
117a0 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73  psp->decllinenos
117b0 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73 74 4c  lot = &sp->destL
117c0 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 70  ineno;.        p
117d0 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
117e0 63 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  cro = 1;.       
117f0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
11800 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41  ITING_FOR_DECL_A
11810 52 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  RG;.      }.    
11820 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
11830 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41  e WAITING_FOR_DA
11840 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3a 0a 20  TATYPE_SYMBOL:. 
11850 20 20 20 20 20 69 66 28 20 21 69 73 61 6c 70 68       if( !isalph
11860 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  a(x[0]) ){.     
11870 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
11880 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
11890 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
118a0 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61        "Symbol na
118b0 6d 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72  me missing after
118c0 20 25 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79   %destructor key
118d0 77 6f 72 64 22 29 3b 0a 20 20 20 20 20 20 20 20  word");.        
118e0 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
118f0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
11900 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
11910 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20  ER_DECL_ERROR;. 
11920 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11930 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
11940 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e  l *sp = Symbol_n
11950 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ew(x);.        p
11960 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
11970 3d 20 26 73 70 2d 3e 64 61 74 61 74 79 70 65 3b  = &sp->datatype;
11980 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e  .        psp->in
11990 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
119a0 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
119b0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
119c0 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20  FOR_DECL_ARG;.  
119d0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
119e0 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
119f0 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
11a00 43 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20  CE_SYMBOL:.     
11a10 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
11a20 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
11a30 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
11a40 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
11a50 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
11a60 20 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29   isupper(x[0]) )
11a70 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  {.        struct
11a80 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 20   symbol *sp;.   
11a90 20 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c       sp = Symbol
11aa0 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
11ab0 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30   if( sp->prec>=0
11ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72   ){.          Er
11ad0 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
11ae0 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
11af0 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
11b00 20 20 20 22 53 79 6d 62 6f 6c 20 5c 22 25 73 5c     "Symbol \"%s\
11b10 22 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  " has already be
11b20 20 67 69 76 65 6e 20 61 20 70 72 65 63 65 64 65   given a precede
11b30 6e 63 65 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  nce.",x);.      
11b40 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
11b50 74 2b 2b 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20  t++;..}else{.   
11b60 20 20 20 20 20 20 20 73 70 2d 3e 70 72 65 63 20         sp->prec 
11b70 3d 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74  = psp->preccount
11b80 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 70  er;.          sp
11b90 2d 3e 61 73 73 6f 63 20 3d 20 70 73 70 2d 3e 64  ->assoc = psp->d
11ba0 65 63 6c 61 73 73 6f 63 3b 0a 09 7d 0a 20 20 20  eclassoc;..}.   
11bb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11bc0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
11bd0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
11be0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
11bf0 20 20 20 20 20 22 43 61 6e 27 74 20 61 73 73 69       "Can't assi
11c00 67 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65 20  gn a precedence 
11c10 74 6f 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a  to \"%s\".",x);.
11c20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
11c30 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
11c40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11c50 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
11c60 4f 52 5f 44 45 43 4c 5f 41 52 47 3a 0a 20 20 20  OR_DECL_ARG:.   
11c70 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b 27     if( x[0]=='{'
11c80 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c 22 27 20 7c   || x[0]=='\"' |
11c90 7c 20 69 73 61 6c 6e 75 6d 28 78 5b 30 5d 29 20  | isalnum(x[0]) 
11ca0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
11cb0 2a 7a 4f 6c 64 2c 20 2a 7a 4e 65 77 2c 20 2a 7a  *zOld, *zNew, *z
11cc0 42 75 66 2c 20 2a 7a 3b 0a 20 20 20 20 20 20 20  Buf, *z;.       
11cd0 20 69 6e 74 20 6e 4f 6c 64 2c 20 6e 2c 20 6e 4c   int nOld, n, nL
11ce0 69 6e 65 2c 20 6e 4e 65 77 2c 20 6e 42 61 63 6b  ine, nNew, nBack
11cf0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 64  ;.        int ad
11d00 64 4c 69 6e 65 4d 61 63 72 6f 3b 0a 20 20 20 20  dLineMacro;.    
11d10 20 20 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 35      char zLine[5
11d20 30 5d 3b 0a 20 20 20 20 20 20 20 20 7a 4e 65 77  0];.        zNew
11d30 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 69 66   = x;.        if
11d40 28 20 7a 4e 65 77 5b 30 5d 3d 3d 27 22 27 20 7c  ( zNew[0]=='"' |
11d50 7c 20 7a 4e 65 77 5b 30 5d 3d 3d 27 7b 27 20 29  | zNew[0]=='{' )
11d60 20 7a 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20 20   zNew++;.       
11d70 20 6e 4e 65 77 20 3d 20 6c 65 6d 6f 6e 53 74 72   nNew = lemonStr
11d80 6c 65 6e 28 7a 4e 65 77 29 3b 0a 20 20 20 20 20  len(zNew);.     
11d90 20 20 20 69 66 28 20 2a 70 73 70 2d 3e 64 65 63     if( *psp->dec
11da0 6c 61 72 67 73 6c 6f 74 20 29 7b 0a 20 20 20 20  largslot ){.    
11db0 20 20 20 20 20 20 7a 4f 6c 64 20 3d 20 2a 70 73        zOld = *ps
11dc0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 3b 0a  p->declargslot;.
11dd0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
11de0 20 20 20 20 20 20 20 20 20 7a 4f 6c 64 20 3d 20           zOld = 
11df0 22 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  "";.        }.  
11e00 20 20 20 20 20 20 6e 4f 6c 64 20 3d 20 6c 65 6d        nOld = lem
11e10 6f 6e 53 74 72 6c 65 6e 28 7a 4f 6c 64 29 3b 0a  onStrlen(zOld);.
11e20 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 4f 6c 64          n = nOld
11e30 20 2b 20 6e 4e 65 77 20 2b 20 32 30 3b 0a 20 20   + nNew + 20;.  
11e40 20 20 20 20 20 20 61 64 64 4c 69 6e 65 4d 61 63        addLineMac
11e50 72 6f 20 3d 20 21 70 73 70 2d 3e 67 70 2d 3e 6e  ro = !psp->gp->n
11e60 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 26 26 20  olinenosflag && 
11e70 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d  psp->insertLineM
11e80 61 63 72 6f 20 26 26 0a 20 20 20 20 20 20 20 20  acro &&.        
11e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ea0 28 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f  (psp->decllineno
11eb0 73 6c 6f 74 3d 3d 30 20 7c 7c 20 70 73 70 2d 3e  slot==0 || psp->
11ec0 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30  decllinenoslot[0
11ed0 5d 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20 69  ]!=0);.        i
11ee0 66 28 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 20  f( addLineMacro 
11ef0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  ){.          for
11f00 28 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  (z=psp->filename
11f10 2c 20 6e 42 61 63 6b 3d 30 3b 20 2a 7a 3b 20 7a  , nBack=0; *z; z
11f20 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
11f30 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20 29 20   if( *z=='\\' ) 
11f40 6e 42 61 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 20  nBack++;.       
11f50 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
11f60 70 72 69 6e 74 66 28 7a 4c 69 6e 65 2c 20 22 23  printf(zLine, "#
11f70 6c 69 6e 65 20 25 64 20 22 2c 20 70 73 70 2d 3e  line %d ", psp->
11f80 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 29 3b 0a 20 20  tokenlineno);.  
11f90 20 20 20 20 20 20 20 20 6e 4c 69 6e 65 20 3d 20          nLine = 
11fa0 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4c 69 6e  lemonStrlen(zLin
11fb0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20  e);.          n 
11fc0 2b 3d 20 6e 4c 69 6e 65 20 2b 20 6c 65 6d 6f 6e  += nLine + lemon
11fd0 53 74 72 6c 65 6e 28 70 73 70 2d 3e 66 69 6c 65  Strlen(psp->file
11fe0 6e 61 6d 65 29 20 2b 20 6e 42 61 63 6b 3b 0a 20  name) + nBack;. 
11ff0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12000 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c   *psp->declargsl
12010 6f 74 20 3d 20 7a 42 75 66 20 3d 20 72 65 61 6c  ot = zBuf = real
12020 6c 6f 63 28 2a 70 73 70 2d 3e 64 65 63 6c 61 72  loc(*psp->declar
12030 67 73 6c 6f 74 2c 20 6e 29 3b 0a 20 20 20 20 20  gslot, n);.     
12040 20 20 20 7a 42 75 66 20 2b 3d 20 6e 4f 6c 64 3b     zBuf += nOld;
12050 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 64 64  .        if( add
12060 4c 69 6e 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20  LineMacro ){.   
12070 20 20 20 20 20 20 20 69 66 28 20 6e 4f 6c 64 20         if( nOld 
12080 26 26 20 7a 42 75 66 5b 2d 31 5d 21 3d 27 5c 6e  && zBuf[-1]!='\n
12090 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
120a0 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 6e   *(zBuf++) = '\n
120b0 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ';.          }. 
120c0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
120d0 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20 6e 4c 69  zBuf, zLine, nLi
120e0 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ne);.          z
120f0 42 75 66 20 2b 3d 20 6e 4c 69 6e 65 3b 0a 20 20  Buf += nLine;.  
12100 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b          *(zBuf++
12110 29 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20 20  ) = '"';.       
12120 20 20 20 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69     for(z=psp->fi
12130 6c 65 6e 61 6d 65 3b 20 2a 7a 3b 20 7a 2b 2b 29  lename; *z; z++)
12140 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
12150 28 20 2a 7a 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20  ( *z=='\\' ){.  
12160 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42              *(zB
12170 75 66 2b 2b 29 20 3d 20 27 5c 5c 27 3b 0a 20 20  uf++) = '\\';.  
12180 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12190 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b          *(zBuf++
121a0 29 20 3d 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20  ) = *z;.        
121b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 2a 28    }.          *(
121c0 7a 42 75 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20  zBuf++) = '"';. 
121d0 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b           *(zBuf+
121e0 2b 29 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20  +) = '\n';.     
121f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
12200 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f   psp->decllineno
12210 73 6c 6f 74 20 26 26 20 70 73 70 2d 3e 64 65 63  slot && psp->dec
12220 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 3d 3d  llinenoslot[0]==
12230 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
12240 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c  sp->decllinenosl
12250 6f 74 5b 30 5d 20 3d 20 70 73 70 2d 3e 74 6f 6b  ot[0] = psp->tok
12260 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  enlineno;.      
12270 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63    }.        memc
12280 70 79 28 7a 42 75 66 2c 20 7a 4e 65 77 2c 20 6e  py(zBuf, zNew, n
12290 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7a 42  New);.        zB
122a0 75 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 20 20  uf += nNew;.    
122b0 20 20 20 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20      *zBuf = 0;. 
122c0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
122d0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
122e0 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
122f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12300 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
12310 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
12320 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
12330 20 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 61        "Illegal a
12340 72 67 75 6d 65 6e 74 20 74 6f 20 25 25 25 73 3a  rgument to %%%s:
12350 20 25 73 22 2c 70 73 70 2d 3e 64 65 63 6c 6b 65   %s",psp->declke
12360 79 77 6f 72 64 2c 78 29 3b 0a 20 20 20 20 20 20  yword,x);.      
12370 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
12380 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
12390 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
123a0 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b  FTER_DECL_ERROR;
123b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
123c0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
123d0 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42  AITING_FOR_FALLB
123e0 41 43 4b 5f 49 44 3a 0a 20 20 20 20 20 20 69 66  ACK_ID:.      if
123f0 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20  ( x[0]=='.' ){. 
12400 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
12410 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
12420 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
12430 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69      }else if( !i
12440 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a  supper(x[0]) ){.
12450 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
12460 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  (psp->filename, 
12470 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
12480 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25 25 66  ,.          "%%f
12490 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e 74  allback argument
124a0 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20 62   \"%s\" should b
124b0 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a  e a token", x);.
124c0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
124d0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
124e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
124f0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
12500 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b  = Symbol_new(x);
12510 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70  .        if( psp
12520 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b  ->fallback==0 ){
12530 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12540 66 61 6c 6c 62 61 63 6b 20 3d 20 73 70 3b 0a 20  fallback = sp;. 
12550 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
12560 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 29 7b   sp->fallback ){
12570 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
12580 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
12590 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
125a0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
125b0 20 22 4d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20   "More than one 
125c0 66 61 6c 6c 62 61 63 6b 20 61 73 73 69 67 6e 65  fallback assigne
125d0 64 20 74 6f 20 74 6f 6b 65 6e 20 25 73 22 2c 20  d to token %s", 
125e0 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
125f0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
12600 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
12610 20 20 20 20 20 20 20 20 73 70 2d 3e 66 61 6c 6c          sp->fall
12620 62 61 63 6b 20 3d 20 70 73 70 2d 3e 66 61 6c 6c  back = psp->fall
12630 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  back;.          
12640 70 73 70 2d 3e 67 70 2d 3e 68 61 73 5f 66 61 6c  psp->gp->has_fal
12650 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20  lback = 1;.     
12660 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
12670 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
12680 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57  se WAITING_FOR_W
12690 49 4c 44 43 41 52 44 5f 49 44 3a 0a 20 20 20 20  ILDCARD_ID:.    
126a0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
126b0 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
126c0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
126d0 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
126e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
126f0 28 20 21 69 73 75 70 70 65 72 28 78 5b 30 5d 29  ( !isupper(x[0])
12700 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
12710 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
12720 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
12730 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
12740 22 25 25 77 69 6c 64 63 61 72 64 20 61 72 67 75  "%%wildcard argu
12750 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75  ment \"%s\" shou
12760 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20  ld be a token", 
12770 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
12780 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
12790 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
127a0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
127b0 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  *sp = Symbol_new
127c0 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (x);.        if(
127d0 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64 63 61   psp->gp->wildca
127e0 72 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rd==0 ){.       
127f0 20 20 20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64     psp->gp->wild
12800 63 61 72 64 20 3d 20 73 70 3b 0a 20 20 20 20 20  card = sp;.     
12810 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12820 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
12830 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d  ->filename, psp-
12840 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
12850 20 20 20 20 20 20 20 20 20 20 22 45 78 74 72 61            "Extra
12860 20 77 69 6c 64 63 61 72 64 20 74 6f 20 74 6f 6b   wildcard to tok
12870 65 6e 3a 20 25 73 22 2c 20 78 29 3b 0a 20 20 20  en: %s", x);.   
12880 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
12890 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
128a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
128b0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
128c0 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
128d0 45 5f 45 52 52 4f 52 3a 0a 2f 2a 20 20 20 20 20  E_ERROR:./*     
128e0 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29   if( x[0]=='.' )
128f0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
12900 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
12910 52 5f 52 55 4c 45 3b 0a 2a 2a 20 20 20 20 20 20  R_RULE;.**      
12920 62 72 65 61 6b 3b 20 2a 2f 0a 20 20 20 20 63 61  break; */.    ca
12930 73 65 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f  se RESYNC_AFTER_
12940 44 45 43 4c 5f 45 52 52 4f 52 3a 0a 20 20 20 20  DECL_ERROR:.    
12950 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
12960 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57  ) psp->state = W
12970 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
12980 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 69  OR_RULE;.      i
12990 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 20 70  f( x[0]=='%' ) p
129a0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
129b0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59  ING_FOR_DECL_KEY
129c0 57 4f 52 44 3b 0a 20 20 20 20 20 20 62 72 65 61  WORD;.      brea
129d0 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e  k;.  }.}../* Run
129e0 20 74 68 65 20 70 72 65 70 72 6f 63 65 73 73 6f   the preprocesso
129f0 72 20 6f 76 65 72 20 74 68 65 20 69 6e 70 75 74  r over the input
12a00 20 66 69 6c 65 20 74 65 78 74 2e 20 20 54 68 65   file text.  The
12a10 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
12a20 73 0a 2a 2a 20 61 7a 44 65 66 69 6e 65 5b 30 5d  s.** azDefine[0]
12a30 20 74 68 72 6f 75 67 68 20 61 7a 44 65 66 69 6e   through azDefin
12a40 65 5b 6e 44 65 66 69 6e 65 2d 31 5d 20 63 6f 6e  e[nDefine-1] con
12a50 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73 20  tains the names 
12a60 6f 66 20 61 6c 6c 20 64 65 66 69 6e 65 64 0a 2a  of all defined.*
12a70 2a 20 6d 61 63 72 6f 73 2e 20 20 54 68 69 73 20  * macros.  This 
12a80 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 66 6f  routine looks fo
12a90 72 20 22 25 69 66 64 65 66 22 20 61 6e 64 20 22  r "%ifdef" and "
12aa0 25 69 66 6e 64 65 66 22 20 61 6e 64 20 22 25 65  %ifndef" and "%e
12ab0 6e 64 69 66 22 20 61 6e 64 0a 2a 2a 20 63 6f 6d  ndif" and.** com
12ac0 6d 65 6e 74 73 20 74 68 65 6d 20 6f 75 74 2e 20  ments them out. 
12ad0 20 54 65 78 74 20 69 6e 20 62 65 74 77 65 65 6e   Text in between
12ae0 20 69 73 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74   is also comment
12af0 65 64 20 6f 75 74 20 61 73 20 61 70 70 72 6f 70  ed out as approp
12b00 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  riate..*/.static
12b10 20 76 6f 69 64 20 70 72 65 70 72 6f 63 65 73 73   void preprocess
12b20 5f 69 6e 70 75 74 28 63 68 61 72 20 2a 7a 29 7b  _input(char *z){
12b30 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20  .  int i, j, k, 
12b40 6e 3b 0a 20 20 69 6e 74 20 65 78 63 6c 75 64 65  n;.  int exclude
12b50 20 3d 20 30 3b 0a 20 20 69 6e 74 20 73 74 61 72   = 0;.  int star
12b60 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 69 6e  t = 0;.  int lin
12b70 65 6e 6f 20 3d 20 31 3b 0a 20 20 69 6e 74 20 73  eno = 1;.  int s
12b80 74 61 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20 31 3b  tart_lineno = 1;
12b90 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d  .  for(i=0; z[i]
12ba0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
12bb0 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  z[i]=='\n' ) lin
12bc0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a  eno++;.    if( z
12bd0 5b 69 5d 21 3d 27 25 27 20 7c 7c 20 28 69 3e 30  [i]!='%' || (i>0
12be0 20 26 26 20 7a 5b 69 2d 31 5d 21 3d 27 5c 6e 27   && z[i-1]!='\n'
12bf0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
12c00 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 26 7a    if( strncmp(&z
12c10 5b 69 5d 2c 22 25 65 6e 64 69 66 22 2c 36 29 3d  [i],"%endif",6)=
12c20 3d 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b  =0 && isspace(z[
12c30 69 2b 36 5d 29 20 29 7b 0a 20 20 20 20 20 20 69  i+6]) ){.      i
12c40 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20  f( exclude ){.  
12c50 20 20 20 20 20 20 65 78 63 6c 75 64 65 2d 2d 3b        exclude--;
12c60 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78 63  .        if( exc
12c70 6c 75 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lude==0 ){.     
12c80 20 20 20 20 20 66 6f 72 28 6a 3d 73 74 61 72 74       for(j=start
12c90 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 20 69 66 28 20  ; j<i; j++) if( 
12ca0 7a 5b 6a 5d 21 3d 27 5c 6e 27 20 29 20 7a 5b 6a  z[j]!='\n' ) z[j
12cb0 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20  ] = ' ';.       
12cc0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
12cd0 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26   for(j=i; z[j] &
12ce0 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b  & z[j]!='\n'; j+
12cf0 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20  +) z[j] = ' ';. 
12d00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 73 74     }else if( (st
12d10 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66  rncmp(&z[i],"%if
12d20 64 65 66 22 2c 36 29 3d 3d 30 20 26 26 20 69 73  def",6)==0 && is
12d30 73 70 61 63 65 28 7a 5b 69 2b 36 5d 29 29 0a 20  space(z[i+6])). 
12d40 20 20 20 20 20 20 20 20 20 7c 7c 20 28 73 74 72           || (str
12d50 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66 6e  ncmp(&z[i],"%ifn
12d60 64 65 66 22 2c 37 29 3d 3d 30 20 26 26 20 69 73  def",7)==0 && is
12d70 73 70 61 63 65 28 7a 5b 69 2b 37 5d 29 29 20 29  space(z[i+7])) )
12d80 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78 63 6c  {.      if( excl
12d90 75 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ude ){.        e
12da0 78 63 6c 75 64 65 2b 2b 3b 0a 20 20 20 20 20 20  xclude++;.      
12db0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
12dc0 6f 72 28 6a 3d 69 2b 37 3b 20 69 73 73 70 61 63  or(j=i+7; isspac
12dd0 65 28 7a 5b 6a 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a  e(z[j]); j++){}.
12de0 20 20 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b          for(n=0;
12df0 20 7a 5b 6a 2b 6e 5d 20 26 26 20 21 69 73 73 70   z[j+n] && !issp
12e00 61 63 65 28 7a 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b  ace(z[j+n]); n++
12e10 29 7b 7d 0a 20 20 20 20 20 20 20 20 65 78 63 6c  ){}.        excl
12e20 75 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ude = 1;.       
12e30 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 6e 44 65 66   for(k=0; k<nDef
12e40 69 6e 65 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  ine; k++){.     
12e50 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
12e60 28 61 7a 44 65 66 69 6e 65 5b 6b 5d 2c 26 7a 5b  (azDefine[k],&z[
12e70 6a 5d 2c 6e 29 3d 3d 30 20 26 26 20 6c 65 6d 6f  j],n)==0 && lemo
12e80 6e 53 74 72 6c 65 6e 28 61 7a 44 65 66 69 6e 65  nStrlen(azDefine
12e90 5b 6b 5d 29 3d 3d 6e 20 29 7b 0a 20 20 20 20 20  [k])==n ){.     
12ea0 20 20 20 20 20 20 20 65 78 63 6c 75 64 65 20 3d         exclude =
12eb0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
12ec0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
12ed0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
12ee0 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 33 5d 3d       if( z[i+3]=
12ef0 3d 27 6e 27 20 29 20 65 78 63 6c 75 64 65 20 3d  ='n' ) exclude =
12f00 20 21 65 78 63 6c 75 64 65 3b 0a 20 20 20 20 20   !exclude;.     
12f10 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29     if( exclude )
12f20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 72  {.          star
12f30 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
12f40 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20   start_lineno = 
12f50 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20  lineno;.        
12f60 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
12f70 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26  for(j=i; z[j] &&
12f80 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b   z[j]!='\n'; j++
12f90 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20  ) z[j] = ' ';.  
12fa0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 78    }.  }.  if( ex
12fb0 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 66 70 72  clude ){.    fpr
12fc0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 75 6e 74  intf(stderr,"unt
12fd0 65 72 6d 69 6e 61 74 65 64 20 25 25 69 66 64 65  erminated %%ifde
12fe0 66 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 6c 69  f starting on li
12ff0 6e 65 20 25 64 5c 6e 22 2c 20 73 74 61 72 74 5f  ne %d\n", start_
13000 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 65 78 69  lineno);.    exi
13010 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  t(1);.  }.}../* 
13020 49 6e 20 73 70 69 74 65 20 6f 66 20 69 74 73 20  In spite of its 
13030 6e 61 6d 65 2c 20 74 68 69 73 20 66 75 6e 63 74  name, this funct
13040 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20 61 20  ion is really a 
13050 73 63 61 6e 6e 65 72 2e 20 20 49 74 20 72 65 61  scanner.  It rea
13060 64 0a 2a 2a 20 69 6e 20 74 68 65 20 65 6e 74 69  d.** in the enti
13070 72 65 20 69 6e 70 75 74 20 66 69 6c 65 20 28 61  re input file (a
13080 6c 6c 20 61 74 20 6f 6e 63 65 29 20 74 68 65 6e  ll at once) then
13090 20 74 6f 6b 65 6e 69 7a 65 73 20 69 74 2e 20 20   tokenizes it.  
130a0 45 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e 20 69 73  Each.** token is
130b0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 66   passed to the f
130c0 75 6e 63 74 69 6f 6e 20 22 70 61 72 73 65 6f 6e  unction "parseon
130d0 65 74 6f 6b 65 6e 22 20 77 68 69 63 68 20 62 75  etoken" which bu
130e0 69 6c 64 73 20 61 6c 6c 0a 2a 2a 20 74 68 65 20  ilds all.** the 
130f0 61 70 70 72 6f 70 72 69 61 74 65 20 64 61 74 61  appropriate data
13100 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20 74   structures in t
13110 68 65 20 67 6c 6f 62 61 6c 20 73 74 61 74 65 20  he global state 
13120 76 65 63 74 6f 72 20 22 67 70 22 2e 0a 2a 2f 0a  vector "gp"..*/.
13130 76 6f 69 64 20 50 61 72 73 65 28 67 70 29 0a 73  void Parse(gp).s
13140 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 67 70 3b  truct lemon *gp;
13150 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 73 74 61  .{.  struct psta
13160 74 65 20 70 73 3b 0a 20 20 46 49 4c 45 20 2a 66  te ps;.  FILE *f
13170 70 3b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65 62  p;.  char *fileb
13180 75 66 3b 0a 20 20 69 6e 74 20 66 69 6c 65 73 69  uf;.  int filesi
13190 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f  ze;.  int lineno
131a0 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68 61  ;.  int c;.  cha
131b0 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63 70 3b 0a  r *cp, *nextcp;.
131c0 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e 65 20    int startline 
131d0 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26  = 0;..  memset(&
131e0 70 73 2c 20 27 5c 30 27 2c 20 73 69 7a 65 6f 66  ps, '\0', sizeof
131f0 28 70 73 29 29 3b 0a 20 20 70 73 2e 67 70 20 3d  (ps));.  ps.gp =
13200 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c 65 6e 61   gp;.  ps.filena
13210 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65 6e 61 6d  me = gp->filenam
13220 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72 63 6e 74  e;.  ps.errorcnt
13230 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74 61 74 65   = 0;.  ps.state
13240 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45 3b 0a 0a   = INITIALIZE;..
13250 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 65    /* Begin by re
13260 61 64 69 6e 67 20 74 68 65 20 69 6e 70 75 74 20  ading the input 
13270 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20 3d 20 66  file */.  fp = f
13280 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e 61 6d 65  open(ps.filename
13290 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 66 70  ,"rb");.  if( fp
132a0 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ==0 ){.    Error
132b0 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
132c0 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68  0,"Can't open th
132d0 69 73 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  is file for read
132e0 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67 70 2d 3e  ing.");.    gp->
132f0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
13300 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 73  return;.  }.  fs
13310 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a 20 20 66  eek(fp,0,2);.  f
13320 69 6c 65 73 69 7a 65 20 3d 20 66 74 65 6c 6c 28  ilesize = ftell(
13330 66 70 29 3b 0a 20 20 72 65 77 69 6e 64 28 66 70  fp);.  rewind(fp
13340 29 3b 0a 20 20 66 69 6c 65 62 75 66 20 3d 20 28  );.  filebuf = (
13350 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 66  char *)malloc( f
13360 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a 20 20 69  ilesize+1 );.  i
13370 66 28 20 66 69 6c 65 62 75 66 3d 3d 30 20 29 7b  f( filebuf==0 ){
13380 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73  .    ErrorMsg(ps
13390 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e  .filename,0,"Can
133a0 27 74 20 61 6c 6c 6f 63 61 74 65 20 25 64 20 6f  't allocate %d o
133b0 66 20 6d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64  f memory to hold
133c0 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20   this file.",.  
133d0 20 20 20 20 66 69 6c 65 73 69 7a 65 2b 31 29 3b      filesize+1);
133e0 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e  .    gp->errorcn
133f0 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  t++;.    return;
13400 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 61 64  .  }.  if( fread
13410 28 66 69 6c 65 62 75 66 2c 31 2c 66 69 6c 65 73  (filebuf,1,files
13420 69 7a 65 2c 66 70 29 21 3d 66 69 6c 65 73 69 7a  ize,fp)!=filesiz
13430 65 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73  e ){.    ErrorMs
13440 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c  g(ps.filename,0,
13450 22 43 61 6e 27 74 20 72 65 61 64 20 69 6e 20 61  "Can't read in a
13460 6c 6c 20 25 64 20 62 79 74 65 73 20 6f 66 20 74  ll %d bytes of t
13470 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20 20 20  his file.",.    
13480 20 20 66 69 6c 65 73 69 7a 65 29 3b 0a 20 20 20    filesize);.   
13490 20 66 72 65 65 28 66 69 6c 65 62 75 66 29 3b 0a   free(filebuf);.
134a0 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74      gp->errorcnt
134b0 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
134c0 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70 29    }.  fclose(fp)
134d0 3b 0a 20 20 66 69 6c 65 62 75 66 5b 66 69 6c 65  ;.  filebuf[file
134e0 73 69 7a 65 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a  size] = 0;..  /*
134f0 20 4d 61 6b 65 20 61 6e 20 69 6e 69 74 69 61 6c   Make an initial
13500 20 70 61 73 73 20 74 68 72 6f 75 67 68 20 74 68   pass through th
13510 65 20 66 69 6c 65 20 74 6f 20 68 61 6e 64 6c 65  e file to handle
13520 20 25 69 66 64 65 66 20 61 6e 64 20 25 69 66 6e   %ifdef and %ifn
13530 64 65 66 20 2a 2f 0a 20 20 70 72 65 70 72 6f 63  def */.  preproc
13540 65 73 73 5f 69 6e 70 75 74 28 66 69 6c 65 62 75  ess_input(filebu
13550 66 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 73 63  f);..  /* Now sc
13560 61 6e 20 74 68 65 20 74 65 78 74 20 6f 66 20 74  an the text of t
13570 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
13580 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20  .  lineno = 1;. 
13590 20 66 6f 72 28 63 70 3d 66 69 6c 65 62 75 66 3b   for(cp=filebuf;
135a0 20 28 63 3d 20 2a 63 70 29 21 3d 30 3b 20 29 7b   (c= *cp)!=0; ){
135b0 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27  .    if( c=='\n'
135c0 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 20 20 20   ) lineno++;    
135d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 65            /* Kee
135e0 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6c  p track of the l
135f0 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ine number */.  
13600 20 20 69 66 28 20 69 73 73 70 61 63 65 28 63 29    if( isspace(c)
13610 20 29 7b 20 63 70 2b 2b 3b 20 63 6f 6e 74 69 6e   ){ cp++; contin
13620 75 65 3b 20 7d 20 20 2f 2a 20 53 6b 69 70 20 61  ue; }  /* Skip a
13630 6c 6c 20 77 68 69 74 65 20 73 70 61 63 65 20 2a  ll white space *
13640 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2f 27  /.    if( c=='/'
13650 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29   && cp[1]=='/' )
13660 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b  {          /* Sk
13670 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d  ip C++ style com
13680 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 63  ments */.      c
13690 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68 69 6c  p+=2;.      whil
136a0 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  e( (c= *cp)!=0 &
136b0 26 20 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b 2b  & c!='\n' ) cp++
136c0 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
136d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
136e0 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d  c=='/' && cp[1]=
136f0 3d 27 2a 27 20 29 7b 20 20 20 20 20 20 20 20 20  ='*' ){         
13700 20 2f 2a 20 53 6b 69 70 20 43 20 73 74 79 6c 65   /* Skip C style
13710 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   comments */.   
13720 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20     cp+=2;.      
13730 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
13740 3d 30 20 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c  =0 && (c!='/' ||
13750 20 63 70 5b 2d 31 5d 21 3d 27 2a 27 29 20 29 7b   cp[-1]!='*') ){
13760 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
13770 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
13780 0a 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20  .        cp++;. 
13790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
137a0 20 63 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20   c ) cp++;.     
137b0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
137c0 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e 73 74 61  .    ps.tokensta
137d0 72 74 20 3d 20 63 70 3b 20 20 20 20 20 20 20 20  rt = cp;        
137e0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20          /* Mark 
137f0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
13800 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20   the token */.  
13810 20 20 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f    ps.tokenlineno
13820 20 3d 20 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20   = lineno;      
13830 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62       /* Linenumb
13840 65 72 20 6f 6e 20 77 68 69 63 68 20 74 6f 6b 65  er on which toke
13850 6e 20 62 65 67 69 6e 73 20 2a 2f 0a 20 20 20 20  n begins */.    
13860 69 66 28 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20  if( c=='\"' ){  
13870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13880 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6c 69 74     /* String lit
13890 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20 63  erals */.      c
138a0 70 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  p++;.      while
138b0 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ( (c= *cp)!=0 &&
138c0 20 63 21 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20   c!='\"' ){.    
138d0 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
138e0 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ) lineno++;.    
138f0 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20      cp++;.      
13900 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  }.      if( c==0
13910 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
13920 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65  rMsg(ps.filename
13930 2c 73 74 61 72 74 6c 69 6e 65 2c 0a 22 53 74 72  ,startline,."Str
13940 69 6e 67 20 73 74 61 72 74 69 6e 67 20 6f 6e 20  ing starting on 
13950 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74  this line is not
13960 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f   terminated befo
13970 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  re the end of th
13980 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20  e file.");.     
13990 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b     ps.errorcnt++
139a0 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70  ;.        nextcp
139b0 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c   = cp;.      }el
139c0 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74  se{.        next
139d0 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20  cp = cp+1;.     
139e0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
139f0 20 63 3d 3d 27 7b 27 20 29 7b 20 20 20 20 20 20   c=='{' ){      
13a00 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6c           /* A bl
13a10 6f 63 6b 20 6f 66 20 43 20 63 6f 64 65 20 2a 2f  ock of C code */
13a20 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 76 65 6c  .      int level
13a30 3b 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20  ;.      cp++;.  
13a40 20 20 20 20 66 6f 72 28 6c 65 76 65 6c 3d 31 3b      for(level=1;
13a50 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
13a60 28 6c 65 76 65 6c 3e 31 20 7c 7c 20 63 21 3d 27  (level>1 || c!='
13a70 7d 27 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20  }'); cp++){.    
13a80 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20      if( c=='\n' 
13a90 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ) lineno++;.    
13aa0 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d      else if( c==
13ab0 27 7b 27 20 29 20 6c 65 76 65 6c 2b 2b 3b 0a 20  '{' ) level++;. 
13ac0 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20         else if( 
13ad0 63 3d 3d 27 7d 27 20 29 20 6c 65 76 65 6c 2d 2d  c=='}' ) level--
13ae0 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69  ;.        else i
13af0 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b  f( c=='/' && cp[
13b00 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 2f 2a 20 53  1]=='*' ){  /* S
13b10 6b 69 70 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a  kip comments */.
13b20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 70 72            int pr
13b30 65 76 63 3b 0a 20 20 20 20 20 20 20 20 20 20 63  evc;.          c
13b40 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20  p = &cp[2];.    
13b50 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 30 3b        prevc = 0;
13b60 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
13b70 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ( (c= *cp)!=0 &&
13b80 20 28 63 21 3d 27 2f 27 20 7c 7c 20 70 72 65 76   (c!='/' || prev
13b90 63 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20 20  c!='*') ){.     
13ba0 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c         if( c=='\
13bb0 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n' ) lineno++;. 
13bc0 20 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63             prevc
13bd0 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20   = c;.          
13be0 20 20 63 70 2b 2b 3b 0a 09 20 20 7d 0a 09 7d 65    cp++;..  }..}e
13bf0 6c 73 65 20 69 66 28 20 63 3d 3d 27 2f 27 20 26  lse if( c=='/' &
13c00 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20  & cp[1]=='/' ){ 
13c10 20 2f 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74 79   /* Skip C++ sty
13c20 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 74 6f 6f 20  le comments too 
13c30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 70 20  */.          cp 
13c40 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20  = &cp[2];.      
13c50 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a      while( (c= *
13c60 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e  cp)!=0 && c!='\n
13c70 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20  ' ) cp++;.      
13c80 20 20 20 20 69 66 28 20 63 20 29 20 6c 69 6e 65      if( c ) line
13c90 6e 6f 2b 2b 3b 0a 09 7d 65 6c 73 65 20 69 66 28  no++;..}else if(
13ca0 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27   c=='\'' || c=='
13cb0 5c 22 27 20 29 7b 20 20 20 20 2f 2a 20 53 74 72  \"' ){    /* Str
13cc0 69 6e 67 20 61 20 63 68 61 72 61 63 74 65 72 20  ing a character 
13cd0 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20  literals */.    
13ce0 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 63        int startc
13cf0 68 61 72 2c 20 70 72 65 76 63 3b 0a 20 20 20 20  har, prevc;.    
13d00 20 20 20 20 20 20 73 74 61 72 74 63 68 61 72 20        startchar 
13d10 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = c;.          p
13d20 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  revc = 0;.      
13d30 20 20 20 20 66 6f 72 28 63 70 2b 2b 3b 20 28 63      for(cp++; (c
13d40 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21  = *cp)!=0 && (c!
13d50 3d 73 74 61 72 74 63 68 61 72 20 7c 7c 20 70 72  =startchar || pr
13d60 65 76 63 3d 3d 27 5c 5c 27 29 3b 20 63 70 2b 2b  evc=='\\'); cp++
13d70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
13d80 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e  f( c=='\n' ) lin
13d90 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  eno++;.         
13da0 20 20 20 69 66 28 20 70 72 65 76 63 3d 3d 27 5c     if( prevc=='\
13db0 5c 27 20 29 20 70 72 65 76 63 20 3d 20 30 3b 0a  \' ) prevc = 0;.
13dc0 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65              else
13dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
13de0 65 76 63 20 3d 20 63 3b 0a 09 20 20 7d 0a 09 7d  evc = c;..  }..}
13df0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
13e00 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
13e10 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66     ErrorMsg(ps.f
13e20 69 6c 65 6e 61 6d 65 2c 70 73 2e 74 6f 6b 65 6e  ilename,ps.token
13e30 6c 69 6e 65 6e 6f 2c 0a 22 43 20 63 6f 64 65 20  lineno,."C code 
13e40 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73  starting on this
13e50 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72   line is not ter
13e60 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74  minated before t
13e70 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
13e80 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70  le.");.        p
13e90 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  s.errorcnt++;.  
13ea0 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
13eb0 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  p;.      }else{.
13ec0 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d          nextcp =
13ed0 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20   cp+1;.      }. 
13ee0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 61     }else if( isa
13ef0 6c 6e 75 6d 28 63 29 20 29 7b 20 20 20 20 20 20  lnum(c) ){      
13f00 20 20 20 20 2f 2a 20 49 64 65 6e 74 69 66 69 65      /* Identifie
13f10 72 73 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c  rs */.      whil
13f20 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  e( (c= *cp)!=0 &
13f30 26 20 28 69 73 61 6c 6e 75 6d 28 63 29 20 7c 7c  & (isalnum(c) ||
13f40 20 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b 3b   c=='_') ) cp++;
13f50 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20  .      nextcp = 
13f60 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  cp;.    }else if
13f70 28 20 63 3d 3d 27 3a 27 20 26 26 20 63 70 5b 31  ( c==':' && cp[1
13f80 5d 3d 3d 27 3a 27 20 26 26 20 63 70 5b 32 5d 3d  ]==':' && cp[2]=
13f90 3d 27 3d 27 20 29 7b 20 2f 2a 20 54 68 65 20 6f  ='=' ){ /* The o
13fa0 70 65 72 61 74 6f 72 20 22 3a 3a 3d 22 20 2a 2f  perator "::=" */
13fb0 0a 20 20 20 20 20 20 63 70 20 2b 3d 20 33 3b 0a  .      cp += 3;.
13fc0 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
13fd0 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  p;.    }else if(
13fe0 20 28 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27   (c=='/' || c=='
13ff0 7c 27 29 20 26 26 20 69 73 61 6c 70 68 61 28 63  |') && isalpha(c
14000 70 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 63  p[1]) ){.      c
14010 70 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 77 68  p += 2;.      wh
14020 69 6c 65 28 20 28 63 20 3d 20 2a 63 70 29 21 3d  ile( (c = *cp)!=
14030 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 63 29  0 && (isalnum(c)
14040 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70   || c=='_') ) cp
14050 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70  ++;.      nextcp
14060 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65   = cp;.    }else
14070 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
14080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
14090 6c 20 6f 74 68 65 72 20 28 6f 6e 65 20 63 68 61  l other (one cha
140a0 72 61 63 74 65 72 29 20 6f 70 65 72 61 74 6f 72  racter) operator
140b0 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b  s */.      cp++;
140c0 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20  .      nextcp = 
140d0 63 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 20  cp;.    }.    c 
140e0 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20 3d  = *cp;.    *cp =
140f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
14100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
14110 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74 68 65  ll terminate the
14120 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 61   token */.    pa
14130 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 26 70 73 29  rseonetoken(&ps)
14140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
14150 20 50 61 72 73 65 20 74 68 65 20 74 6f 6b 65 6e   Parse the token
14160 20 2a 2f 0a 20 20 20 20 2a 63 70 20 3d 20 63 3b   */.    *cp = c;
14170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14180 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 6f          /* Resto
14190 72 65 20 74 68 65 20 62 75 66 66 65 72 20 2a 2f  re the buffer */
141a0 0a 20 20 20 20 63 70 20 3d 20 6e 65 78 74 63 70  .    cp = nextcp
141b0 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 66 69 6c  ;.  }.  free(fil
141c0 65 62 75 66 29 3b 20 20 20 20 20 20 20 20 20 20  ebuf);          
141d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6c            /* Rel
141e0 65 61 73 65 20 74 68 65 20 62 75 66 66 65 72 20  ease the buffer 
141f0 61 66 74 65 72 20 70 61 72 73 69 6e 67 20 2a 2f  after parsing */
14200 0a 20 20 67 70 2d 3e 72 75 6c 65 20 3d 20 70 73  .  gp->rule = ps
14210 2e 66 69 72 73 74 72 75 6c 65 3b 0a 20 20 67 70  .firstrule;.  gp
14220 2d 3e 65 72 72 6f 72 63 6e 74 20 3d 20 70 73 2e  ->errorcnt = ps.
14230 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a  errorcnt;.}./***
14240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14250 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
14260 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 63 22  e file "plink.c"
14270 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
14280 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f  ******/./*.** Ro
14290 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73 69 6e  utines processin
142a0 67 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  g configuration 
142b0 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61  follow-set propa
142c0 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a 2a 20  gation links.** 
142d0 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  in the LEMON par
142e0 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
142f0 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
14300 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66 72 65  plink *plink_fre
14310 65 6c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 20 41  elist = 0;../* A
14320 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 6c  llocate a new pl
14330 69 6e 6b 20 2a 2f 0a 73 74 72 75 63 74 20 70 6c  ink */.struct pl
14340 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28 29  ink *Plink_new()
14350 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  {.  struct plink
14360 20 2a 6e 65 77 3b 0a 0a 20 20 69 66 28 20 70 6c   *new;..  if( pl
14370 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d 3d 30 20  ink_freelist==0 
14380 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
14390 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30 30 3b    int amt = 100;
143a0 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c  .    plink_freel
143b0 69 73 74 20 3d 20 28 73 74 72 75 63 74 20 70 6c  ist = (struct pl
143c0 69 6e 6b 20 2a 29 63 61 6c 6c 6f 63 28 20 61 6d  ink *)calloc( am
143d0 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  t, sizeof(struct
143e0 20 70 6c 69 6e 6b 29 20 29 3b 0a 20 20 20 20 69   plink) );.    i
143f0 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73  f( plink_freelis
14400 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  t==0 ){.      fp
14410 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20  rintf(stderr,.  
14420 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 61      "Unable to a
14430 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
14440 6f 72 20 61 20 6e 65 77 20 66 6f 6c 6c 6f 77 2d  or a new follow-
14450 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  set propagation 
14460 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20 20 20 20 20  link.\n");.     
14470 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
14480 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
14490 6d 74 2d 31 3b 20 69 2b 2b 29 20 70 6c 69 6e 6b  mt-1; i++) plink
144a0 5f 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78  _freelist[i].nex
144b0 74 20 3d 20 26 70 6c 69 6e 6b 5f 66 72 65 65 6c  t = &plink_freel
144c0 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 70 6c  ist[i+1];.    pl
144d0 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 61 6d 74  ink_freelist[amt
144e0 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  -1].next = 0;.  
144f0 7d 0a 20 20 6e 65 77 20 3d 20 70 6c 69 6e 6b 5f  }.  new = plink_
14500 66 72 65 65 6c 69 73 74 3b 0a 20 20 70 6c 69 6e  freelist;.  plin
14510 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 70 6c 69  k_freelist = pli
14520 6e 6b 5f 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78  nk_freelist->nex
14530 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 3b  t;.  return new;
14540 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 70 6c 69  .}../* Add a pli
14550 6e 6b 20 74 6f 20 61 20 70 6c 69 6e 6b 20 6c 69  nk to a plink li
14560 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b  st */.void Plink
14570 5f 61 64 64 28 70 6c 70 70 2c 63 66 70 29 0a 73  _add(plpp,cfp).s
14580 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 70 6c  truct plink **pl
14590 70 70 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  pp;.struct confi
145a0 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72 75  g *cfp;.{.  stru
145b0 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 3b 0a 20  ct plink *new;. 
145c0 20 6e 65 77 20 3d 20 50 6c 69 6e 6b 5f 6e 65 77   new = Plink_new
145d0 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e 65 78 74 20  ();.  new->next 
145e0 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c 70 70  = *plpp;.  *plpp
145f0 20 3d 20 6e 65 77 3b 0a 20 20 6e 65 77 2d 3e 63   = new;.  new->c
14600 66 70 20 3d 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20  fp = cfp;.}../* 
14610 54 72 61 6e 73 66 65 72 20 65 76 65 72 79 20 70  Transfer every p
14620 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73 74  link on the list
14630 20 22 66 72 6f 6d 22 20 74 6f 20 74 68 65 20 6c   "from" to the l
14640 69 73 74 20 22 74 6f 22 20 2a 2f 0a 76 6f 69 64  ist "to" */.void
14650 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 74 6f 2c 66   Plink_copy(to,f
14660 72 6f 6d 29 0a 73 74 72 75 63 74 20 70 6c 69 6e  rom).struct plin
14670 6b 20 2a 2a 74 6f 3b 0a 73 74 72 75 63 74 20 70  k **to;.struct p
14680 6c 69 6e 6b 20 2a 66 72 6f 6d 3b 0a 7b 0a 20 20  link *from;.{.  
14690 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
146a0 78 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28 20 66  xtpl;.  while( f
146b0 72 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78 74 70  rom ){.    nextp
146c0 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74 3b 0a  l = from->next;.
146d0 20 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74 20 3d      from->next =
146e0 20 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20 3d 20   *to;.    *to = 
146f0 66 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d 20 3d  from;.    from =
14700 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 0a   nextpl;.  }.}..
14710 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72 79 20  /* Delete every 
14720 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69 73  plink on the lis
14730 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  t */.void Plink_
14740 64 65 6c 65 74 65 28 70 6c 70 29 0a 73 74 72 75  delete(plp).stru
14750 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 7b  ct plink *plp;.{
14760 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
14770 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20 77 68 69 6c  *nextpl;..  whil
14780 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20 6e 65  e( plp ){.    ne
14790 78 74 70 6c 20 3d 20 70 6c 70 2d 3e 6e 65 78 74  xtpl = plp->next
147a0 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e 65 78 74 20  ;.    plp->next 
147b0 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74  = plink_freelist
147c0 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65  ;.    plink_free
147d0 6c 69 73 74 20 3d 20 70 6c 70 3b 0a 20 20 20 20  list = plp;.    
147e0 70 6c 70 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20  plp = nextpl;.  
147f0 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}./***********
14800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
14810 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65 70 6f  m the file "repo
14820 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rt.c" **********
14830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14840 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 64 75 72  /./*.** Procedur
14850 65 73 20 66 6f 72 20 67 65 6e 65 72 61 74 69 6e  es for generatin
14860 67 20 72 65 70 6f 72 74 73 20 61 6e 64 20 74 61  g reports and ta
14870 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f  bles in the LEMO
14880 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
14890 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47 65 6e 65 72  or..*/../* Gener
148a0 61 74 65 20 61 20 66 69 6c 65 6e 61 6d 65 20 77  ate a filename w
148b0 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 73 75  ith the given su
148c0 66 66 69 78 2e 20 20 53 70 61 63 65 20 74 6f 20  ffix.  Space to 
148d0 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 6e 61 6d 65  hold the.** name
148e0 20 63 6f 6d 65 73 20 66 72 6f 6d 20 6d 61 6c 6c   comes from mall
148f0 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20 62 65  oc() and must be
14900 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61   freed by the ca
14910 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74 69 6f  lling.** functio
14920 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 63 68  n..*/.PRIVATE ch
14930 61 72 20 2a 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d  ar *file_makenam
14940 65 28 6c 65 6d 70 2c 73 75 66 66 69 78 29 0a 73  e(lemp,suffix).s
14950 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
14960 70 3b 0a 63 68 61 72 20 2a 73 75 66 66 69 78 3b  p;.char *suffix;
14970 0a 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b  .{.  char *name;
14980 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20  .  char *cp;..  
14990 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6c  name = malloc( l
149a0 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d  emonStrlen(lemp-
149b0 3e 66 69 6c 65 6e 61 6d 65 29 20 2b 20 6c 65 6d  >filename) + lem
149c0 6f 6e 53 74 72 6c 65 6e 28 73 75 66 66 69 78 29  onStrlen(suffix)
149d0 20 2b 20 35 20 29 3b 0a 20 20 69 66 28 20 6e 61   + 5 );.  if( na
149e0 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  me==0 ){.    fpr
149f0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e  intf(stderr,"Can
14a00 27 74 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  't allocate spac
14a10 65 20 66 6f 72 20 61 20 66 69 6c 65 6e 61 6d 65  e for a filename
14a20 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  .\n");.    exit(
14a30 31 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63 70 79  1);.  }.  strcpy
14a40 28 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65  (name,lemp->file
14a50 6e 61 6d 65 29 3b 0a 20 20 63 70 20 3d 20 73 74  name);.  cp = st
14a60 72 72 63 68 72 28 6e 61 6d 65 2c 27 2e 27 29 3b  rrchr(name,'.');
14a70 0a 20 20 69 66 28 20 63 70 20 29 20 2a 63 70 20  .  if( cp ) *cp 
14a80 3d 20 30 3b 0a 20 20 73 74 72 63 61 74 28 6e 61  = 0;.  strcat(na
14a90 6d 65 2c 73 75 66 66 69 78 29 3b 0a 20 20 72 65  me,suffix);.  re
14aa0 74 75 72 6e 20 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  turn name;.}../*
14ab0 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 77 69 74   Open a file wit
14ac0 68 20 61 20 6e 61 6d 65 20 62 61 73 65 64 20 6f  h a name based o
14ad0 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
14ae0 65 20 69 6e 70 75 74 20 66 69 6c 65 2c 0a 2a 2a  e input file,.**
14af0 20 62 75 74 20 77 69 74 68 20 61 20 64 69 66 66   but with a diff
14b00 65 72 65 6e 74 20 28 73 70 65 63 69 66 69 65 64  erent (specified
14b10 29 20 73 75 66 66 69 78 2c 20 61 6e 64 20 72 65  ) suffix, and re
14b20 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
14b30 2a 20 74 6f 20 74 68 65 20 73 74 72 65 61 6d 20  * to the stream 
14b40 2a 2f 0a 50 52 49 56 41 54 45 20 46 49 4c 45 20  */.PRIVATE FILE 
14b50 2a 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c  *file_open(lemp,
14b60 73 75 66 66 69 78 2c 6d 6f 64 65 29 0a 73 74 72  suffix,mode).str
14b70 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
14b80 0a 63 68 61 72 20 2a 73 75 66 66 69 78 3b 0a 63  .char *suffix;.c
14b90 68 61 72 20 2a 6d 6f 64 65 3b 0a 7b 0a 20 20 46  har *mode;.{.  F
14ba0 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 69 66 28 20  ILE *fp;..  if( 
14bb0 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20 29 20  lemp->outname ) 
14bc0 66 72 65 65 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61  free(lemp->outna
14bd0 6d 65 29 3b 0a 20 20 6c 65 6d 70 2d 3e 6f 75 74  me);.  lemp->out
14be0 6e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65  name = file_make
14bf0 6e 61 6d 65 28 6c 65 6d 70 2c 20 73 75 66 66 69  name(lemp, suffi
14c00 78 29 3b 0a 20 20 66 70 20 3d 20 66 6f 70 65 6e  x);.  fp = fopen
14c10 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 2c 6d  (lemp->outname,m
14c20 6f 64 65 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d  ode);.  if( fp==
14c30 30 20 26 26 20 2a 6d 6f 64 65 3d 3d 27 77 27 20  0 && *mode=='w' 
14c40 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
14c50 74 64 65 72 72 2c 22 43 61 6e 27 74 20 6f 70 65  tderr,"Can't ope
14c60 6e 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e  n file \"%s\".\n
14c70 22 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29  ",lemp->outname)
14c80 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f  ;.    lemp->erro
14c90 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  rcnt++;.    retu
14ca0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
14cb0 72 6e 20 66 70 3b 0a 7d 0a 0a 2f 2a 20 44 75 70  rn fp;.}../* Dup
14cc0 6c 69 63 61 74 65 20 74 68 65 20 69 6e 70 75 74  licate the input
14cd0 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 63 6f   file without co
14ce0 6d 6d 65 6e 74 73 20 61 6e 64 20 77 69 74 68 6f  mments and witho
14cf0 75 74 20 61 63 74 69 6f 6e 73 20 0a 2a 2a 20 6f  ut actions .** o
14d00 6e 20 72 75 6c 65 73 20 2a 2f 0a 76 6f 69 64 20  n rules */.void 
14d10 52 65 70 72 69 6e 74 28 6c 65 6d 70 29 0a 73 74  Reprint(lemp).st
14d20 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
14d30 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  ;.{.  struct rul
14d40 65 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20  e *rp;.  struct 
14d50 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e  symbol *sp;.  in
14d60 74 20 69 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c 20  t i, j, maxlen, 
14d70 6c 65 6e 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20 73  len, ncolumns, s
14d80 6b 69 70 3b 0a 20 20 70 72 69 6e 74 66 28 22 2f  kip;.  printf("/
14d90 2f 20 52 65 70 72 69 6e 74 20 6f 66 20 69 6e 70  / Reprint of inp
14da0 75 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c  ut file \"%s\".\
14db0 6e 2f 2f 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 2c  n// Symbols:\n",
14dc0 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
14dd0 0a 20 20 6d 61 78 6c 65 6e 20 3d 20 31 30 3b 0a  .  maxlen = 10;.
14de0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
14df0 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
14e00 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d  {.    sp = lemp-
14e10 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
14e20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c   len = lemonStrl
14e30 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20  en(sp->name);.  
14e40 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e    if( len>maxlen
14e50 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b   ) maxlen = len;
14e60 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73 20  .  }.  ncolumns 
14e70 3d 20 37 36 2f 28 6d 61 78 6c 65 6e 2b 35 29 3b  = 76/(maxlen+5);
14e80 0a 20 20 69 66 28 20 6e 63 6f 6c 75 6d 6e 73 3c  .  if( ncolumns<
14e90 31 20 29 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 31  1 ) ncolumns = 1
14ea0 3b 0a 20 20 73 6b 69 70 20 3d 20 28 6c 65 6d 70  ;.  skip = (lemp
14eb0 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f 6c  ->nsymbol + ncol
14ec0 75 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f 6c 75 6d  umns - 1)/ncolum
14ed0 6e 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ns;.  for(i=0; i
14ee0 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  <skip; i++){.   
14ef0 20 70 72 69 6e 74 66 28 22 2f 2f 22 29 3b 0a 20   printf("//");. 
14f00 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c 65     for(j=i; j<le
14f10 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 3d  mp->nsymbol; j+=
14f20 73 6b 69 70 29 7b 0a 20 20 20 20 20 20 73 70 20  skip){.      sp 
14f30 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
14f40 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  j];.      assert
14f50 28 20 73 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20 29  ( sp->index==j )
14f60 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  ;.      printf("
14f70 20 25 33 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c 6d   %3d %-*.*s",j,m
14f80 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70 2d  axlen,maxlen,sp-
14f90 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  >name);.    }.  
14fa0 20 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a    printf("\n");.
14fb0 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d    }.  for(rp=lem
14fc0 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
14fd0 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 70  rp->next){.    p
14fe0 72 69 6e 74 66 28 22 25 73 22 2c 72 70 2d 3e 6c  rintf("%s",rp->l
14ff0 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f  hs->name);.    /
15000 2a 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73  *    if( rp->lhs
15010 61 6c 69 61 73 20 29 20 70 72 69 6e 74 66 28 22  alias ) printf("
15020 28 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61 6c 69  (%s)",rp->lhsali
15030 61 73 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e  as); */.    prin
15040 74 66 28 22 20 3a 3a 3d 22 29 3b 0a 20 20 20 20  tf(" ::=");.    
15050 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
15060 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
15070 20 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d   sp = rp->rhs[i]
15080 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  ;.      printf("
15090 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b   %s", sp->name);
150a0 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74  .      if( sp->t
150b0 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype==MULTITERMIN
150c0 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  AL ){.        fo
150d0 72 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75  r(j=1; j<sp->nsu
150e0 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  bsym; j++){.    
150f0 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 7c 25        printf("|%
15100 73 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a  s", sp->subsym[j
15110 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
15120 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
15130 20 20 2f 2a 20 69 66 28 20 72 70 2d 3e 72 68 73    /* if( rp->rhs
15140 61 6c 69 61 73 5b 69 5d 20 29 20 70 72 69 6e 74  alias[i] ) print
15150 66 28 22 28 25 73 29 22 2c 72 70 2d 3e 72 68 73  f("(%s)",rp->rhs
15160 61 6c 69 61 73 5b 69 5d 29 3b 20 2a 2f 0a 20 20  alias[i]); */.  
15170 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22    }.    printf("
15180 2e 22 29 3b 0a 20 20 20 20 69 66 28 20 72 70 2d  .");.    if( rp-
15190 3e 70 72 65 63 73 79 6d 20 29 20 70 72 69 6e 74  >precsym ) print
151a0 66 28 22 20 5b 25 73 5d 22 2c 72 70 2d 3e 70 72  f(" [%s]",rp->pr
151b0 65 63 73 79 6d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ecsym->name);.  
151c0 20 20 2f 2a 20 69 66 28 20 72 70 2d 3e 63 6f 64    /* if( rp->cod
151d0 65 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 20 20  e ) printf("\n  
151e0 20 20 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b    %s",rp->code);
151f0 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66 28 22   */.    printf("
15200 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69  \n");.  }.}..voi
15210 64 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 66 70  d ConfigPrint(fp
15220 2c 63 66 70 29 0a 46 49 4c 45 20 2a 66 70 3b 0a  ,cfp).FILE *fp;.
15230 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
15240 66 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 72  fp;.{.  struct r
15250 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72 75 63  ule *rp;.  struc
15260 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20  t symbol *sp;.  
15270 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 72 70 20 3d  int i, j;.  rp =
15280 20 63 66 70 2d 3e 72 70 3b 0a 20 20 66 70 72 69   cfp->rp;.  fpri
15290 6e 74 66 28 66 70 2c 22 25 73 20 3a 3a 3d 22 2c  ntf(fp,"%s ::=",
152a0 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a  rp->lhs->name);.
152b0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 72 70    for(i=0; i<=rp
152c0 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
152d0 20 20 69 66 28 20 69 3d 3d 63 66 70 2d 3e 64 6f    if( i==cfp->do
152e0 74 20 29 20 66 70 72 69 6e 74 66 28 66 70 2c 22  t ) fprintf(fp,"
152f0 20 2a 22 29 3b 0a 20 20 20 20 69 66 28 20 69 3d   *");.    if( i=
15300 3d 72 70 2d 3e 6e 72 68 73 20 29 20 62 72 65 61  =rp->nrhs ) brea
15310 6b 3b 0a 20 20 20 20 73 70 20 3d 20 72 70 2d 3e  k;.    sp = rp->
15320 72 68 73 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69  rhs[i];.    fpri
15330 6e 74 66 28 66 70 2c 22 20 25 73 22 2c 20 73 70  ntf(fp," %s", sp
15340 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  ->name);.    if(
15350 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49   sp->type==MULTI
15360 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
15370 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70 2d    for(j=1; j<sp-
15380 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a  >nsubsym; j++){.
15390 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
153a0 66 70 2c 22 7c 25 73 22 2c 73 70 2d 3e 73 75 62  fp,"|%s",sp->sub
153b0 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  sym[j]->name);. 
153c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
153d0 0a 7d 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20 54  .}../* #define T
153e0 45 53 54 20 2a 2f 0a 23 69 66 20 30 0a 2f 2a 20  EST */.#if 0./* 
153f0 50 72 69 6e 74 20 61 20 73 65 74 20 2a 2f 0a 50  Print a set */.P
15400 52 49 56 41 54 45 20 76 6f 69 64 20 53 65 74 50  RIVATE void SetP
15410 72 69 6e 74 28 6f 75 74 2c 73 65 74 2c 6c 65 6d  rint(out,set,lem
15420 70 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 63 68  p).FILE *out;.ch
15430 61 72 20 2a 73 65 74 3b 0a 73 74 72 75 63 74 20  ar *set;.struct 
15440 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20  lemon *lemp;.{. 
15450 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
15460 73 70 61 63 65 72 3b 0a 20 20 73 70 61 63 65 72  spacer;.  spacer
15470 20 3d 20 22 22 3b 0a 20 20 66 70 72 69 6e 74 66   = "";.  fprintf
15480 28 6f 75 74 2c 22 25 31 32 73 5b 22 2c 22 22 29  (out,"%12s[","")
15490 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ;.  for(i=0; i<l
154a0 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
154b0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 65  i++){.    if( Se
154c0 74 46 69 6e 64 28 73 65 74 2c 69 29 20 29 7b 0a  tFind(set,i) ){.
154d0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
154e0 74 2c 22 25 73 25 73 22 2c 73 70 61 63 65 72 2c  t,"%s%s",spacer,
154f0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
15500 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  ->name);.      s
15510 70 61 63 65 72 20 3d 20 22 20 22 3b 0a 20 20 20  pacer = " ";.   
15520 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
15530 28 6f 75 74 2c 22 5d 5c 6e 22 29 3b 0a 7d 0a 0a  (out,"]\n");.}..
15540 2f 2a 20 50 72 69 6e 74 20 61 20 70 6c 69 6e 6b  /* Print a plink
15550 20 63 68 61 69 6e 20 2a 2f 0a 50 52 49 56 41 54   chain */.PRIVAT
15560 45 20 76 6f 69 64 20 50 6c 69 6e 6b 50 72 69 6e  E void PlinkPrin
15570 74 28 6f 75 74 2c 70 6c 70 2c 74 61 67 29 0a 46  t(out,plp,tag).F
15580 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74  ILE *out;.struct
15590 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 63 68 61   plink *plp;.cha
155a0 72 20 2a 74 61 67 3b 0a 7b 0a 20 20 77 68 69 6c  r *tag;.{.  whil
155b0 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20 66 70  e( plp ){.    fp
155c0 72 69 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 25  rintf(out,"%12s%
155d0 73 20 28 73 74 61 74 65 20 25 32 64 29 20 22 2c  s (state %2d) ",
155e0 22 22 2c 74 61 67 2c 70 6c 70 2d 3e 63 66 70 2d  "",tag,plp->cfp-
155f0 3e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b  >stp->statenum);
15600 0a 20 20 20 20 43 6f 6e 66 69 67 50 72 69 6e 74  .    ConfigPrint
15610 28 6f 75 74 2c 70 6c 70 2d 3e 63 66 70 29 3b 0a  (out,plp->cfp);.
15620 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
15630 22 5c 6e 22 29 3b 0a 20 20 20 20 70 6c 70 20 3d  "\n");.    plp =
15640 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a   plp->next;.  }.
15650 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 50 72 69  }.#endif../* Pri
15660 6e 74 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20  nt an action to 
15670 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
15680 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
15690 72 6e 20 46 41 4c 53 45 20 69 66 0a 2a 2a 20 6e  rn FALSE if.** n
156a0 6f 74 68 69 6e 67 20 77 61 73 20 61 63 74 75 61  othing was actua
156b0 6c 6c 79 20 70 72 69 6e 74 65 64 2e 0a 2a 2f 0a  lly printed..*/.
156c0 69 6e 74 20 50 72 69 6e 74 41 63 74 69 6f 6e 28  int PrintAction(
156d0 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
156e0 70 2c 20 46 49 4c 45 20 2a 66 70 2c 20 69 6e 74  p, FILE *fp, int
156f0 20 69 6e 64 65 6e 74 29 7b 0a 20 20 69 6e 74 20   indent){.  int 
15700 72 65 73 75 6c 74 20 3d 20 31 3b 0a 20 20 73 77  result = 1;.  sw
15710 69 74 63 68 28 20 61 70 2d 3e 74 79 70 65 20 29  itch( ap->type )
15720 7b 0a 20 20 20 20 63 61 73 65 20 53 48 49 46 54  {.    case SHIFT
15730 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  :.      fprintf(
15740 66 70 2c 22 25 2a 73 20 73 68 69 66 74 20 20 25  fp,"%*s shift  %
15750 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70  d",indent,ap->sp
15760 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70  ->name,ap->x.stp
15770 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20  ->statenum);.   
15780 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
15790 73 65 20 52 45 44 55 43 45 3a 0a 20 20 20 20 20  se REDUCE:.     
157a0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
157b0 20 72 65 64 75 63 65 20 25 64 22 2c 69 6e 64 65   reduce %d",inde
157c0 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c  nt,ap->sp->name,
157d0 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 29  ap->x.rp->index)
157e0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
157f0 20 20 20 63 61 73 65 20 41 43 43 45 50 54 3a 0a     case ACCEPT:.
15800 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
15810 2c 22 25 2a 73 20 61 63 63 65 70 74 22 2c 69 6e  ,"%*s accept",in
15820 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
15830 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
15840 0a 20 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a  .    case ERROR:
15850 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66  .      fprintf(f
15860 70 2c 22 25 2a 73 20 65 72 72 6f 72 22 2c 69 6e  p,"%*s error",in
15870 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
15880 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
15890 0a 20 20 20 20 63 61 73 65 20 53 52 43 4f 4e 46  .    case SRCONF
158a0 4c 49 43 54 3a 0a 20 20 20 20 63 61 73 65 20 52  LICT:.    case R
158b0 52 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20  RCONFLICT:.     
158c0 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73   fprintf(fp,"%*s
158d0 20 72 65 64 75 63 65 20 25 2d 33 64 20 2a 2a 20   reduce %-3d ** 
158e0 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74  Parsing conflict
158f0 20 2a 2a 22 2c 0a 20 20 20 20 20 20 20 20 69 6e   **",.        in
15900 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
15910 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65  e,ap->x.rp->inde
15920 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
15930 0a 20 20 20 20 63 61 73 65 20 53 53 43 4f 4e 46  .    case SSCONF
15940 4c 49 43 54 3a 0a 20 20 20 20 20 20 66 70 72 69  LICT:.      fpri
15950 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66  ntf(fp,"%*s shif
15960 74 20 20 25 64 20 2a 2a 20 50 61 72 73 69 6e 67  t  %d ** Parsing
15970 20 63 6f 6e 66 6c 69 63 74 20 2a 2a 22 2c 20 0a   conflict **", .
15980 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74 2c 61          indent,a
15990 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e  p->sp->name,ap->
159a0 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29  x.stp->statenum)
159b0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
159c0 20 20 20 63 61 73 65 20 53 48 5f 52 45 53 4f 4c     case SH_RESOL
159d0 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20 52 44  VED:.    case RD
159e0 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 63  _RESOLVED:.    c
159f0 61 73 65 20 4e 4f 54 5f 55 53 45 44 3a 0a 20 20  ase NOT_USED:.  
15a00 20 20 20 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a      result = 0;.
15a10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
15a20 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74  .  return result
15a30 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  ;.}../* Generate
15a40 20 74 68 65 20 22 79 2e 6f 75 74 70 75 74 22 20   the "y.output" 
15a50 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 76 6f 69 64  log file */.void
15a60 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28 6c 65   ReportOutput(le
15a70 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
15a80 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20   *lemp;.{.  int 
15a90 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
15aa0 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74  e *stp;.  struct
15ab0 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20   config *cfp;.  
15ac0 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
15ad0 70 3b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a  p;.  FILE *fp;..
15ae0 20 20 66 70 20 3d 20 66 69 6c 65 5f 6f 70 65 6e    fp = file_open
15af0 28 6c 65 6d 70 2c 22 2e 6f 75 74 22 2c 22 77 62  (lemp,".out","wb
15b00 22 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30 20  ");.  if( fp==0 
15b10 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
15b20 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
15b30 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
15b40 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
15b50 64 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74  d[i];.    fprint
15b60 66 28 66 70 2c 22 53 74 61 74 65 20 25 64 3a 5c  f(fp,"State %d:\
15b70 6e 22 2c 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d  n",stp->statenum
15b80 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d 70 2d  );.    if( lemp-
15b90 3e 62 61 73 69 73 66 6c 61 67 20 29 20 63 66 70  >basisflag ) cfp
15ba0 3d 73 74 70 2d 3e 62 70 3b 0a 20 20 20 20 65 6c  =stp->bp;.    el
15bb0 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
15bc0 20 20 20 20 63 66 70 3d 73 74 70 2d 3e 63 66 70      cfp=stp->cfp
15bd0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 66 70  ;.    while( cfp
15be0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 62   ){.      char b
15bf0 75 66 5b 32 30 5d 3b 0a 20 20 20 20 20 20 69 66  uf[20];.      if
15c00 28 20 63 66 70 2d 3e 64 6f 74 3d 3d 63 66 70 2d  ( cfp->dot==cfp-
15c10 3e 72 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20  >rp->nrhs ){.   
15c20 20 20 20 20 20 73 70 72 69 6e 74 66 28 62 75 66       sprintf(buf
15c30 2c 22 28 25 64 29 22 2c 63 66 70 2d 3e 72 70 2d  ,"(%d)",cfp->rp-
15c40 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20  >index);.       
15c50 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 20 20   fprintf(fp,"   
15c60 20 25 35 73 20 22 2c 62 75 66 29 3b 0a 20 20 20   %5s ",buf);.   
15c70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15c80 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 20    fprintf(fp,"  
15c90 20 20 20 20 20 20 20 20 22 29 3b 0a 20 20 20 20          ");.    
15ca0 20 20 7d 0a 20 20 20 20 20 20 43 6f 6e 66 69 67    }.      Config
15cb0 50 72 69 6e 74 28 66 70 2c 63 66 70 29 3b 0a 20  Print(fp,cfp);. 
15cc0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
15cd0 22 5c 6e 22 29 3b 0a 23 69 66 20 30 0a 20 20 20  "\n");.#if 0.   
15ce0 20 20 20 53 65 74 50 72 69 6e 74 28 66 70 2c 63     SetPrint(fp,c
15cf0 66 70 2d 3e 66 77 73 2c 6c 65 6d 70 29 3b 0a 20  fp->fws,lemp);. 
15d00 20 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e 74 28       PlinkPrint(
15d10 66 70 2c 63 66 70 2d 3e 66 70 6c 70 2c 22 54 6f  fp,cfp->fplp,"To
15d20 20 20 22 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e    ");.      Plin
15d30 6b 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 62  kPrint(fp,cfp->b
15d40 70 6c 70 2c 22 46 72 6f 6d 22 29 3b 0a 23 65 6e  plp,"From");.#en
15d50 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 6c 65  dif.      if( le
15d60 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29 20  mp->basisflag ) 
15d70 63 66 70 3d 63 66 70 2d 3e 62 70 3b 0a 20 20 20  cfp=cfp->bp;.   
15d80 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20     else         
15d90 20 20 20 20 20 20 20 20 20 63 66 70 3d 63 66 70           cfp=cfp
15da0 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  ->next;.    }.  
15db0 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e    fprintf(fp,"\n
15dc0 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73  ");.    for(ap=s
15dd0 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  tp->ap; ap; ap=a
15de0 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
15df0 69 66 28 20 50 72 69 6e 74 41 63 74 69 6f 6e 28  if( PrintAction(
15e00 61 70 2c 66 70 2c 33 30 29 20 29 20 66 70 72 69  ap,fp,30) ) fpri
15e10 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20  ntf(fp,"\n");.  
15e20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
15e30 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  fp,"\n");.  }.  
15e40 66 70 72 69 6e 74 66 28 66 70 2c 20 22 2d 2d 2d  fprintf(fp, "---
15e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e80 2d 5c 6e 22 29 3b 0a 20 20 66 70 72 69 6e 74 66  -\n");.  fprintf
15e90 28 66 70 2c 20 22 53 79 6d 62 6f 6c 73 3a 5c 6e  (fp, "Symbols:\n
15ea0 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
15eb0 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
15ec0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6a 3b  i++){.    int j;
15ed0 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62  .    struct symb
15ee0 6f 6c 20 2a 73 70 3b 0a 0a 20 20 20 20 73 70 20  ol *sp;..    sp 
15ef0 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
15f00 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i];.    fprintf(
15f10 66 70 2c 20 22 20 20 25 33 64 3a 20 25 73 22 2c  fp, "  %3d: %s",
15f20 20 69 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20   i, sp->name);. 
15f30 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d     if( sp->type=
15f40 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  =NONTERMINAL ){.
15f50 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
15f60 2c 20 22 3a 22 29 3b 0a 20 20 20 20 20 20 69 66  , ":");.      if
15f70 28 20 73 70 2d 3e 6c 61 6d 62 64 61 20 29 7b 0a  ( sp->lambda ){.
15f80 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
15f90 66 70 2c 20 22 20 3c 6c 61 6d 62 64 61 3e 22 29  fp, " <lambda>")
15fa0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15fb0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70 2d  for(j=0; j<lemp-
15fc0 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b 29  >nterminal; j++)
15fd0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 70  {.        if( sp
15fe0 2d 3e 66 69 72 73 74 73 65 74 20 26 26 20 53 65  ->firstset && Se
15ff0 74 46 69 6e 64 28 73 70 2d 3e 66 69 72 73 74 73  tFind(sp->firsts
16000 65 74 2c 20 6a 29 20 29 7b 0a 20 20 20 20 20 20  et, j) ){.      
16010 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20      fprintf(fp, 
16020 22 20 25 73 22 2c 20 6c 65 6d 70 2d 3e 73 79 6d  " %s", lemp->sym
16030 62 6f 6c 73 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a  bols[j]->name);.
16040 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16050 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  }.    }.    fpri
16060 6e 74 66 28 66 70 2c 20 22 5c 6e 22 29 3b 0a 20  ntf(fp, "\n");. 
16070 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70 29 3b   }.  fclose(fp);
16080 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
16090 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
160a0 66 69 6c 65 20 22 6e 61 6d 65 22 20 77 68 69 63  file "name" whic
160b0 68 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65  h is in the same
160c0 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a   directory as.**
160d0 20 74 68 65 20 65 78 61 63 75 74 61 62 6c 65 20   the exacutable 
160e0 2a 2f 0a 50 52 49 56 41 54 45 20 63 68 61 72 20  */.PRIVATE char 
160f0 2a 70 61 74 68 73 65 61 72 63 68 28 61 72 67 76  *pathsearch(argv
16100 30 2c 6e 61 6d 65 2c 6d 6f 64 65 6d 61 73 6b 29  0,name,modemask)
16110 0a 63 68 61 72 20 2a 61 72 67 76 30 3b 0a 63 68  .char *argv0;.ch
16120 61 72 20 2a 6e 61 6d 65 3b 0a 69 6e 74 20 6d 6f  ar *name;.int mo
16130 64 65 6d 61 73 6b 3b 0a 7b 0a 20 20 63 68 61 72  demask;.{.  char
16140 20 2a 70 61 74 68 6c 69 73 74 3b 0a 20 20 63 68   *pathlist;.  ch
16150 61 72 20 2a 70 61 74 68 2c 2a 63 70 3b 0a 20 20  ar *path,*cp;.  
16160 63 68 61 72 20 63 3b 0a 0a 23 69 66 64 65 66 20  char c;..#ifdef 
16170 5f 5f 57 49 4e 33 32 5f 5f 0a 20 20 63 70 20 3d  __WIN32__.  cp =
16180 20 73 74 72 72 63 68 72 28 61 72 67 76 30 2c 27   strrchr(argv0,'
16190 5c 5c 27 29 3b 0a 23 65 6c 73 65 0a 20 20 63 70  \\');.#else.  cp
161a0 20 3d 20 73 74 72 72 63 68 72 28 61 72 67 76 30   = strrchr(argv0
161b0 2c 27 2f 27 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ,'/');.#endif.  
161c0 69 66 28 20 63 70 20 29 7b 0a 20 20 20 20 63 20  if( cp ){.    c 
161d0 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70 20 3d  = *cp;.    *cp =
161e0 20 30 3b 0a 20 20 20 20 70 61 74 68 20 3d 20 28   0;.    path = (
161f0 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c  char *)malloc( l
16200 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67 76 30  emonStrlen(argv0
16210 29 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  ) + lemonStrlen(
16220 6e 61 6d 65 29 20 2b 20 32 20 29 3b 0a 20 20 20  name) + 2 );.   
16230 20 69 66 28 20 70 61 74 68 20 29 20 73 70 72 69   if( path ) spri
16240 6e 74 66 28 70 61 74 68 2c 22 25 73 2f 25 73 22  ntf(path,"%s/%s"
16250 2c 61 72 67 76 30 2c 6e 61 6d 65 29 3b 0a 20 20  ,argv0,name);.  
16260 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 7d 65 6c    *cp = c;.  }el
16270 73 65 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 63  se{.    extern c
16280 68 61 72 20 2a 67 65 74 65 6e 76 28 29 3b 0a 20  har *getenv();. 
16290 20 20 20 70 61 74 68 6c 69 73 74 20 3d 20 67 65     pathlist = ge
162a0 74 65 6e 76 28 22 50 41 54 48 22 29 3b 0a 20 20  tenv("PATH");.  
162b0 20 20 69 66 28 20 70 61 74 68 6c 69 73 74 3d 3d    if( pathlist==
162c0 30 20 29 20 70 61 74 68 6c 69 73 74 20 3d 20 22  0 ) pathlist = "
162d0 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f 62 69 6e 22  .:/bin:/usr/bin"
162e0 3b 0a 20 20 20 20 70 61 74 68 20 3d 20 28 63 68  ;.    path = (ch
162f0 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d  ar *)malloc( lem
16300 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68 6c 69 73  onStrlen(pathlis
16310 74 29 2b 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6e  t)+lemonStrlen(n
16320 61 6d 65 29 2b 32 20 29 3b 0a 20 20 20 20 69 66  ame)+2 );.    if
16330 28 20 70 61 74 68 21 3d 30 20 29 7b 0a 20 20 20  ( path!=0 ){.   
16340 20 20 20 77 68 69 6c 65 28 20 2a 70 61 74 68 6c     while( *pathl
16350 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ist ){.        c
16360 70 20 3d 20 73 74 72 63 68 72 28 70 61 74 68 6c  p = strchr(pathl
16370 69 73 74 2c 27 3a 27 29 3b 0a 20 20 20 20 20 20  ist,':');.      
16380 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70    if( cp==0 ) cp
16390 20 3d 20 26 70 61 74 68 6c 69 73 74 5b 6c 65 6d   = &pathlist[lem
163a0 6f 6e 53 74 72 6c 65 6e 28 70 61 74 68 6c 69 73  onStrlen(pathlis
163b0 74 29 5d 3b 0a 20 20 20 20 20 20 20 20 63 20 3d  t)];.        c =
163c0 20 2a 63 70 3b 0a 20 20 20 20 20 20 20 20 2a 63   *cp;.        *c
163d0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  p = 0;.        s
163e0 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73 2f  printf(path,"%s/
163f0 25 73 22 2c 70 61 74 68 6c 69 73 74 2c 6e 61 6d  %s",pathlist,nam
16400 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 63 70 20  e);.        *cp 
16410 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = c;.        if(
16420 20 63 3d 3d 30 20 29 20 70 61 74 68 6c 69 73 74   c==0 ) pathlist
16430 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 65   = "";.        e
16440 6c 73 65 20 70 61 74 68 6c 69 73 74 20 3d 20 26  lse pathlist = &
16450 63 70 5b 31 5d 3b 0a 20 20 20 20 20 20 20 20 69  cp[1];.        i
16460 66 28 20 61 63 63 65 73 73 28 70 61 74 68 2c 6d  f( access(path,m
16470 6f 64 65 6d 61 73 6b 29 3d 3d 30 20 29 20 62 72  odemask)==0 ) br
16480 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
16490 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
164a0 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 47 69 76 65  path;.}../* Give
164b0 6e 20 61 6e 20 61 63 74 69 6f 6e 2c 20 63 6f 6d  n an action, com
164c0 70 75 74 65 20 74 68 65 20 69 6e 74 65 67 65 72  pute the integer
164d0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 61 74 20   value for that 
164e0 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68 20  action.** which 
164f0 69 73 20 74 6f 20 62 65 20 70 75 74 20 69 6e 20  is to be put in 
16500 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
16510 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
16520 64 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 52 65  d machine..** Re
16530 74 75 72 6e 20 6e 65 67 61 74 69 76 65 20 69 66  turn negative if
16540 20 6e 6f 20 61 63 74 69 6f 6e 20 73 68 6f 75 6c   no action shoul
16550 64 20 62 65 20 67 65 6e 65 72 61 74 65 64 2e 0a  d be generated..
16560 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 63  */.PRIVATE int c
16570 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65  ompute_action(le
16580 6d 70 2c 61 70 29 0a 73 74 72 75 63 74 20 6c 65  mp,ap).struct le
16590 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 73 74 72 75 63  mon *lemp;.struc
165a0 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 7b 0a  t action *ap;.{.
165b0 20 20 69 6e 74 20 61 63 74 3b 0a 20 20 73 77 69    int act;.  swi
165c0 74 63 68 28 20 61 70 2d 3e 74 79 70 65 20 29 7b  tch( ap->type ){
165d0 0a 20 20 20 20 63 61 73 65 20 53 48 49 46 54 3a  .    case SHIFT:
165e0 20 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e 73 74    act = ap->x.st
165f0 70 2d 3e 73 74 61 74 65 6e 75 6d 3b 20 20 20 20  p->statenum;    
16600 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
16610 20 20 20 63 61 73 65 20 52 45 44 55 43 45 3a 20     case REDUCE: 
16620 61 63 74 20 3d 20 61 70 2d 3e 78 2e 72 70 2d 3e  act = ap->x.rp->
16630 69 6e 64 65 78 20 2b 20 6c 65 6d 70 2d 3e 6e 73  index + lemp->ns
16640 74 61 74 65 3b 20 62 72 65 61 6b 3b 0a 20 20 20  tate; break;.   
16650 20 63 61 73 65 20 45 52 52 4f 52 3a 20 20 61 63   case ERROR:  ac
16660 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  t = lemp->nstate
16670 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 20   + lemp->nrule; 
16680 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
16690 61 73 65 20 41 43 43 45 50 54 3a 20 61 63 74 20  ase ACCEPT: act 
166a0 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b  = lemp->nstate +
166b0 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20 31   lemp->nrule + 1
166c0 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66  ; break;.    def
166d0 61 75 6c 74 3a 20 20 20 20 20 61 63 74 20 3d 20  ault:     act = 
166e0 2d 31 3b 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  -1; break;.  }. 
166f0 20 72 65 74 75 72 6e 20 61 63 74 3b 0a 7d 0a 0a   return act;.}..
16700 23 64 65 66 69 6e 65 20 4c 49 4e 45 53 49 5a 45  #define LINESIZE
16710 20 31 30 30 30 0a 2f 2a 20 54 68 65 20 6e 65 78   1000./* The nex
16720 74 20 63 6c 75 73 74 65 72 20 6f 66 20 72 6f 75  t cluster of rou
16730 74 69 6e 65 73 20 61 72 65 20 66 6f 72 20 72 65  tines are for re
16740 61 64 69 6e 67 20 74 68 65 20 74 65 6d 70 6c 61  ading the templa
16750 74 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 77  te file.** and w
16760 72 69 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c  riting the resul
16770 74 73 20 74 6f 20 74 68 65 20 67 65 6e 65 72 61  ts to the genera
16780 74 65 64 20 70 61 72 73 65 72 20 2a 2f 0a 2f 2a  ted parser */./*
16790 20 54 68 65 20 66 69 72 73 74 20 66 75 6e 63 74   The first funct
167a0 69 6f 6e 20 74 72 61 6e 73 66 65 72 73 20 64 61  ion transfers da
167b0 74 61 20 66 72 6f 6d 20 22 69 6e 22 20 74 6f 20  ta from "in" to 
167c0 22 6f 75 74 22 20 75 6e 74 69 6c 0a 2a 2a 20 61  "out" until.** a
167d0 20 6c 69 6e 65 20 69 73 20 73 65 65 6e 20 77 68   line is seen wh
167e0 69 63 68 20 62 65 67 69 6e 73 20 77 69 74 68 20  ich begins with 
167f0 22 25 25 22 2e 20 20 54 68 65 20 6c 69 6e 65 20  "%%".  The line 
16800 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 74 72 61  number is.** tra
16810 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 6e  cked..**.** if n
16820 61 6d 65 21 3d 30 2c 20 74 68 65 6e 20 61 6e 79  ame!=0, then any
16830 20 77 6f 72 64 20 74 68 61 74 20 62 65 67 69 6e   word that begin
16840 20 77 69 74 68 20 22 50 61 72 73 65 22 20 69 73   with "Parse" is
16850 20 63 68 61 6e 67 65 64 20 74 6f 0a 2a 2a 20 62   changed to.** b
16860 65 67 69 6e 20 77 69 74 68 20 2a 6e 61 6d 65 20  egin with *name 
16870 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 50 52 49 56  instead..*/.PRIV
16880 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 78 66  ATE void tplt_xf
16890 65 72 28 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 6c  er(name,in,out,l
168a0 69 6e 65 6e 6f 29 0a 63 68 61 72 20 2a 6e 61 6d  ineno).char *nam
168b0 65 3b 0a 46 49 4c 45 20 2a 69 6e 3b 0a 46 49 4c  e;.FILE *in;.FIL
168c0 45 20 2a 6f 75 74 3b 0a 69 6e 74 20 2a 6c 69 6e  E *out;.int *lin
168d0 65 6e 6f 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 20  eno;.{.  int i, 
168e0 69 53 74 61 72 74 3b 0a 20 20 63 68 61 72 20 6c  iStart;.  char l
168f0 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20  ine[LINESIZE];. 
16900 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 6c 69   while( fgets(li
16910 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29 20  ne,LINESIZE,in) 
16920 26 26 20 28 6c 69 6e 65 5b 30 5d 21 3d 27 25 27  && (line[0]!='%'
16930 20 7c 7c 20 6c 69 6e 65 5b 31 5d 21 3d 27 25 27   || line[1]!='%'
16940 29 20 29 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e  ) ){.    (*linen
16950 6f 29 2b 2b 3b 0a 20 20 20 20 69 53 74 61 72 74  o)++;.    iStart
16960 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 61   = 0;.    if( na
16970 6d 65 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  me ){.      for(
16980 69 3d 30 3b 20 6c 69 6e 65 5b 69 5d 3b 20 69 2b  i=0; line[i]; i+
16990 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
169a0 6c 69 6e 65 5b 69 5d 3d 3d 27 50 27 20 26 26 20  line[i]=='P' && 
169b0 73 74 72 6e 63 6d 70 28 26 6c 69 6e 65 5b 69 5d  strncmp(&line[i]
169c0 2c 22 50 61 72 73 65 22 2c 35 29 3d 3d 30 0a 20  ,"Parse",5)==0. 
169d0 20 20 20 20 20 20 20 20 20 26 26 20 28 69 3d 3d           && (i==
169e0 30 20 7c 7c 20 21 69 73 61 6c 70 68 61 28 6c 69  0 || !isalpha(li
169f0 6e 65 5b 69 2d 31 5d 29 29 0a 20 20 20 20 20 20  ne[i-1])).      
16a00 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
16a10 66 28 20 69 3e 69 53 74 61 72 74 20 29 20 66 70  f( i>iStart ) fp
16a20 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22  rintf(out,"%.*s"
16a30 2c 69 2d 69 53 74 61 72 74 2c 26 6c 69 6e 65 5b  ,i-iStart,&line[
16a40 69 53 74 61 72 74 5d 29 3b 0a 20 20 20 20 20 20  iStart]);.      
16a50 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
16a60 22 25 73 22 2c 6e 61 6d 65 29 3b 0a 20 20 20 20  "%s",name);.    
16a70 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20        i += 4;.  
16a80 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d          iStart =
16a90 20 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   i+1;.        }.
16aa0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16ab0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
16ac0 73 22 2c 26 6c 69 6e 65 5b 69 53 74 61 72 74 5d  s",&line[iStart]
16ad0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 54 68 65  );.  }.}../* The
16ae0 20 6e 65 78 74 20 66 75 6e 63 74 69 6f 6e 20 66   next function f
16af0 69 6e 64 73 20 74 68 65 20 74 65 6d 70 6c 61 74  inds the templat
16b00 65 20 66 69 6c 65 20 61 6e 64 20 6f 70 65 6e 73  e file and opens
16b10 20 69 74 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a   it, returning.*
16b20 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
16b30 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 2e 20  he opened file. 
16b40 2a 2f 0a 50 52 49 56 41 54 45 20 46 49 4c 45 20  */.PRIVATE FILE 
16b50 2a 74 70 6c 74 5f 6f 70 65 6e 28 6c 65 6d 70 29  *tplt_open(lemp)
16b60 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
16b70 65 6d 70 3b 0a 7b 0a 20 20 73 74 61 74 69 63 20  emp;.{.  static 
16b80 63 68 61 72 20 74 65 6d 70 6c 61 74 65 6e 61 6d  char templatenam
16b90 65 5b 5d 20 3d 20 22 6c 65 6d 70 61 72 2e 63 22  e[] = "lempar.c"
16ba0 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 31 30 30  ;.  char buf[100
16bb0 30 5d 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a  0];.  FILE *in;.
16bc0 20 20 63 68 61 72 20 2a 74 70 6c 74 6e 61 6d 65    char *tpltname
16bd0 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20  ;.  char *cp;.. 
16be0 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 6c 65   cp = strrchr(le
16bf0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 27 2e 27  mp->filename,'.'
16c00 29 3b 0a 20 20 69 66 28 20 63 70 20 29 7b 0a 20  );.  if( cp ){. 
16c10 20 20 20 73 70 72 69 6e 74 66 28 62 75 66 2c 22     sprintf(buf,"
16c20 25 2e 2a 73 2e 6c 74 22 2c 28 69 6e 74 29 28 63  %.*s.lt",(int)(c
16c30 70 2d 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  p-lemp->filename
16c40 29 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  ),lemp->filename
16c50 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
16c60 73 70 72 69 6e 74 66 28 62 75 66 2c 22 25 73 2e  sprintf(buf,"%s.
16c70 6c 74 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  lt",lemp->filena
16c80 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61  me);.  }.  if( a
16c90 63 63 65 73 73 28 62 75 66 2c 30 30 34 29 3d 3d  ccess(buf,004)==
16ca0 30 20 29 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d  0 ){.    tpltnam
16cb0 65 20 3d 20 62 75 66 3b 0a 20 20 7d 65 6c 73 65  e = buf;.  }else
16cc0 20 69 66 28 20 61 63 63 65 73 73 28 74 65 6d 70   if( access(temp
16cd0 6c 61 74 65 6e 61 6d 65 2c 30 30 34 29 3d 3d 30  latename,004)==0
16ce0 20 29 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65   ){.    tpltname
16cf0 20 3d 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 3b   = templatename;
16d00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 70  .  }else{.    tp
16d10 6c 74 6e 61 6d 65 20 3d 20 70 61 74 68 73 65 61  ltname = pathsea
16d20 72 63 68 28 6c 65 6d 70 2d 3e 61 72 67 76 30 2c  rch(lemp->argv0,
16d30 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 29 3b  templatename,0);
16d40 0a 20 20 7d 0a 20 20 69 66 28 20 74 70 6c 74 6e  .  }.  if( tpltn
16d50 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70  ame==0 ){.    fp
16d60 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61  rintf(stderr,"Ca
16d70 6e 27 74 20 66 69 6e 64 20 74 68 65 20 70 61 72  n't find the par
16d80 73 65 72 20 64 72 69 76 65 72 20 74 65 6d 70 6c  ser driver templ
16d90 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e  ate file \"%s\".
16da0 5c 6e 22 2c 0a 20 20 20 20 74 65 6d 70 6c 61 74  \n",.    templat
16db0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70  ename);.    lemp
16dc0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
16dd0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
16de0 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 74 70 6c    in = fopen(tpl
16df0 74 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69  tname,"rb");.  i
16e00 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  f( in==0 ){.    
16e10 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
16e20 43 61 6e 27 74 20 6f 70 65 6e 20 74 68 65 20 74  Can't open the t
16e30 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25  emplate file \"%
16e40 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70 6c 61 74 65  s\".\n",template
16e50 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d  name);.    lemp-
16e60 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
16e70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
16e80 20 72 65 74 75 72 6e 20 69 6e 3b 0a 7d 0a 0a 2f   return in;.}../
16e90 2a 20 50 72 69 6e 74 20 61 20 23 6c 69 6e 65 20  * Print a #line 
16ea0 64 69 72 65 63 74 69 76 65 20 6c 69 6e 65 20 74  directive line t
16eb0 6f 20 74 68 65 20 6f 75 74 70 75 74 20 66 69 6c  o the output fil
16ec0 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  e. */.PRIVATE vo
16ed0 69 64 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28  id tplt_linedir(
16ee0 6f 75 74 2c 6c 69 6e 65 6e 6f 2c 66 69 6c 65 6e  out,lineno,filen
16ef0 61 6d 65 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a  ame).FILE *out;.
16f00 69 6e 74 20 6c 69 6e 65 6e 6f 3b 0a 63 68 61 72  int lineno;.char
16f10 20 2a 66 69 6c 65 6e 61 6d 65 3b 0a 7b 0a 20 20   *filename;.{.  
16f20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 6c 69  fprintf(out,"#li
16f30 6e 65 20 25 64 20 5c 22 22 2c 6c 69 6e 65 6e 6f  ne %d \"",lineno
16f40 29 3b 0a 20 20 77 68 69 6c 65 28 20 2a 66 69 6c  );.  while( *fil
16f50 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 69 66 28  ename ){.    if(
16f60 20 2a 66 69 6c 65 6e 61 6d 65 20 3d 3d 20 27 5c   *filename == '\
16f70 5c 27 20 29 20 70 75 74 63 28 27 5c 5c 27 2c 6f  \' ) putc('\\',o
16f80 75 74 29 3b 0a 20 20 20 20 70 75 74 63 28 2a 66  ut);.    putc(*f
16f90 69 6c 65 6e 61 6d 65 2c 6f 75 74 29 3b 0a 20 20  ilename,out);.  
16fa0 20 20 66 69 6c 65 6e 61 6d 65 2b 2b 3b 0a 20 20    filename++;.  
16fb0 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
16fc0 22 5c 22 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a 20 50  "\"\n");.}../* P
16fd0 72 69 6e 74 20 61 20 73 74 72 69 6e 67 20 74 6f  rint a string to
16fe0 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 6b 65   the file and ke
16ff0 65 70 20 74 68 65 20 6c 69 6e 65 6e 75 6d 62 65  ep the linenumbe
17000 72 20 75 70 20 74 6f 20 64 61 74 65 20 2a 2f 0a  r up to date */.
17010 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c  PRIVATE void tpl
17020 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70  t_print(out,lemp
17030 2c 73 74 72 2c 6c 69 6e 65 6e 6f 29 0a 46 49 4c  ,str,lineno).FIL
17040 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20 6c  E *out;.struct l
17050 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 63 68 61 72  emon *lemp;.char
17060 20 2a 73 74 72 3b 0a 69 6e 74 20 2a 6c 69 6e 65   *str;.int *line
17070 6e 6f 3b 0a 7b 0a 20 20 69 66 28 20 73 74 72 3d  no;.{.  if( str=
17080 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
17090 68 69 6c 65 28 20 2a 73 74 72 20 29 7b 0a 20 20  hile( *str ){.  
170a0 20 20 70 75 74 63 28 2a 73 74 72 2c 6f 75 74 29    putc(*str,out)
170b0 3b 0a 20 20 20 20 69 66 28 20 2a 73 74 72 3d 3d  ;.    if( *str==
170c0 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29  '\n' ) (*lineno)
170d0 2b 2b 3b 0a 20 20 20 20 73 74 72 2b 2b 3b 0a 20  ++;.    str++;. 
170e0 20 7d 0a 20 20 69 66 28 20 73 74 72 5b 2d 31 5d   }.  if( str[-1]
170f0 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 70 75  !='\n' ){.    pu
17100 74 63 28 27 5c 6e 27 2c 6f 75 74 29 3b 0a 20 20  tc('\n',out);.  
17110 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20    (*lineno)++;. 
17120 20 7d 0a 20 20 69 66 20 28 21 6c 65 6d 70 2d 3e   }.  if (!lemp->
17130 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b  nolinenosflag) {
17140 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  .    (*lineno)++
17150 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f  ; tplt_linedir(o
17160 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d  ut,*lineno,lemp-
17170 3e 6f 75 74 6e 61 6d 65 29 3b 20 0a 20 20 7d 0a  >outname); .  }.
17180 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a    return;.}../*.
17190 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
171a0 20 72 6f 75 74 69 6e 65 20 65 6d 69 74 73 20 63   routine emits c
171b0 6f 64 65 20 66 6f 72 20 74 68 65 20 64 65 73 74  ode for the dest
171c0 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65 0a 2a  ructor for the.*
171d0 2a 20 73 79 6d 62 6f 6c 20 73 70 0a 2a 2f 0a 76  * symbol sp.*/.v
171e0 6f 69 64 20 65 6d 69 74 5f 64 65 73 74 72 75 63  oid emit_destruc
171f0 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 73 70 2c  tor_code(out,sp,
17200 6c 65 6d 70 2c 6c 69 6e 65 6e 6f 29 0a 46 49 4c  lemp,lineno).FIL
17210 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20 73  E *out;.struct s
17220 79 6d 62 6f 6c 20 2a 73 70 3b 0a 73 74 72 75 63  ymbol *sp;.struc
17230 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69  t lemon *lemp;.i
17240 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 63  nt *lineno;.{. c
17250 68 61 72 20 2a 63 70 20 3d 20 30 3b 0a 0a 20 69  har *cp = 0;.. i
17260 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52  f( sp->type==TER
17270 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 63 70 20 3d  MINAL ){.   cp =
17280 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74   lemp->tokendest
17290 3b 0a 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29  ;.   if( cp==0 )
172a0 20 72 65 74 75 72 6e 3b 0a 20 20 20 66 70 72 69   return;.   fpri
172b0 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20  ntf(out,"{\n"); 
172c0 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65  (*lineno)++;. }e
172d0 6c 73 65 20 69 66 28 20 73 70 2d 3e 64 65 73 74  lse if( sp->dest
172e0 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 63 70 20  ructor ){.   cp 
172f0 3d 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72  = sp->destructor
17300 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  ;.   fprintf(out
17310 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e  ,"{\n"); (*linen
17320 6f 29 2b 2b 3b 0a 20 20 20 69 66 20 28 21 6c 65  o)++;.   if (!le
17330 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61  mp->nolinenosfla
17340 67 29 20 7b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  g) { (*lineno)++
17350 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f  ; tplt_linedir(o
17360 75 74 2c 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e  ut,sp->destLinen
17370 6f 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  o,lemp->filename
17380 29 3b 20 7d 0a 20 7d 65 6c 73 65 20 69 66 28 20  ); }. }else if( 
17390 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29 7b  lemp->vardest ){
173a0 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76  .   cp = lemp->v
173b0 61 72 64 65 73 74 3b 0a 20 20 20 69 66 28 20 63  ardest;.   if( c
173c0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
173d0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b    fprintf(out,"{
173e0 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n"); (*lineno)+
173f0 2b 3b 0a 20 7d 65 6c 73 65 7b 0a 20 20 20 61 73  +;. }else{.   as
17400 73 65 72 74 28 20 30 20 29 3b 20 20 2f 2a 20 43  sert( 0 );  /* C
17410 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a  annot happen */.
17420 20 7d 0a 20 66 6f 72 28 3b 20 2a 63 70 3b 20 63   }. for(; *cp; c
17430 70 2b 2b 29 7b 0a 20 20 20 69 66 28 20 2a 63 70  p++){.   if( *cp
17440 3d 3d 27 24 27 20 26 26 20 63 70 5b 31 5d 3d 3d  =='$' && cp[1]==
17450 27 24 27 20 29 7b 0a 20 20 20 20 20 66 70 72 69  '$' ){.     fpri
17460 6e 74 66 28 6f 75 74 2c 22 28 79 79 70 6d 69 6e  ntf(out,"(yypmin
17470 6f 72 2d 3e 79 79 25 64 29 22 2c 73 70 2d 3e 64  or->yy%d)",sp->d
17480 74 6e 75 6d 29 3b 0a 20 20 20 20 20 63 70 2b 2b  tnum);.     cp++
17490 3b 0a 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  ;.     continue;
174a0 0a 20 20 20 7d 0a 20 20 20 69 66 28 20 2a 63 70  .   }.   if( *cp
174b0 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e  =='\n' ) (*linen
174c0 6f 29 2b 2b 3b 0a 20 20 20 66 70 75 74 63 28 2a  o)++;.   fputc(*
174d0 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20 66 70 72  cp,out);. }. fpr
174e0 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20  intf(out,"\n"); 
174f0 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 69 66  (*lineno)++;. if
17500 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e   (!lemp->nolinen
17510 6f 73 66 6c 61 67 29 20 7b 20 0a 20 20 20 28 2a  osflag) { .   (*
17520 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f  lineno)++; tplt_
17530 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e  linedir(out,*lin
17540 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  eno,lemp->outnam
17550 65 29 3b 20 0a 20 7d 0a 20 66 70 72 69 6e 74 66  e); . }. fprintf
17560 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a 6c  (out,"}\n"); (*l
17570 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 72 65 74 75 72  ineno)++;. retur
17580 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  n;.}../*.** Retu
17590 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72  rn TRUE (non-zer
175a0 6f 29 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  o) if the given 
175b0 73 79 6d 62 6f 6c 20 68 61 73 20 61 20 64 65 73  symbol has a des
175c0 74 72 75 63 74 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  tructor..*/.int 
175d0 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28 73  has_destructor(s
175e0 70 2c 20 6c 65 6d 70 29 0a 73 74 72 75 63 74 20  p, lemp).struct 
175f0 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 73 74 72 75  symbol *sp;.stru
17600 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
17610 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 69  {.  int ret;.  i
17620 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52  f( sp->type==TER
17630 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 72 65 74  MINAL ){.    ret
17640 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65   = lemp->tokende
17650 73 74 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  st!=0;.  }else{.
17660 20 20 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e      ret = lemp->
17670 76 61 72 64 65 73 74 21 3d 30 20 7c 7c 20 73 70  vardest!=0 || sp
17680 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30 3b  ->destructor!=0;
17690 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
176a0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  t;.}../*.** Appe
176b0 6e 64 20 74 65 78 74 20 74 6f 20 61 20 64 79 6e  nd text to a dyn
176c0 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74  amically allocat
176d0 65 64 20 73 74 72 69 6e 67 2e 20 20 49 66 20 7a  ed string.  If z
176e0 54 65 78 74 20 69 73 20 30 20 74 68 65 6e 0a 2a  Text is 0 then.*
176f0 2a 20 72 65 73 65 74 20 74 68 65 20 73 74 72 69  * reset the stri
17700 6e 67 20 74 6f 20 62 65 20 65 6d 70 74 79 20 61  ng to be empty a
17710 67 61 69 6e 2e 20 20 41 6c 77 61 79 73 20 72 65  gain.  Always re
17720 74 75 72 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74  turn the complet
17730 65 20 74 65 78 74 0a 2a 2a 20 6f 66 20 74 68 65  e text.** of the
17740 20 73 74 72 69 6e 67 20 28 77 68 69 63 68 20 69   string (which i
17750 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  s overwritten wi
17760 74 68 20 65 61 63 68 20 63 61 6c 6c 29 2e 0a 2a  th each call)..*
17770 2a 0a 2a 2a 20 6e 20 62 79 74 65 73 20 6f 66 20  *.** n bytes of 
17780 7a 54 65 78 74 20 61 72 65 20 73 74 6f 72 65 64  zText are stored
17790 2e 20 20 49 66 20 6e 3d 3d 30 20 74 68 65 6e 20  .  If n==0 then 
177a0 61 6c 6c 20 6f 66 20 7a 54 65 78 74 20 75 70 20  all of zText up 
177b0 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  to the first.** 
177c0 5c 30 30 30 20 74 65 72 6d 69 6e 61 74 6f 72 20  \000 terminator 
177d0 69 73 20 73 74 6f 72 65 64 2e 20 20 7a 54 65 78  is stored.  zTex
177e0 74 20 63 61 6e 20 63 6f 6e 74 61 69 6e 20 75 70  t can contain up
177f0 20 74 6f 20 74 77 6f 20 69 6e 73 74 61 6e 63 65   to two instance
17800 73 20 6f 66 0a 2a 2a 20 25 64 2e 20 20 54 68 65  s of.** %d.  The
17810 20 76 61 6c 75 65 73 20 6f 66 20 70 31 20 61 6e   values of p1 an
17820 64 20 70 32 20 61 72 65 20 77 72 69 74 74 65 6e  d p2 are written
17830 20 69 6e 74 6f 20 74 68 65 20 66 69 72 73 74 20   into the first 
17840 61 6e 64 20 73 65 63 6f 6e 64 0a 2a 2a 20 25 64  and second.** %d
17850 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 2d 31  ..**.** If n==-1
17860 2c 20 74 68 65 6e 20 74 68 65 20 70 72 65 76 69  , then the previ
17870 6f 75 73 20 63 68 61 72 61 63 74 65 72 20 69 73  ous character is
17880 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2f   overwritten..*/
17890 0a 50 52 49 56 41 54 45 20 63 68 61 72 20 2a 61  .PRIVATE char *a
178a0 70 70 65 6e 64 5f 73 74 72 28 63 68 61 72 20 2a  ppend_str(char *
178b0 7a 54 65 78 74 2c 20 69 6e 74 20 6e 2c 20 69 6e  zText, int n, in
178c0 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20  t p1, int p2){. 
178d0 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 7a 20   static char *z 
178e0 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
178f0 74 20 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20  t alloced = 0;. 
17900 20 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 64   static int used
17910 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 3b 0a 20   = 0;.  int c;. 
17920 20 63 68 61 72 20 7a 49 6e 74 5b 34 30 5d 3b 0a   char zInt[40];.
17930 0a 20 20 69 66 28 20 7a 54 65 78 74 3d 3d 30 20  .  if( zText==0 
17940 29 7b 0a 20 20 20 20 75 73 65 64 20 3d 20 30 3b  ){.    used = 0;
17950 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 3b 0a 20  .    return z;. 
17960 20 7d 0a 20 20 69 66 28 20 6e 3c 3d 30 20 29 7b   }.  if( n<=0 ){
17970 0a 20 20 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a  .    if( n<0 ){.
17980 20 20 20 20 20 20 75 73 65 64 20 2b 3d 20 6e 3b        used += n;
17990 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 75  .      assert( u
179a0 73 65 64 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  sed>=0 );.    }.
179b0 20 20 20 20 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72      n = lemonStr
179c0 6c 65 6e 28 7a 54 65 78 74 29 3b 0a 20 20 7d 0a  len(zText);.  }.
179d0 20 20 69 66 28 20 6e 2b 73 69 7a 65 6f 66 28 7a    if( n+sizeof(z
179e0 49 6e 74 29 2a 32 2b 75 73 65 64 20 3e 3d 20 61  Int)*2+used >= a
179f0 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 61 6c  lloced ){.    al
17a00 6c 6f 63 65 64 20 3d 20 6e 20 2b 20 73 69 7a 65  loced = n + size
17a10 6f 66 28 7a 49 6e 74 29 2a 32 20 2b 20 75 73 65  of(zInt)*2 + use
17a20 64 20 2b 20 32 30 30 3b 0a 20 20 20 20 7a 20 3d  d + 200;.    z =
17a30 20 72 65 61 6c 6c 6f 63 28 7a 2c 20 20 61 6c 6c   realloc(z,  all
17a40 6f 63 65 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28  oced);.  }.  if(
17a50 20 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 22   z==0 ) return "
17a60 22 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20  ";.  while( n-- 
17a70 3e 20 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a  > 0 ){.    c = *
17a80 28 7a 54 65 78 74 2b 2b 29 3b 0a 20 20 20 20 69  (zText++);.    i
17a90 66 28 20 63 3d 3d 27 25 27 20 26 26 20 6e 3e 30  f( c=='%' && n>0
17aa0 20 26 26 20 7a 54 65 78 74 5b 30 5d 3d 3d 27 64   && zText[0]=='d
17ab0 27 20 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e  ' ){.      sprin
17ac0 74 66 28 7a 49 6e 74 2c 20 22 25 64 22 2c 20 70  tf(zInt, "%d", p
17ad0 31 29 3b 0a 20 20 20 20 20 20 70 31 20 3d 20 70  1);.      p1 = p
17ae0 32 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28  2;.      strcpy(
17af0 26 7a 5b 75 73 65 64 5d 2c 20 7a 49 6e 74 29 3b  &z[used], zInt);
17b00 0a 20 20 20 20 20 20 75 73 65 64 20 2b 3d 20 6c  .      used += l
17b10 65 6d 6f 6e 53 74 72 6c 65 6e 28 26 7a 5b 75 73  emonStrlen(&z[us
17b20 65 64 5d 29 3b 0a 20 20 20 20 20 20 7a 54 65 78  ed]);.      zTex
17b30 74 2b 2b 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  t++;.      n--;.
17b40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17b50 20 7a 5b 75 73 65 64 2b 2b 5d 20 3d 20 63 3b 0a   z[used++] = c;.
17b60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 5b 75 73      }.  }.  z[us
17b70 65 64 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ed] = 0;.  retur
17b80 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 7a 43  n z;.}../*.** zC
17b90 6f 64 65 20 69 73 20 61 20 73 74 72 69 6e 67 20  ode is a string 
17ba0 74 68 61 74 20 69 73 20 74 68 65 20 61 63 74 69  that is the acti
17bb0 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
17bc0 74 68 20 61 20 72 75 6c 65 2e 20 20 45 78 70 61  th a rule.  Expa
17bd0 6e 64 0a 2a 2a 20 74 68 65 20 73 79 6d 62 6f 6c  nd.** the symbol
17be0 73 20 69 6e 20 74 68 69 73 20 73 74 72 69 6e 67  s in this string
17bf0 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 66   so that the ref
17c00 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74 73 20 6f  er to elements o
17c10 66 20 74 68 65 20 70 61 72 73 65 72 0a 2a 2a 20  f the parser.** 
17c20 73 74 61 63 6b 2e 0a 2a 2f 0a 50 52 49 56 41 54  stack..*/.PRIVAT
17c30 45 20 76 6f 69 64 20 74 72 61 6e 73 6c 61 74 65  E void translate
17c40 5f 63 6f 64 65 28 73 74 72 75 63 74 20 6c 65 6d  _code(struct lem
17c50 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74  on *lemp, struct
17c60 20 72 75 6c 65 20 2a 72 70 29 7b 0a 20 20 63 68   rule *rp){.  ch
17c70 61 72 20 2a 63 70 2c 20 2a 78 70 3b 0a 20 20 69  ar *cp, *xp;.  i
17c80 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 6c 68 73  nt i;.  char lhs
17c90 75 73 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20  used = 0;    /* 
17ca0 54 72 75 65 20 69 66 20 74 68 65 20 4c 48 53 20  True if the LHS 
17cb0 65 6c 65 6d 65 6e 74 20 68 61 73 20 62 65 65 6e  element has been
17cc0 20 75 73 65 64 20 2a 2f 0a 20 20 63 68 61 72 20   used */.  char 
17cd0 75 73 65 64 5b 4d 41 58 52 48 53 5d 3b 20 20 20  used[MAXRHS];   
17ce0 2f 2a 20 54 72 75 65 20 66 6f 72 20 65 61 63 68  /* True for each
17cf0 20 52 48 53 20 65 6c 65 6d 65 6e 74 20 77 68 69   RHS element whi
17d00 63 68 20 69 73 20 75 73 65 64 20 2a 2f 0a 0a 20  ch is used */.. 
17d10 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
17d20 6e 72 68 73 3b 20 69 2b 2b 29 20 75 73 65 64 5b  nrhs; i++) used[
17d30 69 5d 20 3d 20 30 3b 0a 20 20 6c 68 73 75 73 65  i] = 0;.  lhsuse
17d40 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 72 70  d = 0;..  if( rp
17d50 2d 3e 63 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  ->code==0 ){.   
17d60 20 72 70 2d 3e 63 6f 64 65 20 3d 20 22 5c 6e 22   rp->code = "\n"
17d70 3b 0a 20 20 20 20 72 70 2d 3e 6c 69 6e 65 20 3d  ;.    rp->line =
17d80 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 3b 0a 20   rp->ruleline;. 
17d90 20 7d 0a 0a 20 20 61 70 70 65 6e 64 5f 73 74 72   }..  append_str
17da0 28 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 66 6f 72  (0,0,0,0);.  for
17db0 28 63 70 3d 72 70 2d 3e 63 6f 64 65 3b 20 2a 63  (cp=rp->code; *c
17dc0 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 69 66  p; cp++){.    if
17dd0 28 20 69 73 61 6c 70 68 61 28 2a 63 70 29 20 26  ( isalpha(*cp) &
17de0 26 20 28 63 70 3d 3d 72 70 2d 3e 63 6f 64 65 20  & (cp==rp->code 
17df0 7c 7c 20 28 21 69 73 61 6c 6e 75 6d 28 63 70 5b  || (!isalnum(cp[
17e00 2d 31 5d 29 20 26 26 20 63 70 5b 2d 31 5d 21 3d  -1]) && cp[-1]!=
17e10 27 5f 27 29 29 20 29 7b 0a 20 20 20 20 20 20 63  '_')) ){.      c
17e20 68 61 72 20 73 61 76 65 64 3b 0a 20 20 20 20 20  har saved;.     
17e30 20 66 6f 72 28 78 70 3d 20 26 63 70 5b 31 5d 3b   for(xp= &cp[1];
17e40 20 69 73 61 6c 6e 75 6d 28 2a 78 70 29 20 7c 7c   isalnum(*xp) ||
17e50 20 2a 78 70 3d 3d 27 5f 27 3b 20 78 70 2b 2b 29   *xp=='_'; xp++)
17e60 3b 0a 20 20 20 20 20 20 73 61 76 65 64 20 3d 20  ;.      saved = 
17e70 2a 78 70 3b 0a 20 20 20 20 20 20 2a 78 70 20 3d  *xp;.      *xp =
17e80 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70   0;.      if( rp
17e90 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20 73 74  ->lhsalias && st
17ea0 72 63 6d 70 28 63 70 2c 72 70 2d 3e 6c 68 73 61  rcmp(cp,rp->lhsa
17eb0 6c 69 61 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lias)==0 ){.    
17ec0 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22      append_str("
17ed0 79 79 67 6f 74 6f 6d 69 6e 6f 72 2e 79 79 25 64  yygotominor.yy%d
17ee0 22 2c 30 2c 72 70 2d 3e 6c 68 73 2d 3e 64 74 6e  ",0,rp->lhs->dtn
17ef0 75 6d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 63  um,0);.        c
17f00 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20 20 20  p = xp;.        
17f10 6c 68 73 75 73 65 64 20 3d 20 31 3b 0a 20 20 20  lhsused = 1;.   
17f20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17f30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d    for(i=0; i<rp-
17f40 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
17f50 20 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 72         if( rp->r
17f60 68 73 61 6c 69 61 73 5b 69 5d 20 26 26 20 73 74  hsalias[i] && st
17f70 72 63 6d 70 28 63 70 2c 72 70 2d 3e 72 68 73 61  rcmp(cp,rp->rhsa
17f80 6c 69 61 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a 20  lias[i])==0 ){. 
17f90 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
17fa0 70 21 3d 72 70 2d 3e 63 6f 64 65 20 26 26 20 63  p!=rp->code && c
17fb0 70 5b 2d 31 5d 3d 3d 27 40 27 20 29 7b 0a 20 20  p[-1]=='@' ){.  
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
17fd0 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 69  f the argument i
17fe0 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 40 58  s of the form @X
17ff0 20 74 68 65 6e 20 73 75 62 73 74 69 74 75 74 65   then substitute
18000 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
18010 2a 2a 20 74 68 65 20 74 6f 6b 65 6e 20 6e 75 6d  ** the token num
18020 62 65 72 20 6f 66 20 58 2c 20 6e 6f 74 20 74 68  ber of X, not th
18030 65 20 76 61 6c 75 65 20 6f 66 20 58 20 2a 2f 0a  e value of X */.
18040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
18050 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73 70 5b  pend_str("yymsp[
18060 25 64 5d 2e 6d 61 6a 6f 72 22 2c 2d 31 2c 69 2d  %d].major",-1,i-
18070 72 70 2d 3e 6e 72 68 73 2b 31 2c 30 29 3b 0a 20  rp->nrhs+1,0);. 
18080 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
18090 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
180a0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
180b0 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a  p = rp->rhs[i];.
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
180d0 74 20 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20  t dtnum;.       
180e0 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74         if( sp->t
180f0 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype==MULTITERMIN
18100 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
18110 20 20 20 20 20 20 64 74 6e 75 6d 20 3d 20 73 70        dtnum = sp
18120 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 64 74 6e  ->subsym[0]->dtn
18130 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  um;.            
18140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18150 20 20 20 20 20 20 20 20 20 64 74 6e 75 6d 20 3d           dtnum =
18160 20 73 70 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20 20   sp->dtnum;.    
18170 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
18180 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64            append
18190 5f 73 74 72 28 22 79 79 6d 73 70 5b 25 64 5d 2e  _str("yymsp[%d].
181a0 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 30 2c 69 2d  minor.yy%d",0,i-
181b0 72 70 2d 3e 6e 72 68 73 2b 31 2c 20 64 74 6e 75  rp->nrhs+1, dtnu
181c0 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  m);.            
181d0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 70  }.            cp
181e0 20 3d 20 78 70 3b 0a 20 20 20 20 20 20 20 20 20   = xp;.         
181f0 20 20 20 75 73 65 64 5b 69 5d 20 3d 20 31 3b 0a     used[i] = 1;.
18200 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
18210 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
18220 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
18230 0a 20 20 20 20 20 20 2a 78 70 20 3d 20 73 61 76  .      *xp = sav
18240 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 70  ed;.    }.    ap
18250 70 65 6e 64 5f 73 74 72 28 63 70 2c 20 31 2c 20  pend_str(cp, 1, 
18260 30 2c 20 30 29 3b 0a 20 20 7d 20 2f 2a 20 45 6e  0, 0);.  } /* En
18270 64 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 2f 2a 20  d loop */..  /* 
18280 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
18290 72 65 20 74 68 65 20 4c 48 53 20 68 61 73 20 62  re the LHS has b
182a0 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20 69 66  een used */.  if
182b0 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26  ( rp->lhsalias &
182c0 26 20 21 6c 68 73 75 73 65 64 20 29 7b 0a 20 20  & !lhsused ){.  
182d0 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
182e0 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75  >filename,rp->ru
182f0 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 22 4c  leline,.      "L
18300 61 62 65 6c 20 5c 22 25 73 5c 22 20 66 6f 72 20  abel \"%s\" for 
18310 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e 65  \"%s(%s)\" is ne
18320 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20 20  ver used.",.    
18330 20 20 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73      rp->lhsalias
18340 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 72  ,rp->lhs->name,r
18350 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20  p->lhsalias);.  
18360 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
18370 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  ++;.  }..  /* Ge
18380 6e 65 72 61 74 65 20 64 65 73 74 72 75 63 74 6f  nerate destructo
18390 72 20 63 6f 64 65 20 66 6f 72 20 52 48 53 20 73  r code for RHS s
183a0 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 61 72 65  ymbols which are
183b0 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 74 68 65   not used in the
183c0 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 63 6f 64  .  ** reduce cod
183d0 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
183e0 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
183f0 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68  {.    if( rp->rh
18400 73 61 6c 69 61 73 5b 69 5d 20 26 26 20 21 75 73  salias[i] && !us
18410 65 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 45  ed[i] ){.      E
18420 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
18430 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c  lename,rp->rulel
18440 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 22 4c 61  ine,.        "La
18450 62 65 6c 20 25 73 20 66 6f 72 20 5c 22 25 73 28  bel %s for \"%s(
18460 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72 20 75  %s)\" is never u
18470 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20 20 72  sed.",.        r
18480 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 2c 72  p->rhsalias[i],r
18490 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 2c  p->rhs[i]->name,
184a0 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29  rp->rhsalias[i])
184b0 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72  ;.      lemp->er
184c0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65  rorcnt++;.    }e
184d0 6c 73 65 20 69 66 28 20 72 70 2d 3e 72 68 73 61  lse if( rp->rhsa
184e0 6c 69 61 73 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  lias[i]==0 ){.  
184f0 20 20 20 20 69 66 28 20 68 61 73 5f 64 65 73 74      if( has_dest
18500 72 75 63 74 6f 72 28 72 70 2d 3e 72 68 73 5b 69  ructor(rp->rhs[i
18510 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20 20 20 20 20  ],lemp) ){.     
18520 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22 20     append_str(" 
18530 20 79 79 5f 64 65 73 74 72 75 63 74 6f 72 28 79   yy_destructor(y
18540 79 70 50 61 72 73 65 72 2c 25 64 2c 26 79 79 6d  ypParser,%d,&yym
18550 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29 3b 5c 6e  sp[%d].minor);\n
18560 22 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  ", 0,.          
18570 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 69 6e 64   rp->rhs[i]->ind
18580 65 78 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 29  ex,i-rp->nrhs+1)
18590 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
185a0 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 64 65 73         /* No des
185b0 74 72 75 63 74 6f 72 20 64 65 66 69 6e 65 64 20  tructor defined 
185c0 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a 2f  for this term */
185d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
185e0 20 7d 0a 20 20 69 66 28 20 72 70 2d 3e 63 6f 64   }.  if( rp->cod
185f0 65 20 29 7b 0a 20 20 20 20 63 70 20 3d 20 61 70  e ){.    cp = ap
18600 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c 30 2c 30  pend_str(0,0,0,0
18610 29 3b 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 20  );.    rp->code 
18620 3d 20 53 74 72 73 61 66 65 28 63 70 3f 63 70 3a  = Strsafe(cp?cp:
18630 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 0a  "");.  }.}../* .
18640 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
18650 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20   which executes 
18660 77 68 65 6e 20 74 68 65 20 72 75 6c 65 20 22 72  when the rule "r
18670 70 22 20 69 73 20 72 65 64 75 63 65 64 2e 20 20  p" is reduced.  
18680 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 63 6f 64  Write.** the cod
18690 65 20 74 6f 20 22 6f 75 74 22 2e 20 20 4d 61 6b  e to "out".  Mak
186a0 65 20 73 75 72 65 20 6c 69 6e 65 6e 6f 20 73 74  e sure lineno st
186b0 61 79 73 20 75 70 2d 74 6f 2d 64 61 74 65 2e 0a  ays up-to-date..
186c0 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
186d0 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c 72 70  emit_code(out,rp
186e0 2c 6c 65 6d 70 2c 6c 69 6e 65 6e 6f 29 0a 46 49  ,lemp,lineno).FI
186f0 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20  LE *out;.struct 
18700 72 75 6c 65 20 2a 72 70 3b 0a 73 74 72 75 63 74  rule *rp;.struct
18710 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e   lemon *lemp;.in
18720 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 63 68  t *lineno;.{. ch
18730 61 72 20 2a 63 70 3b 0a 0a 20 2f 2a 20 47 65 6e  ar *cp;.. /* Gen
18740 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 6f  erate code to do
18750 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69   the reduce acti
18760 6f 6e 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 63  on */. if( rp->c
18770 6f 64 65 20 29 7b 0a 20 20 20 69 66 20 28 21 6c  ode ){.   if (!l
18780 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c  emp->nolinenosfl
18790 61 67 29 20 7b 20 28 2a 6c 69 6e 65 6e 6f 29 2b  ag) { (*lineno)+
187a0 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28  +; tplt_linedir(
187b0 6f 75 74 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65 6d  out,rp->line,lem
187c0 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 20 7d 0a  p->filename); }.
187d0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
187e0 7b 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 0a  {%s",rp->code);.
187f0 20 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f     for(cp=rp->co
18800 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a  de; *cp; cp++){.
18810 20 20 20 20 20 69 66 28 20 2a 63 70 3d 3d 27 5c       if( *cp=='\
18820 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n' ) (*lineno)++
18830 3b 0a 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f  ;.   } /* End lo
18840 6f 70 20 2a 2f 0a 20 20 20 66 70 72 69 6e 74 66  op */.   fprintf
18850 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a 6c  (out,"}\n"); (*l
18860 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66 20  ineno)++;.   if 
18870 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f  (!lemp->nolineno
18880 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65 6e  sflag) { (*linen
18890 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64  o)++; tplt_lined
188a0 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c  ir(out,*lineno,l
188b0 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 7d  emp->outname); }
188c0 0a 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20 72  . } /* End if( r
188d0 70 2d 3e 63 6f 64 65 20 29 20 2a 2f 0a 0a 20 72  p->code ) */.. r
188e0 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
188f0 50 72 69 6e 74 20 74 68 65 20 64 65 66 69 6e 69  Print the defini
18900 74 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e 69 6f  tion of the unio
18910 6e 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 70  n used for the p
18920 61 72 73 65 72 27 73 20 64 61 74 61 20 73 74 61  arser's data sta
18930 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 75 6e 69 6f  ck..** This unio
18940 6e 20 63 6f 6e 74 61 69 6e 73 20 66 69 65 6c 64  n contains field
18950 73 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73 73  s for every poss
18960 69 62 6c 65 20 64 61 74 61 20 74 79 70 65 20 66  ible data type f
18970 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e 64  or tokens.** and
18980 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e 20 20   nonterminals.  
18990 49 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f  In the process o
189a0 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 64 20  f computing and 
189b0 70 72 69 6e 74 69 6e 67 20 74 68 69 73 0a 2a 2a  printing this.**
189c0 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73 65 74   union, also set
189d0 20 74 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69   the ".dtnum" fi
189e0 65 6c 64 20 6f 66 20 65 76 65 72 79 20 74 65 72  eld of every ter
189f0 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72  minal and nonter
18a00 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 2e  minal.** symbol.
18a10 0a 2a 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f 73  .*/.void print_s
18a20 74 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c  tack_union(out,l
18a30 65 6d 70 2c 70 6c 69 6e 65 6e 6f 2c 6d 68 66 6c  emp,plineno,mhfl
18a40 61 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 20 20  ag).FILE *out;  
18a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a60 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 73 74  /* The output st
18a70 72 65 61 6d 20 2a 2f 0a 73 74 72 75 63 74 20 6c  ream */.struct l
18a80 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 20 20 20 20 20  emon *lemp;     
18a90 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
18aa0 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 66  info structure f
18ab0 6f 72 20 74 68 69 73 20 70 61 72 73 65 72 20 2a  or this parser *
18ac0 2f 0a 69 6e 74 20 2a 70 6c 69 6e 65 6e 6f 3b 20  /.int *plineno; 
18ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18ae0 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
18af0 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 69  line number */.i
18b00 6e 74 20 6d 68 66 6c 61 67 3b 20 20 20 20 20 20  nt mhflag;      
18b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
18b20 75 65 20 69 66 20 67 65 6e 65 72 61 74 69 6e 67  ue if generating
18b30 20 6d 61 6b 65 68 65 61 64 65 72 73 20 6f 75 74   makeheaders out
18b40 70 75 74 20 2a 2f 0a 7b 0a 20 20 69 6e 74 20 6c  put */.{.  int l
18b50 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f  ineno = *plineno
18b60 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 6e 65  ;    /* The line
18b70 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6f   number of the o
18b80 75 74 70 75 74 20 2a 2f 0a 20 20 63 68 61 72 20  utput */.  char 
18b90 2a 2a 74 79 70 65 73 3b 20 20 20 20 20 20 20 20  **types;        
18ba0 20 20 20 20 20 2f 2a 20 41 20 68 61 73 68 20 74       /* A hash t
18bb0 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65  able of datatype
18bc0 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72 61 79  s */.  int array
18bd0 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
18be0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
18bf0 22 74 79 70 65 73 22 20 61 72 72 61 79 20 2a 2f  "types" array */
18c00 0a 20 20 69 6e 74 20 6d 61 78 64 74 6c 65 6e 67  .  int maxdtleng
18c10 74 68 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  th;          /* 
18c20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20 6f  Maximum length o
18c30 66 20 61 6e 79 20 22 2e 64 61 74 61 74 79 70 65  f any ".datatype
18c40 22 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 63 68  " field. */.  ch
18c50 61 72 20 2a 73 74 64 64 74 3b 20 20 20 20 20 20  ar *stddt;      
18c60 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 6e 64          /* Stand
18c70 61 72 64 69 7a 65 64 20 6e 61 6d 65 20 66 6f 72  ardized name for
18c80 20 61 20 64 61 74 61 74 79 70 65 20 2a 2f 0a 20   a datatype */. 
18c90 20 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20 20 20   int i,j;       
18ca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
18cb0 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
18cc0 20 69 6e 74 20 68 61 73 68 3b 20 20 20 20 20 20   int hash;      
18cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
18ce0 72 20 68 61 73 68 69 6e 67 20 74 68 65 20 6e 61  r hashing the na
18cf0 6d 65 20 6f 66 20 61 20 74 79 70 65 20 2a 2f 0a  me of a type */.
18d00 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20    char *name;   
18d10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
18d20 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72 73 65  ame of the parse
18d30 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  r */..  /* Alloc
18d40 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
18d50 7a 65 20 74 79 70 65 73 5b 5d 20 61 6e 64 20 61  ze types[] and a
18d60 6c 6c 6f 63 61 74 65 20 73 74 64 64 74 5b 5d 20  llocate stddt[] 
18d70 2a 2f 0a 20 20 61 72 72 61 79 73 69 7a 65 20 3d  */.  arraysize =
18d80 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2a   lemp->nsymbol *
18d90 20 32 3b 0a 20 20 74 79 70 65 73 20 3d 20 28 63   2;.  types = (c
18da0 68 61 72 2a 2a 29 63 61 6c 6c 6f 63 28 20 61 72  har**)calloc( ar
18db0 72 61 79 73 69 7a 65 2c 20 73 69 7a 65 6f 66 28  raysize, sizeof(
18dc0 63 68 61 72 2a 29 20 29 3b 0a 20 20 66 6f 72 28  char*) );.  for(
18dd0 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69 7a 65  i=0; i<arraysize
18de0 3b 20 69 2b 2b 29 20 74 79 70 65 73 5b 69 5d 20  ; i++) types[i] 
18df0 3d 20 30 3b 0a 20 20 6d 61 78 64 74 6c 65 6e 67  = 0;.  maxdtleng
18e00 74 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 6c 65  th = 0;.  if( le
18e10 6d 70 2d 3e 76 61 72 74 79 70 65 20 29 7b 0a 20  mp->vartype ){. 
18e20 20 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d     maxdtlength =
18e30 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d   lemonStrlen(lem
18e40 70 2d 3e 76 61 72 74 79 70 65 29 3b 0a 20 20 7d  p->vartype);.  }
18e50 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
18e60 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
18e70 29 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  ){.    int len;.
18e80 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
18e90 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79  l *sp = lemp->sy
18ea0 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66  mbols[i];.    if
18eb0 28 20 73 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d  ( sp->datatype==
18ec0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
18ed0 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72    len = lemonStr
18ee0 6c 65 6e 28 73 70 2d 3e 64 61 74 61 74 79 70 65  len(sp->datatype
18ef0 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d  );.    if( len>m
18f00 61 78 64 74 6c 65 6e 67 74 68 20 29 20 6d 61 78  axdtlength ) max
18f10 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 3b 0a  dtlength = len;.
18f20 20 20 7d 0a 20 20 73 74 64 64 74 20 3d 20 28 63    }.  stddt = (c
18f30 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 6d 61 78  har*)malloc( max
18f40 64 74 6c 65 6e 67 74 68 2a 32 20 2b 20 31 20 29  dtlength*2 + 1 )
18f50 3b 0a 20 20 69 66 28 20 74 79 70 65 73 3d 3d 30  ;.  if( types==0
18f60 20 7c 7c 20 73 74 64 64 74 3d 3d 30 20 29 7b 0a   || stddt==0 ){.
18f70 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
18f80 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72  rr,"Out of memor
18f90 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  y.\n");.    exit
18fa0 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 42  (1);.  }..  /* B
18fb0 75 69 6c 64 20 61 20 68 61 73 68 20 74 61 62 6c  uild a hash tabl
18fc0 65 20 6f 66 20 64 61 74 61 74 79 70 65 73 2e 20  e of datatypes. 
18fd0 54 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69 65  The ".dtnum" fie
18fe0 6c 64 20 6f 66 20 65 61 63 68 20 73 79 6d 62 6f  ld of each symbo
18ff0 6c 0a 20 20 2a 2a 20 69 73 20 66 69 6c 6c 65 64  l.  ** is filled
19000 20 69 6e 20 77 69 74 68 20 74 68 65 20 68 61 73   in with the has
19010 68 20 69 6e 64 65 78 20 70 6c 75 73 20 31 2e 20  h index plus 1. 
19020 20 41 20 22 2e 64 74 6e 75 6d 22 20 76 61 6c 75   A ".dtnum" valu
19030 65 20 6f 66 20 30 20 69 73 0a 20 20 2a 2a 20 75  e of 0 is.  ** u
19040 73 65 64 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c  sed for terminal
19050 20 73 79 6d 62 6f 6c 73 2e 20 20 49 66 20 74 68   symbols.  If th
19060 65 72 65 20 69 73 20 6e 6f 20 25 64 65 66 61 75  ere is no %defau
19070 6c 74 5f 74 79 70 65 20 64 65 66 69 6e 65 64 20  lt_type defined 
19080 74 68 65 6e 0a 20 20 2a 2a 20 30 20 69 73 20 61  then.  ** 0 is a
19090 6c 73 6f 20 75 73 65 64 20 61 73 20 74 68 65 20  lso used as the 
190a0 2e 64 74 6e 75 6d 20 76 61 6c 75 65 20 66 6f 72  .dtnum value for
190b0 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68   nonterminals wh
190c0 69 63 68 20 64 6f 20 6e 6f 74 20 73 70 65 63 69  ich do not speci
190d0 66 79 0a 20 20 2a 2a 20 61 20 64 61 74 61 74 79  fy.  ** a dataty
190e0 70 65 20 75 73 69 6e 67 20 74 68 65 20 25 74 79  pe using the %ty
190f0 70 65 20 64 69 72 65 63 74 69 76 65 2e 0a 20 20  pe directive..  
19100 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
19110 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
19120 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
19130 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d  symbol *sp = lem
19140 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
19150 20 20 20 63 68 61 72 20 2a 63 70 3b 0a 20 20 20     char *cp;.   
19160 20 69 66 28 20 73 70 3d 3d 6c 65 6d 70 2d 3e 65   if( sp==lemp->e
19170 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20 73  rrsym ){.      s
19180 70 2d 3e 64 74 6e 75 6d 20 3d 20 61 72 72 61 79  p->dtnum = array
19190 73 69 7a 65 2b 31 3b 0a 20 20 20 20 20 20 63 6f  size+1;.      co
191a0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
191b0 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 21 3d    if( sp->type!=
191c0 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 28  NONTERMINAL || (
191d0 73 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20  sp->datatype==0 
191e0 26 26 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65  && lemp->vartype
191f0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 70  ==0) ){.      sp
19200 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20  ->dtnum = 0;.   
19210 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
19220 20 7d 0a 20 20 20 20 63 70 20 3d 20 73 70 2d 3e   }.    cp = sp->
19230 64 61 74 61 74 79 70 65 3b 0a 20 20 20 20 69 66  datatype;.    if
19240 28 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20 6c  ( cp==0 ) cp = l
19250 65 6d 70 2d 3e 76 61 72 74 79 70 65 3b 0a 20 20  emp->vartype;.  
19260 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 77 68 69    j = 0;.    whi
19270 6c 65 28 20 69 73 73 70 61 63 65 28 2a 63 70 29  le( isspace(*cp)
19280 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69   ) cp++;.    whi
19290 6c 65 28 20 2a 63 70 20 29 20 73 74 64 64 74 5b  le( *cp ) stddt[
192a0 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b 0a 20 20  j++] = *cp++;.  
192b0 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20    while( j>0 && 
192c0 69 73 73 70 61 63 65 28 73 74 64 64 74 5b 6a 2d  isspace(stddt[j-
192d0 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 73  1]) ) j--;.    s
192e0 74 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20  tddt[j] = 0;.   
192f0 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e   if( lemp->token
19300 74 79 70 65 20 26 26 20 73 74 72 63 6d 70 28 73  type && strcmp(s
19310 74 64 64 74 2c 20 6c 65 6d 70 2d 3e 74 6f 6b 65  tddt, lemp->toke
19320 6e 74 79 70 65 29 3d 3d 30 20 29 7b 0a 20 20 20  ntype)==0 ){.   
19330 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30     sp->dtnum = 0
19340 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
19350 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73 68  ;.    }.    hash
19360 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d   = 0;.    for(j=
19370 30 3b 20 73 74 64 64 74 5b 6a 5d 3b 20 6a 2b 2b  0; stddt[j]; j++
19380 29 7b 0a 20 20 20 20 20 20 68 61 73 68 20 3d 20  ){.      hash = 
19390 68 61 73 68 2a 35 33 20 2b 20 73 74 64 64 74 5b  hash*53 + stddt[
193a0 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61  j];.    }.    ha
193b0 73 68 20 3d 20 28 68 61 73 68 20 26 20 30 78 37  sh = (hash & 0x7
193c0 66 66 66 66 66 66 66 29 25 61 72 72 61 79 73 69  fffffff)%arraysi
193d0 7a 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 74  ze;.    while( t
193e0 79 70 65 73 5b 68 61 73 68 5d 20 29 7b 0a 20 20  ypes[hash] ){.  
193f0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 74      if( strcmp(t
19400 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64 74  ypes[hash],stddt
19410 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
19420 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68  sp->dtnum = hash
19430 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72   + 1;.        br
19440 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
19450 20 20 20 68 61 73 68 2b 2b 3b 0a 20 20 20 20 20     hash++;.     
19460 20 69 66 28 20 68 61 73 68 3e 3d 61 72 72 61 79   if( hash>=array
19470 73 69 7a 65 20 29 20 68 61 73 68 20 3d 20 30 3b  size ) hash = 0;
19480 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74  .    }.    if( t
19490 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30 20 29 7b  ypes[hash]==0 ){
194a0 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d  .      sp->dtnum
194b0 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20 20 20   = hash + 1;.   
194c0 20 20 20 74 79 70 65 73 5b 68 61 73 68 5d 20 3d     types[hash] =
194d0 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20   (char*)malloc( 
194e0 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 74 64 64  lemonStrlen(stdd
194f0 74 29 2b 31 20 29 3b 0a 20 20 20 20 20 20 69 66  t)+1 );.      if
19500 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30  ( types[hash]==0
19510 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
19520 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20  ntf(stderr,"Out 
19530 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a  of memory.\n");.
19540 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b          exit(1);
19550 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
19560 74 72 63 70 79 28 74 79 70 65 73 5b 68 61 73 68  trcpy(types[hash
19570 5d 2c 73 74 64 64 74 29 3b 0a 20 20 20 20 7d 0a  ],stddt);.    }.
19580 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e 74 20    }..  /* Print 
19590 6f 75 74 20 74 68 65 20 64 65 66 69 6e 69 74 69  out the definiti
195a0 6f 6e 20 6f 66 20 59 59 54 4f 4b 45 4e 54 59 50  on of YYTOKENTYP
195b0 45 20 61 6e 64 20 59 59 4d 49 4e 4f 52 54 59 50  E and YYMINORTYP
195c0 45 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d 20 6c 65  E */.  name = le
195d0 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d  mp->name ? lemp-
195e0 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b  >name : "Parse";
195f0 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69  .  lineno = *pli
19600 6e 65 6e 6f 3b 0a 20 20 69 66 28 20 6d 68 66 6c  neno;.  if( mhfl
19610 61 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75  ag ){ fprintf(ou
19620 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43 45  t,"#if INTERFACE
19630 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20  \n"); lineno++; 
19640 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
19650 22 23 64 65 66 69 6e 65 20 25 73 54 4f 4b 45 4e  "#define %sTOKEN
19660 54 59 50 45 20 25 73 5c 6e 22 2c 6e 61 6d 65 2c  TYPE %s\n",name,
19670 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  .    lemp->token
19680 74 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  type?lemp->token
19690 74 79 70 65 3a 22 76 6f 69 64 2a 22 29 3b 20 20  type:"void*");  
196a0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20  lineno++;.  if( 
196b0 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74  mhflag ){ fprint
196c0 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22  f(out,"#endif\n"
196d0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20  ); lineno++; }. 
196e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 74 79   fprintf(out,"ty
196f0 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 5c 6e 22  pedef union {\n"
19700 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
19710 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e  printf(out,"  in
19720 74 20 79 79 69 6e 69 74 3b 5c 6e 22 29 3b 20 6c  t yyinit;\n"); l
19730 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
19740 74 66 28 6f 75 74 2c 22 20 20 25 73 54 4f 4b 45  tf(out,"  %sTOKE
19750 4e 54 59 50 45 20 79 79 30 3b 5c 6e 22 2c 6e 61  NTYPE yy0;\n",na
19760 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
19770 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61   for(i=0; i<arra
19780 79 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  ysize; i++){.   
19790 20 69 66 28 20 74 79 70 65 73 5b 69 5d 3d 3d 30   if( types[i]==0
197a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
197b0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
197c0 25 73 20 79 79 25 64 3b 5c 6e 22 2c 74 79 70 65  %s yy%d;\n",type
197d0 73 5b 69 5d 2c 69 2b 31 29 3b 20 6c 69 6e 65 6e  s[i],i+1); linen
197e0 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 74 79  o++;.    free(ty
197f0 70 65 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 69  pes[i]);.  }.  i
19800 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d  f( lemp->errsym-
19810 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20 66  >useCnt ){.    f
19820 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69 6e  printf(out,"  in
19830 74 20 79 79 25 64 3b 5c 6e 22 2c 6c 65 6d 70 2d  t yy%d;\n",lemp-
19840 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b  >errsym->dtnum);
19850 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
19860 20 66 72 65 65 28 73 74 64 64 74 29 3b 0a 20 20   free(stddt);.  
19870 66 72 65 65 28 74 79 70 65 73 29 3b 0a 20 20 66  free(types);.  f
19880 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 20 59 59  printf(out,"} YY
19890 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e 22 29 3b 20  MINORTYPE;\n"); 
198a0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a 70 6c 69  lineno++;.  *pli
198b0 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 7d  neno = lineno;.}
198c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
198d0 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 43 20 64  he name of a C d
198e0 61 74 61 74 79 70 65 20 61 62 6c 65 20 74 6f 20  atatype able to 
198f0 72 65 70 72 65 73 65 6e 74 20 76 61 6c 75 65 73  represent values
19900 20 62 65 74 77 65 65 6e 0a 2a 2a 20 6c 77 72 20   between.** lwr 
19910 61 6e 64 20 75 70 72 2c 20 69 6e 63 6c 75 73 69  and upr, inclusi
19920 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ve..*/.static co
19930 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e 69 6d 75  nst char *minimu
19940 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e 74 20  m_size_type(int 
19950 6c 77 72 2c 20 69 6e 74 20 75 70 72 29 7b 0a 20  lwr, int upr){. 
19960 20 69 66 28 20 6c 77 72 3e 3d 30 20 29 7b 0a 20   if( lwr>=0 ){. 
19970 20 20 20 69 66 28 20 75 70 72 3c 3d 32 35 35 20     if( upr<=255 
19980 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
19990 22 75 6e 73 69 67 6e 65 64 20 63 68 61 72 22 3b  "unsigned char";
199a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 75  .    }else if( u
199b0 70 72 3c 36 35 35 33 35 20 29 7b 0a 20 20 20 20  pr<65535 ){.    
199c0 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67 6e    return "unsign
199d0 65 64 20 73 68 6f 72 74 20 69 6e 74 22 3b 0a 20  ed short int";. 
199e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
199f0 72 65 74 75 72 6e 20 22 75 6e 73 69 67 6e 65 64  return "unsigned
19a00 20 69 6e 74 22 3b 0a 20 20 20 20 7d 0a 20 20 7d   int";.    }.  }
19a10 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d 31  else if( lwr>=-1
19a20 32 37 20 26 26 20 75 70 72 3c 3d 31 32 37 20 29  27 && upr<=127 )
19a30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22 73 69  {.    return "si
19a40 67 6e 65 64 20 63 68 61 72 22 3b 0a 20 20 7d 65  gned char";.  }e
19a50 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d 33 32  lse if( lwr>=-32
19a60 37 36 37 20 26 26 20 75 70 72 3c 33 32 37 36 37  767 && upr<32767
19a70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22   ){.    return "
19a80 73 68 6f 72 74 22 3b 0a 20 20 7d 65 6c 73 65 7b  short";.  }else{
19a90 0a 20 20 20 20 72 65 74 75 72 6e 20 22 69 6e 74  .    return "int
19aa0 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ";.  }.}../*.** 
19ab0 45 61 63 68 20 73 74 61 74 65 20 63 6f 6e 74 61  Each state conta
19ac0 69 6e 73 20 61 20 73 65 74 20 6f 66 20 74 6f 6b  ins a set of tok
19ad0 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  en transaction a
19ae0 6e 64 20 61 20 73 65 74 20 6f 66 0a 2a 2a 20 6e  nd a set of.** n
19af0 6f 6e 74 65 72 6d 69 6e 61 6c 20 74 72 61 6e 73  onterminal trans
19b00 61 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20 6f  actions.  Each o
19b10 66 20 74 68 65 73 65 20 73 65 74 73 20 6d 61 6b  f these sets mak
19b20 65 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 0a 2a  es an instance.*
19b30 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
19b40 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 41  ng structure.  A
19b50 6e 20 61 72 72 61 79 20 6f 66 20 74 68 65 73 65  n array of these
19b60 20 73 74 72 75 63 74 75 72 65 73 20 69 73 20 75   structures is u
19b70 73 65 64 0a 2a 2a 20 74 6f 20 6f 72 64 65 72 20  sed.** to order 
19b80 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20  the creation of 
19b90 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 79  entries in the y
19ba0 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65  y_action[] table
19bb0 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 61 78 73 65  ..*/.struct axse
19bc0 74 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  t {.  struct sta
19bd0 74 65 20 2a 73 74 70 3b 20 20 20 2f 2a 20 41 20  te *stp;   /* A 
19be0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61  pointer to a sta
19bf0 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 6b  te */.  int isTk
19c00 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
19c10 54 72 75 65 20 74 6f 20 75 73 65 20 74 6f 6b 65  True to use toke
19c20 6e 73 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6e  ns.  False for n
19c30 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a  on-terminals */.
19c40 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b 20 20    int nAction;  
19c50 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19c60 20 6f 66 20 61 63 74 69 6f 6e 73 20 2a 2f 0a 20   of actions */. 
19c70 20 69 6e 74 20 69 4f 72 64 65 72 3b 20 20 20 20   int iOrder;    
19c80 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61        /* Origina
19c90 6c 20 6f 72 64 65 72 20 6f 66 20 61 63 74 69 6f  l order of actio
19ca0 6e 20 73 65 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  n sets */.};../*
19cb0 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 6f 20 61  .** Compare to a
19cc0 78 73 65 74 20 73 74 72 75 63 74 75 72 65 73 20  xset structures 
19cd0 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70  for sorting purp
19ce0 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oses.*/.static i
19cf0 6e 74 20 61 78 73 65 74 5f 63 6f 6d 70 61 72 65  nt axset_compare
19d00 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20  (const void *a, 
19d10 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a  const void *b){.
19d20 20 20 73 74 72 75 63 74 20 61 78 73 65 74 20 2a    struct axset *
19d30 70 31 20 3d 20 28 73 74 72 75 63 74 20 61 78 73  p1 = (struct axs
19d40 65 74 2a 29 61 3b 0a 20 20 73 74 72 75 63 74 20  et*)a;.  struct 
19d50 61 78 73 65 74 20 2a 70 32 20 3d 20 28 73 74 72  axset *p2 = (str
19d60 75 63 74 20 61 78 73 65 74 2a 29 62 3b 0a 20 20  uct axset*)b;.  
19d70 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20 70 32 2d  int c;.  c = p2-
19d80 3e 6e 41 63 74 69 6f 6e 20 2d 20 70 31 2d 3e 6e  >nAction - p1->n
19d90 41 63 74 69 6f 6e 3b 0a 20 20 69 66 28 20 63 3d  Action;.  if( c=
19da0 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 70 32  =0 ){.    c = p2
19db0 2d 3e 69 4f 72 64 65 72 20 2d 20 70 31 2d 3e 69  ->iOrder - p1->i
19dc0 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 61 73 73  Order;.  }.  ass
19dd0 65 72 74 28 20 63 21 3d 30 20 7c 7c 20 70 31 3d  ert( c!=0 || p1=
19de0 3d 70 32 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  =p2 );.  return 
19df0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
19e00 65 20 74 65 78 74 20 6f 6e 20 22 6f 75 74 22 20  e text on "out" 
19e10 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
19e20 68 65 20 72 75 6c 65 20 22 72 70 22 2e 0a 2a 2f  he rule "rp"..*/
19e30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 72 69  .static void wri
19e40 74 65 52 75 6c 65 54 65 78 74 28 46 49 4c 45 20  teRuleText(FILE 
19e50 2a 6f 75 74 2c 20 73 74 72 75 63 74 20 72 75 6c  *out, struct rul
19e60 65 20 2a 72 70 29 7b 0a 20 20 69 6e 74 20 6a 3b  e *rp){.  int j;
19e70 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
19e80 25 73 20 3a 3a 3d 22 2c 20 72 70 2d 3e 6c 68 73  %s ::=", rp->lhs
19e90 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 6a  ->name);.  for(j
19ea0 3d 30 3b 20 6a 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; j<rp->nrhs; 
19eb0 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  j++){.    struct
19ec0 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70   symbol *sp = rp
19ed0 2d 3e 72 68 73 5b 6a 5d 3b 0a 20 20 20 20 66 70  ->rhs[j];.    fp
19ee0 72 69 6e 74 66 28 6f 75 74 2c 22 20 25 73 22 2c  rintf(out," %s",
19ef0 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
19f00 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55  if( sp->type==MU
19f10 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
19f20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
19f30 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 73 70 2d    for(k=1; k<sp-
19f40 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b 0a  >nsubsym; k++){.
19f50 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
19f60 6f 75 74 2c 22 7c 25 73 22 2c 73 70 2d 3e 73 75  out,"|%s",sp->su
19f70 62 73 79 6d 5b 6b 5d 2d 3e 6e 61 6d 65 29 3b 0a  bsym[k]->name);.
19f80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19f90 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e 65 72 61 74  }.}.../* Generat
19fa0 65 20 43 20 73 6f 75 72 63 65 20 63 6f 64 65 20  e C source code 
19fb0 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 2a  for the parser *
19fc0 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 54 61 62  /.void ReportTab
19fd0 6c 65 28 6c 65 6d 70 2c 20 6d 68 66 6c 61 67 29  le(lemp, mhflag)
19fe0 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
19ff0 65 6d 70 3b 0a 69 6e 74 20 6d 68 66 6c 61 67 3b  emp;.int mhflag;
1a000 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 69       /* Output i
1a010 6e 20 6d 61 6b 65 68 65 61 64 65 72 73 20 66 6f  n makeheaders fo
1a020 72 6d 61 74 20 69 66 20 74 72 75 65 20 2a 2f 0a  rmat if true */.
1a030 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a  {.  FILE *out, *
1a040 69 6e 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b  in;.  char line[
1a050 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74  LINESIZE];.  int
1a060 20 20 6c 69 6e 65 6e 6f 3b 0a 20 20 73 74 72 75    lineno;.  stru
1a070 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
1a080 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
1a090 61 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  ap;.  struct rul
1a0a0 65 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20  e *rp;.  struct 
1a0b0 61 63 74 74 61 62 20 2a 70 41 63 74 74 61 62 3b  acttab *pActtab;
1a0c0 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20  .  int i, j, k, 
1a0d0 6e 3b 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b  n;.  char *name;
1a0e0 0a 20 20 69 6e 74 20 6d 6e 54 6b 6e 4f 66 73 74  .  int mnTknOfst
1a0f0 2c 20 6d 78 54 6b 6e 4f 66 73 74 3b 0a 20 20 69  , mxTknOfst;.  i
1a100 6e 74 20 6d 6e 4e 74 4f 66 73 74 2c 20 6d 78 4e  nt mnNtOfst, mxN
1a110 74 4f 66 73 74 3b 0a 20 20 73 74 72 75 63 74 20  tOfst;.  struct 
1a120 61 78 73 65 74 20 2a 61 78 3b 0a 0a 20 20 69 6e  axset *ax;..  in
1a130 20 3d 20 74 70 6c 74 5f 6f 70 65 6e 28 6c 65 6d   = tplt_open(lem
1a140 70 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20  p);.  if( in==0 
1a150 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 75 74 20  ) return;.  out 
1a160 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70  = file_open(lemp
1a170 2c 22 2e 63 22 2c 22 77 62 22 29 3b 0a 20 20 69  ,".c","wb");.  i
1a180 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20  f( out==0 ){.   
1a190 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20   fclose(in);.   
1a1a0 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 6c   return;.  }.  l
1a1b0 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 74 70 6c  ineno = 1;.  tpl
1a1c0 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1a1d0 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1a1e0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1a1f0 65 20 74 68 65 20 69 6e 63 6c 75 64 65 20 63 6f  e the include co
1a200 64 65 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20  de, if any */.  
1a210 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
1a220 65 6d 70 2c 6c 65 6d 70 2d 3e 69 6e 63 6c 75 64  emp,lemp->includ
1a230 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 69 66  e,&lineno);.  if
1a240 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( mhflag ){.    
1a250 63 68 61 72 20 2a 6e 61 6d 65 20 3d 20 66 69 6c  char *name = fil
1a260 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c  e_makename(lemp,
1a270 20 22 2e 68 22 29 3b 0a 20 20 20 20 66 70 72 69   ".h");.    fpri
1a280 6e 74 66 28 6f 75 74 2c 22 23 69 6e 63 6c 75 64  ntf(out,"#includ
1a290 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 6e 61 6d  e \"%s\"\n", nam
1a2a0 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
1a2b0 20 20 66 72 65 65 28 6e 61 6d 65 29 3b 0a 20 20    free(name);.  
1a2c0 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
1a2d0 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1a2e0 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1a2f0 47 65 6e 65 72 61 74 65 20 23 64 65 66 69 6e 65  Generate #define
1a300 73 20 66 6f 72 20 61 6c 6c 20 74 6f 6b 65 6e 73  s for all tokens
1a310 20 2a 2f 0a 20 20 69 66 28 20 6d 68 66 6c 61 67   */.  if( mhflag
1a320 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 72   ){.    char *pr
1a330 65 66 69 78 3b 0a 20 20 20 20 66 70 72 69 6e 74  efix;.    fprint
1a340 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52  f(out,"#if INTER
1a350 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  FACE\n"); lineno
1a360 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d 70  ++;.    if( lemp
1a370 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20 29 20  ->tokenprefix ) 
1a380 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e 74  prefix = lemp->t
1a390 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 20 20  okenprefix;.    
1a3a0 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
1a3b0 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d          prefix =
1a3c0 20 22 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31   "";.    for(i=1
1a3d0 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; i<lemp->ntermi
1a3e0 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nal; i++){.     
1a3f0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1a400 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25 32  efine %s%-30s %2
1a410 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70  d\n",prefix,lemp
1a420 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61  ->symbols[i]->na
1a430 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 6c 69 6e  me,i);.      lin
1a440 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  eno++;.    }.   
1a450 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65   fprintf(out,"#e
1a460 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  ndif\n"); lineno
1a470 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78  ++;.  }.  tplt_x
1a480 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1a490 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1a4a0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
1a4b0 68 65 20 64 65 66 69 6e 65 73 20 2a 2f 0a 20 20  he defines */.  
1a4c0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1a4d0 66 69 6e 65 20 59 59 43 4f 44 45 54 59 50 45 20  fine YYCODETYPE 
1a4e0 25 73 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e 69 6d  %s\n",.    minim
1a4f0 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 30 2c 20  um_size_type(0, 
1a500 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 31 29  lemp->nsymbol+1)
1a510 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1a520 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1a530 69 6e 65 20 59 59 4e 4f 43 4f 44 45 20 25 64 5c  ine YYNOCODE %d\
1a540 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c  n",lemp->nsymbol
1a550 2b 31 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  +1);  lineno++;.
1a560 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1a570 64 65 66 69 6e 65 20 59 59 41 43 54 49 4f 4e 54  define YYACTIONT
1a580 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20 6d  YPE %s\n",.    m
1a590 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65  inimum_size_type
1a5a0 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  (0, lemp->nstate
1a5b0 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2b 35 29 29  +lemp->nrule+5))
1a5c0 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69  ;  lineno++;.  i
1a5d0 66 28 20 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72  f( lemp->wildcar
1a5e0 64 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  d ){.    fprintf
1a5f0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1a600 57 49 4c 44 43 41 52 44 20 25 64 5c 6e 22 2c 0a  WILDCARD %d\n",.
1a610 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 77 69 6c         lemp->wil
1a620 64 63 61 72 64 2d 3e 69 6e 64 65 78 29 3b 20 6c  dcard->index); l
1a630 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 70  ineno++;.  }.  p
1a640 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e  rint_stack_union
1a650 28 6f 75 74 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e  (out,lemp,&linen
1a660 6f 2c 6d 68 66 6c 61 67 29 3b 0a 20 20 66 70 72  o,mhflag);.  fpr
1a670 69 6e 74 66 28 6f 75 74 2c 20 22 23 69 66 6e 64  intf(out, "#ifnd
1a680 65 66 20 59 59 53 54 41 43 4b 44 45 50 54 48 5c  ef YYSTACKDEPTH\
1a690 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1a6a0 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 63 6b   if( lemp->stack
1a6b0 73 69 7a 65 20 29 7b 0a 20 20 20 20 66 70 72 69  size ){.    fpri
1a6c0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1a6d0 20 59 59 53 54 41 43 4b 44 45 50 54 48 20 25 73   YYSTACKDEPTH %s
1a6e0 5c 6e 22 2c 6c 65 6d 70 2d 3e 73 74 61 63 6b 73  \n",lemp->stacks
1a6f0 69 7a 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  ize);  lineno++;
1a700 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70  .  }else{.    fp
1a710 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1a720 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54 48 20  ne YYSTACKDEPTH 
1a730 31 30 30 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e 6f  100\n");  lineno
1a740 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74  ++;.  }.  fprint
1a750 66 28 6f 75 74 2c 20 22 23 65 6e 64 69 66 5c 6e  f(out, "#endif\n
1a760 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1a770 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20  if( mhflag ){.  
1a780 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1a790 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29  if INTERFACE\n")
1a7a0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
1a7b0 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e    name = lemp->n
1a7c0 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65  ame ? lemp->name
1a7d0 20 3a 20 22 50 61 72 73 65 22 3b 0a 20 20 69 66   : "Parse";.  if
1a7e0 28 20 6c 65 6d 70 2d 3e 61 72 67 20 26 26 20 6c  ( lemp->arg && l
1a7f0 65 6d 70 2d 3e 61 72 67 5b 30 5d 20 29 7b 0a 20  emp->arg[0] ){. 
1a800 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 20     int i;.    i 
1a810 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65  = lemonStrlen(le
1a820 6d 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20 77 68  mp->arg);.    wh
1a830 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 69 73 73  ile( i>=1 && iss
1a840 70 61 63 65 28 6c 65 6d 70 2d 3e 61 72 67 5b 69  pace(lemp->arg[i
1a850 2d 31 5d 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20  -1]) ) i--;.    
1a860 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 28  while( i>=1 && (
1a870 69 73 61 6c 6e 75 6d 28 6c 65 6d 70 2d 3e 61 72  isalnum(lemp->ar
1a880 67 5b 69 2d 31 5d 29 20 7c 7c 20 6c 65 6d 70 2d  g[i-1]) || lemp-
1a890 3e 61 72 67 5b 69 2d 31 5d 3d 3d 27 5f 27 29 20  >arg[i-1]=='_') 
1a8a0 29 20 69 2d 2d 3b 0a 20 20 20 20 66 70 72 69 6e  ) i--;.    fprin
1a8b0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1a8c0 25 73 41 52 47 5f 53 44 45 43 4c 20 25 73 3b 5c  %sARG_SDECL %s;\
1a8d0 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72  n",name,lemp->ar
1a8e0 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  g);  lineno++;. 
1a8f0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1a900 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44  #define %sARG_PD
1a910 45 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d 65 2c  ECL ,%s\n",name,
1a920 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e  lemp->arg);  lin
1a930 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  eno++;.    fprin
1a940 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1a950 25 73 41 52 47 5f 46 45 54 43 48 20 25 73 20 3d  %sARG_FETCH %s =
1a960 20 79 79 70 50 61 72 73 65 72 2d 3e 25 73 5c 6e   yypParser->%s\n
1a970 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1a980 20 20 20 20 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61      name,lemp->a
1a990 72 67 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d  rg,&lemp->arg[i]
1a9a0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1a9b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1a9c0 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 54 4f  define %sARG_STO
1a9d0 52 45 20 79 79 70 50 61 72 73 65 72 2d 3e 25 73  RE yypParser->%s
1a9e0 20 3d 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20   = %s\n",.      
1a9f0 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c             name,
1aa00 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 2c 26 6c  &lemp->arg[i],&l
1aa10 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c  emp->arg[i]);  l
1aa20 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65  ineno++;.  }else
1aa30 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
1aa40 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
1aa50 5f 53 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b  _SDECL\n",name);
1aa60 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
1aa70 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1aa80 66 69 6e 65 20 25 73 41 52 47 5f 50 44 45 43 4c  fine %sARG_PDECL
1aa90 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65  \n",name);  line
1aaa0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
1aab0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1aac0 73 41 52 47 5f 46 45 54 43 48 5c 6e 22 2c 6e 61  sARG_FETCH\n",na
1aad0 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
1aae0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1aaf0 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 54  #define %sARG_ST
1ab00 4f 52 45 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69  ORE\n",name); li
1ab10 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  neno++;.  }.  if
1ab20 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( mhflag ){.    
1ab30 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e  fprintf(out,"#en
1ab40 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  dif\n"); lineno+
1ab50 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66  +;.  }.  fprintf
1ab60 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1ab70 4e 53 54 41 54 45 20 25 64 5c 6e 22 2c 6c 65 6d  NSTATE %d\n",lem
1ab80 70 2d 3e 6e 73 74 61 74 65 29 3b 20 20 6c 69 6e  p->nstate);  lin
1ab90 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1aba0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1abb0 4e 52 55 4c 45 20 25 64 5c 6e 22 2c 6c 65 6d 70  NRULE %d\n",lemp
1abc0 2d 3e 6e 72 75 6c 65 29 3b 20 20 6c 69 6e 65 6e  ->nrule);  linen
1abd0 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  o++;.  if( lemp-
1abe0 3e 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74 20  >errsym->useCnt 
1abf0 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
1ac00 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45 52  ut,"#define YYER
1ac10 52 4f 52 53 59 4d 42 4f 4c 20 25 64 5c 6e 22 2c  RORSYMBOL %d\n",
1ac20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 69 6e  lemp->errsym->in
1ac30 64 65 78 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  dex);  lineno++;
1ac40 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1ac50 2c 22 23 64 65 66 69 6e 65 20 59 59 45 52 52 53  ,"#define YYERRS
1ac60 59 4d 44 54 20 79 79 25 64 5c 6e 22 2c 6c 65 6d  YMDT yy%d\n",lem
1ac70 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d  p->errsym->dtnum
1ac80 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1ac90 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68 61  }.  if( lemp->ha
1aca0 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  s_fallback ){.  
1acb0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1acc0 64 65 66 69 6e 65 20 59 59 46 41 4c 4c 42 41 43  define YYFALLBAC
1acd0 4b 20 31 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e 6f  K 1\n");  lineno
1ace0 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78  ++;.  }.  tplt_x
1acf0 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1ad00 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1ad10 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74  .  /* Generate t
1ad20 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  he action table 
1ad30 61 6e 64 20 69 74 73 20 61 73 73 6f 63 69 61 74  and its associat
1ad40 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 79  es:.  **.  **  y
1ad50 79 5f 61 63 74 69 6f 6e 5b 5d 20 20 20 20 20 20  y_action[]      
1ad60 20 20 41 20 73 69 6e 67 6c 65 20 74 61 62 6c 65    A single table
1ad70 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20   containing all 
1ad80 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20 79  actions..  **  y
1ad90 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 20 20  y_lookahead[]   
1ada0 20 20 41 20 74 61 62 6c 65 20 63 6f 6e 74 61 69    A table contai
1adb0 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 6b 61 68 65  ning the lookahe
1adc0 61 64 20 66 6f 72 20 65 61 63 68 20 65 6e 74 72  ad for each entr
1add0 79 20 69 6e 0a 20 20 2a 2a 20 20 20 20 20 20 20  y in.  **       
1ade0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 79 79                yy
1adf0 5f 61 63 74 69 6f 6e 2e 20 20 55 73 65 64 20 74  _action.  Used t
1ae00 6f 20 64 65 74 65 63 74 20 68 61 73 68 20 63 6f  o detect hash co
1ae10 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20  llisions..  **  
1ae20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20  yy_shift_ofst[] 
1ae30 20 20 20 46 6f 72 20 65 61 63 68 20 73 74 61 74     For each stat
1ae40 65 2c 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  e, the offset in
1ae50 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 66 6f 72  to yy_action for
1ae60 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20  .  **           
1ae70 20 20 20 20 20 20 20 20 20 20 73 68 69 66 74 69            shifti
1ae80 6e 67 20 74 65 72 6d 69 6e 61 6c 73 2e 0a 20 20  ng terminals..  
1ae90 2a 2a 20 20 79 79 5f 72 65 64 75 63 65 5f 6f 66  **  yy_reduce_of
1aea0 73 74 5b 5d 20 20 20 46 6f 72 20 65 61 63 68 20  st[]   For each 
1aeb0 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73 65  state, the offse
1aec0 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e  t into yy_action
1aed0 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20 20   for.  **       
1aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68                sh
1aef0 69 66 74 69 6e 67 20 6e 6f 6e 2d 74 65 72 6d 69  ifting non-termi
1af00 6e 61 6c 73 20 61 66 74 65 72 20 61 20 72 65 64  nals after a red
1af10 75 63 65 2e 0a 20 20 2a 2a 20 20 79 79 5f 64 65  uce..  **  yy_de
1af20 66 61 75 6c 74 5b 5d 20 20 20 20 20 20 20 44 65  fault[]       De
1af30 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 66 6f 72  fault action for
1af40 20 65 61 63 68 20 73 74 61 74 65 2e 0a 20 20 2a   each state..  *
1af50 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  /..  /* Compute 
1af60 74 68 65 20 61 63 74 69 6f 6e 73 20 6f 6e 20 61  the actions on a
1af70 6c 6c 20 73 74 61 74 65 73 20 61 6e 64 20 63 6f  ll states and co
1af80 75 6e 74 20 74 68 65 6d 20 75 70 20 2a 2f 0a 20  unt them up */. 
1af90 20 61 78 20 3d 20 63 61 6c 6c 6f 63 28 6c 65 6d   ax = calloc(lem
1afa0 70 2d 3e 6e 73 74 61 74 65 2a 32 2c 20 73 69 7a  p->nstate*2, siz
1afb0 65 6f 66 28 61 78 5b 30 5d 29 29 3b 0a 20 20 69  eof(ax[0]));.  i
1afc0 66 28 20 61 78 3d 3d 30 20 29 7b 0a 20 20 20 20  f( ax==0 ){.    
1afd0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
1afe0 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22  malloc failed\n"
1aff0 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
1b000 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
1b010 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
1b020 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
1b030 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
1b040 20 20 20 20 61 78 5b 69 2a 32 5d 2e 73 74 70 20      ax[i*2].stp 
1b050 3d 20 73 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a  = stp;.    ax[i*
1b060 32 5d 2e 69 73 54 6b 6e 20 3d 20 31 3b 0a 20 20  2].isTkn = 1;.  
1b070 20 20 61 78 5b 69 2a 32 5d 2e 6e 41 63 74 69 6f    ax[i*2].nActio
1b080 6e 20 3d 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74  n = stp->nTknAct
1b090 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e  ;.    ax[i*2+1].
1b0a0 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61  stp = stp;.    a
1b0b0 78 5b 69 2a 32 2b 31 5d 2e 69 73 54 6b 6e 20 3d  x[i*2+1].isTkn =
1b0c0 20 30 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31   0;.    ax[i*2+1
1b0d0 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d  ].nAction = stp-
1b0e0 3e 6e 4e 74 41 63 74 3b 0a 20 20 7d 0a 20 20 6d  >nNtAct;.  }.  m
1b0f0 78 54 6b 6e 4f 66 73 74 20 3d 20 6d 6e 54 6b 6e  xTknOfst = mnTkn
1b100 4f 66 73 74 20 3d 20 30 3b 0a 20 20 6d 78 4e 74  Ofst = 0;.  mxNt
1b110 4f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20  Ofst = mnNtOfst 
1b120 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  = 0;..  /* Compu
1b130 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  te the action ta
1b140 62 6c 65 2e 20 20 49 6e 20 6f 72 64 65 72 20 74  ble.  In order t
1b150 6f 20 74 72 79 20 74 6f 20 6b 65 65 70 20 74 68  o try to keep th
1b160 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 20 20  e size of the.  
1b170 2a 2a 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  ** action table 
1b180 74 6f 20 61 20 6d 69 6e 69 6d 75 6d 2c 20 74 68  to a minimum, th
1b190 65 20 68 65 75 72 69 73 74 69 63 20 6f 66 20 70  e heuristic of p
1b1a0 6c 61 63 69 6e 67 20 74 68 65 20 6c 61 72 67 65  lacing the large
1b1b0 73 74 20 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 73  st action.  ** s
1b1c0 65 74 73 20 66 69 72 73 74 20 69 73 20 75 73 65  ets first is use
1b1d0 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  d..  */.  for(i=
1b1e0 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
1b1f0 65 2a 32 3b 20 69 2b 2b 29 20 61 78 5b 69 5d 2e  e*2; i++) ax[i].
1b200 69 4f 72 64 65 72 20 3d 20 69 3b 0a 20 20 71 73  iOrder = i;.  qs
1b210 6f 72 74 28 61 78 2c 20 6c 65 6d 70 2d 3e 6e 73  ort(ax, lemp->ns
1b220 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66 28 61  tate*2, sizeof(a
1b230 78 5b 30 5d 29 2c 20 61 78 73 65 74 5f 63 6f 6d  x[0]), axset_com
1b240 70 61 72 65 29 3b 0a 20 20 70 41 63 74 74 61 62  pare);.  pActtab
1b250 20 3d 20 61 63 74 74 61 62 5f 61 6c 6c 6f 63 28   = acttab_alloc(
1b260 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1b270 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 20 26  lemp->nstate*2 &
1b280 26 20 61 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e 3e  & ax[i].nAction>
1b290 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  0; i++){.    stp
1b2a0 20 3d 20 61 78 5b 69 5d 2e 73 74 70 3b 0a 20 20   = ax[i].stp;.  
1b2b0 20 20 69 66 28 20 61 78 5b 69 5d 2e 69 73 54 6b    if( ax[i].isTk
1b2c0 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 61  n ){.      for(a
1b2d0 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
1b2e0 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
1b2f0 20 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b       int action;
1b300 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d  .        if( ap-
1b310 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d 6c 65 6d 70  >sp->index>=lemp
1b320 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f  ->nterminal ) co
1b330 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1b340 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65  action = compute
1b350 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70  _action(lemp, ap
1b360 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  );.        if( a
1b370 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e  ction<0 ) contin
1b380 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 74  ue;.        actt
1b390 61 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74 61  ab_action(pActta
1b3a0 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  b, ap->sp->index
1b3b0 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20  , action);.     
1b3c0 20 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69 54   }.      stp->iT
1b3d0 6b 6e 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f  knOfst = acttab_
1b3e0 69 6e 73 65 72 74 28 70 41 63 74 74 61 62 29 3b  insert(pActtab);
1b3f0 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e  .      if( stp->
1b400 69 54 6b 6e 4f 66 73 74 3c 6d 6e 54 6b 6e 4f 66  iTknOfst<mnTknOf
1b410 73 74 20 29 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d  st ) mnTknOfst =
1b420 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a   stp->iTknOfst;.
1b430 20 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69        if( stp->i
1b440 54 6b 6e 4f 66 73 74 3e 6d 78 54 6b 6e 4f 66 73  TknOfst>mxTknOfs
1b450 74 20 29 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20  t ) mxTknOfst = 
1b460 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20  stp->iTknOfst;. 
1b470 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b480 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20  for(ap=stp->ap; 
1b490 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
1b4a0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 63  {.        int ac
1b4b0 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66  tion;.        if
1b4c0 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c  ( ap->sp->index<
1b4d0 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  lemp->nterminal 
1b4e0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1b4f0 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e      if( ap->sp->
1b500 69 6e 64 65 78 3d 3d 6c 65 6d 70 2d 3e 6e 73 79  index==lemp->nsy
1b510 6d 62 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  mbol ) continue;
1b520 0a 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e 20  .        action 
1b530 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e  = compute_action
1b540 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20  (lemp, ap);.    
1b550 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30      if( action<0
1b560 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1b570 20 20 20 20 20 61 63 74 74 61 62 5f 61 63 74 69       acttab_acti
1b580 6f 6e 28 70 41 63 74 74 61 62 2c 20 61 70 2d 3e  on(pActtab, ap->
1b590 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f  sp->index, actio
1b5a0 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
1b5b0 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 20 3d    stp->iNtOfst =
1b5c0 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 70   acttab_insert(p
1b5d0 41 63 74 74 61 62 29 3b 0a 20 20 20 20 20 20 69  Acttab);.      i
1b5e0 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3c  f( stp->iNtOfst<
1b5f0 6d 6e 4e 74 4f 66 73 74 20 29 20 6d 6e 4e 74 4f  mnNtOfst ) mnNtO
1b600 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66  fst = stp->iNtOf
1b610 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  st;.      if( st
1b620 70 2d 3e 69 4e 74 4f 66 73 74 3e 6d 78 4e 74 4f  p->iNtOfst>mxNtO
1b630 66 73 74 20 29 20 6d 78 4e 74 4f 66 73 74 20 3d  fst ) mxNtOfst =
1b640 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20   stp->iNtOfst;. 
1b650 20 20 20 7d 0a 20 20 7d 0a 20 20 66 72 65 65 28     }.  }.  free(
1b660 61 78 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75  ax);..  /* Outpu
1b670 74 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20  t the yy_action 
1b680 74 61 62 6c 65 20 2a 2f 0a 20 20 6e 20 3d 20 61  table */.  n = a
1b690 63 74 74 61 62 5f 73 69 7a 65 28 70 41 63 74 74  cttab_size(pActt
1b6a0 61 62 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  ab);.  fprintf(o
1b6b0 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 5f 41  ut,"#define YY_A
1b6c0 43 54 54 41 42 5f 43 4f 55 4e 54 20 28 25 64 29  CTTAB_COUNT (%d)
1b6d0 5c 6e 22 2c 20 6e 29 3b 20 6c 69 6e 65 6e 6f 2b  \n", n); lineno+
1b6e0 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
1b6f0 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59  ,"static const Y
1b700 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79 5f 61  YACTIONTYPE yy_a
1b710 63 74 69 6f 6e 5b 5d 20 3d 20 7b 5c 6e 22 29 3b  ction[] = {\n");
1b720 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72   lineno++;.  for
1b730 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
1b740 29 7b 0a 20 20 20 20 69 6e 74 20 61 63 74 69 6f  ){.    int actio
1b750 6e 20 3d 20 61 63 74 74 61 62 5f 79 79 61 63 74  n = acttab_yyact
1b760 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 69 29 3b  ion(pActtab, i);
1b770 0a 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c  .    if( action<
1b780 30 20 29 20 61 63 74 69 6f 6e 20 3d 20 6c 65 6d  0 ) action = lem
1b790 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70  p->nstate + lemp
1b7a0 2d 3e 6e 72 75 6c 65 20 2b 20 32 3b 0a 20 20 20  ->nrule + 2;.   
1b7b0 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69   if( j==0 ) fpri
1b7c0 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64  ntf(out," /* %5d
1b7d0 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66   */ ", i);.    f
1b7e0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34  printf(out, " %4
1b7f0 64 2c 22 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20  d,", action);.  
1b800 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d    if( j==9 || i=
1b810 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70  =n-1 ){.      fp
1b820 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
1b830 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1b840 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c    j = 0;.    }el
1b850 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  se{.      j++;. 
1b860 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e     }.  }.  fprin
1b870 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b  tf(out, "};\n");
1b880 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a   lineno++;..  /*
1b890 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 6c   Output the yy_l
1b8a0 6f 6f 6b 61 68 65 61 64 20 74 61 62 6c 65 20 2a  ookahead table *
1b8b0 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  /.  fprintf(out,
1b8c0 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59 59  "static const YY
1b8d0 43 4f 44 45 54 59 50 45 20 79 79 5f 6c 6f 6f 6b  CODETYPE yy_look
1b8e0 61 68 65 61 64 5b 5d 20 3d 20 7b 5c 6e 22 29 3b  ahead[] = {\n");
1b8f0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72   lineno++;.  for
1b900 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
1b910 29 7b 0a 20 20 20 20 69 6e 74 20 6c 61 20 3d 20  ){.    int la = 
1b920 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61 68 65  acttab_yylookahe
1b930 61 64 28 70 41 63 74 74 61 62 2c 20 69 29 3b 0a  ad(pActtab, i);.
1b940 20 20 20 20 69 66 28 20 6c 61 3c 30 20 29 20 6c      if( la<0 ) l
1b950 61 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  a = lemp->nsymbo
1b960 6c 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20  l;.    if( j==0 
1b970 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20  ) fprintf(out," 
1b980 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b  /* %5d */ ", i);
1b990 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1b9a0 2c 20 22 20 25 34 64 2c 22 2c 20 6c 61 29 3b 0a  , " %4d,", la);.
1b9b0 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
1b9c0 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
1b9d0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
1b9e0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1b9f0 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
1ba00 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
1ba10 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
1ba20 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
1ba30 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20  ); lineno++;..  
1ba40 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79  /* Output the yy
1ba50 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 74 61  _shift_ofst[] ta
1ba60 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66  ble */.  fprintf
1ba70 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
1ba80 59 5f 53 48 49 46 54 5f 55 53 45 5f 44 46 4c 54  Y_SHIFT_USE_DFLT
1ba90 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f   (%d)\n", mnTknO
1baa0 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  fst-1); lineno++
1bab0 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73  ;.  n = lemp->ns
1bac0 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28 20 6e  tate;.  while( n
1bad0 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72 74  >0 && lemp->sort
1bae0 65 64 5b 6e 2d 31 5d 2d 3e 69 54 6b 6e 4f 66 73  ed[n-1]->iTknOfs
1baf0 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6e  t==NO_OFFSET ) n
1bb00 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  --;.  fprintf(ou
1bb10 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53  t, "#define YY_S
1bb20 48 49 46 54 5f 43 4f 55 4e 54 20 28 25 64 29 5c  HIFT_COUNT (%d)\
1bb30 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f  n", n-1); lineno
1bb40 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1bb50 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53  t, "#define YY_S
1bb60 48 49 46 54 5f 4d 49 4e 20 20 20 28 25 64 29 5c  HIFT_MIN   (%d)\
1bb70 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74 29 3b 20  n", mnTknOfst); 
1bb80 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1bb90 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
1bba0 65 20 59 59 5f 53 48 49 46 54 5f 4d 41 58 20 20  e YY_SHIFT_MAX  
1bbb0 20 28 25 64 29 5c 6e 22 2c 20 6d 78 54 6b 6e 4f   (%d)\n", mxTknO
1bbc0 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  fst); lineno++;.
1bbd0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1bbe0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 25 73 20  static const %s 
1bbf0 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20  yy_shift_ofst[] 
1bc00 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  = {\n", .       
1bc10 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f     minimum_size_
1bc20 74 79 70 65 28 6d 6e 54 6b 6e 4f 66 73 74 2d 31  type(mnTknOfst-1
1bc30 2c 20 6d 78 54 6b 6e 4f 66 73 74 29 29 3b 20 6c  , mxTknOfst)); l
1bc40 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69  ineno++;.  for(i
1bc50 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
1bc60 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20  .    int ofst;. 
1bc70 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
1bc80 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66  orted[i];.    of
1bc90 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66  st = stp->iTknOf
1bca0 73 74 3b 0a 20 20 20 20 69 66 28 20 6f 66 73 74  st;.    if( ofst
1bcb0 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6f 66  ==NO_OFFSET ) of
1bcc0 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20 2d  st = mnTknOfst -
1bcd0 20 31 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30   1;.    if( j==0
1bce0 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
1bcf0 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29   /* %5d */ ", i)
1bd00 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1bd10 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66 73 74  t, " %4d,", ofst
1bd20 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20  );.    if( j==9 
1bd30 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20  || i==n-1 ){.   
1bd40 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1bd50 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
1bd60 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  .      j = 0;.  
1bd70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a    }else{.      j
1bd80 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1bd90 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b  fprintf(out, "};
1bda0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1bdb0 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
1bdc0 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b   yy_reduce_ofst[
1bdd0 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72  ] table */.  fpr
1bde0 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69  intf(out, "#defi
1bdf0 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 55 53 45  ne YY_REDUCE_USE
1be00 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6d  _DFLT (%d)\n", m
1be10 6e 4e 74 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65  nNtOfst-1); line
1be20 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70  no++;.  n = lemp
1be30 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68 69 6c  ->nstate;.  whil
1be40 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e  e( n>0 && lemp->
1be50 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 4e 74  sorted[n-1]->iNt
1be60 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20  Ofst==NO_OFFSET 
1be70 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66  ) n--;.  fprintf
1be80 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
1be90 59 5f 52 45 44 55 43 45 5f 43 4f 55 4e 54 20 28  Y_REDUCE_COUNT (
1bea0 25 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69  %d)\n", n-1); li
1beb0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1bec0 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20  f(out, "#define 
1bed0 59 59 5f 52 45 44 55 43 45 5f 4d 49 4e 20 20 20  YY_REDUCE_MIN   
1bee0 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f 66 73  (%d)\n", mnNtOfs
1bef0 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  t); lineno++;.  
1bf00 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64  fprintf(out, "#d
1bf10 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f  efine YY_REDUCE_
1bf20 4d 41 58 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d  MAX   (%d)\n", m
1bf30 78 4e 74 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f  xNtOfst); lineno
1bf40 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1bf50 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74  t, "static const
1bf60 20 25 73 20 79 79 5f 72 65 64 75 63 65 5f 6f 66   %s yy_reduce_of
1bf70 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20  st[] = {\n", .  
1bf80 20 20 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f          minimum_
1bf90 73 69 7a 65 5f 74 79 70 65 28 6d 6e 4e 74 4f 66  size_type(mnNtOf
1bfa0 73 74 2d 31 2c 20 6d 78 4e 74 4f 66 73 74 29 29  st-1, mxNtOfst))
1bfb0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f  ; lineno++;.  fo
1bfc0 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
1bfd0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74  +){.    int ofst
1bfe0 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  ;.    stp = lemp
1bff0 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
1c000 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74   ofst = stp->iNt
1c010 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f 66  Ofst;.    if( of
1c020 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20  st==NO_OFFSET ) 
1c030 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20  ofst = mnNtOfst 
1c040 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  - 1;.    if( j==
1c050 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  0 ) fprintf(out,
1c060 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69  " /* %5d */ ", i
1c070 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1c080 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66 73  ut, " %4d,", ofs
1c090 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39  t);.    if( j==9
1c0a0 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20   || i==n-1 ){.  
1c0b0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1c0c0 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   "\n"); lineno++
1c0d0 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20  ;.      j = 0;. 
1c0e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c0f0 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  j++;.    }.  }. 
1c100 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d   fprintf(out, "}
1c110 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1c120 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68  ..  /* Output th
1c130 65 20 64 65 66 61 75 6c 74 20 61 63 74 69 6f 6e  e default action
1c140 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69   table */.  fpri
1c150 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69 63  ntf(out, "static
1c160 20 63 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e 54   const YYACTIONT
1c170 59 50 45 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d  YPE yy_default[]
1c180 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   = {\n"); lineno
1c190 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e  ++;.  n = lemp->
1c1a0 6e 73 74 61 74 65 3b 0a 20 20 66 6f 72 28 69 3d  nstate;.  for(i=
1c1b0 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
1c1c0 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
1c1d0 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 69  sorted[i];.    i
1c1e0 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74  f( j==0 ) fprint
1c1f0 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a  f(out," /* %5d *
1c200 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72  / ", i);.    fpr
1c210 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c  intf(out, " %4d,
1c220 22 2c 20 73 74 70 2d 3e 69 44 66 6c 74 29 3b 0a  ", stp->iDflt);.
1c230 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
1c240 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
1c250 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
1c260 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1c270 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
1c280 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
1c290 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
1c2a0 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
1c2b0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74  ); lineno++;.  t
1c2c0 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1c2d0 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1c2e0 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1c2f0 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 6f 66  ate the table of
1c300 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 73   fallback tokens
1c310 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d  ..  */.  if( lem
1c320 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20  p->has_fallback 
1c330 29 7b 0a 20 20 20 20 69 6e 74 20 6d 78 20 3d 20  ){.    int mx = 
1c340 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20  lemp->nterminal 
1c350 2d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  - 1;.    while( 
1c360 6d 78 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 79  mx>0 && lemp->sy
1c370 6d 62 6f 6c 73 5b 6d 78 5d 2d 3e 66 61 6c 6c 62  mbols[mx]->fallb
1c380 61 63 6b 3d 3d 30 20 29 7b 20 6d 78 2d 2d 3b 20  ack==0 ){ mx--; 
1c390 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
1c3a0 3c 3d 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <=mx; i++){.    
1c3b0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1c3c0 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  *p = lemp->symbo
1c3d0 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  ls[i];.      if(
1c3e0 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20   p->fallback==0 
1c3f0 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
1c400 74 66 28 6f 75 74 2c 20 22 20 20 20 20 30 2c 20  tf(out, "    0, 
1c410 20 2f 2a 20 25 31 30 73 20 3d 3e 20 6e 6f 74 68   /* %10s => noth
1c420 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 6e 61  ing */\n", p->na
1c430 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
1c440 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
1c450 66 28 6f 75 74 2c 20 22 20 20 25 33 64 2c 20 20  f(out, "  %3d,  
1c460 2f 2a 20 25 31 30 73 20 3d 3e 20 25 73 20 2a 2f  /* %10s => %s */
1c470 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b  \n", p->fallback
1c480 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20 20 20 20  ->index,.       
1c490 20 20 20 70 2d 3e 6e 61 6d 65 2c 20 70 2d 3e 66     p->name, p->f
1c4a0 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d 65 29 3b 0a  allback->name);.
1c4b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 69        }.      li
1c4c0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  neno++;.    }.  
1c4d0 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
1c4e0 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e 2c 20 6f 75  mp->name, in, ou
1c4f0 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  t, &lineno);..  
1c500 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74 61  /* Generate a ta
1c510 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
1c520 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65  he symbolic name
1c530 20 6f 66 20 65 76 65 72 79 20 73 79 6d 62 6f 6c   of every symbol
1c540 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
1c550 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
1c560 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 72 69  ; i++){.    spri
1c570 6e 74 66 28 6c 69 6e 65 2c 22 5c 22 25 73 5c 22  ntf(line,"\"%s\"
1c580 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ,",lemp->symbols
1c590 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  [i]->name);.    
1c5a0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25  fprintf(out,"  %
1c5b0 2d 31 35 73 22 2c 6c 69 6e 65 29 3b 0a 20 20 20  -15s",line);.   
1c5c0 20 69 66 28 20 28 69 26 33 29 3d 3d 33 20 29 7b   if( (i&3)==3 ){
1c5d0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e   fprintf(out,"\n
1c5e0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a  "); lineno++; }.
1c5f0 20 20 7d 0a 20 20 69 66 28 20 28 69 26 33 29 21    }.  if( (i&3)!
1c600 3d 30 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75  =0 ){ fprintf(ou
1c610 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  t,"\n"); lineno+
1c620 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  +; }.  tplt_xfer
1c630 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1c640 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1c650 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74 61  /* Generate a ta
1c660 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  ble containing a
1c670 20 74 65 78 74 20 73 74 72 69 6e 67 20 74 68 61   text string tha
1c680 74 20 64 65 73 63 72 69 62 65 73 20 65 76 65 72  t describes ever
1c690 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69 6e 20 74  y.  ** rule in t
1c6a0 68 65 20 72 75 6c 65 20 73 65 74 20 6f 66 20 74  he rule set of t
1c6b0 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 54 68 69  he grammar.  Thi
1c6c0 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
1c6d0 20 75 73 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20   used.  ** when 
1c6e0 74 72 61 63 69 6e 67 20 52 45 44 55 43 45 20 61  tracing REDUCE a
1c6f0 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66  ctions..  */.  f
1c700 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65 6d 70 2d  or(i=0, rp=lemp-
1c710 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
1c720 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20  ->next, i++){.  
1c730 20 20 61 73 73 65 72 74 28 20 72 70 2d 3e 69 6e    assert( rp->in
1c740 64 65 78 3d 3d 69 20 29 3b 0a 20 20 20 20 66 70  dex==i );.    fp
1c750 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25  rintf(out," /* %
1c760 33 64 20 2a 2f 20 5c 22 22 2c 20 69 29 3b 0a 20  3d */ \"", i);. 
1c770 20 20 20 77 72 69 74 65 52 75 6c 65 54 65 78 74     writeRuleText
1c780 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20 20 66  (out, rp);.    f
1c790 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22 2c 5c  printf(out,"\",\
1c7a0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1c7b0 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
1c7c0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1c7d0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1c7e0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
1c7f0 68 69 63 68 20 65 78 65 63 75 74 65 73 20 65 76  hich executes ev
1c800 65 72 79 20 74 69 6d 65 20 61 20 73 79 6d 62 6f  ery time a symbo
1c810 6c 20 69 73 20 70 6f 70 70 65 64 20 66 72 6f 6d  l is popped from
1c820 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 63 6b 20  .  ** the stack 
1c830 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67  while processing
1c840 20 65 72 72 6f 72 73 20 6f 72 20 77 68 69 6c 65   errors or while
1c850 20 64 65 73 74 72 6f 79 69 6e 67 20 74 68 65 20   destroying the 
1c860 70 61 72 73 65 72 2e 20 0a 20 20 2a 2a 20 28 49  parser. .  ** (I
1c870 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 67  n other words, g
1c880 65 6e 65 72 61 74 65 20 74 68 65 20 25 64 65 73  enerate the %des
1c890 74 72 75 63 74 6f 72 20 61 63 74 69 6f 6e 73 29  tructor actions)
1c8a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70  .  */.  if( lemp
1c8b0 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29 7b 0a 20  ->tokendest ){. 
1c8c0 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b     int once = 1;
1c8d0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1c8e0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
1c8f0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  ++){.      struc
1c900 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
1c910 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
1c920 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d 3d 30  .      if( sp==0
1c930 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21 3d 54 45   || sp->type!=TE
1c940 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74 69 6e 75  RMINAL ) continu
1c950 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e 63  e;.      if( onc
1c960 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  e ){.        fpr
1c970 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20 20  intf(out, "     
1c980 20 2f 2a 20 54 45 52 4d 49 4e 41 4c 20 44 65 73   /* TERMINAL Des
1c990 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22 29 3b 20  tructor */\n"); 
1c9a0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
1c9b0 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20    once = 0;.    
1c9c0 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
1c9d0 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20  f(out,"    case 
1c9e0 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c  %d: /* %s */\n",
1c9f0 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e   sp->index, sp->
1ca00 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
1ca10 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
1ca20 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
1ca30 62 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d  bol && lemp->sym
1ca40 62 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65 21 3d 54  bols[i]->type!=T
1ca50 45 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b 0a 20  ERMINAL; i++);. 
1ca60 20 20 20 69 66 28 20 69 3c 6c 65 6d 70 2d 3e 6e     if( i<lemp->n
1ca70 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20  symbol ){.      
1ca80 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f  emit_destructor_
1ca90 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73  code(out,lemp->s
1caa0 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26  ymbols[i],lemp,&
1cab0 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 66  lineno);.      f
1cac0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
1cad0 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69    break;\n"); li
1cae0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  neno++;.    }.  
1caf0 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61  }.  if( lemp->va
1cb00 72 64 65 73 74 20 29 7b 0a 20 20 20 20 73 74 72  rdest ){.    str
1cb10 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 66 6c 74  uct symbol *dflt
1cb20 5f 73 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  _sp = 0;.    int
1cb30 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 66   once = 1;.    f
1cb40 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1cb50 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
1cb60 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
1cb70 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73  ol *sp = lemp->s
1cb80 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20  ymbols[i];.     
1cb90 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70   if( sp==0 || sp
1cba0 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
1cbb0 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 73 70   ||.          sp
1cbc0 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c 20 73 70  ->index<=0 || sp
1cbd0 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30 20  ->destructor!=0 
1cbe0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1cbf0 20 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20 20    if( once ){.  
1cc00 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1cc10 74 2c 20 22 20 20 20 20 20 20 2f 2a 20 44 65 66  t, "      /* Def
1cc20 61 75 6c 74 20 4e 4f 4e 2d 54 45 52 4d 49 4e 41  ault NON-TERMINA
1cc30 4c 20 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c  L Destructor */\
1cc40 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1cc50 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b         once = 0;
1cc60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
1cc70 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
1cc80 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a  case %d: /* %s *
1cc90 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c  /\n", sp->index,
1cca0 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65   sp->name); line
1ccb0 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 64 66 6c 74  no++;.      dflt
1ccc0 5f 73 70 20 3d 20 73 70 3b 0a 20 20 20 20 7d 0a  _sp = sp;.    }.
1ccd0 20 20 20 20 69 66 28 20 64 66 6c 74 5f 73 70 21      if( dflt_sp!
1cce0 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 6d 69 74  =0 ){.      emit
1ccf0 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65  _destructor_code
1cd00 28 6f 75 74 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d  (out,dflt_sp,lem
1cd10 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  p,&lineno);.    
1cd20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  }.    fprintf(ou
1cd30 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c  t,"      break;\
1cd40 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1cd50 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1cd60 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
1cd70 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
1cd80 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d  symbol *sp = lem
1cd90 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
1cda0 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20     if( sp==0 || 
1cdb0 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  sp->type==TERMIN
1cdc0 41 4c 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75  AL || sp->destru
1cdd0 63 74 6f 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  ctor==0 ) contin
1cde0 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ue;.    fprintf(
1cdf0 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64  out,"    case %d
1ce00 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 20 73  : /* %s */\n", s
1ce10 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61  p->index, sp->na
1ce20 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a  me); lineno++;..
1ce30 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 64      /* Combine d
1ce40 75 70 6c 69 63 61 74 65 20 64 65 73 74 72 75 63  uplicate destruc
1ce50 74 6f 72 73 20 69 6e 74 6f 20 61 20 73 69 6e 67  tors into a sing
1ce60 6c 65 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 66  le case */.    f
1ce70 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6c 65 6d 70  or(j=i+1; j<lemp
1ce80 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 2b 29 7b  ->nsymbol; j++){
1ce90 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79  .      struct sy
1cea0 6d 62 6f 6c 20 2a 73 70 32 20 3d 20 6c 65 6d 70  mbol *sp2 = lemp
1ceb0 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20  ->symbols[j];.  
1cec0 20 20 20 20 69 66 28 20 73 70 32 20 26 26 20 73      if( sp2 && s
1ced0 70 32 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e  p2->type!=TERMIN
1cee0 41 4c 20 26 26 20 73 70 32 2d 3e 64 65 73 74 72  AL && sp2->destr
1cef0 75 63 74 6f 72 0a 20 20 20 20 20 20 20 20 20 20  uctor.          
1cf00 26 26 20 73 70 32 2d 3e 64 74 6e 75 6d 3d 3d 73  && sp2->dtnum==s
1cf10 70 2d 3e 64 74 6e 75 6d 0a 20 20 20 20 20 20 20  p->dtnum.       
1cf20 20 20 20 26 26 20 73 74 72 63 6d 70 28 73 70 2d     && strcmp(sp-
1cf30 3e 64 65 73 74 72 75 63 74 6f 72 2c 73 70 32 2d  >destructor,sp2-
1cf40 3e 64 65 73 74 72 75 63 74 6f 72 29 3d 3d 30 20  >destructor)==0 
1cf50 29 7b 0a 20 20 20 20 20 20 20 20 20 66 70 72 69  ){.         fpri
1cf60 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73  ntf(out,"    cas
1cf70 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e  e %d: /* %s */\n
1cf80 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1cf90 20 20 20 20 73 70 32 2d 3e 69 6e 64 65 78 2c 20      sp2->index, 
1cfa0 73 70 32 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65  sp2->name); line
1cfb0 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 73  no++;.         s
1cfc0 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 3d  p2->destructor =
1cfd0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1cfe0 7d 0a 0a 20 20 20 20 65 6d 69 74 5f 64 65 73 74  }..    emit_dest
1cff0 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c  ructor_code(out,
1d000 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
1d010 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  ,lemp,&lineno);.
1d020 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1d030 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22  "      break;\n"
1d040 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1d050 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1d060 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1d070 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1d080 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
1d090 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e  ch executes when
1d0a0 65 76 65 72 20 74 68 65 20 70 61 72 73 65 72 20  ever the parser 
1d0b0 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77 73 20  stack overflows 
1d0c0 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
1d0d0 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 6f  out,lemp,lemp->o
1d0e0 76 65 72 66 6c 6f 77 2c 26 6c 69 6e 65 6e 6f 29  verflow,&lineno)
1d0f0 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
1d100 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1d110 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1d120 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 61 62  Generate the tab
1d130 6c 65 20 6f 66 20 72 75 6c 65 20 69 6e 66 6f 72  le of rule infor
1d140 6d 61 74 69 6f 6e 20 0a 20 20 2a 2a 0a 20 20 2a  mation .  **.  *
1d150 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 63 6f 64  * Note: This cod
1d160 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  e depends on the
1d170 20 66 61 63 74 20 74 68 61 74 20 72 75 6c 65 73   fact that rules
1d180 20 61 72 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a   are number.  **
1d190 20 73 65 71 75 65 6e 74 75 61 6c 6c 79 20 62 65   sequentually be
1d1a0 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30 2e 0a  ginning with 0..
1d1b0 20 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65    */.  for(rp=le
1d1c0 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
1d1d0 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
1d1e0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 7b  fprintf(out,"  {
1d1f0 20 25 64 2c 20 25 64 20 7d 2c 5c 6e 22 2c 72 70   %d, %d },\n",rp
1d200 2d 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c 72 70 2d  ->lhs->index,rp-
1d210 3e 6e 72 68 73 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  >nrhs); lineno++
1d220 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ;.  }.  tplt_xfe
1d230 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1d240 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1d250 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1d260 65 20 77 68 69 63 68 20 65 78 65 63 75 74 69 6f  e which executio
1d270 6e 20 64 75 72 69 6e 67 20 65 61 63 68 20 52 45  n during each RE
1d280 44 55 43 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20  DUCE action */. 
1d290 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
1d2a0 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
1d2b0 65 78 74 29 7b 0a 20 20 20 20 74 72 61 6e 73 6c  ext){.    transl
1d2c0 61 74 65 5f 63 6f 64 65 28 6c 65 6d 70 2c 20 72  ate_code(lemp, r
1d2d0 70 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 69 72  p);.  }.  /* Fir
1d2e0 73 74 20 6f 75 74 70 75 74 20 72 75 6c 65 73 20  st output rules 
1d2f0 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 64  other than the d
1d300 65 66 61 75 6c 74 3a 20 72 75 6c 65 20 2a 2f 0a  efault: rule */.
1d310 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
1d320 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
1d330 6e 65 78 74 29 7b 0a 20 20 20 20 73 74 72 75 63  next){.    struc
1d340 74 20 72 75 6c 65 20 2a 72 70 32 3b 20 20 20 20  t rule *rp2;    
1d350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 74             /* Ot
1d360 68 65 72 20 72 75 6c 65 73 20 77 69 74 68 20 74  her rules with t
1d370 68 65 20 73 61 6d 65 20 61 63 74 69 6f 6e 20 2a  he same action *
1d380 2f 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f  /.    if( rp->co
1d390 64 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  de==0 ) continue
1d3a0 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63 6f  ;.    if( rp->co
1d3b0 64 65 5b 30 5d 3d 3d 27 5c 6e 27 20 26 26 20 72  de[0]=='\n' && r
1d3c0 70 2d 3e 63 6f 64 65 5b 31 5d 3d 3d 30 20 29 20  p->code[1]==0 ) 
1d3d0 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 57 69 6c  continue; /* Wil
1d3e0 6c 20 62 65 20 64 65 66 61 75 6c 74 3a 20 2a 2f  l be default: */
1d3f0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1d400 2c 22 20 20 20 20 20 20 63 61 73 65 20 25 64 3a  ,"      case %d:
1d410 20 2f 2a 20 22 2c 20 72 70 2d 3e 69 6e 64 65 78   /* ", rp->index
1d420 29 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65  );.    writeRule
1d430 54 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20  Text(out, rp);. 
1d440 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1d450 22 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  " */\n"); lineno
1d460 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 72 70 32 3d  ++;.    for(rp2=
1d470 72 70 2d 3e 6e 65 78 74 3b 20 72 70 32 3b 20 72  rp->next; rp2; r
1d480 70 32 3d 72 70 32 2d 3e 6e 65 78 74 29 7b 0a 20  p2=rp2->next){. 
1d490 20 20 20 20 20 69 66 28 20 72 70 32 2d 3e 63 6f       if( rp2->co
1d4a0 64 65 3d 3d 72 70 2d 3e 63 6f 64 65 20 29 7b 0a  de==rp->code ){.
1d4b0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1d4c0 6f 75 74 2c 22 20 20 20 20 20 20 63 61 73 65 20  out,"      case 
1d4d0 25 64 3a 20 2f 2a 20 22 2c 20 72 70 32 2d 3e 69  %d: /* ", rp2->i
1d4e0 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 77  ndex);.        w
1d4f0 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74  riteRuleText(out
1d500 2c 20 72 70 32 29 3b 0a 20 20 20 20 20 20 20 20  , rp2);.        
1d510 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2a 2f  fprintf(out," */
1d520 20 79 79 74 65 73 74 63 61 73 65 28 79 79 72 75   yytestcase(yyru
1d530 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c 20 72  leno==%d);\n", r
1d540 70 32 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65  p2->index); line
1d550 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 70  no++;.        rp
1d560 32 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20 20 20  2->code = 0;.   
1d570 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65     }.    }.    e
1d580 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c 72 70 2c  mit_code(out,rp,
1d590 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lemp,&lineno);. 
1d5a0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1d5b0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e          break;\n
1d5c0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1d5d0 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a    rp->code = 0;.
1d5e0 20 20 7d 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79    }.  /* Finally
1d5f0 2c 20 6f 75 74 70 75 74 20 74 68 65 20 64 65 66  , output the def
1d600 61 75 6c 74 3a 20 72 75 6c 65 2e 20 20 57 65 20  ault: rule.  We 
1d610 63 68 6f 6f 73 65 20 61 73 20 74 68 65 20 64 65  choose as the de
1d620 66 61 75 6c 74 3a 20 61 6c 6c 0a 20 20 2a 2a 20  fault: all.  ** 
1d630 65 6d 70 74 79 20 61 63 74 69 6f 6e 73 2e 20 2a  empty actions. *
1d640 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  /.  fprintf(out,
1d650 22 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 5c  "      default:\
1d660 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1d670 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
1d680 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
1d690 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 72 70  ext){.    if( rp
1d6a0 2d 3e 63 6f 64 65 3d 3d 30 20 29 20 63 6f 6e 74  ->code==0 ) cont
1d6b0 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74  inue;.    assert
1d6c0 28 20 72 70 2d 3e 63 6f 64 65 5b 30 5d 3d 3d 27  ( rp->code[0]=='
1d6d0 5c 6e 27 20 26 26 20 72 70 2d 3e 63 6f 64 65 5b  \n' && rp->code[
1d6e0 31 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 66 70 72  1]==0 );.    fpr
1d6f0 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
1d700 2f 2a 20 28 25 64 29 20 22 2c 20 72 70 2d 3e 69  /* (%d) ", rp->i
1d710 6e 64 65 78 29 3b 0a 20 20 20 20 77 72 69 74 65  ndex);.    write
1d720 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70  RuleText(out, rp
1d730 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1d740 75 74 2c 20 22 20 2a 2f 20 79 79 74 65 73 74 63  ut, " */ yytestc
1d750 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d 3d 25 64  ase(yyruleno==%d
1d760 29 3b 5c 6e 22 2c 20 72 70 2d 3e 69 6e 64 65 78  );\n", rp->index
1d770 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1d780 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1d790 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e          break;\n
1d7a0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1d7b0 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1d7c0 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1d7d0 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1d7e0 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20  rate code which 
1d7f0 65 78 65 63 75 74 65 73 20 69 66 20 61 20 70 61  executes if a pa
1d800 72 73 65 20 66 61 69 6c 73 20 2a 2f 0a 20 20 74  rse fails */.  t
1d810 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
1d820 6d 70 2c 6c 65 6d 70 2d 3e 66 61 69 6c 75 72 65  mp,lemp->failure
1d830 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c  ,&lineno);.  tpl
1d840 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1d850 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1d860 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1d870 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
1d880 63 75 74 65 73 20 77 68 65 6e 20 61 20 73 79 6e  cutes when a syn
1d890 74 61 78 20 65 72 72 6f 72 20 6f 63 63 75 72 73  tax error occurs
1d8a0 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74   */.  tplt_print
1d8b0 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e  (out,lemp,lemp->
1d8c0 65 72 72 6f 72 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  error,&lineno);.
1d8d0 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1d8e0 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1d8f0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
1d900 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63  nerate code whic
1d910 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 20  h executes when 
1d920 74 68 65 20 70 61 72 73 65 72 20 61 63 63 65 70  the parser accep
1d930 74 73 20 69 74 73 20 69 6e 70 75 74 20 2a 2f 0a  ts its input */.
1d940 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
1d950 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 61 63 63 65  ,lemp,lemp->acce
1d960 70 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74  pt,&lineno);.  t
1d970 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1d980 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1d990 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 41 70 70 65 6e  no);..  /* Appen
1d9a0 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e 20 63  d any addition c
1d9b0 6f 64 65 20 74 68 65 20 75 73 65 72 20 64 65 73  ode the user des
1d9c0 69 72 65 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70  ires */.  tplt_p
1d9d0 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65  rint(out,lemp,le
1d9e0 6d 70 2d 3e 65 78 74 72 61 63 6f 64 65 2c 26 6c  mp->extracode,&l
1d9f0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 66 63 6c 6f 73  ineno);..  fclos
1da00 65 28 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28  e(in);.  fclose(
1da10 6f 75 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  out);.  return;.
1da20 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  }../* Generate a
1da30 20 68 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72   header file for
1da40 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76   the parser */.v
1da50 6f 69 64 20 52 65 70 6f 72 74 48 65 61 64 65 72  oid ReportHeader
1da60 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65  (lemp).struct le
1da70 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 46  mon *lemp;.{.  F
1da80 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20  ILE *out, *in;. 
1da90 20 63 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20   char *prefix;. 
1daa0 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53   char line[LINES
1dab0 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70 61 74  IZE];.  char pat
1dac0 74 65 72 6e 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a  tern[LINESIZE];.
1dad0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
1dae0 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
1daf0 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d  x ) prefix = lem
1db00 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a  p->tokenprefix;.
1db10 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
1db20 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78            prefix
1db30 20 3d 20 22 22 3b 0a 20 20 69 6e 20 3d 20 66 69   = "";.  in = fi
1db40 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68  le_open(lemp,".h
1db50 22 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  ","rb");.  if( i
1db60 6e 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  n ){.    for(i=1
1db70 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; i<lemp->ntermi
1db80 6e 61 6c 20 26 26 20 66 67 65 74 73 28 6c 69 6e  nal && fgets(lin
1db90 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e 29 3b 20  e,LINESIZE,in); 
1dba0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 70 72 69  i++){.      spri
1dbb0 6e 74 66 28 70 61 74 74 65 72 6e 2c 22 23 64 65  ntf(pattern,"#de
1dbc0 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25 32 64  fine %s%-30s %2d
1dbd0 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d  \n",prefix,lemp-
1dbe0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d  >symbols[i]->nam
1dbf0 65 2c 69 29 3b 0a 20 20 20 20 20 20 69 66 28 20  e,i);.      if( 
1dc00 73 74 72 63 6d 70 28 6c 69 6e 65 2c 70 61 74 74  strcmp(line,patt
1dc10 65 72 6e 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ern) ) break;.  
1dc20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 69    }.    fclose(i
1dc30 6e 29 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6c  n);.    if( i==l
1dc40 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29  emp->nterminal )
1dc50 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 68  {.      /* No ch
1dc60 61 6e 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65  ange in the file
1dc70 2e 20 20 44 6f 6e 27 74 20 72 65 77 72 69 74 65  .  Don't rewrite
1dc80 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65   it. */.      re
1dc90 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
1dca0 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65    out = file_ope
1dcb0 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 77 62 22  n(lemp,".h","wb"
1dcc0 29 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a  );.  if( out ){.
1dcd0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c      for(i=1; i<l
1dce0 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
1dcf0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70 72 69  i++){.      fpri
1dd00 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1dd10 20 25 73 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c   %s%-30s %2d\n",
1dd20 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d  prefix,lemp->sym
1dd30 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29  bols[i]->name,i)
1dd40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f  ;.    }.    fclo
1dd50 73 65 28 6f 75 74 29 3b 20 20 0a 20 20 7d 0a 20  se(out);  .  }. 
1dd60 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52   return;.}../* R
1dd70 65 64 75 63 65 20 74 68 65 20 73 69 7a 65 20 6f  educe the size o
1dd80 66 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  f the action tab
1dd90 6c 65 73 2c 20 69 66 20 70 6f 73 73 69 62 6c 65  les, if possible
1dda0 2c 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 0a  , by making use.
1ddb0 2a 2a 20 6f 66 20 64 65 66 61 75 6c 74 73 2e 0a  ** of defaults..
1ddc0 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65  **.** In this ve
1ddd0 72 73 69 6f 6e 2c 20 77 65 20 74 61 6b 65 20 74  rsion, we take t
1dde0 68 65 20 6d 6f 73 74 20 66 72 65 71 75 65 6e 74  he most frequent
1ddf0 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20 61   REDUCE action a
1de00 6e 64 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 74 68  nd make.** it th
1de10 65 20 64 65 66 61 75 6c 74 2e 20 20 45 78 63 65  e default.  Exce
1de20 70 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  pt, there is no 
1de30 64 65 66 61 75 6c 74 20 69 66 20 74 68 65 20 77  default if the w
1de40 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e 0a 2a 2a  ildcard token.**
1de50 20 69 73 20 61 20 70 6f 73 73 69 62 6c 65 20 6c   is a possible l
1de60 6f 6f 6b 2d 61 68 65 61 64 2e 0a 2a 2f 0a 76 6f  ook-ahead..*/.vo
1de70 69 64 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65  id CompressTable
1de80 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  s(lemp).struct l
1de90 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
1dea0 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
1deb0 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  p;.  struct acti
1dec0 6f 6e 20 2a 61 70 2c 20 2a 61 70 32 3b 0a 20 20  on *ap, *ap2;.  
1ded0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c  struct rule *rp,
1dee0 20 2a 72 70 32 2c 20 2a 72 62 65 73 74 3b 0a 20   *rp2, *rbest;. 
1def0 20 69 6e 74 20 6e 62 65 73 74 2c 20 6e 3b 0a 20   int nbest, n;. 
1df00 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 75 73   int i;.  int us
1df10 65 73 57 69 6c 64 63 61 72 64 3b 0a 0a 20 20 66  esWildcard;..  f
1df20 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1df30 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
1df40 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
1df50 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6e 62 65  rted[i];.    nbe
1df60 73 74 20 3d 20 30 3b 0a 20 20 20 20 72 62 65 73  st = 0;.    rbes
1df70 74 20 3d 20 30 3b 0a 20 20 20 20 75 73 65 73 57  t = 0;.    usesW
1df80 69 6c 64 63 61 72 64 20 3d 20 30 3b 0a 0a 20 20  ildcard = 0;..  
1df90 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
1dfa0 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
1dfb0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70  t){.      if( ap
1dfc0 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26 26  ->type==SHIFT &&
1dfd0 20 61 70 2d 3e 73 70 3d 3d 6c 65 6d 70 2d 3e 77   ap->sp==lemp->w
1dfe0 69 6c 64 63 61 72 64 20 29 7b 0a 20 20 20 20 20  ildcard ){.     
1dff0 20 20 20 75 73 65 73 57 69 6c 64 63 61 72 64 20     usesWildcard 
1e000 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1e010 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 21     if( ap->type!
1e020 3d 52 45 44 55 43 45 20 29 20 63 6f 6e 74 69 6e  =REDUCE ) contin
1e030 75 65 3b 0a 20 20 20 20 20 20 72 70 20 3d 20 61  ue;.      rp = a
1e040 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20 69  p->x.rp;.      i
1e050 66 28 20 72 70 2d 3e 6c 68 73 53 74 61 72 74 20  f( rp->lhsStart 
1e060 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1e070 20 20 69 66 28 20 72 70 3d 3d 72 62 65 73 74 20    if( rp==rbest 
1e080 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1e090 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 66    n = 1;.      f
1e0a0 6f 72 28 61 70 32 3d 61 70 2d 3e 6e 65 78 74 3b  or(ap2=ap->next;
1e0b0 20 61 70 32 3b 20 61 70 32 3d 61 70 32 2d 3e 6e   ap2; ap2=ap2->n
1e0c0 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ext){.        if
1e0d0 28 20 61 70 32 2d 3e 74 79 70 65 21 3d 52 45 44  ( ap2->type!=RED
1e0e0 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UCE ) continue;.
1e0f0 20 20 20 20 20 20 20 20 72 70 32 20 3d 20 61 70          rp2 = ap
1e100 32 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20 20 20  2->x.rp;.       
1e110 20 69 66 28 20 72 70 32 3d 3d 72 62 65 73 74 20   if( rp2==rbest 
1e120 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1e130 20 20 20 20 69 66 28 20 72 70 32 3d 3d 72 70 20      if( rp2==rp 
1e140 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ) n++;.      }. 
1e150 20 20 20 20 20 69 66 28 20 6e 3e 6e 62 65 73 74       if( n>nbest
1e160 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 62 65 73   ){.        nbes
1e170 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 72  t = n;.        r
1e180 62 65 73 74 20 3d 20 72 70 3b 0a 20 20 20 20 20  best = rp;.     
1e190 20 7d 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f   }.    }. .    /
1e1a0 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b 65 20 61 20  * Do not make a 
1e1b0 64 65 66 61 75 6c 74 20 69 66 20 74 68 65 20 6e  default if the n
1e1c0 75 6d 62 65 72 20 6f 66 20 72 75 6c 65 73 20 74  umber of rules t
1e1d0 6f 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a 2a  o default.    **
1e1e0 20 69 73 20 6e 6f 74 20 61 74 20 6c 65 61 73 74   is not at least
1e1f0 20 31 20 6f 72 20 69 66 20 74 68 65 20 77 69 6c   1 or if the wil
1e200 64 63 61 72 64 20 74 6f 6b 65 6e 20 69 73 20 61  dcard token is a
1e210 20 70 6f 73 73 69 62 6c 65 0a 20 20 20 20 2a 2a   possible.    **
1e220 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20   lookahead..    
1e230 2a 2f 0a 20 20 20 20 69 66 28 20 6e 62 65 73 74  */.    if( nbest
1e240 3c 31 20 7c 7c 20 75 73 65 73 57 69 6c 64 63 61  <1 || usesWildca
1e250 72 64 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  rd ) continue;..
1e260 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 20  .    /* Combine 
1e270 6d 61 74 63 68 69 6e 67 20 52 45 44 55 43 45 20  matching REDUCE 
1e280 61 63 74 69 6f 6e 73 20 69 6e 74 6f 20 61 20 73  actions into a s
1e290 69 6e 67 6c 65 20 64 65 66 61 75 6c 74 20 2a 2f  ingle default */
1e2a0 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
1e2b0 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
1e2c0 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
1e2d0 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43   ap->type==REDUC
1e2e0 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72  E && ap->x.rp==r
1e2f0 62 65 73 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  best ) break;.  
1e300 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1e310 61 70 20 29 3b 0a 20 20 20 20 61 70 2d 3e 73 70  ap );.    ap->sp
1e320 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b   = Symbol_new("{
1e330 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20 20 20  default}");.    
1e340 66 6f 72 28 61 70 3d 61 70 2d 3e 6e 65 78 74 3b  for(ap=ap->next;
1e350 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
1e360 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d  ){.      if( ap-
1e370 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26  >type==REDUCE &&
1e380 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74   ap->x.rp==rbest
1e390 20 29 20 61 70 2d 3e 74 79 70 65 20 3d 20 4e 4f   ) ap->type = NO
1e3a0 54 5f 55 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20  T_USED;.    }.  
1e3b0 20 20 73 74 70 2d 3e 61 70 20 3d 20 41 63 74 69    stp->ap = Acti
1e3c0 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e 61 70 29  on_sort(stp->ap)
1e3d0 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
1e3e0 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 61 74  Compare two stat
1e3f0 65 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70  es for sorting p
1e400 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20 73 6d  urposes.  The sm
1e410 61 6c 6c 65 72 20 73 74 61 74 65 20 69 73 20 74  aller state is t
1e420 68 65 0a 2a 2a 20 6f 6e 65 20 77 69 74 68 20 74  he.** one with t
1e430 68 65 20 6d 6f 73 74 20 6e 6f 6e 2d 74 65 72 6d  he most non-term
1e440 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2e 20 20 49  inal actions.  I
1e450 66 20 74 68 65 79 20 68 61 76 65 20 74 68 65 20  f they have the 
1e460 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f  same number.** o
1e470 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61  f non-terminal a
1e480 63 74 69 6f 6e 73 2c 20 74 68 65 6e 20 74 68 65  ctions, then the
1e490 20 73 6d 61 6c 6c 65 72 20 69 73 20 74 68 65 20   smaller is the 
1e4a0 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6d 6f 73  one with the mos
1e4b0 74 0a 2a 2a 20 74 6f 6b 65 6e 20 61 63 74 69 6f  t.** token actio
1e4c0 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
1e4d0 74 20 73 74 61 74 65 52 65 73 6f 72 74 43 6f 6d  t stateResortCom
1e4e0 70 61 72 65 28 63 6f 6e 73 74 20 76 6f 69 64 20  pare(const void 
1e4f0 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  *a, const void *
1e500 62 29 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75  b){.  const stru
1e510 63 74 20 73 74 61 74 65 20 2a 70 41 20 3d 20 2a  ct state *pA = *
1e520 28 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74  (const struct st
1e530 61 74 65 2a 2a 29 61 3b 0a 20 20 63 6f 6e 73 74  ate**)a;.  const
1e540 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 70   struct state *p
1e550 42 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75  B = *(const stru
1e560 63 74 20 73 74 61 74 65 2a 2a 29 62 3b 0a 20 20  ct state**)b;.  
1e570 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d 20 70 42  int n;..  n = pB
1e580 2d 3e 6e 4e 74 41 63 74 20 2d 20 70 41 2d 3e 6e  ->nNtAct - pA->n
1e590 4e 74 41 63 74 3b 0a 20 20 69 66 28 20 6e 3d 3d  NtAct;.  if( n==
1e5a0 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 42 2d  0 ){.    n = pB-
1e5b0 3e 6e 54 6b 6e 41 63 74 20 2d 20 70 41 2d 3e 6e  >nTknAct - pA->n
1e5c0 54 6b 6e 41 63 74 3b 0a 20 20 20 20 69 66 28 20  TknAct;.    if( 
1e5d0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 20  n==0 ){.      n 
1e5e0 3d 20 70 42 2d 3e 73 74 61 74 65 6e 75 6d 20 2d  = pB->statenum -
1e5f0 20 70 41 2d 3e 73 74 61 74 65 6e 75 6d 3b 0a 20   pA->statenum;. 
1e600 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
1e610 74 28 20 6e 21 3d 30 20 29 3b 0a 20 20 72 65 74  t( n!=0 );.  ret
1e620 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  urn n;.}.../*.**
1e630 20 52 65 6e 75 6d 62 65 72 20 61 6e 64 20 72 65   Renumber and re
1e640 73 6f 72 74 20 73 74 61 74 65 73 20 73 6f 20 74  sort states so t
1e650 68 61 74 20 73 74 61 74 65 73 20 77 69 74 68 20  hat states with 
1e660 66 65 77 65 72 20 63 68 6f 69 63 65 73 0a 2a 2a  fewer choices.**
1e670 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65 6e   occur at the en
1e680 64 2e 20 20 45 78 63 65 70 74 2c 20 6b 65 65 70  d.  Except, keep
1e690 20 73 74 61 74 65 20 30 20 61 73 20 74 68 65 20   state 0 as the 
1e6a0 66 69 72 73 74 20 73 74 61 74 65 2e 0a 2a 2f 0a  first state..*/.
1e6b0 76 6f 69 64 20 52 65 73 6f 72 74 53 74 61 74 65  void ResortState
1e6c0 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  s(lemp).struct l
1e6d0 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
1e6e0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
1e6f0 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
1e700 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b  ruct action *ap;
1e710 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ..  for(i=0; i<l
1e720 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
1e730 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  ){.    stp = lem
1e740 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
1e750 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 20 3d    stp->nTknAct =
1e760 20 73 74 70 2d 3e 6e 4e 74 41 63 74 20 3d 20 30   stp->nNtAct = 0
1e770 3b 0a 20 20 20 20 73 74 70 2d 3e 69 44 66 6c 74  ;.    stp->iDflt
1e780 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20   = lemp->nstate 
1e790 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20  + lemp->nrule;. 
1e7a0 20 20 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74     stp->iTknOfst
1e7b0 20 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20 20   = NO_OFFSET;.  
1e7c0 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 20 3d    stp->iNtOfst =
1e7d0 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20   NO_OFFSET;.    
1e7e0 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20  for(ap=stp->ap; 
1e7f0 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
1e800 7b 0a 20 20 20 20 20 20 69 66 28 20 63 6f 6d 70  {.      if( comp
1e810 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c  ute_action(lemp,
1e820 61 70 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ap)>=0 ){.      
1e830 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e    if( ap->sp->in
1e840 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  dex<lemp->ntermi
1e850 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nal ){.         
1e860 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 2b 2b 3b   stp->nTknAct++;
1e870 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1e880 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  f( ap->sp->index
1e890 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29  <lemp->nsymbol )
1e8a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 70 2d  {.          stp-
1e8b0 3e 6e 4e 74 41 63 74 2b 2b 3b 0a 20 20 20 20 20  >nNtAct++;.     
1e8c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e8d0 20 20 20 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d      stp->iDflt =
1e8e0 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28   compute_action(
1e8f0 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20  lemp, ap);.     
1e900 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1e910 20 7d 0a 20 20 7d 0a 20 20 71 73 6f 72 74 28 26   }.  }.  qsort(&
1e920 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 31 5d 2c  lemp->sorted[1],
1e930 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2d 31 2c   lemp->nstate-1,
1e940 20 73 69 7a 65 6f 66 28 6c 65 6d 70 2d 3e 73 6f   sizeof(lemp->so
1e950 72 74 65 64 5b 30 5d 29 2c 0a 20 20 20 20 20 20  rted[0]),.      
1e960 20 20 73 74 61 74 65 52 65 73 6f 72 74 43 6f 6d    stateResortCom
1e970 70 61 72 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  pare);.  for(i=0
1e980 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
1e990 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70  ; i++){.    lemp
1e9a0 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 73 74 61  ->sorted[i]->sta
1e9b0 74 65 6e 75 6d 20 3d 20 69 3b 0a 20 20 7d 0a 7d  tenum = i;.  }.}
1e9c0 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
1e9d0 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
1e9e0 69 6c 65 20 22 73 65 74 2e 63 22 20 2a 2a 2a 2a  ile "set.c" ****
1e9f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ea00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ea10 2f 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6d 61 6e 69  /./*.** Set mani
1ea20 70 75 6c 61 74 69 6f 6e 20 72 6f 75 74 69 6e 65  pulation routine
1ea30 73 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20  s for the LEMON 
1ea40 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
1ea50 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
1ea60 20 73 69 7a 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53   size = 0;../* S
1ea70 65 74 20 74 68 65 20 73 65 74 20 73 69 7a 65 20  et the set size 
1ea80 2a 2f 0a 76 6f 69 64 20 53 65 74 53 69 7a 65 28  */.void SetSize(
1ea90 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 73 69  n).int n;.{.  si
1eaa0 7a 65 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20  ze = n+1;.}../* 
1eab0 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73  Allocate a new s
1eac0 65 74 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e  et */.char *SetN
1ead0 65 77 28 29 7b 0a 20 20 63 68 61 72 20 2a 73 3b  ew(){.  char *s;
1eae0 0a 20 20 73 20 3d 20 28 63 68 61 72 2a 29 63 61  .  s = (char*)ca
1eaf0 6c 6c 6f 63 28 20 73 69 7a 65 2c 20 31 29 3b 0a  lloc( size, 1);.
1eb00 20 20 69 66 28 20 73 3d 3d 30 20 29 7b 0a 20 20    if( s==0 ){.  
1eb10 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d 65    extern void me
1eb20 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20  mory_error();.  
1eb30 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29    memory_error()
1eb40 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
1eb50 3b 0a 7d 0a 0a 2f 2a 20 44 65 61 6c 6c 6f 63 61  ;.}../* Dealloca
1eb60 74 65 20 61 20 73 65 74 20 2a 2f 0a 76 6f 69 64  te a set */.void
1eb70 20 53 65 74 46 72 65 65 28 73 29 0a 63 68 61 72   SetFree(s).char
1eb80 20 2a 73 3b 0a 7b 0a 20 20 66 72 65 65 28 73 29   *s;.{.  free(s)
1eb90 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65  ;.}../* Add a ne
1eba0 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
1ebb0 20 73 65 74 2e 20 20 52 65 74 75 72 6e 20 54 52   set.  Return TR
1ebc0 55 45 20 69 66 20 74 68 65 20 65 6c 65 6d 65 6e  UE if the elemen
1ebd0 74 20 77 61 73 20 61 64 64 65 64 0a 2a 2a 20 61  t was added.** a
1ebe0 6e 64 20 46 41 4c 53 45 20 69 66 20 69 74 20 77  nd FALSE if it w
1ebf0 61 73 20 61 6c 72 65 61 64 79 20 74 68 65 72 65  as already there
1ec00 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 41 64 64 28  . */.int SetAdd(
1ec10 73 2c 65 29 0a 63 68 61 72 20 2a 73 3b 0a 69 6e  s,e).char *s;.in
1ec20 74 20 65 3b 0a 7b 0a 20 20 69 6e 74 20 72 76 3b  t e;.{.  int rv;
1ec30 0a 20 20 61 73 73 65 72 74 28 20 65 3e 3d 30 20  .  assert( e>=0 
1ec40 26 26 20 65 3c 73 69 7a 65 20 29 3b 0a 20 20 72  && e<size );.  r
1ec50 76 20 3d 20 73 5b 65 5d 3b 0a 20 20 73 5b 65 5d  v = s[e];.  s[e]
1ec60 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 21   = 1;.  return !
1ec70 72 76 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 65 76  rv;.}../* Add ev
1ec80 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 73  ery element of s
1ec90 32 20 74 6f 20 73 31 2e 20 20 52 65 74 75 72 6e  2 to s1.  Return
1eca0 20 54 52 55 45 20 69 66 20 73 31 20 63 68 61 6e   TRUE if s1 chan
1ecb0 67 65 73 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 55  ges. */.int SetU
1ecc0 6e 69 6f 6e 28 73 31 2c 73 32 29 0a 63 68 61 72  nion(s1,s2).char
1ecd0 20 2a 73 31 3b 0a 63 68 61 72 20 2a 73 32 3b 0a   *s1;.char *s2;.
1ece0 7b 0a 20 20 69 6e 74 20 69 2c 20 70 72 6f 67 72  {.  int i, progr
1ecf0 65 73 73 3b 0a 20 20 70 72 6f 67 72 65 73 73 20  ess;.  progress 
1ed00 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
1ed10 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  i<size; i++){.  
1ed20 20 20 69 66 28 20 73 32 5b 69 5d 3d 3d 30 20 29    if( s2[i]==0 )
1ed30 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
1ed40 66 28 20 73 31 5b 69 5d 3d 3d 30 20 29 7b 0a 20  f( s1[i]==0 ){. 
1ed50 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20       progress = 
1ed60 31 3b 0a 20 20 20 20 20 20 73 31 5b 69 5d 20 3d  1;.      s1[i] =
1ed70 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
1ed80 72 65 74 75 72 6e 20 70 72 6f 67 72 65 73 73 3b  return progress;
1ed90 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
1eda0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
1edb0 74 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e  the file "table.
1edc0 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
1edd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1ede0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20  ./*.** All code 
1edf0 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68 61 73  in this file has
1ee00 20 62 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61   been automatica
1ee10 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a  lly generated.**
1ee20 20 66 72 6f 6d 20 61 20 73 70 65 63 69 66 69 63   from a specific
1ee30 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c  ation in the fil
1ee40 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
1ee50 20 20 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62    "table.q".** b
1ee60 79 20 74 68 65 20 61 73 73 6f 63 69 61 74 69 76  y the associativ
1ee70 65 20 61 72 72 61 79 20 63 6f 64 65 20 62 75 69  e array code bui
1ee80 6c 64 69 6e 67 20 70 72 6f 67 72 61 6d 20 22 61  lding program "a
1ee90 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  agen"..** Do not
1eea0 20 65 64 69 74 20 74 68 69 73 20 66 69 6c 65 21   edit this file!
1eeb0 20 20 49 6e 73 74 65 61 64 2c 20 65 64 69 74 20    Instead, edit 
1eec0 74 68 65 20 73 70 65 63 69 66 69 63 61 74 69 6f  the specificatio
1eed0 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  n.** file, then 
1eee0 72 65 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a  rerun aagen..*/.
1eef0 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70  /*.** Code for p
1ef00 72 6f 63 65 73 73 69 6e 67 20 74 61 62 6c 65 73  rocessing tables
1ef10 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
1ef20 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
1ef30 2a 2f 0a 0a 50 52 49 56 41 54 45 20 69 6e 74 20  */..PRIVATE int 
1ef40 73 74 72 68 61 73 68 28 78 29 0a 63 68 61 72 20  strhash(x).char 
1ef50 2a 78 3b 0a 7b 0a 20 20 69 6e 74 20 68 20 3d 20  *x;.{.  int h = 
1ef60 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 78 29 20  0;.  while( *x) 
1ef70 68 20 3d 20 68 2a 31 33 20 2b 20 2a 28 78 2b 2b  h = h*13 + *(x++
1ef80 29 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d  );.  return h;.}
1ef90 0a 0a 2f 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20  ../* Works like 
1efa0 73 74 72 64 75 70 2c 20 73 6f 72 74 20 6f 66 2e  strdup, sort of.
1efb0 20 20 53 61 76 65 20 61 20 73 74 72 69 6e 67 20    Save a string 
1efc0 69 6e 20 6d 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f  in malloced memo
1efd0 72 79 2c 20 62 75 74 0a 2a 2a 20 6b 65 65 70 20  ry, but.** keep 
1efe0 73 74 72 69 6e 67 73 20 69 6e 20 61 20 74 61 62  strings in a tab
1eff0 6c 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 73  le so that the s
1f000 61 6d 65 20 73 74 72 69 6e 67 20 69 73 20 6e 6f  ame string is no
1f010 74 20 69 6e 20 6d 6f 72 65 0a 2a 2a 20 74 68 61  t in more.** tha
1f020 6e 20 6f 6e 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a  n one place..*/.
1f030 63 68 61 72 20 2a 53 74 72 73 61 66 65 28 79 29  char *Strsafe(y)
1f040 0a 63 68 61 72 20 2a 79 3b 0a 7b 0a 20 20 63 68  .char *y;.{.  ch
1f050 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 79 3d  ar *z;..  if( y=
1f060 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1f070 20 7a 20 3d 20 53 74 72 73 61 66 65 5f 66 69 6e   z = Strsafe_fin
1f080 64 28 79 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  d(y);.  if( z==0
1f090 20 26 26 20 28 7a 3d 6d 61 6c 6c 6f 63 28 20 6c   && (z=malloc( l
1f0a0 65 6d 6f 6e 53 74 72 6c 65 6e 28 79 29 2b 31 20  emonStrlen(y)+1 
1f0b0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ))!=0 ){.    str
1f0c0 63 70 79 28 7a 2c 79 29 3b 0a 20 20 20 20 53 74  cpy(z,y);.    St
1f0d0 72 73 61 66 65 5f 69 6e 73 65 72 74 28 7a 29 3b  rsafe_insert(z);
1f0e0 0a 20 20 7d 0a 20 20 4d 65 6d 6f 72 79 43 68 65  .  }.  MemoryChe
1f0f0 63 6b 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ck(z);.  return 
1f100 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69  z;.}../* There i
1f110 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
1f120 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1f130 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61  structure for ea
1f140 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76  ch.** associativ
1f150 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
1f160 22 78 31 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  "x1"..*/.struct 
1f170 73 5f 78 31 20 7b 0a 20 20 69 6e 74 20 73 69 7a  s_x1 {.  int siz
1f180 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1f190 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
1f1a0 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74  f available slot
1f1b0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
1f1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1d0 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70  /*   Must be a p
1f1e0 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65  ower of 2 greate
1f1f0 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20  r than or */.   
1f200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f210 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61         /*   equa
1f220 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20  l to 1 */.  int 
1f230 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  count;          
1f240 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f250 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73   currently slots
1f260 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72   filled */.  str
1f270 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 74 62  uct s_x1node *tb
1f280 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  l;  /* The data 
1f290 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20  stored here */. 
1f2a0 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
1f2b0 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20   **ht;  /* Hash 
1f2c0 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70  table for lookup
1f2d0 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72  s */.};../* Ther
1f2e0 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
1f2f0 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
1f300 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61  ure for every da
1f310 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e  ta element.** in
1f320 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20   an associative 
1f330 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
1f340 31 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  1"..*/.typedef s
1f350 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 7b  truct s_x1node {
1f360 0a 20 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  .  char *data;  
1f370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f380 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
1f390 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
1f3a0 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78   *next;   /* Nex
1f3b0 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  t entry with the
1f3c0 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20   same hash */.  
1f3d0 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20  struct s_x1node 
1f3e0 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76  **from;  /* Prev
1f3f0 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78  ious link */.} x
1f400 31 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65  1node;../* There
1f410 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73   is only one ins
1f420 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72  tance of the arr
1f430 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  ay, which is the
1f440 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74   following */.st
1f450 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 31  atic struct s_x1
1f460 20 2a 78 31 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63   *x1a;../* Alloc
1f470 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69  ate a new associ
1f480 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76  ative array */.v
1f490 6f 69 64 20 53 74 72 73 61 66 65 5f 69 6e 69 74  oid Strsafe_init
1f4a0 28 29 7b 0a 20 20 69 66 28 20 78 31 61 20 29 20  (){.  if( x1a ) 
1f4b0 72 65 74 75 72 6e 3b 0a 20 20 78 31 61 20 3d 20  return;.  x1a = 
1f4c0 28 73 74 72 75 63 74 20 73 5f 78 31 2a 29 6d 61  (struct s_x1*)ma
1f4d0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
1f4e0 75 63 74 20 73 5f 78 31 29 20 29 3b 0a 20 20 69  uct s_x1) );.  i
1f4f0 66 28 20 78 31 61 20 29 7b 0a 20 20 20 20 78 31  f( x1a ){.    x1
1f500 61 2d 3e 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  a->size = 1024;.
1f510 20 20 20 20 78 31 61 2d 3e 63 6f 75 6e 74 20 3d      x1a->count =
1f520 20 30 3b 0a 20 20 20 20 78 31 61 2d 3e 74 62 6c   0;.    x1a->tbl
1f530 20 3d 20 28 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x1node*)mall
1f540 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65  oc( .      (size
1f550 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x1node) + siz
1f560 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 2a 31 30  eof(x1node*))*10
1f570 32 34 20 29 3b 0a 20 20 20 20 69 66 28 20 78 31  24 );.    if( x1
1f580 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
1f590 20 20 20 66 72 65 65 28 78 31 61 29 3b 0a 20 20     free(x1a);.  
1f5a0 20 20 20 20 78 31 61 20 3d 20 30 3b 0a 20 20 20      x1a = 0;.   
1f5b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1f5c0 74 20 69 3b 0a 20 20 20 20 20 20 78 31 61 2d 3e  t i;.      x1a->
1f5d0 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26  ht = (x1node**)&
1f5e0 28 78 31 61 2d 3e 74 62 6c 5b 31 30 32 34 5d 29  (x1a->tbl[1024])
1f5f0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1f600 20 69 3c 31 30 32 34 3b 20 69 2b 2b 29 20 78 31   i<1024; i++) x1
1f610 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  a->ht[i] = 0;.  
1f620 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73    }.  }.}./* Ins
1f630 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
1f640 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e   into the array.
1f650 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
1f660 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20   successful..** 
1f670 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20  Prior data with 
1f680 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
1f690 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20  NOT overwritten 
1f6a0 2a 2f 0a 69 6e 74 20 53 74 72 73 61 66 65 5f 69  */.int Strsafe_i
1f6b0 6e 73 65 72 74 28 64 61 74 61 29 0a 63 68 61 72  nsert(data).char
1f6c0 20 2a 64 61 74 61 3b 0a 7b 0a 20 20 78 31 6e 6f   *data;.{.  x1no
1f6d0 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b  de *np;.  int h;
1f6e0 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66  .  int ph;..  if
1f6f0 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x1a==0 ) retur
1f700 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72 68  n 0;.  ph = strh
1f710 61 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d  ash(data);.  h =
1f720 20 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65   ph & (x1a->size
1f730 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d  -1);.  np = x1a-
1f740 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
1f750 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73   np ){.    if( s
1f760 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64  trcmp(np->data,d
1f770 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ata)==0 ){.     
1f780 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
1f790 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
1f7a0 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64  ame key is found
1f7b0 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61  . */.      /* Fa
1f7c0 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77  il because overw
1f7d0 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  rite is not allo
1f7e0 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ws. */.      ret
1f7f0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1f800 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
1f810 20 20 7d 0a 20 20 69 66 28 20 78 31 61 2d 3e 63    }.  if( x1a->c
1f820 6f 75 6e 74 3e 3d 78 31 61 2d 3e 73 69 7a 65 20  ount>=x1a->size 
1f830 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74  ){.    /* Need t
1f840 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20  o make the hash 
1f850 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a  table bigger */.
1f860 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a      int i,size;.
1f870 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 31 20      struct s_x1 
1f880 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79  array;.    array
1f890 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78  .size = size = x
1f8a0 31 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20  1a->size*2;.    
1f8b0 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 31  array.count = x1
1f8c0 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72  a->count;.    ar
1f8d0 72 61 79 2e 74 62 6c 20 3d 20 28 78 31 6e 6f 64  ray.tbl = (x1nod
1f8e0 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e*)malloc(.     
1f8f0 20 28 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29   (sizeof(x1node)
1f900 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65   + sizeof(x1node
1f910 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20  *))*size );.    
1f920 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30  if( array.tbl==0
1f930 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
1f940 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c   Fail due to mal
1f950 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20  loc failure */. 
1f960 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78     array.ht = (x
1f970 31 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e  1node**)&(array.
1f980 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20  tbl[size]);.    
1f990 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
1f9a0 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69   i++) array.ht[i
1f9b0 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  ] = 0;.    for(i
1f9c0 3d 30 3b 20 69 3c 78 31 61 2d 3e 63 6f 75 6e 74  =0; i<x1a->count
1f9d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 31  ; i++){.      x1
1f9e0 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65  node *oldnp, *ne
1f9f0 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70  wnp;.      oldnp
1fa00 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 69 5d   = &(x1a->tbl[i]
1fa10 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74 72  );.      h = str
1fa20 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61  hash(oldnp->data
1fa30 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20  ) & (size-1);.  
1fa40 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72      newnp = &(ar
1fa50 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  ray.tbl[i]);.   
1fa60 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b     if( array.ht[
1fa70 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d  h] ) array.ht[h]
1fa80 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70  ->from = &(newnp
1fa90 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ->next);.      n
1faa0 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72  ewnp->next = arr
1fab0 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20  ay.ht[h];.      
1fac0 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c  newnp->data = ol
1fad0 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20  dnp->data;.     
1fae0 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26   newnp->from = &
1faf0 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20  (array.ht[h]);. 
1fb00 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d       array.ht[h]
1fb10 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a   = newnp;.    }.
1fb20 20 20 20 20 66 72 65 65 28 78 31 61 2d 3e 74 62      free(x1a->tb
1fb30 6c 29 3b 0a 20 20 20 20 2a 78 31 61 20 3d 20 61  l);.    *x1a = a
1fb40 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  rray;.  }.  /* I
1fb50 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61  nsert the new da
1fb60 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26  ta */.  h = ph &
1fb70 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x1a->size-1);.
1fb80 20 20 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74 62    np = &(x1a->tb
1fb90 6c 5b 78 31 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29  l[x1a->count++])
1fba0 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64  ;.  np->data = d
1fbb0 61 74 61 3b 0a 20 20 69 66 28 20 78 31 61 2d 3e  ata;.  if( x1a->
1fbc0 68 74 5b 68 5d 20 29 20 78 31 61 2d 3e 68 74 5b  ht[h] ) x1a->ht[
1fbd0 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d  h]->from = &(np-
1fbe0 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65  >next);.  np->ne
1fbf0 78 74 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b  xt = x1a->ht[h];
1fc00 0a 20 20 78 31 61 2d 3e 68 74 5b 68 5d 20 3d 20  .  x1a->ht[h] = 
1fc10 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d  np;.  np->from =
1fc20 20 26 28 78 31 61 2d 3e 68 74 5b 68 5d 29 3b 0a   &(x1a->ht[h]);.
1fc30 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
1fc40 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1fc50 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67  er to data assig
1fc60 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ned to the given
1fc70 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55   key.  Return NU
1fc80 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68  LL.** if no such
1fc90 20 6b 65 79 2e 20 2a 2f 0a 63 68 61 72 20 2a 53   key. */.char *S
1fca0 74 72 73 61 66 65 5f 66 69 6e 64 28 6b 65 79 29  trsafe_find(key)
1fcb0 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20  .char *key;.{.  
1fcc0 69 6e 74 20 68 3b 0a 20 20 78 31 6e 6f 64 65 20  int h;.  x1node 
1fcd0 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d  *np;..  if( x1a=
1fce0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1fcf0 20 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79   h = strhash(key
1fd00 29 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31  ) & (x1a->size-1
1fd10 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68  );.  np = x1a->h
1fd20 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
1fd30 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  p ){.    if( str
1fd40 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79  cmp(np->data,key
1fd50 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
1fd60 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
1fd70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70  .  }.  return np
1fd80 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b   ? np->data : 0;
1fd90 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
1fda0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 28  pointer to the (
1fdb0 74 65 72 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74  terminal or nont
1fdc0 65 72 6d 69 6e 61 6c 29 20 73 79 6d 62 6f 6c 20  erminal) symbol 
1fdd0 22 78 22 2e 0a 2a 2a 20 43 72 65 61 74 65 20 61  "x"..** Create a
1fde0 20 6e 65 77 20 73 79 6d 62 6f 6c 20 69 66 20 74   new symbol if t
1fdf0 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
1fe00 20 74 69 6d 65 20 22 78 22 20 68 61 73 20 62 65   time "x" has be
1fe10 65 6e 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75  en seen..*/.stru
1fe20 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f  ct symbol *Symbo
1fe30 6c 5f 6e 65 77 28 78 29 0a 63 68 61 72 20 2a 78  l_new(x).char *x
1fe40 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  ;.{.  struct sym
1fe50 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 73 70 20 3d  bol *sp;..  sp =
1fe60 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 3b   Symbol_find(x);
1fe70 0a 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a  .  if( sp==0 ){.
1fe80 20 20 20 20 73 70 20 3d 20 28 73 74 72 75 63 74      sp = (struct
1fe90 20 73 79 6d 62 6f 6c 20 2a 29 63 61 6c 6c 6f 63   symbol *)calloc
1fea0 28 31 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63  (1, sizeof(struc
1feb0 74 20 73 79 6d 62 6f 6c 29 20 29 3b 0a 20 20 20  t symbol) );.   
1fec0 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73 70 29   MemoryCheck(sp)
1fed0 3b 0a 20 20 20 20 73 70 2d 3e 6e 61 6d 65 20 3d  ;.    sp->name =
1fee0 20 53 74 72 73 61 66 65 28 78 29 3b 0a 20 20 20   Strsafe(x);.   
1fef0 20 73 70 2d 3e 74 79 70 65 20 3d 20 69 73 75 70   sp->type = isup
1ff00 70 65 72 28 2a 78 29 20 3f 20 54 45 52 4d 49 4e  per(*x) ? TERMIN
1ff10 41 4c 20 3a 20 4e 4f 4e 54 45 52 4d 49 4e 41 4c  AL : NONTERMINAL
1ff20 3b 0a 20 20 20 20 73 70 2d 3e 72 75 6c 65 20 3d  ;.    sp->rule =
1ff30 20 30 3b 0a 20 20 20 20 73 70 2d 3e 66 61 6c 6c   0;.    sp->fall
1ff40 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73 70  back = 0;.    sp
1ff50 2d 3e 70 72 65 63 20 3d 20 2d 31 3b 0a 20 20 20  ->prec = -1;.   
1ff60 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20 55 4e 4b   sp->assoc = UNK
1ff70 3b 0a 20 20 20 20 73 70 2d 3e 66 69 72 73 74 73  ;.    sp->firsts
1ff80 65 74 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  et = 0;.    sp->
1ff90 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 46  lambda = LEMON_F
1ffa0 41 4c 53 45 3b 0a 20 20 20 20 73 70 2d 3e 64 65  ALSE;.    sp->de
1ffb0 73 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20  structor = 0;.  
1ffc0 20 20 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f    sp->destLineno
1ffd0 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64 61   = 0;.    sp->da
1ffe0 74 61 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  tatype = 0;.    
1fff0 73 70 2d 3e 75 73 65 43 6e 74 20 3d 20 30 3b 0a  sp->useCnt = 0;.
20000 20 20 20 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72      Symbol_inser
20010 74 28 73 70 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a  t(sp,sp->name);.
20020 20 20 7d 0a 20 20 73 70 2d 3e 75 73 65 43 6e 74    }.  sp->useCnt
20030 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73 70 3b  ++;.  return sp;
20040 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74  .}../* Compare t
20050 77 6f 20 73 79 6d 62 6f 6c 73 20 66 6f 72 20 77  wo symbols for w
20060 6f 72 6b 69 6e 67 20 70 75 72 70 6f 73 65 73 0a  orking purposes.
20070 2a 2a 0a 2a 2a 20 53 79 6d 62 6f 6c 73 20 74 68  **.** Symbols th
20080 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 75 70  at begin with up
20090 70 65 72 20 63 61 73 65 20 6c 65 74 74 65 72 73  per case letters
200a0 20 28 74 65 72 6d 69 6e 61 6c 73 20 6f 72 20 74   (terminals or t
200b0 6f 6b 65 6e 73 29 0a 2a 2a 20 6d 75 73 74 20 73  okens).** must s
200c0 6f 72 74 20 62 65 66 6f 72 65 20 73 79 6d 62 6f  ort before symbo
200d0 6c 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  ls that begin wi
200e0 74 68 20 6c 6f 77 65 72 20 63 61 73 65 20 6c 65  th lower case le
200f0 74 74 65 72 73 0a 2a 2a 20 28 6e 6f 6e 2d 74 65  tters.** (non-te
20100 72 6d 69 6e 61 6c 73 29 2e 20 20 4f 74 68 65 72  rminals).  Other
20110 20 74 68 61 6e 20 74 68 61 74 2c 20 74 68 65 20   than that, the 
20120 6f 72 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 6d  order does not m
20130 61 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  atter..**.** We 
20140 66 69 6e 64 20 65 78 70 65 72 69 6d 65 6e 74 61  find experimenta
20150 6c 6c 79 20 74 68 61 74 20 6c 65 61 76 69 6e 67  lly that leaving
20160 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 69 6e 20   the symbols in 
20170 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 0a 2a  their original.*
20180 2a 20 6f 72 64 65 72 20 28 74 68 65 20 6f 72 64  * order (the ord
20190 65 72 20 74 68 65 79 20 61 70 70 65 61 72 65 64  er they appeared
201a0 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20   in the grammar 
201b0 66 69 6c 65 29 20 67 69 76 65 73 20 74 68 65 0a  file) gives the.
201c0 2a 2a 20 73 6d 61 6c 6c 65 73 74 20 70 61 72 73  ** smallest pars
201d0 65 72 20 74 61 62 6c 65 73 20 69 6e 20 53 51 4c  er tables in SQL
201e0 69 74 65 2e 0a 2a 2f 0a 69 6e 74 20 53 79 6d 62  ite..*/.int Symb
201f0 6f 6c 63 6d 70 70 28 73 74 72 75 63 74 20 73 79  olcmpp(struct sy
20200 6d 62 6f 6c 20 2a 2a 61 2c 20 73 74 72 75 63 74  mbol **a, struct
20210 20 73 79 6d 62 6f 6c 20 2a 2a 62 29 7b 0a 20 20   symbol **b){.  
20220 69 6e 74 20 69 31 20 3d 20 28 2a 2a 61 29 2e 69  int i1 = (**a).i
20230 6e 64 65 78 20 2b 20 31 30 30 30 30 30 30 30 2a  ndex + 10000000*
20240 28 28 2a 2a 61 29 2e 6e 61 6d 65 5b 30 5d 3e 27  ((**a).name[0]>'
20250 5a 27 29 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20  Z');.  int i2 = 
20260 28 2a 2a 62 29 2e 69 6e 64 65 78 20 2b 20 31 30  (**b).index + 10
20270 30 30 30 30 30 30 2a 28 28 2a 2a 62 29 2e 6e 61  000000*((**b).na
20280 6d 65 5b 30 5d 3e 27 5a 27 29 3b 0a 20 20 61 73  me[0]>'Z');.  as
20290 73 65 72 74 28 20 69 31 21 3d 69 32 20 7c 7c 20  sert( i1!=i2 || 
202a0 73 74 72 63 6d 70 28 28 2a 2a 61 29 2e 6e 61 6d  strcmp((**a).nam
202b0 65 2c 28 2a 2a 62 29 2e 6e 61 6d 65 29 3d 3d 30  e,(**b).name)==0
202c0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 31 2d   );.  return i1-
202d0 69 32 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20  i2;.}../* There 
202e0 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
202f0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
20300 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
20310 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69  ach.** associati
20320 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
20330 20 22 78 32 22 2e 0a 2a 2f 0a 73 74 72 75 63 74   "x2"..*/.struct
20340 20 73 5f 78 32 20 7b 0a 20 20 69 6e 74 20 73 69   s_x2 {.  int si
20350 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
20360 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
20370 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  of available slo
20380 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ts. */.         
20390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203a0 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20   /*   Must be a 
203b0 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74  power of 2 great
203c0 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20  er than or */.  
203d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
203e0 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75          /*   equ
203f0 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74  al to 1 */.  int
20400 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20   count;         
20410 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20420 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74  f currently slot
20430 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74  s filled */.  st
20440 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 74  ruct s_x2node *t
20450 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  bl;  /* The data
20460 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a   stored here */.
20470 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64    struct s_x2nod
20480 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68  e **ht;  /* Hash
20490 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75   table for looku
204a0 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  ps */.};../* The
204b0 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
204c0 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
204d0 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64  ture for every d
204e0 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69  ata element.** i
204f0 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65  n an associative
20500 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
20510 78 32 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  x2"..*/.typedef 
20520 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20  struct s_x2node 
20530 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
20540 6c 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  l *data;        
20550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
20560 20 64 61 74 61 20 2a 2f 0a 20 20 63 68 61 72 20   data */.  char 
20570 2a 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  *key;           
20580 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b          /* The k
20590 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ey */.  struct s
205a0 5f 78 32 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20  _x2node *next;  
205b0 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77   /* Next entry w
205c0 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73  ith the same has
205d0 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  h */.  struct s_
205e0 78 32 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20  x2node **from;  
205f0 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b  /* Previous link
20600 20 2a 2f 0a 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f   */.} x2node;../
20610 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  * There is only 
20620 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
20630 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68  the array, which
20640 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   is the followin
20650 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  g */.static stru
20660 63 74 20 73 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f  ct s_x2 *x2a;../
20670 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
20680 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
20690 61 79 20 2a 2f 0a 76 6f 69 64 20 53 79 6d 62 6f  ay */.void Symbo
206a0 6c 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20  l_init(){.  if( 
206b0 78 32 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  x2a ) return;.  
206c0 78 32 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f  x2a = (struct s_
206d0 78 32 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  x2*)malloc( size
206e0 6f 66 28 73 74 72 75 63 74 20 73 5f 78 32 29 20  of(struct s_x2) 
206f0 29 3b 0a 20 20 69 66 28 20 78 32 61 20 29 7b 0a  );.  if( x2a ){.
20700 20 20 20 20 78 32 61 2d 3e 73 69 7a 65 20 3d 20      x2a->size = 
20710 31 32 38 3b 0a 20 20 20 20 78 32 61 2d 3e 63 6f  128;.    x2a->co
20720 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 32 61  unt = 0;.    x2a
20730 2d 3e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a  ->tbl = (x2node*
20740 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20  )malloc( .      
20750 28 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20  (sizeof(x2node) 
20760 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a  + sizeof(x2node*
20770 29 29 2a 31 32 38 20 29 3b 0a 20 20 20 20 69 66  ))*128 );.    if
20780 28 20 78 32 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b  ( x2a->tbl==0 ){
20790 0a 20 20 20 20 20 20 66 72 65 65 28 78 32 61 29  .      free(x2a)
207a0 3b 0a 20 20 20 20 20 20 78 32 61 20 3d 20 30 3b  ;.      x2a = 0;
207b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
207c0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78    int i;.      x
207d0 32 61 2d 3e 68 74 20 3d 20 28 78 32 6e 6f 64 65  2a->ht = (x2node
207e0 2a 2a 29 26 28 78 32 61 2d 3e 74 62 6c 5b 31 32  **)&(x2a->tbl[12
207f0 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  8]);.      for(i
20800 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20  =0; i<128; i++) 
20810 78 32 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a  x2a->ht[i] = 0;.
20820 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49      }.  }.}./* I
20830 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f  nsert a new reco
20840 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61  rd into the arra
20850 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  y.  Return TRUE 
20860 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a  if successful..*
20870 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77 69 74  * Prior data wit
20880 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69  h the same key i
20890 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65  s NOT overwritte
208a0 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f  n */.int Symbol_
208b0 69 6e 73 65 72 74 28 64 61 74 61 2c 6b 65 79 29  insert(data,key)
208c0 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
208d0 64 61 74 61 3b 0a 63 68 61 72 20 2a 6b 65 79 3b  data;.char *key;
208e0 0a 7b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b  .{.  x2node *np;
208f0 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20  .  int h;.  int 
20900 70 68 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d  ph;..  if( x2a==
20910 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
20920 70 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79  ph = strhash(key
20930 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  );.  h = ph & (x
20940 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  2a->size-1);.  n
20950 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x2a->ht[h];.
20960 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
20970 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70     if( strcmp(np
20980 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b  ->key,key)==0 ){
20990 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69  .      /* An exi
209a0 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68  sting entry with
209b0 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
209c0 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20   found. */.     
209d0 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65   /* Fail because
209e0 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f   overwrite is no
209f0 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20  t allows. */.   
20a00 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
20a10 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e   }.    np = np->
20a20 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  next;.  }.  if( 
20a30 78 32 61 2d 3e 63 6f 75 6e 74 3e 3d 78 32 61 2d  x2a->count>=x2a-
20a40 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  >size ){.    /* 
20a50 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  Need to make the
20a60 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67   hash table bigg
20a70 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  er */.    int i,
20a80 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74  size;.    struct
20a90 20 73 5f 78 32 20 61 72 72 61 79 3b 0a 20 20 20   s_x2 array;.   
20aa0 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69   array.size = si
20ab0 7a 65 20 3d 20 78 32 61 2d 3e 73 69 7a 65 2a 32  ze = x2a->size*2
20ac0 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e  ;.    array.coun
20ad0 74 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a  t = x2a->count;.
20ae0 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20      array.tbl = 
20af0 28 78 32 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x2node*)malloc(
20b00 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
20b10 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  2node) + sizeof(
20b20 78 32 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29  x2node*))*size )
20b30 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e  ;.    if( array.
20b40 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tbl==0 ) return 
20b50 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20  0;  /* Fail due 
20b60 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  to malloc failur
20b70 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68  e */.    array.h
20b80 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28  t = (x2node**)&(
20b90 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29  array.tbl[size])
20ba0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
20bb0 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  <size; i++) arra
20bc0 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  y.ht[i] = 0;.   
20bd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 32 61 2d   for(i=0; i<x2a-
20be0 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  >count; i++){.  
20bf0 20 20 20 20 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e      x2node *oldn
20c00 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20  p, *newnp;.     
20c10 20 6f 6c 64 6e 70 20 3d 20 26 28 78 32 61 2d 3e   oldnp = &(x2a->
20c20 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68  tbl[i]);.      h
20c30 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70   = strhash(oldnp
20c40 2d 3e 6b 65 79 29 20 26 20 28 73 69 7a 65 2d 31  ->key) & (size-1
20c50 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d  );.      newnp =
20c60 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29   &(array.tbl[i])
20c70 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61  ;.      if( arra
20c80 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e  y.ht[h] ) array.
20c90 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
20ca0 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20  newnp->next);.  
20cb0 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20      newnp->next 
20cc0 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20  = array.ht[h];. 
20cd0 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20       newnp->key 
20ce0 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20  = oldnp->key;.  
20cf0 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20      newnp->data 
20d00 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20  = oldnp->data;. 
20d10 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d       newnp->from
20d20 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d   = &(array.ht[h]
20d30 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68  );.      array.h
20d40 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20  t[h] = newnp;.  
20d50 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 32 61    }.    free(x2a
20d60 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 32 61  ->tbl);.    *x2a
20d70 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20   = array;.  }.  
20d80 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
20d90 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20  w data */.  h = 
20da0 70 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d  ph & (x2a->size-
20db0 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 32 61  1);.  np = &(x2a
20dc0 2d 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f 75 6e 74  ->tbl[x2a->count
20dd0 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20  ++]);.  np->key 
20de0 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74  = key;.  np->dat
20df0 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20  a = data;.  if( 
20e00 78 32 61 2d 3e 68 74 5b 68 5d 20 29 20 78 32 61  x2a->ht[h] ) x2a
20e10 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  ->ht[h]->from = 
20e20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e  &(np->next);.  n
20e30 70 2d 3e 6e 65 78 74 20 3d 20 78 32 61 2d 3e 68  p->next = x2a->h
20e40 74 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e 68 74 5b  t[h];.  x2a->ht[
20e50 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66  h] = np;.  np->f
20e60 72 6f 6d 20 3d 20 26 28 78 32 61 2d 3e 68 74 5b  rom = &(x2a->ht[
20e70 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  h]);.  return 1;
20e80 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
20e90 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
20ea0 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20  assigned to the 
20eb0 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75  given key.  Retu
20ec0 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f  rn NULL.** if no
20ed0 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74   such key. */.st
20ee0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d  ruct symbol *Sym
20ef0 62 6f 6c 5f 66 69 6e 64 28 6b 65 79 29 0a 63 68  bol_find(key).ch
20f00 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74  ar *key;.{.  int
20f10 20 68 3b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70   h;.  x2node *np
20f20 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20  ;..  if( x2a==0 
20f30 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20  ) return 0;.  h 
20f40 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29 20 26  = strhash(key) &
20f50 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x2a->size-1);.
20f60 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68    np = x2a->ht[h
20f70 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
20f80 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
20f90 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30  (np->key,key)==0
20fa0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70   ) break;.    np
20fb0 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
20fc0 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e  .  return np ? n
20fd0 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a  p->data : 0;.}..
20fe0 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 2d  /* Return the n-
20ff0 74 68 20 64 61 74 61 2e 20 20 52 65 74 75 72 6e  th data.  Return
21000 20 4e 55 4c 4c 20 69 66 20 6e 20 69 73 20 6f 75   NULL if n is ou
21010 74 20 6f 66 20 72 61 6e 67 65 2e 20 2a 2f 0a 73  t of range. */.s
21020 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
21030 6d 62 6f 6c 5f 4e 74 68 28 6e 29 0a 69 6e 74 20  mbol_Nth(n).int 
21040 6e 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79  n;.{.  struct sy
21050 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a 20 20 69 66  mbol *data;.  if
21060 28 20 78 32 61 20 26 26 20 6e 3e 30 20 26 26 20  ( x2a && n>0 && 
21070 6e 3c 3d 78 32 61 2d 3e 63 6f 75 6e 74 20 29 7b  n<=x2a->count ){
21080 0a 20 20 20 20 64 61 74 61 20 3d 20 78 32 61 2d  .    data = x2a-
21090 3e 74 62 6c 5b 6e 2d 31 5d 2e 64 61 74 61 3b 0a  >tbl[n-1].data;.
210a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 61 74    }else{.    dat
210b0 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  a = 0;.  }.  ret
210c0 75 72 6e 20 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 20  urn data;.}../* 
210d0 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
210e0 6f 66 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a  of the array */.
210f0 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74  int Symbol_count
21100 28 29 0a 7b 0a 20 20 72 65 74 75 72 6e 20 78 32  ().{.  return x2
21110 61 20 3f 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3a  a ? x2a->count :
21120 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   0;.}../* Return
21130 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
21140 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74  nters to all dat
21150 61 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  a in the table..
21160 2a 2a 20 54 68 65 20 61 72 72 61 79 20 69 73 20  ** The array is 
21170 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
21180 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55  lloc.  Return NU
21190 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c  LL if memory all
211a0 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c  ocation.** probl
211b0 65 6d 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61  ems, or if the a
211c0 72 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a  rray is empty. *
211d0 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  /.struct symbol 
211e0 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66  **Symbol_arrayof
211f0 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79  ().{.  struct sy
21200 6d 62 6f 6c 20 2a 2a 61 72 72 61 79 3b 0a 20 20  mbol **array;.  
21210 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 69 66  int i,size;.  if
21220 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x2a==0 ) retur
21230 6e 20 30 3b 0a 20 20 73 69 7a 65 20 3d 20 78 32  n 0;.  size = x2
21240 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61  a->count;.  arra
21250 79 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62  y = (struct symb
21260 6f 6c 20 2a 2a 29 63 61 6c 6c 6f 63 28 73 69 7a  ol **)calloc(siz
21270 65 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  e, sizeof(struct
21280 20 73 79 6d 62 6f 6c 20 2a 29 29 3b 0a 20 20 69   symbol *));.  i
21290 66 28 20 61 72 72 61 79 20 29 7b 0a 20 20 20 20  f( array ){.    
212a0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
212b0 20 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d   i++) array[i] =
212c0 20 78 32 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74   x2a->tbl[i].dat
212d0 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  a;.  }.  return 
212e0 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d  array;.}../* Com
212f0 70 61 72 65 20 74 77 6f 20 63 6f 6e 66 69 67 75  pare two configu
21300 72 61 74 69 6f 6e 73 20 2a 2f 0a 69 6e 74 20 43  rations */.int C
21310 6f 6e 66 69 67 63 6d 70 28 61 2c 62 29 0a 73 74  onfigcmp(a,b).st
21320 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a  ruct config *a;.
21330 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
21340 3b 0a 7b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 78  ;.{.  int x;.  x
21350 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20   = a->rp->index 
21360 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a  - b->rp->index;.
21370 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d    if( x==0 ) x =
21380 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74   a->dot - b->dot
21390 3b 0a 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a  ;.  return x;.}.
213a0 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  ./* Compare two 
213b0 73 74 61 74 65 73 20 2a 2f 0a 50 52 49 56 41 54  states */.PRIVAT
213c0 45 20 69 6e 74 20 73 74 61 74 65 63 6d 70 28 61  E int statecmp(a
213d0 2c 62 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  ,b).struct confi
213e0 67 20 2a 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e  g *a;.struct con
213f0 66 69 67 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20  fig *b;.{.  int 
21400 72 63 3b 0a 20 20 66 6f 72 28 72 63 3d 30 3b 20  rc;.  for(rc=0; 
21410 72 63 3d 3d 30 20 26 26 20 61 20 26 26 20 62 3b  rc==0 && a && b;
21420 20 20 61 3d 61 2d 3e 62 70 2c 20 62 3d 62 2d 3e    a=a->bp, b=b->
21430 62 70 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 2d  bp){.    rc = a-
21440 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e  >rp->index - b->
21450 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 20 20 69  rp->index;.    i
21460 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20  f( rc==0 ) rc = 
21470 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b  a->dot - b->dot;
21480 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30  .  }.  if( rc==0
21490 20 29 7b 0a 20 20 20 20 69 66 28 20 61 20 29 20   ){.    if( a ) 
214a0 72 63 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  rc = 1;.    if( 
214b0 62 20 29 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d  b ) rc = -1;.  }
214c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
214d0 0a 2f 2a 20 48 61 73 68 20 61 20 73 74 61 74 65  ./* Hash a state
214e0 20 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20   */.PRIVATE int 
214f0 73 74 61 74 65 68 61 73 68 28 61 29 0a 73 74 72  statehash(a).str
21500 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 7b  uct config *a;.{
21510 0a 20 20 69 6e 74 20 68 3d 30 3b 0a 20 20 77 68  .  int h=0;.  wh
21520 69 6c 65 28 20 61 20 29 7b 0a 20 20 20 20 68 20  ile( a ){.    h 
21530 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d  = h*571 + a->rp-
21540 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64  >index*37 + a->d
21550 6f 74 3b 0a 20 20 20 20 61 20 3d 20 61 2d 3e 62  ot;.    a = a->b
21560 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
21570 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  h;.}../* Allocat
21580 65 20 61 20 6e 65 77 20 73 74 61 74 65 20 73 74  e a new state st
21590 72 75 63 74 75 72 65 20 2a 2f 0a 73 74 72 75 63  ructure */.struc
215a0 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e  t state *State_n
215b0 65 77 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  ew().{.  struct 
215c0 73 74 61 74 65 20 2a 6e 65 77 3b 0a 20 20 6e 65  state *new;.  ne
215d0 77 20 3d 20 28 73 74 72 75 63 74 20 73 74 61 74  w = (struct stat
215e0 65 20 2a 29 63 61 6c 6c 6f 63 28 31 2c 20 73 69  e *)calloc(1, si
215f0 7a 65 6f 66 28 73 74 72 75 63 74 20 73 74 61 74  zeof(struct stat
21600 65 29 20 29 3b 0a 20 20 4d 65 6d 6f 72 79 43 68  e) );.  MemoryCh
21610 65 63 6b 28 6e 65 77 29 3b 0a 20 20 72 65 74 75  eck(new);.  retu
21620 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 54 68  rn new;.}../* Th
21630 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
21640 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
21650 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66  wing structure f
21660 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63  or each.** assoc
21670 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
21680 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 73 74  type "x3"..*/.st
21690 72 75 63 74 20 73 5f 78 33 20 7b 0a 20 20 69 6e  ruct s_x3 {.  in
216a0 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
216b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
216c0 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
216d0 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20   slots. */.     
216e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216f0 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62       /*   Must b
21700 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67  e a power of 2 g
21710 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a  reater than or *
21720 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
21730 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
21740 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20   equal to 1 */. 
21750 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20   int count;     
21760 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
21770 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20  er of currently 
21780 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a  slots filled */.
21790 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64    struct s_x3nod
217a0 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20  e *tbl;  /* The 
217b0 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65  data stored here
217c0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
217d0 33 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20  3node **ht;  /* 
217e0 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c  Hash table for l
217f0 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ookups */.};../*
21800 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
21810 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
21820 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65  tructure for eve
21830 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a  ry data element.
21840 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61  ** in an associa
21850 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
21860 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 74 79 70 65  pe "x3"..*/.type
21870 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 33 6e  def struct s_x3n
21880 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ode {.  struct s
21890 74 61 74 65 20 2a 64 61 74 61 3b 20 20 20 20 20  tate *data;     
218a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
218b0 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74  The data */.  st
218c0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79  ruct config *key
218d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
218e0 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
218f0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e  /.  struct s_x3n
21900 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20  ode *next;   /* 
21910 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20  Next entry with 
21920 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f  the same hash */
21930 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f  .  struct s_x3no
21940 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50  de **from;  /* P
21950 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a  revious link */.
21960 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68  } x3node;../* Th
21970 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
21980 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
21990 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20  array, which is 
219a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
219b0 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73  .static struct s
219c0 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f 2a 20 41 6c  _x3 *x3a;../* Al
219d0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73  locate a new ass
219e0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a  ociative array *
219f0 2f 0a 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69  /.void State_ini
21a00 74 28 29 7b 0a 20 20 69 66 28 20 78 33 61 20 29  t(){.  if( x3a )
21a10 20 72 65 74 75 72 6e 3b 0a 20 20 78 33 61 20 3d   return;.  x3a =
21a20 20 28 73 74 72 75 63 74 20 73 5f 78 33 2a 29 6d   (struct s_x3*)m
21a30 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74  alloc( sizeof(st
21a40 72 75 63 74 20 73 5f 78 33 29 20 29 3b 0a 20 20  ruct s_x3) );.  
21a50 69 66 28 20 78 33 61 20 29 7b 0a 20 20 20 20 78  if( x3a ){.    x
21a60 33 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b 0a  3a->size = 128;.
21a70 20 20 20 20 78 33 61 2d 3e 63 6f 75 6e 74 20 3d      x3a->count =
21a80 20 30 3b 0a 20 20 20 20 78 33 61 2d 3e 74 62 6c   0;.    x3a->tbl
21a90 20 3d 20 28 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x3node*)mall
21aa0 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65  oc( .      (size
21ab0 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x3node) + siz
21ac0 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 2a 31 32  eof(x3node*))*12
21ad0 38 20 29 3b 0a 20 20 20 20 69 66 28 20 78 33 61  8 );.    if( x3a
21ae0 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ->tbl==0 ){.    
21af0 20 20 66 72 65 65 28 78 33 61 29 3b 0a 20 20 20    free(x3a);.   
21b00 20 20 20 78 33 61 20 3d 20 30 3b 0a 20 20 20 20     x3a = 0;.    
21b10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
21b20 20 69 3b 0a 20 20 20 20 20 20 78 33 61 2d 3e 68   i;.      x3a->h
21b30 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28  t = (x3node**)&(
21b40 78 33 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a  x3a->tbl[128]);.
21b50 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
21b60 3c 31 32 38 3b 20 69 2b 2b 29 20 78 33 61 2d 3e  <128; i++) x3a->
21b70 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ht[i] = 0;.    }
21b80 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74  .  }.}./* Insert
21b90 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e   a new record in
21ba0 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52  to the array.  R
21bb0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75  eturn TRUE if su
21bc0 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69  ccessful..** Pri
21bd0 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65  or data with the
21be0 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54   same key is NOT
21bf0 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a   overwritten */.
21c00 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65 72 74  int State_insert
21c10 28 64 61 74 61 2c 6b 65 79 29 0a 73 74 72 75 63  (data,key).struc
21c20 74 20 73 74 61 74 65 20 2a 64 61 74 61 3b 0a 73  t state *data;.s
21c30 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65  truct config *ke
21c40 79 3b 0a 7b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e  y;.{.  x3node *n
21c50 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e  p;.  int h;.  in
21c60 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 33 61  t ph;..  if( x3a
21c70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
21c80 20 20 70 68 20 3d 20 73 74 61 74 65 68 61 73 68    ph = statehash
21c90 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70 68 20  (key);.  h = ph 
21ca0 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x3a->size-1);
21cb0 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b  .  np = x3a->ht[
21cc0 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
21cd0 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74 65  ){.    if( state
21ce0 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29  cmp(np->key,key)
21cf0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
21d00 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  An existing entr
21d10 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
21d20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f  key is found. */
21d30 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62  .      /* Fail b
21d40 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65  ecause overwrite
21d50 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20   is not allows. 
21d60 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
21d70 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20  0;.    }.    np 
21d80 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
21d90 20 20 69 66 28 20 78 33 61 2d 3e 63 6f 75 6e 74    if( x3a->count
21da0 3e 3d 78 33 61 2d 3e 73 69 7a 65 20 29 7b 0a 20  >=x3a->size ){. 
21db0 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61     /* Need to ma
21dc0 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  ke the hash tabl
21dd0 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20  e bigger */.    
21de0 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20  int i,size;.    
21df0 73 74 72 75 63 74 20 73 5f 78 33 20 61 72 72 61  struct s_x3 arra
21e00 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a  y;.    array.siz
21e10 65 20 3d 20 73 69 7a 65 20 3d 20 78 33 61 2d 3e  e = size = x3a->
21e20 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61  size*2;.    arra
21e30 79 2e 63 6f 75 6e 74 20 3d 20 78 33 61 2d 3e 63  y.count = x3a->c
21e40 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e  ount;.    array.
21e50 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 6d  tbl = (x3node*)m
21e60 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69  alloc(.      (si
21e70 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73  zeof(x3node) + s
21e80 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 2a  izeof(x3node*))*
21e90 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  size );.    if( 
21ea0 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72  array.tbl==0 ) r
21eb0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69  eturn 0;  /* Fai
21ec0 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20  l due to malloc 
21ed0 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61  failure */.    a
21ee0 72 72 61 79 2e 68 74 20 3d 20 28 78 33 6e 6f 64  rray.ht = (x3nod
21ef0 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b  e**)&(array.tbl[
21f00 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28  size]);.    for(
21f10 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b  i=0; i<size; i++
21f20 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20  ) array.ht[i] = 
21f30 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
21f40 69 3c 78 33 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b  i<x3a->count; i+
21f50 2b 29 7b 0a 20 20 20 20 20 20 78 33 6e 6f 64 65  +){.      x3node
21f60 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b   *oldnp, *newnp;
21f70 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26  .      oldnp = &
21f80 28 78 33 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20  (x3a->tbl[i]);. 
21f90 20 20 20 20 20 68 20 3d 20 73 74 61 74 65 68 61       h = stateha
21fa0 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26  sh(oldnp->key) &
21fb0 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20   (size-1);.     
21fc0 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79   newnp = &(array
21fd0 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  .tbl[i]);.      
21fe0 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20  if( array.ht[h] 
21ff0 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66  ) array.ht[h]->f
22000 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e  rom = &(newnp->n
22010 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  ext);.      newn
22020 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e  p->next = array.
22030 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77  ht[h];.      new
22040 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d  np->key = oldnp-
22050 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e  >key;.      newn
22060 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d  p->data = oldnp-
22070 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77  >data;.      new
22080 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72  np->from = &(arr
22090 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20  ay.ht[h]);.     
220a0 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e   array.ht[h] = n
220b0 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ewnp;.    }.    
220c0 66 72 65 65 28 78 33 61 2d 3e 74 62 6c 29 3b 0a  free(x3a->tbl);.
220d0 20 20 20 20 2a 78 33 61 20 3d 20 61 72 72 61 79      *x3a = array
220e0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  ;.  }.  /* Inser
220f0 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a  t the new data *
22100 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 33  /.  h = ph & (x3
22110 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
22120 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 78 33   = &(x3a->tbl[x3
22130 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20  a->count++]);.  
22140 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20  np->key = key;. 
22150 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61   np->data = data
22160 3b 0a 20 20 69 66 28 20 78 33 61 2d 3e 68 74 5b  ;.  if( x3a->ht[
22170 68 5d 20 29 20 78 33 61 2d 3e 68 74 5b 68 5d 2d  h] ) x3a->ht[h]-
22180 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65  >from = &(np->ne
22190 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20  xt);.  np->next 
221a0 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x3a->ht[h];.  
221b0 78 33 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b  x3a->ht[h] = np;
221c0 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  .  np->from = &(
221d0 78 33 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72  x3a->ht[h]);.  r
221e0 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52  eturn 1;.}../* R
221f0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
22200 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64  to data assigned
22210 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65   to the given ke
22220 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a  y.  Return NULL.
22230 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65  ** if no such ke
22240 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61  y. */.struct sta
22250 74 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 6b  te *State_find(k
22260 65 79 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  ey).struct confi
22270 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20  g *key;.{.  int 
22280 68 3b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b  h;.  x3node *np;
22290 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29  ..  if( x3a==0 )
222a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d   return 0;.  h =
222b0 20 73 74 61 74 65 68 61 73 68 28 6b 65 79 29 20   statehash(key) 
222c0 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x3a->size-1);
222d0 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b  .  np = x3a->ht[
222e0 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
222f0 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74 65  ){.    if( state
22300 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29  cmp(np->key,key)
22310 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
22320 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
22330 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20    }.  return np 
22340 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a  ? np->data : 0;.
22350 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20  }../* Return an 
22360 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
22370 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e  s to all data in
22380 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54   the table..** T
22390 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61  he array is obta
223a0 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
223b0 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
223c0 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  f memory allocat
223d0 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c  ion.** problems,
223e0 20 6f 72 20 69 66 20 74 68 65 20 61 72 72 61 79   or if the array
223f0 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74   is empty. */.st
22400 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53 74 61  ruct state **Sta
22410 74 65 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a 20  te_arrayof().{. 
22420 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a   struct state **
22430 61 72 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c 73  array;.  int i,s
22440 69 7a 65 3b 0a 20 20 69 66 28 20 78 33 61 3d 3d  ize;.  if( x3a==
22450 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
22460 73 69 7a 65 20 3d 20 78 33 61 2d 3e 63 6f 75 6e  size = x3a->coun
22470 74 3b 0a 20 20 61 72 72 61 79 20 3d 20 28 73 74  t;.  array = (st
22480 72 75 63 74 20 73 74 61 74 65 20 2a 2a 29 6d 61  ruct state **)ma
22490 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
224a0 75 63 74 20 73 74 61 74 65 20 2a 29 2a 73 69 7a  uct state *)*siz
224b0 65 20 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79  e );.  if( array
224c0 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
224d0 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72   i<size; i++) ar
224e0 72 61 79 5b 69 5d 20 3d 20 78 33 61 2d 3e 74 62  ray[i] = x3a->tb
224f0 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20  l[i].data;.  }. 
22500 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d   return array;.}
22510 0a 0a 2f 2a 20 48 61 73 68 20 61 20 63 6f 6e 66  ../* Hash a conf
22520 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49  iguration */.PRI
22530 56 41 54 45 20 69 6e 74 20 63 6f 6e 66 69 67 68  VATE int configh
22540 61 73 68 28 61 29 0a 73 74 72 75 63 74 20 63 6f  ash(a).struct co
22550 6e 66 69 67 20 2a 61 3b 0a 7b 0a 20 20 69 6e 74  nfig *a;.{.  int
22560 20 68 3d 30 3b 0a 20 20 68 20 3d 20 68 2a 35 37   h=0;.  h = h*57
22570 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78  1 + a->rp->index
22580 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20  *37 + a->dot;.  
22590 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20  return h;.}../* 
225a0 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
225b0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
225c0 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
225d0 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73   for each.** ass
225e0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
225f0 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a  f type "x4"..*/.
22600 73 74 72 75 63 74 20 73 5f 78 34 20 7b 0a 20 20  struct s_x4 {.  
22610 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
22620 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
22630 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
22640 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20  le slots. */.   
22650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22660 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74         /*   Must
22670 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
22680 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
22690 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
226a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
226b0 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f     equal to 1 */
226c0 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20  .  int count;   
226d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
226e0 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c  mber of currentl
226f0 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a  y slots filled *
22700 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e  /.  struct s_x4n
22710 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68  ode *tbl;  /* Th
22720 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65  e data stored he
22730 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  re */.  struct s
22740 5f 78 34 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f  _x4node **ht;  /
22750 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
22760 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a   lookups */.};..
22770 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
22780 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
22790 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
227a0 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e  very data elemen
227b0 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63  t.** in an assoc
227c0 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
227d0 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 74 79  type "x4"..*/.ty
227e0 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78  pedef struct s_x
227f0 34 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74  4node {.  struct
22800 20 63 6f 6e 66 69 67 20 2a 64 61 74 61 3b 20 20   config *data;  
22810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22820 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
22830 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65   struct s_x4node
22840 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78   *next;   /* Nex
22850 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  t entry with the
22860 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20   same hash */.  
22870 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20  struct s_x4node 
22880 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76  **from;  /* Prev
22890 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78  ious link */.} x
228a0 34 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65  4node;../* There
228b0 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73   is only one ins
228c0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72  tance of the arr
228d0 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  ay, which is the
228e0 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74   following */.st
228f0 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 34  atic struct s_x4
22900 20 2a 78 34 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63   *x4a;../* Alloc
22910 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69  ate a new associ
22920 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76  ative array */.v
22930 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  oid Configtable_
22940 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78 34  init(){.  if( x4
22950 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 34  a ) return;.  x4
22960 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 34  a = (struct s_x4
22970 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)malloc( sizeof
22980 28 73 74 72 75 63 74 20 73 5f 78 34 29 20 29 3b  (struct s_x4) );
22990 0a 20 20 69 66 28 20 78 34 61 20 29 7b 0a 20 20  .  if( x4a ){.  
229a0 20 20 78 34 61 2d 3e 73 69 7a 65 20 3d 20 36 34    x4a->size = 64
229b0 3b 0a 20 20 20 20 78 34 61 2d 3e 63 6f 75 6e 74  ;.    x4a->count
229c0 20 3d 20 30 3b 0a 20 20 20 20 78 34 61 2d 3e 74   = 0;.    x4a->t
229d0 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29 6d 61  bl = (x4node*)ma
229e0 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69  lloc( .      (si
229f0 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73  zeof(x4node) + s
22a00 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 2a  izeof(x4node*))*
22a10 36 34 20 29 3b 0a 20 20 20 20 69 66 28 20 78 34  64 );.    if( x4
22a20 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
22a30 20 20 20 66 72 65 65 28 78 34 61 29 3b 0a 20 20     free(x4a);.  
22a40 20 20 20 20 78 34 61 20 3d 20 30 3b 0a 20 20 20      x4a = 0;.   
22a50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
22a60 74 20 69 3b 0a 20 20 20 20 20 20 78 34 61 2d 3e  t i;.      x4a->
22a70 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26  ht = (x4node**)&
22a80 28 78 34 61 2d 3e 74 62 6c 5b 36 34 5d 29 3b 0a  (x4a->tbl[64]);.
22a90 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
22aa0 3c 36 34 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68  <64; i++) x4a->h
22ab0 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  t[i] = 0;.    }.
22ac0 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20    }.}./* Insert 
22ad0 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  a new record int
22ae0 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65  o the array.  Re
22af0 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63  turn TRUE if suc
22b00 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f  cessful..** Prio
22b10 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20  r data with the 
22b20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20  same key is NOT 
22b30 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69  overwritten */.i
22b40 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69  nt Configtable_i
22b50 6e 73 65 72 74 28 64 61 74 61 29 0a 73 74 72 75  nsert(data).stru
22b60 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74 61 3b  ct config *data;
22b70 0a 7b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b  .{.  x4node *np;
22b80 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20  .  int h;.  int 
22b90 70 68 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d  ph;..  if( x4a==
22ba0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
22bb0 70 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28  ph = confighash(
22bc0 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20  data);.  h = ph 
22bd0 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x4a->size-1);
22be0 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b  .  np = x4a->ht[
22bf0 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
22c00 29 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69  ){.    if( Confi
22c10 67 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61  gcmp(np->data,da
22c20 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ta)==0 ){.      
22c30 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65  /* An existing e
22c40 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
22c50 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e  me key is found.
22c60 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69   */.      /* Fai
22c70 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72  l because overwr
22c80 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ite is not allow
22c90 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  s. */.      retu
22ca0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
22cb0 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
22cc0 20 7d 0a 20 20 69 66 28 20 78 34 61 2d 3e 63 6f   }.  if( x4a->co
22cd0 75 6e 74 3e 3d 78 34 61 2d 3e 73 69 7a 65 20 29  unt>=x4a->size )
22ce0 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
22cf0 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
22d00 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20  able bigger */. 
22d10 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20     int i,size;. 
22d20 20 20 20 73 74 72 75 63 74 20 73 5f 78 34 20 61     struct s_x4 a
22d30 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e  rray;.    array.
22d40 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 34  size = size = x4
22d50 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61  a->size*2;.    a
22d60 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 34 61  rray.count = x4a
22d70 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72  ->count;.    arr
22d80 61 79 2e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65  ay.tbl = (x4node
22d90 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  *)malloc(.      
22da0 28 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20  (sizeof(x4node) 
22db0 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a  + sizeof(x4node*
22dc0 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69  ))*size );.    i
22dd0 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20  f( array.tbl==0 
22de0 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
22df0 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c  Fail due to mall
22e00 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20  oc failure */.  
22e10 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 34    array.ht = (x4
22e20 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74  node**)&(array.t
22e30 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66  bl[size]);.    f
22e40 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20  or(i=0; i<size; 
22e50 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d  i++) array.ht[i]
22e60 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
22e70 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b  0; i<x4a->count;
22e80 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 34 6e   i++){.      x4n
22e90 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77  ode *oldnp, *new
22ea0 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20  np;.      oldnp 
22eb0 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 29  = &(x4a->tbl[i])
22ec0 3b 0a 20 20 20 20 20 20 68 20 3d 20 63 6f 6e 66  ;.      h = conf
22ed0 69 67 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61  ighash(oldnp->da
22ee0 74 61 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a  ta) & (size-1);.
22ef0 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28        newnp = &(
22f00 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20  array.tbl[i]);. 
22f10 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68       if( array.h
22f20 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b  t[h] ) array.ht[
22f30 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77  h]->from = &(new
22f40 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20  np->next);.     
22f50 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61   newnp->next = a
22f60 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20  rray.ht[h];.    
22f70 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20    newnp->data = 
22f80 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20  oldnp->data;.   
22f90 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d     newnp->from =
22fa0 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b   &(array.ht[h]);
22fb0 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b  .      array.ht[
22fc0 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20  h] = newnp;.    
22fd0 7d 0a 20 20 20 20 66 72 65 65 28 78 34 61 2d 3e  }.    free(x4a->
22fe0 74 62 6c 29 3b 0a 20 20 20 20 2a 78 34 61 20 3d  tbl);.    *x4a =
22ff0 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a   array;.  }.  /*
23000 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
23010 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68  data */.  h = ph
23020 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29   & (x4a->size-1)
23030 3b 0a 20 20 6e 70 20 3d 20 26 28 78 34 61 2d 3e  ;.  np = &(x4a->
23040 74 62 6c 5b 78 34 61 2d 3e 63 6f 75 6e 74 2b 2b  tbl[x4a->count++
23050 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d  ]);.  np->data =
23060 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 34 61   data;.  if( x4a
23070 2d 3e 68 74 5b 68 5d 20 29 20 78 34 61 2d 3e 68  ->ht[h] ) x4a->h
23080 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
23090 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e  p->next);.  np->
230a0 6e 65 78 74 20 3d 20 78 34 61 2d 3e 68 74 5b 68  next = x4a->ht[h
230b0 5d 3b 0a 20 20 78 34 61 2d 3e 68 74 5b 68 5d 20  ];.  x4a->ht[h] 
230c0 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d  = np;.  np->from
230d0 20 3d 20 26 28 78 34 61 2d 3e 68 74 5b 68 5d 29   = &(x4a->ht[h])
230e0 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
230f0 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
23100 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73  nter to data ass
23110 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76  igned to the giv
23120 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20  en key.  Return 
23130 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75  NULL.** if no su
23140 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63  ch key. */.struc
23150 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
23160 74 61 62 6c 65 5f 66 69 6e 64 28 6b 65 79 29 0a  table_find(key).
23170 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b  struct config *k
23180 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20  ey;.{.  int h;. 
23190 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20   x4node *np;..  
231a0 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74  if( x4a==0 ) ret
231b0 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 63 6f 6e  urn 0;.  h = con
231c0 66 69 67 68 61 73 68 28 6b 65 79 29 20 26 20 28  fighash(key) & (
231d0 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x4a->size-1);.  
231e0 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b  np = x4a->ht[h];
231f0 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a  .  while( np ){.
23200 20 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d      if( Configcm
23210 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29 3d  p(np->data,key)=
23220 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
23230 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
23240 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f   }.  return np ?
23250 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d   np->data : 0;.}
23260 0a 0a 2f 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20  ../* Remove all 
23270 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 74 61  data from the ta
23280 62 6c 65 2e 20 20 50 61 73 73 20 65 61 63 68 20  ble.  Pass each 
23290 64 61 74 61 20 74 6f 20 74 68 65 20 66 75 6e 63  data to the func
232a0 74 69 6f 6e 20 22 66 22 0a 2a 2a 20 61 73 20 69  tion "f".** as i
232b0 74 20 69 73 20 72 65 6d 6f 76 65 64 2e 20 20 28  t is removed.  (
232c0 22 66 22 20 6d 61 79 20 62 65 20 6e 75 6c 6c 20  "f" may be null 
232d0 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 73 74  to avoid this st
232e0 65 70 2e 29 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  ep.) */.void Con
232f0 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 66  figtable_clear(f
23300 29 0a 69 6e 74 28 2a 66 29 28 2f 2a 20 73 74 72  ).int(*f)(/* str
23310 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f 29  uct config * */)
23320 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ;.{.  int i;.  i
23330 66 28 20 78 34 61 3d 3d 30 20 7c 7c 20 78 34 61  f( x4a==0 || x4a
23340 2d 3e 63 6f 75 6e 74 3d 3d 30 20 29 20 72 65 74  ->count==0 ) ret
23350 75 72 6e 3b 0a 20 20 69 66 28 20 66 20 29 20 66  urn;.  if( f ) f
23360 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63  or(i=0; i<x4a->c
23370 6f 75 6e 74 3b 20 69 2b 2b 29 20 28 2a 66 29 28  ount; i++) (*f)(
23380 78 34 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61  x4a->tbl[i].data
23390 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
233a0 78 34 61 2d 3e 73 69 7a 65 3b 20 69 2b 2b 29 20  x4a->size; i++) 
233b0 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a  x4a->ht[i] = 0;.
233c0 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30    x4a->count = 0
233d0 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a        ;.  return;.}.