/ Hex Artifact Content
Login

Artifact 0eb9829c494dfcea449de36ad677efe7f0742801:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
0010: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 6f 75  contains all sou
0020: 72 63 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  rces (including 
0030: 68 65 61 64 65 72 73 29 20 74 6f 20 74 68 65 20  headers) to the 
0040: 4c 45 4d 4f 4e 0a 2a 2a 20 4c 41 4c 52 28 31 29  LEMON.** LALR(1)
0050: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0060: 72 2e 20 20 54 68 65 20 73 6f 75 72 63 65 73 20  r.  The sources 
0070: 68 61 76 65 20 62 65 65 6e 20 63 6f 6d 62 69 6e  have been combin
0080: 65 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e  ed into a.** sin
0090: 67 6c 65 20 66 69 6c 65 20 74 6f 20 6d 61 6b 65  gle file to make
00a0: 20 69 74 20 65 61 73 79 20 74 6f 20 69 6e 63 6c   it easy to incl
00b0: 75 64 65 20 4c 45 4d 4f 4e 20 69 6e 20 74 68 65  ude LEMON in the
00c0: 20 73 6f 75 72 63 65 20 74 72 65 65 0a 2a 2a 20   source tree.** 
00d0: 61 6e 64 20 4d 61 6b 65 66 69 6c 65 20 6f 66 20  and Makefile of 
00e0: 61 6e 6f 74 68 65 72 20 70 72 6f 67 72 61 6d 2e  another program.
00f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0100: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61  r of this progra
0110: 6d 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  m disclaims copy
0120: 72 69 67 68 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  right..*/.#inclu
0130: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
0140: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0150: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0160: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63  g.h>.#include <c
0170: 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  type.h>.#include
0180: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0190: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
01a0: 0a 23 69 66 6e 64 65 66 20 5f 5f 57 49 4e 33 32  .#ifndef __WIN32
01b0: 5f 5f 0a 23 20 20 20 69 66 20 64 65 66 69 6e 65  __.#   if define
01c0: 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
01d0: 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 09 64 65  ined(WIN32).#.de
01e0: 66 69 6e 65 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23  fine __WIN32__.#
01f0: 20 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a     endif.#endif.
0200: 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33 32 5f  .#ifdef __WIN32_
0210: 5f 0a 65 78 74 65 72 6e 20 69 6e 74 20 61 63 63  _.extern int acc
0220: 65 73 73 28 29 3b 0a 23 65 6c 73 65 0a 23 69 6e  ess();.#else.#in
0230: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
0240: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 23 64 65 66  .#endif../* #def
0250: 69 6e 65 20 50 52 49 56 41 54 45 20 73 74 61 74  ine PRIVATE stat
0260: 69 63 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  ic */.#define PR
0270: 49 56 41 54 45 0a 0a 23 69 66 64 65 66 20 54 45  IVATE..#ifdef TE
0280: 53 54 0a 23 64 65 66 69 6e 65 20 4d 41 58 52 48  ST.#define MAXRH
0290: 53 20 35 20 20 20 20 20 20 20 2f 2a 20 53 65 74  S 5       /* Set
02a0: 20 6c 6f 77 20 74 6f 20 65 78 65 72 63 69 73 65   low to exercise
02b0: 20 65 78 63 65 70 74 69 6f 6e 20 63 6f 64 65 20   exception code 
02c0: 2a 2f 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  */.#else.#define
02d0: 20 4d 41 58 52 48 53 20 31 30 30 30 0a 23 65 6e   MAXRHS 1000.#en
02e0: 64 69 66 0a 0a 73 74 61 74 69 63 20 63 68 61 72  dif..static char
02f0: 20 2a 6d 73 6f 72 74 28 63 68 61 72 2a 2c 63 68   *msort(char*,ch
0300: 61 72 2a 2a 2c 69 6e 74 28 2a 29 28 63 6f 6e 73  ar**,int(*)(cons
0310: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
0320: 61 72 2a 29 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ar*));../*.** Co
0330: 6d 70 69 6c 65 72 73 20 61 72 65 20 67 65 74 74  mpilers are gett
0340: 69 6e 67 20 69 6e 63 72 65 61 73 69 6e 67 6c 79  ing increasingly
0350: 20 70 65 64 61 6e 74 69 63 20 61 62 6f 75 74 20   pedantic about 
0360: 74 79 70 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73  type conversions
0370: 0a 2a 2a 20 61 73 20 43 20 65 76 6f 6c 76 65 73  .** as C evolves
0380: 20 65 76 65 72 20 63 6c 6f 73 65 72 20 74 6f 20   ever closer to 
0390: 41 64 61 2e 2e 2e 2e 20 20 54 6f 20 77 6f 72 6b  Ada....  To work
03a0: 20 61 72 6f 75 6e 64 20 74 68 65 20 6c 61 74 65   around the late
03b0: 73 74 20 70 72 6f 62 6c 65 6d 73 0a 2a 2a 20 77  st problems.** w
03c0: 65 20 68 61 76 65 20 74 6f 20 64 65 66 69 6e 65  e have to define
03d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   the following v
03e0: 61 72 69 61 6e 74 20 6f 66 20 73 74 72 6c 65 6e  ariant of strlen
03f0: 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 6c  ()..*/.#define l
0400: 65 6d 6f 6e 53 74 72 6c 65 6e 28 58 29 20 20 20  emonStrlen(X)   
0410: 28 28 69 6e 74 29 73 74 72 6c 65 6e 28 58 29 29  ((int)strlen(X))
0420: 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
0430: 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e  action *Action_n
0440: 65 77 28 76 6f 69 64 29 3b 0a 73 74 61 74 69 63  ew(void);.static
0450: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
0460: 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 72 75  Action_sort(stru
0470: 63 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f  ct action *);../
0480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
0490: 74 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e  the file "build.
04a0: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
04b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
04c0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 46 69  *******/.void Fi
04d0: 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65  ndRulePrecedence
04e0: 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 69  s();.void FindFi
04f0: 72 73 74 53 65 74 73 28 29 3b 0a 76 6f 69 64 20  rstSets();.void 
0500: 46 69 6e 64 53 74 61 74 65 73 28 29 3b 0a 76 6f  FindStates();.vo
0510: 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28 29 3b 0a  id FindLinks();.
0520: 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53  void FindFollowS
0530: 65 74 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64  ets();.void Find
0540: 41 63 74 69 6f 6e 73 28 29 3b 0a 0a 2f 2a 2a 2a  Actions();../***
0550: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
0560: 66 69 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73 74  file "configlist
0570: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
0580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0590: 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  *****/.void Conf
05a0: 69 67 6c 69 73 74 5f 69 6e 69 74 28 2f 2a 20 76  iglist_init(/* v
05b0: 6f 69 64 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20  oid */);.struct 
05c0: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
05d0: 73 74 5f 61 64 64 28 2f 2a 20 73 74 72 75 63 74  st_add(/* struct
05e0: 20 72 75 6c 65 20 2a 2c 20 69 6e 74 20 2a 2f 29   rule *, int */)
05f0: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
0600: 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62  *Configlist_addb
0610: 61 73 69 73 28 2f 2a 20 73 74 72 75 63 74 20 72  asis(/* struct r
0620: 75 6c 65 20 2a 2c 20 69 6e 74 20 2a 2f 29 3b 0a  ule *, int */);.
0630: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
0640: 63 6c 6f 73 75 72 65 28 2f 2a 20 76 6f 69 64 20  closure(/* void 
0650: 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67  */);.void Config
0660: 6c 69 73 74 5f 73 6f 72 74 28 2f 2a 20 76 6f 69  list_sort(/* voi
0670: 64 20 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66  d */);.void Conf
0680: 69 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73  iglist_sortbasis
0690: 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 73 74  (/* void */);.st
06a0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
06b0: 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 2f  figlist_return(/
06c0: 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 73 74 72 75  * void */);.stru
06d0: 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
06e0: 67 6c 69 73 74 5f 62 61 73 69 73 28 2f 2a 20 76  glist_basis(/* v
06f0: 6f 69 64 20 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f  oid */);.void Co
0700: 6e 66 69 67 6c 69 73 74 5f 65 61 74 28 2f 2a 20  nfiglist_eat(/* 
0710: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
0720: 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67  */);.void Config
0730: 6c 69 73 74 5f 72 65 73 65 74 28 2f 2a 20 76 6f  list_reset(/* vo
0740: 69 64 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  id */);../******
0750: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
0760: 65 20 22 65 72 72 6f 72 2e 68 22 20 2a 2a 2a 2a  e "error.h" ****
0770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0790: 2a 2a 2a 2f 0a 76 6f 69 64 20 45 72 72 6f 72 4d  ***/.void ErrorM
07a0: 73 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c  sg(const char *,
07b0: 20 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 20   int,const char 
07c0: 2a 2c 20 2e 2e 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  *, ...);../*****
07d0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
07e0: 22 6f 70 74 69 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a  "option.h" *****
07f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0810: 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63 74 20 73 5f  *****/.struct s_
0820: 6f 70 74 69 6f 6e 73 20 7b 0a 20 20 65 6e 75 6d  options {.  enum
0830: 20 7b 20 4f 50 54 5f 46 4c 41 47 3d 31 2c 20 20   { OPT_FLAG=1,  
0840: 4f 50 54 5f 49 4e 54 2c 20 20 4f 50 54 5f 44 42  OPT_INT,  OPT_DB
0850: 4c 2c 20 20 4f 50 54 5f 53 54 52 2c 0a 20 20 20  L,  OPT_STR,.   
0860: 20 20 20 20 20 20 4f 50 54 5f 46 46 4c 41 47 2c        OPT_FFLAG,
0870: 20 4f 50 54 5f 46 49 4e 54 2c 20 4f 50 54 5f 46   OPT_FINT, OPT_F
0880: 44 42 4c 2c 20 4f 50 54 5f 46 53 54 52 7d 20 74  DBL, OPT_FSTR} t
0890: 79 70 65 3b 0a 20 20 63 68 61 72 20 2a 6c 61 62  ype;.  char *lab
08a0: 65 6c 3b 0a 20 20 63 68 61 72 20 2a 61 72 67 3b  el;.  char *arg;
08b0: 0a 20 20 63 68 61 72 20 2a 6d 65 73 73 61 67 65  .  char *message
08c0: 3b 0a 7d 3b 0a 69 6e 74 20 20 20 20 4f 70 74 49  ;.};.int    OptI
08d0: 6e 69 74 28 2f 2a 20 63 68 61 72 2a 2a 2c 73 74  nit(/* char**,st
08e0: 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 2a 2c  ruct s_options*,
08f0: 46 49 4c 45 2a 20 2a 2f 29 3b 0a 69 6e 74 20 20  FILE* */);.int  
0900: 20 20 4f 70 74 4e 41 72 67 73 28 2f 2a 20 76 6f    OptNArgs(/* vo
0910: 69 64 20 2a 2f 29 3b 0a 63 68 61 72 20 20 2a 4f  id */);.char  *O
0920: 70 74 41 72 67 28 2f 2a 20 69 6e 74 20 2a 2f 29  ptArg(/* int */)
0930: 3b 0a 76 6f 69 64 20 20 20 4f 70 74 45 72 72 28  ;.void   OptErr(
0940: 2f 2a 20 69 6e 74 20 2a 2f 29 3b 0a 76 6f 69 64  /* int */);.void
0950: 20 20 20 4f 70 74 50 72 69 6e 74 28 2f 2a 20 76     OptPrint(/* v
0960: 6f 69 64 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  oid */);../*****
0970: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
0980: 65 20 22 70 61 72 73 65 2e 68 22 20 2a 2a 2a 2a  e "parse.h" ****
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09b0: 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 50 61 72 73  *****/.void Pars
09c0: 65 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f  e(/* struct lemo
09d0: 6e 20 2a 6c 65 6d 70 20 2a 2f 29 3b 0a 0a 2f 2a  n *lemp */);../*
09e0: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
09f0: 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 68 22  e file "plink.h"
0a00: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
0a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a20: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63 74  ********/.struct
0a30: 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65   plink *Plink_ne
0a40: 77 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 76  w(/* void */);.v
0a50: 6f 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28 2f 2a  oid Plink_add(/*
0a60: 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a   struct plink **
0a70: 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
0a80: 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 50 6c 69 6e  * */);.void Plin
0a90: 6b 5f 63 6f 70 79 28 2f 2a 20 73 74 72 75 63 74  k_copy(/* struct
0aa0: 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75 63   plink **, struc
0ab0: 74 20 70 6c 69 6e 6b 20 2a 20 2a 2f 29 3b 0a 76  t plink * */);.v
0ac0: 6f 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65  oid Plink_delete
0ad0: 28 2f 2a 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  (/* struct plink
0ae0: 20 2a 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a   * */);../******
0af0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
0b00: 6c 65 20 22 72 65 70 6f 72 74 2e 68 22 20 2a 2a  le "report.h" **
0b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b30: 2a 2a 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e  ***/.void Reprin
0b40: 74 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f  t(/* struct lemo
0b50: 6e 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 52 65  n * */);.void Re
0b60: 70 6f 72 74 4f 75 74 70 75 74 28 2f 2a 20 73 74  portOutput(/* st
0b70: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29  ruct lemon * */)
0b80: 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74 54 61 62  ;.void ReportTab
0b90: 6c 65 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d  le(/* struct lem
0ba0: 6f 6e 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 52  on * */);.void R
0bb0: 65 70 6f 72 74 48 65 61 64 65 72 28 2f 2a 20 73  eportHeader(/* s
0bc0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f  truct lemon * */
0bd0: 29 3b 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73 73  );.void Compress
0be0: 54 61 62 6c 65 73 28 2f 2a 20 73 74 72 75 63 74  Tables(/* struct
0bf0: 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a 76 6f   lemon * */);.vo
0c00: 69 64 20 52 65 73 6f 72 74 53 74 61 74 65 73 28  id ResortStates(
0c10: 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  /* struct lemon 
0c20: 2a 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  * */);../*******
0c30: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
0c40: 65 20 22 73 65 74 2e 68 22 20 2a 2a 2a 2a 2a 2a  e "set.h" ******
0c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c70: 2a 2a 2f 0a 76 6f 69 64 20 20 53 65 74 53 69 7a  **/.void  SetSiz
0c80: 65 28 2f 2a 20 69 6e 74 20 4e 20 2a 2f 29 3b 20  e(/* int N */); 
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
0ca0: 6c 6c 20 73 65 74 73 20 77 69 6c 6c 20 62 65 20  ll sets will be 
0cb0: 6f 66 20 73 69 7a 65 20 4e 20 2a 2f 0a 63 68 61  of size N */.cha
0cc0: 72 20 2a 53 65 74 4e 65 77 28 2f 2a 20 76 6f 69  r *SetNew(/* voi
0cd0: 64 20 2a 2f 29 3b 20 20 20 20 20 20 20 20 20 20  d */);          
0ce0: 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 65       /* A new se
0cf0: 74 20 66 6f 72 20 65 6c 65 6d 65 6e 74 20 30 2e  t for element 0.
0d00: 2e 4e 20 2a 2f 0a 76 6f 69 64 20 20 53 65 74 46  .N */.void  SetF
0d10: 72 65 65 28 2f 2a 20 63 68 61 72 2a 20 2a 2f 29  ree(/* char* */)
0d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0d30: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65   Deallocate a se
0d40: 74 20 2a 2f 0a 0a 69 6e 74 20 53 65 74 41 64 64  t */..int SetAdd
0d50: 28 2f 2a 20 63 68 61 72 2a 2c 69 6e 74 20 2a 2f  (/* char*,int */
0d60: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  );            /*
0d70: 20 41 64 64 20 65 6c 65 6d 65 6e 74 20 74 6f 20   Add element to 
0d80: 61 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53 65 74  a set */.int Set
0d90: 55 6e 69 6f 6e 28 2f 2a 20 63 68 61 72 20 2a 41  Union(/* char *A
0da0: 2c 63 68 61 72 20 2a 42 20 2a 2f 29 3b 20 20 20  ,char *B */);   
0db0: 20 2f 2a 20 41 20 3c 2d 20 41 20 55 20 42 2c 20   /* A <- A U B, 
0dc0: 74 68 72 75 20 65 6c 65 6d 65 6e 74 20 4e 20 2a  thru element N *
0dd0: 2f 0a 0a 23 64 65 66 69 6e 65 20 53 65 74 46 69  /..#define SetFi
0de0: 6e 64 28 58 2c 59 29 20 28 58 5b 59 5d 29 20 20  nd(X,Y) (X[Y])  
0df0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
0e00: 59 20 69 73 20 69 6e 20 73 65 74 20 58 20 2a 2f  Y is in set X */
0e10: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
0e20: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73 74 72  om the file "str
0e30: 75 63 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  uct.h" *********
0e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
0e60: 0a 2a 2a 20 50 72 69 6e 63 69 70 61 6c 20 64 61  .** Principal da
0e70: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  ta structures fo
0e80: 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  r the LEMON pars
0e90: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
0ea0: 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b  ..typedef enum {
0eb0: 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3d 30 2c 20 4c  LEMON_FALSE=0, L
0ec0: 45 4d 4f 4e 5f 54 52 55 45 7d 20 42 6f 6f 6c 65  EMON_TRUE} Boole
0ed0: 61 6e 3b 0a 0a 2f 2a 20 53 79 6d 62 6f 6c 73 20  an;../* Symbols 
0ee0: 28 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e  (terminals and n
0ef0: 6f 6e 74 65 72 6d 69 6e 61 6c 73 29 20 6f 66 20  onterminals) of 
0f00: 74 68 65 20 67 72 61 6d 6d 61 72 20 61 72 65 20  the grammar are 
0f10: 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
0f20: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 73   following: */.s
0f30: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 7b 0a 20  truct symbol {. 
0f40: 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20   char *name;    
0f50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
0f60: 65 20 6f 66 20 74 68 65 20 73 79 6d 62 6f 6c 20  e of the symbol 
0f70: 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20  */.  int index; 
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0f90: 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 66 6f   Index number fo
0fa0: 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f  r this symbol */
0fb0: 0a 20 20 65 6e 75 6d 20 7b 0a 20 20 20 20 54 45  .  enum {.    TE
0fc0: 52 4d 49 4e 41 4c 2c 0a 20 20 20 20 4e 4f 4e 54  RMINAL,.    NONT
0fd0: 45 52 4d 49 4e 41 4c 2c 0a 20 20 20 20 4d 55 4c  ERMINAL,.    MUL
0fe0: 54 49 54 45 52 4d 49 4e 41 4c 0a 20 20 7d 20 74  TITERMINAL.  } t
0ff0: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
1000: 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 73        /* Symbols
1010: 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20   are all either 
1020: 54 45 52 4d 49 4e 41 4c 53 20 6f 72 20 4e 54 73  TERMINALS or NTs
1030: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
1040: 65 20 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f  e *rule;       /
1050: 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * Linked list of
1060: 20 72 75 6c 65 73 20 6f 66 20 74 68 69 73 20 28   rules of this (
1070: 69 66 20 61 6e 20 4e 54 29 20 2a 2f 0a 20 20 73  if an NT) */.  s
1080: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 66 61  truct symbol *fa
1090: 6c 6c 62 61 63 6b 3b 20 2f 2a 20 66 61 6c 6c 62  llback; /* fallb
10a0: 61 63 6b 20 74 6f 6b 65 6e 20 69 6e 20 63 61 73  ack token in cas
10b0: 65 20 74 68 69 73 20 74 6f 6b 65 6e 20 64 6f 65  e this token doe
10c0: 73 6e 27 74 20 70 61 72 73 65 20 2a 2f 0a 20 20  sn't parse */.  
10d0: 69 6e 74 20 70 72 65 63 3b 20 20 20 20 20 20 20  int prec;       
10e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63           /* Prec
10f0: 65 64 65 6e 63 65 20 69 66 20 64 65 66 69 6e 65  edence if define
1100: 64 20 28 2d 31 20 6f 74 68 65 72 77 69 73 65 29  d (-1 otherwise)
1110: 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73   */.  enum e_ass
1120: 6f 63 20 7b 0a 20 20 20 20 4c 45 46 54 2c 0a 20  oc {.    LEFT,. 
1130: 20 20 20 52 49 47 48 54 2c 0a 20 20 20 20 4e 4f     RIGHT,.    NO
1140: 4e 45 2c 0a 20 20 20 20 55 4e 4b 0a 20 20 7d 20  NE,.    UNK.  } 
1150: 61 73 73 6f 63 3b 20 20 20 20 20 20 20 20 20 20  assoc;          
1160: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
1170: 61 74 69 76 69 74 79 20 69 66 20 70 72 65 63 65  ativity if prece
1180: 64 65 6e 63 65 20 69 73 20 64 65 66 69 6e 65 64  dence is defined
1190: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69 72 73   */.  char *firs
11a0: 74 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f  tset;          /
11b0: 2a 20 46 69 72 73 74 2d 73 65 74 20 66 6f 72 20  * First-set for 
11c0: 61 6c 6c 20 72 75 6c 65 73 20 6f 66 20 74 68 69  all rules of thi
11d0: 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 42 6f  s symbol */.  Bo
11e0: 6f 6c 65 61 6e 20 6c 61 6d 62 64 61 3b 20 20 20  olean lambda;   
11f0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1200: 66 20 4e 54 20 61 6e 64 20 63 61 6e 20 67 65 6e  f NT and can gen
1210: 65 72 61 74 65 20 61 6e 20 65 6d 70 74 79 20 73  erate an empty s
1220: 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 75  tring */.  int u
1230: 73 65 43 6e 74 3b 20 20 20 20 20 20 20 20 20 20  seCnt;          
1240: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1250: 20 74 69 6d 65 73 20 75 73 65 64 20 2a 2f 0a 20   times used */. 
1260: 20 63 68 61 72 20 2a 64 65 73 74 72 75 63 74 6f   char *destructo
1270: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64  r;        /* Cod
1280: 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
1290: 20 77 68 65 6e 65 76 65 72 20 74 68 69 73 20 73   whenever this s
12a0: 79 6d 62 6f 6c 20 69 73 0a 20 20 20 20 20 20 20  ymbol is.       
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c0: 20 20 20 20 2a 2a 20 70 6f 70 70 65 64 20 66 72      ** popped fr
12d0: 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 64 75 72  om the stack dur
12e0: 69 6e 67 20 65 72 72 6f 72 20 70 72 6f 63 65 73  ing error proces
12f0: 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sing */.  int de
1300: 73 74 4c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20  stLineno;       
1310: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
1320: 72 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 64  r for start of d
1330: 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 63  estructor */.  c
1340: 68 61 72 20 2a 64 61 74 61 74 79 70 65 3b 20 20  har *datatype;  
1350: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
1360: 61 74 61 20 74 79 70 65 20 6f 66 20 69 6e 66 6f  ata type of info
1370: 72 6d 61 74 69 6f 6e 20 68 65 6c 64 20 62 79 20  rmation held by 
1380: 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  this.           
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a0: 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f 6e 6c 79 20  ** object. Only 
13b0: 75 73 65 64 20 69 66 20 74 79 70 65 3d 3d 4e 4f  used if type==NO
13c0: 4e 54 45 52 4d 49 4e 41 4c 20 2a 2f 0a 20 20 69  NTERMINAL */.  i
13d0: 6e 74 20 64 74 6e 75 6d 3b 20 20 20 20 20 20 20  nt dtnum;       
13e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
13f0: 61 74 61 20 74 79 70 65 20 6e 75 6d 62 65 72 2e  ata type number.
1400: 20 20 49 6e 20 74 68 65 20 70 61 72 73 65 72 2c    In the parser,
1410: 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   the value.     
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 20 20 20 2a 2a 20 73 74 61 63 6b 20 69        ** stack i
1440: 73 20 61 20 75 6e 69 6f 6e 2e 20 20 54 68 65 20  s a union.  The 
1450: 2e 79 79 25 64 20 65 6c 65 6d 65 6e 74 20 6f 66  .yy%d element of
1460: 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1480: 20 2a 2a 20 75 6e 69 6f 6e 20 69 73 20 74 68 65   ** union is the
1490: 20 63 6f 72 72 65 63 74 20 64 61 74 61 20 74 79   correct data ty
14a0: 70 65 20 66 6f 72 20 74 68 69 73 20 6f 62 6a 65  pe for this obje
14b0: 63 74 20 2a 2f 0a 20 20 2f 2a 20 54 68 65 20 66  ct */.  /* The f
14c0: 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
14d0: 61 72 65 20 75 73 65 64 20 62 79 20 4d 55 4c 54  are used by MULT
14e0: 49 54 45 52 4d 49 4e 41 4c 73 20 6f 6e 6c 79 20  ITERMINALs only 
14f0: 2a 2f 0a 20 20 69 6e 74 20 6e 73 75 62 73 79 6d  */.  int nsubsym
1500: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1510: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74   Number of const
1520: 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20 69  ituent symbols i
1530: 6e 20 74 68 65 20 4d 55 4c 54 49 20 2a 2f 0a 20  n the MULTI */. 
1540: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1550: 2a 73 75 62 73 79 6d 3b 20 20 2f 2a 20 41 72 72  *subsym;  /* Arr
1560: 61 79 20 6f 66 20 63 6f 6e 73 74 69 74 75 65 6e  ay of constituen
1570: 74 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 7d 3b 0a  t symbols */.};.
1580: 0a 2f 2a 20 45 61 63 68 20 70 72 6f 64 75 63 74  ./* Each product
1590: 69 6f 6e 20 72 75 6c 65 20 69 6e 20 74 68 65 20  ion rule in the 
15a0: 67 72 61 6d 6d 61 72 20 69 73 20 73 74 6f 72 65  grammar is store
15b0: 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d in the followi
15c0: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
15d0: 20 20 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c 65    */.struct rule
15e0: 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62   {.  struct symb
15f0: 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20 2f 2a  ol *lhs;      /*
1600: 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   Left-hand side 
1610: 6f 66 20 74 68 65 20 72 75 6c 65 20 2a 2f 0a 20  of the rule */. 
1620: 20 63 68 61 72 20 2a 6c 68 73 61 6c 69 61 73 3b   char *lhsalias;
1630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 69            /* Ali
1640: 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20 28  as for the LHS (
1650: 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f  NULL if none) */
1660: 0a 20 20 69 6e 74 20 6c 68 73 53 74 61 72 74 3b  .  int lhsStart;
1670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1680: 72 75 65 20 69 66 20 6c 65 66 74 2d 68 61 6e 64  rue if left-hand
1690: 20 73 69 64 65 20 69 73 20 74 68 65 20 73 74 61   side is the sta
16a0: 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69  rt symbol */.  i
16b0: 6e 74 20 72 75 6c 65 6c 69 6e 65 3b 20 20 20 20  nt ruleline;    
16c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
16d0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72  number for the r
16e0: 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68  ule */.  int nrh
16f0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1700: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
1710: 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20  HS symbols */.  
1720: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
1730: 72 68 73 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rhs;     /* The 
1740: 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  RHS symbols */. 
1750: 20 63 68 61 72 20 2a 2a 72 68 73 61 6c 69 61 73   char **rhsalias
1760: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ;         /* An 
1770: 61 6c 69 61 73 20 66 6f 72 20 65 61 63 68 20 52  alias for each R
1780: 48 53 20 73 79 6d 62 6f 6c 20 28 4e 55 4c 4c 20  HS symbol (NULL 
1790: 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20 20 69 6e  if none) */.  in
17a0: 74 20 6c 69 6e 65 3b 20 20 20 20 20 20 20 20 20  t line;         
17b0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
17c0: 75 6d 62 65 72 20 61 74 20 77 68 69 63 68 20 63  umber at which c
17d0: 6f 64 65 20 62 65 67 69 6e 73 20 2a 2f 0a 20 20  ode begins */.  
17e0: 63 68 61 72 20 2a 63 6f 64 65 3b 20 20 20 20 20  char *code;     
17f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1800: 63 6f 64 65 20 65 78 65 63 75 74 65 64 20 77 68  code executed wh
1810: 65 6e 20 74 68 69 73 20 72 75 6c 65 20 69 73 20  en this rule is 
1820: 72 65 64 75 63 65 64 20 2a 2f 0a 20 20 73 74 72  reduced */.  str
1830: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 70 72 65 63  uct symbol *prec
1840: 73 79 6d 3b 20 20 2f 2a 20 50 72 65 63 65 64 65  sym;  /* Precede
1850: 6e 63 65 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74  nce symbol for t
1860: 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e  his rule */.  in
1870: 74 20 69 6e 64 65 78 3b 20 20 20 20 20 20 20 20  t index;        
1880: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
1890: 65 78 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ex number for th
18a0: 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 42 6f 6f  is rule */.  Boo
18b0: 6c 65 61 6e 20 63 61 6e 52 65 64 75 63 65 3b 20  lean canReduce; 
18c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
18d0: 20 74 68 69 73 20 72 75 6c 65 20 69 73 20 65 76   this rule is ev
18e0: 65 72 20 72 65 64 75 63 65 64 20 2a 2f 0a 20 20  er reduced */.  
18f0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65 78  struct rule *nex
1900: 74 6c 68 73 3b 20 20 20 20 2f 2a 20 4e 65 78 74  tlhs;    /* Next
1910: 20 72 75 6c 65 20 77 69 74 68 20 74 68 65 20 73   rule with the s
1920: 61 6d 65 20 4c 48 53 20 2a 2f 0a 20 20 73 74 72  ame LHS */.  str
1930: 75 63 74 20 72 75 6c 65 20 2a 6e 65 78 74 3b 20  uct rule *next; 
1940: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 72 75        /* Next ru
1950: 6c 65 20 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c  le in the global
1960: 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20   list */.};../* 
1970: 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  A configuration 
1980: 69 73 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  is a production 
1990: 72 75 6c 65 20 6f 66 20 74 68 65 20 67 72 61 6d  rule of the gram
19a0: 6d 61 72 20 74 6f 67 65 74 68 65 72 20 77 69 74  mar together wit
19b0: 68 0a 2a 2a 20 61 20 6d 61 72 6b 20 28 64 6f 74  h.** a mark (dot
19c0: 29 20 73 68 6f 77 69 6e 67 20 68 6f 77 20 6d 75  ) showing how mu
19d0: 63 68 20 6f 66 20 74 68 61 74 20 72 75 6c 65 20  ch of that rule 
19e0: 68 61 73 20 62 65 65 6e 20 70 72 6f 63 65 73 73  has been process
19f0: 65 64 20 73 6f 20 66 61 72 2e 0a 2a 2a 20 43 6f  ed so far..** Co
1a00: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 61 6c 73  nfigurations als
1a10: 6f 20 63 6f 6e 74 61 69 6e 20 61 20 66 6f 6c 6c  o contain a foll
1a20: 6f 77 2d 73 65 74 20 77 68 69 63 68 20 69 73 20  ow-set which is 
1a30: 61 20 6c 69 73 74 20 6f 66 20 74 65 72 6d 69 6e  a list of termin
1a40: 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 73 20 77 68  al.** symbols wh
1a50: 69 63 68 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  ich are allowed 
1a60: 74 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  to immediately f
1a70: 6f 6c 6c 6f 77 20 74 68 65 20 65 6e 64 20 6f 66  ollow the end of
1a80: 20 74 68 65 20 72 75 6c 65 2e 0a 2a 2a 20 45 76   the rule..** Ev
1a90: 65 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ery configuratio
1aa0: 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20 61 73  n is recorded as
1ab0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
1ac0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a  the following: *
1ad0: 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  /.struct config 
1ae0: 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  {.  struct rule 
1af0: 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  *rp;         /* 
1b00: 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20 77 68  The rule upon wh
1b10: 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ich the configur
1b20: 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64 20 2a  ation is based *
1b30: 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20 20 20  /.  int dot;    
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b50: 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e 74 20  The parse point 
1b60: 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73 3b 20  */.  char *fws; 
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b80: 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72 20   Follow-set for 
1b90: 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  this configurati
1ba0: 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  on only */.  str
1bb0: 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c 70 3b  uct plink *fplp;
1bc0: 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d        /* Follow-
1bd0: 73 65 74 20 66 6f 72 77 61 72 64 20 70 72 6f 70  set forward prop
1be0: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f  agation links */
1bf0: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
1c00: 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20 46  *bplp;      /* F
1c10: 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b 77 61  ollow-set backwa
1c20: 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  rds propagation 
1c30: 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75 63  links */.  struc
1c40: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20  t state *stp;   
1c50: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1c60: 6f 20 73 74 61 74 65 20 77 68 69 63 68 20 63 6f  o state which co
1c70: 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f 0a 20  ntains this */. 
1c80: 20 65 6e 75 6d 20 7b 0a 20 20 20 20 43 4f 4d 50   enum {.    COMP
1c90: 4c 45 54 45 2c 20 20 20 20 20 20 20 20 20 20 20  LETE,           
1ca0: 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 75 73     /* The status
1cb0: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
1cc0: 66 6f 6c 6c 6f 77 73 65 74 20 61 6e 64 20 2a 2f  followset and */
1cd0: 0a 20 20 20 20 49 4e 43 4f 4d 50 4c 45 54 45 20  .    INCOMPLETE 
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
1cf0: 20 20 73 68 69 66 74 20 63 6f 6d 70 75 74 61 74    shift computat
1d00: 69 6f 6e 73 20 2a 2f 0a 20 20 7d 20 73 74 61 74  ions */.  } stat
1d10: 75 73 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  us;.  struct con
1d20: 66 69 67 20 2a 6e 65 78 74 3b 20 20 20 20 20 2f  fig *next;     /
1d30: 2a 20 4e 65 78 74 20 63 6f 6e 66 69 67 75 72 61  * Next configura
1d40: 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74 61 74  tion in the stat
1d50: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f  e */.  struct co
1d60: 6e 66 69 67 20 2a 62 70 3b 20 20 20 20 20 20 20  nfig *bp;       
1d70: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 61 73 69  /* The next basi
1d80: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  s configuration 
1d90: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72 79 20  */.};../* Every 
1da0: 73 68 69 66 74 20 6f 72 20 72 65 64 75 63 65 20  shift or reduce 
1db0: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73 74 6f  operation is sto
1dc0: 72 65 64 20 61 73 20 6f 6e 65 20 6f 66 20 74 68  red as one of th
1dd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
1de0: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 7b 0a 20  truct action {. 
1df0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1e00: 73 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  sp;       /* The
1e10: 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 73 79 6d 62   look-ahead symb
1e20: 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61  ol */.  enum e_a
1e30: 63 74 69 6f 6e 20 7b 0a 20 20 20 20 53 48 49 46  ction {.    SHIF
1e40: 54 2c 0a 20 20 20 20 41 43 43 45 50 54 2c 0a 20  T,.    ACCEPT,. 
1e50: 20 20 20 52 45 44 55 43 45 2c 0a 20 20 20 20 45     REDUCE,.    E
1e60: 52 52 4f 52 2c 0a 20 20 20 20 53 53 43 4f 4e 46  RROR,.    SSCONF
1e70: 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20 20 20  LICT,           
1e80: 20 20 20 2f 2a 20 41 20 73 68 69 66 74 2f 73 68     /* A shift/sh
1e90: 69 66 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ift conflict */.
1ea0: 20 20 20 20 53 52 43 4f 4e 46 4c 49 43 54 2c 20      SRCONFLICT, 
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ec0: 57 61 73 20 61 20 72 65 64 75 63 65 2c 20 62 75  Was a reduce, bu
1ed0: 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6e 66  t part of a conf
1ee0: 6c 69 63 74 20 2a 2f 0a 20 20 20 20 52 52 43 4f  lict */.    RRCO
1ef0: 4e 46 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20  NFLICT,         
1f00: 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 72 65       /* Was a re
1f10: 64 75 63 65 2c 20 62 75 74 20 70 61 72 74 20 6f  duce, but part o
1f20: 66 20 61 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  f a conflict */.
1f30: 20 20 20 20 53 48 5f 52 45 53 4f 4c 56 45 44 2c      SH_RESOLVED,
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f50: 57 61 73 20 61 20 73 68 69 66 74 2e 20 20 50 72  Was a shift.  Pr
1f60: 65 63 65 64 65 6e 63 65 20 72 65 73 6f 6c 76 65  ecedence resolve
1f70: 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  d conflict */.  
1f80: 20 20 52 44 5f 52 45 53 4f 4c 56 45 44 2c 20 20    RD_RESOLVED,  
1f90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61             /* Wa
1fa0: 73 20 72 65 64 75 63 65 2e 20 20 50 72 65 63 65  s reduce.  Prece
1fb0: 64 65 6e 63 65 20 72 65 73 6f 6c 76 65 64 20 63  dence resolved c
1fc0: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20 4e  onflict */.    N
1fd0: 4f 54 5f 55 53 45 44 20 20 20 20 20 20 20 20 20  OT_USED         
1fe0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
1ff0: 65 64 20 62 79 20 63 6f 6d 70 72 65 73 73 69 6f  ed by compressio
2000: 6e 20 2a 2f 0a 20 20 7d 20 74 79 70 65 3b 0a 20  n */.  } type;. 
2010: 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72   union {.    str
2020: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20  uct state *stp; 
2030: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 73      /* The new s
2040: 74 61 74 65 2c 20 69 66 20 61 20 73 68 69 66 74  tate, if a shift
2050: 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 72   */.    struct r
2060: 75 6c 65 20 2a 72 70 3b 20 20 20 20 20 20 20 2f  ule *rp;       /
2070: 2a 20 54 68 65 20 72 75 6c 65 2c 20 69 66 20 61  * The rule, if a
2080: 20 72 65 64 75 63 65 20 2a 2f 0a 20 20 7d 20 78   reduce */.  } x
2090: 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
20a0: 6e 20 2a 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20  n *next;     /* 
20b0: 4e 65 78 74 20 61 63 74 69 6f 6e 20 66 6f 72 20  Next action for 
20c0: 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20  this state */.  
20d0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 63  struct action *c
20e0: 6f 6c 6c 69 64 65 3b 20 20 2f 2a 20 4e 65 78 74  ollide;  /* Next
20f0: 20 61 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65   action with the
2100: 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 7d 3b   same hash */.};
2110: 0a 0a 2f 2a 20 45 61 63 68 20 73 74 61 74 65 20  ../* Each state 
2120: 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
2130: 20 70 61 72 73 65 72 27 73 20 66 69 6e 69 74 65   parser's finite
2140: 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 0a 2a   state machine.*
2150: 2a 20 69 73 20 65 6e 63 6f 64 65 64 20 61 73 20  * is encoded as 
2160: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
2170: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
2180: 75 63 74 75 72 65 2e 20 2a 2f 0a 73 74 72 75 63  ucture. */.struc
2190: 74 20 73 74 61 74 65 20 7b 0a 20 20 73 74 72 75  t state {.  stru
21a0: 63 74 20 63 6f 6e 66 69 67 20 2a 62 70 3b 20 20  ct config *bp;  
21b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 61 73 69       /* The basi
21c0: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  s configurations
21d0: 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 20   for this state 
21e0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  */.  struct conf
21f0: 69 67 20 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a  ig *cfp;      /*
2200: 20 41 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69   All configurati
2210: 6f 6e 73 20 69 6e 20 74 68 69 73 20 73 65 74 20  ons in this set 
2220: 2a 2f 0a 20 20 69 6e 74 20 73 74 61 74 65 6e 75  */.  int statenu
2230: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  m;            /*
2240: 20 53 65 71 75 65 6e 74 69 61 6c 20 6e 75 6d 62   Sequential numb
2250: 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74  er for this stat
2260: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63  e */.  struct ac
2270: 74 69 6f 6e 20 2a 61 70 3b 20 20 20 20 20 20 20  tion *ap;       
2280: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
2290: 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 73 74 61  ons for this sta
22a0: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6b 6e  te */.  int nTkn
22b0: 41 63 74 2c 20 6e 4e 74 41 63 74 3b 20 20 20 20  Act, nNtAct;    
22c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 63   /* Number of ac
22d0: 74 69 6f 6e 73 20 6f 6e 20 74 65 72 6d 69 6e 61  tions on termina
22e0: 6c 73 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e  ls and nontermin
22f0: 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6b  als */.  int iTk
2300: 6e 4f 66 73 74 2c 20 69 4e 74 4f 66 73 74 3b 20  nOfst, iNtOfst; 
2310: 20 20 2f 2a 20 79 79 5f 61 63 74 69 6f 6e 5b 5d    /* yy_action[]
2320: 20 6f 66 66 73 65 74 20 66 6f 72 20 74 65 72 6d   offset for term
2330: 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74 65 72  inals and nonter
2340: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 69 44 66 6c  ms */.  int iDfl
2350: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2360: 20 2f 2a 20 44 65 66 61 75 6c 74 20 61 63 74 69   /* Default acti
2370: 6f 6e 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65  on */.};.#define
2380: 20 4e 4f 5f 4f 46 46 53 45 54 20 28 2d 32 31 34   NO_OFFSET (-214
2390: 37 34 38 33 36 34 37 29 0a 0a 2f 2a 20 41 20 66  7483647)../* A f
23a0: 6f 6c 6c 6f 77 73 65 74 20 70 72 6f 70 61 67 61  ollowset propaga
23b0: 74 69 6f 6e 20 6c 69 6e 6b 20 69 6e 64 69 63 61  tion link indica
23c0: 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
23d0: 74 65 6e 74 73 20 6f 66 20 6f 6e 65 0a 2a 2a 20  tents of one.** 
23e0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6f  configuration fo
23f0: 6c 6c 6f 77 73 65 74 20 73 68 6f 75 6c 64 20 62  llowset should b
2400: 65 20 70 72 6f 70 61 67 61 74 65 64 20 74 6f 20  e propagated to 
2410: 61 6e 6f 74 68 65 72 20 77 68 65 6e 65 76 65 72  another whenever
2420: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 68  .** the first ch
2430: 61 6e 67 65 73 2e 20 2a 2f 0a 73 74 72 75 63 74  anges. */.struct
2440: 20 70 6c 69 6e 6b 20 7b 0a 20 20 73 74 72 75 63   plink {.  struc
2450: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20  t config *cfp;  
2460: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 69      /* The confi
2470: 67 75 72 61 74 69 6f 6e 20 74 6f 20 77 68 69 63  guration to whic
2480: 68 20 6c 69 6e 6b 65 64 20 2a 2f 0a 20 20 73 74  h linked */.  st
2490: 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74  ruct plink *next
24a0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ;      /* The ne
24b0: 78 74 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e  xt propagate lin
24c0: 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 20  k */.};../* The 
24d0: 73 74 61 74 65 20 76 65 63 74 6f 72 20 66 6f 72  state vector for
24e0: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 72 73   the entire pars
24f0: 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69 73 20  er generator is 
2500: 72 65 63 6f 72 64 65 64 20 61 73 0a 2a 2a 20 66  recorded as.** f
2510: 6f 6c 6c 6f 77 73 2e 20 20 28 4c 45 4d 4f 4e 20  ollows.  (LEMON 
2520: 75 73 65 73 20 6e 6f 20 67 6c 6f 62 61 6c 20 76  uses no global v
2530: 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6d 61 6b  ariables and mak
2540: 65 73 20 6c 69 74 74 6c 65 20 75 73 65 20 6f 66  es little use of
2550: 0a 2a 2a 20 73 74 61 74 69 63 20 76 61 72 69 61  .** static varia
2560: 62 6c 65 73 2e 20 20 46 69 65 6c 64 73 20 69 6e  bles.  Fields in
2570: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2580: 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20  tructure can be 
2590: 74 68 6f 75 67 68 74 0a 2a 2a 20 6f 66 20 61 73  thought.** of as
25a0: 20 62 65 67 69 6e 20 67 6c 6f 62 61 6c 20 76 61   begin global va
25b0: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70  riables in the p
25c0: 72 6f 67 72 61 6d 2e 29 20 2a 2f 0a 73 74 72 75  rogram.) */.stru
25d0: 63 74 20 6c 65 6d 6f 6e 20 7b 0a 20 20 73 74 72  ct lemon {.  str
25e0: 75 63 74 20 73 74 61 74 65 20 2a 2a 73 6f 72 74  uct state **sort
25f0: 65 64 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f  ed;   /* Table o
2600: 66 20 73 74 61 74 65 73 20 73 6f 72 74 65 64 20  f states sorted 
2610: 62 79 20 73 74 61 74 65 20 6e 75 6d 62 65 72 20  by state number 
2620: 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  */.  struct rule
2630: 20 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f 2a   *rule;       /*
2640: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 72 75 6c   List of all rul
2650: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 74 61  es */.  int nsta
2660: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
2670: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 74   /* Number of st
2680: 61 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 72  ates */.  int nr
2690: 75 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ule;            
26a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
26b0: 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  rules */.  int n
26c0: 73 79 6d 62 6f 6c 3b 20 20 20 20 20 20 20 20 20  symbol;         
26d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
26e0: 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f   terminal and no
26f0: 6e 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c  nterminal symbol
2700: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 74 65 72 6d  s */.  int nterm
2710: 69 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  inal;           
2720: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
2730: 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f  minal symbols */
2740: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
2750: 20 2a 2a 73 79 6d 62 6f 6c 73 3b 20 2f 2a 20 53   **symbols; /* S
2760: 6f 72 74 65 64 20 61 72 72 61 79 20 6f 66 20 70  orted array of p
2770: 6f 69 6e 74 65 72 73 20 74 6f 20 73 79 6d 62 6f  ointers to symbo
2780: 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f  ls */.  int erro
2790: 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rcnt;           
27a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
27b0: 72 6f 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  rors */.  struct
27c0: 20 73 79 6d 62 6f 6c 20 2a 65 72 72 73 79 6d 3b   symbol *errsym;
27d0: 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20     /* The error 
27e0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75  symbol */.  stru
27f0: 63 74 20 73 79 6d 62 6f 6c 20 2a 77 69 6c 64 63  ct symbol *wildc
2800: 61 72 64 3b 20 2f 2a 20 54 6f 6b 65 6e 20 74 68  ard; /* Token th
2810: 61 74 20 6d 61 74 63 68 65 73 20 61 6e 79 74 68  at matches anyth
2820: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6e  ing */.  char *n
2830: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
2840: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2850: 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65   generated parse
2860: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67  r */.  char *arg
2870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2880: 2f 2a 20 44 65 63 6c 61 72 61 74 69 6f 6e 20 6f  /* Declaration o
2890: 66 20 74 68 65 20 33 74 68 20 61 72 67 75 6d 65  f the 3th argume
28a0: 6e 74 20 74 6f 20 70 61 72 73 65 72 20 2a 2f 0a  nt to parser */.
28b0: 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 74 79 70    char *tokentyp
28c0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79  e;         /* Ty
28d0: 70 65 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73  pe of terminal s
28e0: 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20 70 61  ymbols in the pa
28f0: 72 73 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20  rser stack */.  
2900: 63 68 61 72 20 2a 76 61 72 74 79 70 65 3b 20 20  char *vartype;  
2910: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2920: 64 65 66 61 75 6c 74 20 74 79 70 65 20 6f 66 20  default type of 
2930: 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 73 79 6d  non-terminal sym
2940: 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  bols */.  char *
2950: 73 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20  start;          
2960: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2970: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 66  e start symbol f
2980: 6f 72 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  or the grammar *
2990: 2f 0a 20 20 63 68 61 72 20 2a 73 74 61 63 6b 73  /.  char *stacks
29a0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ize;         /* 
29b0: 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 72 73  Size of the pars
29c0: 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68  er stack */.  ch
29d0: 61 72 20 2a 69 6e 63 6c 75 64 65 3b 20 20 20 20  ar *include;    
29e0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
29f0: 6f 20 70 75 74 20 61 74 20 74 68 65 20 73 74 61  o put at the sta
2a00: 72 74 20 6f 66 20 74 68 65 20 43 20 66 69 6c 65  rt of the C file
2a10: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 72 72 6f   */.  char *erro
2a20: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
2a30: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
2a40: 65 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20  e when an error 
2a50: 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 63 68 61  is seen */.  cha
2a60: 72 20 2a 6f 76 65 72 66 6c 6f 77 3b 20 20 20 20  r *overflow;    
2a70: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f        /* Code to
2a80: 20 65 78 65 63 75 74 65 20 6f 6e 20 61 20 73 74   execute on a st
2a90: 61 63 6b 20 6f 76 65 72 66 6c 6f 77 20 2a 2f 0a  ack overflow */.
2aa0: 20 20 63 68 61 72 20 2a 66 61 69 6c 75 72 65 3b    char *failure;
2ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2ac0: 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f 6e  de to execute on
2ad0: 20 70 61 72 73 65 72 20 66 61 69 6c 75 72 65 20   parser failure 
2ae0: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 63 63 65 70  */.  char *accep
2af0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
2b00: 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65   Code to execute
2b10: 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   when the parser
2b20: 20 65 78 63 65 70 74 73 20 2a 2f 0a 20 20 63 68   excepts */.  ch
2b30: 61 72 20 2a 65 78 74 72 61 63 6f 64 65 3b 20 20  ar *extracode;  
2b40: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 61         /* Code a
2b50: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 67  ppended to the g
2b60: 65 6e 65 72 61 74 65 64 20 66 69 6c 65 20 2a 2f  enerated file */
2b70: 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 64 65  .  char *tokende
2b80: 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  st;         /* C
2b90: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 74  ode to execute t
2ba0: 6f 20 64 65 73 74 72 6f 79 20 74 6f 6b 65 6e 20  o destroy token 
2bb0: 64 61 74 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a  data */.  char *
2bc0: 76 61 72 64 65 73 74 3b 20 20 20 20 20 20 20 20  vardest;        
2bd0: 20 20 20 2f 2a 20 43 6f 64 65 20 66 6f 72 20 74     /* Code for t
2be0: 68 65 20 64 65 66 61 75 6c 74 20 6e 6f 6e 2d 74  he default non-t
2bf0: 65 72 6d 69 6e 61 6c 20 64 65 73 74 72 75 63 74  erminal destruct
2c00: 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69  or */.  char *fi
2c10: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
2c20: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2c30: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
2c40: 63 68 61 72 20 2a 6f 75 74 6e 61 6d 65 3b 20 20  char *outname;  
2c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2c60: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2c70: 6f 75 74 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20  output file */. 
2c80: 20 63 68 61 72 20 2a 74 6f 6b 65 6e 70 72 65 66   char *tokenpref
2c90: 69 78 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 70  ix;       /* A p
2ca0: 72 65 66 69 78 20 61 64 64 65 64 20 74 6f 20 74  refix added to t
2cb0: 6f 6b 65 6e 20 6e 61 6d 65 73 20 69 6e 20 74 68  oken names in th
2cc0: 65 20 2e 68 20 66 69 6c 65 20 2a 2f 0a 20 20 69  e .h file */.  i
2cd0: 6e 74 20 6e 63 6f 6e 66 6c 69 63 74 3b 20 20 20  nt nconflict;   
2ce0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2cf0: 72 20 6f 66 20 70 61 72 73 69 6e 67 20 63 6f 6e  r of parsing con
2d00: 66 6c 69 63 74 73 20 2a 2f 0a 20 20 69 6e 74 20  flicts */.  int 
2d10: 74 61 62 6c 65 73 69 7a 65 3b 20 20 20 20 20 20  tablesize;      
2d20: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2d30: 74 68 65 20 70 61 72 73 65 20 74 61 62 6c 65 73  the parse tables
2d40: 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 69 73 66   */.  int basisf
2d50: 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f  lag;           /
2d60: 2a 20 50 72 69 6e 74 20 6f 6e 6c 79 20 62 61 73  * Print only bas
2d70: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
2d80: 73 20 2a 2f 0a 20 20 69 6e 74 20 68 61 73 5f 66  s */.  int has_f
2d90: 61 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  allback;        
2da0: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 25  /* True if any %
2db0: 66 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 65 6e  fallback is seen
2dc0: 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20   in the grammar 
2dd0: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e  */.  int nolinen
2de0: 6f 73 66 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  osflag;       /*
2df0: 20 54 72 75 65 20 69 66 20 23 6c 69 6e 65 20 73   True if #line s
2e00: 74 61 74 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64  tatements should
2e10: 20 6e 6f 74 20 62 65 20 70 72 69 6e 74 65 64 20   not be printed 
2e20: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67 76 30  */.  char *argv0
2e30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2e40: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f   Name of the pro
2e50: 67 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  gram */.};..#def
2e60: 69 6e 65 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28  ine MemoryCheck(
2e70: 58 29 20 69 66 28 28 58 29 3d 3d 30 29 7b 20 5c  X) if((X)==0){ \
2e80: 0a 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d  .  extern void m
2e90: 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c  emory_error(); \
2ea0: 0a 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  .  memory_error(
2eb0: 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ); \.}../*******
2ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
2ed0: 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 68  he file "table.h
2ee0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
2ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f00: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63  ***/./*.** All c
2f10: 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ode in this file
2f20: 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61   has been automa
2f30: 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  tically generate
2f40: 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65 63  d.** from a spec
2f50: 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68 65  ification in the
2f60: 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20   file.**        
2f70: 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22 0a        "table.q".
2f80: 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63 69  ** by the associ
2f90: 61 74 69 76 65 20 61 72 72 61 79 20 63 6f 64 65  ative array code
2fa0: 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72 61   building progra
2fb0: 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f  m "aagen"..** Do
2fc0: 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20 66   not edit this f
2fd0: 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20 65  ile!  Instead, e
2fe0: 64 69 74 20 74 68 65 20 73 70 65 63 69 66 69 63  dit the specific
2ff0: 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74  ation.** file, t
3000: 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e 2e  hen rerun aagen.
3010: 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66  .*/./*.** Code f
3020: 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74 61  or processing ta
3030: 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f  bles in the LEMO
3040: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
3050: 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 52 6f 75 74 69  or..*/../* Routi
3060: 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67  nes for handling
3070: 20 61 20 73 74 72 69 6e 67 73 20 2a 2f 0a 0a 63   a strings */..c
3080: 68 61 72 20 2a 53 74 72 73 61 66 65 28 29 3b 0a  har *Strsafe();.
3090: 0a 76 6f 69 64 20 53 74 72 73 61 66 65 5f 69 6e  .void Strsafe_in
30a0: 69 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a  it(/* void */);.
30b0: 69 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65  int Strsafe_inse
30c0: 72 74 28 2f 2a 20 63 68 61 72 20 2a 20 2a 2f 29  rt(/* char * */)
30d0: 3b 0a 63 68 61 72 20 2a 53 74 72 73 61 66 65 5f  ;.char *Strsafe_
30e0: 66 69 6e 64 28 2f 2a 20 63 68 61 72 20 2a 20 2a  find(/* char * *
30f0: 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73  /);../* Routines
3100: 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 73 79   for handling sy
3110: 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20 67 72 61  mbols of the gra
3120: 6d 6d 61 72 20 2a 2f 0a 0a 73 74 72 75 63 74 20  mmar */..struct 
3130: 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e  symbol *Symbol_n
3140: 65 77 28 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c  ew();.int Symbol
3150: 63 6d 70 70 28 2f 2a 20 73 74 72 75 63 74 20 73  cmpp(/* struct s
3160: 79 6d 62 6f 6c 20 2a 2a 2c 20 73 74 72 75 63 74  ymbol **, struct
3170: 20 73 79 6d 62 6f 6c 20 2a 2a 20 2a 2f 29 3b 0a   symbol ** */);.
3180: 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74  void Symbol_init
3190: 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e  (/* void */);.in
31a0: 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28  t Symbol_insert(
31b0: 2f 2a 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  /* struct symbol
31c0: 20 2a 2c 20 63 68 61 72 20 2a 20 2a 2f 29 3b 0a   *, char * */);.
31d0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
31e0: 79 6d 62 6f 6c 5f 66 69 6e 64 28 2f 2a 20 63 68  ymbol_find(/* ch
31f0: 61 72 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74  ar * */);.struct
3200: 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
3210: 4e 74 68 28 2f 2a 20 69 6e 74 20 2a 2f 29 3b 0a  Nth(/* int */);.
3220: 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74  int Symbol_count
3230: 28 2f 2a 20 20 2a 2f 29 3b 0a 73 74 72 75 63 74  (/*  */);.struct
3240: 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c   symbol **Symbol
3250: 5f 61 72 72 61 79 6f 66 28 2f 2a 20 20 2a 2f 29  _arrayof(/*  */)
3260: 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 74  ;../* Routines t
3270: 6f 20 6d 61 6e 61 67 65 20 74 68 65 20 73 74 61  o manage the sta
3280: 74 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 69 6e 74  te table */..int
3290: 20 43 6f 6e 66 69 67 63 6d 70 28 2f 2a 20 73 74   Configcmp(/* st
32a0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2c 20 73  ruct config *, s
32b0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a  truct config * *
32c0: 2f 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65  /);.struct state
32d0: 20 2a 53 74 61 74 65 5f 6e 65 77 28 29 3b 0a 76   *State_new();.v
32e0: 6f 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28 2f  oid State_init(/
32f0: 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e 74 20  * void */);.int 
3300: 53 74 61 74 65 5f 69 6e 73 65 72 74 28 2f 2a 20  State_insert(/* 
3310: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2c 20  struct state *, 
3320: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
3330: 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74  */);.struct stat
3340: 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 2f 2a  e *State_find(/*
3350: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
3360: 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 74 61   */);.struct sta
3370: 74 65 20 2a 2a 53 74 61 74 65 5f 61 72 72 61 79  te **State_array
3380: 6f 66 28 2f 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a 20  of(/*  */);../* 
3390: 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20 66 6f  Routines used fo
33a0: 72 20 65 66 66 69 63 69 65 6e 63 79 20 69 6e 20  r efficiency in 
33b0: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 20 2a  Configlist_add *
33c0: 2f 0a 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  /..void Configta
33d0: 62 6c 65 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64  ble_init(/* void
33e0: 20 2a 2f 29 3b 0a 69 6e 74 20 43 6f 6e 66 69 67   */);.int Config
33f0: 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 2f 2a 20  table_insert(/* 
3400: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
3410: 2a 2f 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  */);.struct conf
3420: 69 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f  ig *Configtable_
3430: 66 69 6e 64 28 2f 2a 20 73 74 72 75 63 74 20 63  find(/* struct c
3440: 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 76 6f 69  onfig * */);.voi
3450: 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c  d Configtable_cl
3460: 65 61 72 28 2f 2a 20 69 6e 74 28 2a 29 28 73 74  ear(/* int(*)(st
3470: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20 2a  ruct config *) *
3480: 2f 29 3b 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /);./***********
3490: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
34a0: 20 66 69 6c 65 20 22 61 63 74 69 6f 6e 2e 63 22   file "action.c"
34b0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
34c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34d0: 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  /./*.** Routines
34e0: 20 70 72 6f 63 65 73 73 69 6e 67 20 70 61 72 73   processing pars
34f0: 65 72 20 61 63 74 69 6f 6e 73 20 69 6e 20 74 68  er actions in th
3500: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
3510: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
3520: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
3530: 70 61 72 73 65 72 20 61 63 74 69 6f 6e 20 2a 2f  parser action */
3540: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
3550: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65  ction *Action_ne
3560: 77 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  w(void){.  stati
3570: 63 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  c struct action 
3580: 2a 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 20  *freelist = 0;. 
3590: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
35a0: 6e 65 77 3b 0a 0a 20 20 69 66 28 20 66 72 65 65  new;..  if( free
35b0: 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  list==0 ){.    i
35c0: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d  nt i;.    int am
35d0: 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 66 72 65  t = 100;.    fre
35e0: 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74 20  elist = (struct 
35f0: 61 63 74 69 6f 6e 20 2a 29 63 61 6c 6c 6f 63 28  action *)calloc(
3600: 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75  amt, sizeof(stru
3610: 63 74 20 61 63 74 69 6f 6e 29 29 3b 0a 20 20 20  ct action));.   
3620: 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30   if( freelist==0
3630: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
3640: 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65  f(stderr,"Unable
3650: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
3660: 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 70 61  ory for a new pa
3670: 72 73 65 72 20 61 63 74 69 6f 6e 2e 22 29 3b 0a  rser action.");.
3680: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
3690: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
36a0: 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20  ; i<amt-1; i++) 
36b0: 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74  freelist[i].next
36c0: 20 3d 20 26 66 72 65 65 6c 69 73 74 5b 69 2b 31   = &freelist[i+1
36d0: 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 5b  ];.    freelist[
36e0: 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b  amt-1].next = 0;
36f0: 0a 20 20 7d 0a 20 20 6e 65 77 20 3d 20 66 72 65  .  }.  new = fre
3700: 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73  elist;.  freelis
3710: 74 20 3d 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65  t = freelist->ne
3720: 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77  xt;.  return new
3730: 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20  ;.}../* Compare 
3740: 74 77 6f 20 61 63 74 69 6f 6e 73 20 66 6f 72 20  two actions for 
3750: 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73  sorting purposes
3760: 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
3770: 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 0a 2a 2a 20  ve, zero, or.** 
3780: 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20  positive if the 
3790: 66 69 72 73 74 20 61 63 74 69 6f 6e 20 69 73 20  first action is 
37a0: 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
37b0: 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20   to, or greater 
37c0: 74 68 61 6e 0a 2a 2a 20 74 68 65 20 66 69 72 73  than.** the firs
37d0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  t.*/.static int 
37e0: 61 63 74 69 6f 6e 63 6d 70 28 0a 20 20 73 74 72  actioncmp(.  str
37f0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 31 2c  uct action *ap1,
3800: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
3810: 20 2a 61 70 32 0a 29 7b 0a 20 20 69 6e 74 20 72   *ap2.){.  int r
3820: 63 3b 0a 20 20 72 63 20 3d 20 61 70 31 2d 3e 73  c;.  rc = ap1->s
3830: 70 2d 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e  p->index - ap2->
3840: 73 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28  sp->index;.  if(
3850: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   rc==0 ){.    rc
3860: 20 3d 20 28 69 6e 74 29 61 70 31 2d 3e 74 79 70   = (int)ap1->typ
3870: 65 20 2d 20 28 69 6e 74 29 61 70 32 2d 3e 74 79  e - (int)ap2->ty
3880: 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  pe;.  }.  if( rc
3890: 3d 3d 30 20 26 26 20 61 70 31 2d 3e 74 79 70 65  ==0 && ap1->type
38a0: 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20  ==REDUCE ){.    
38b0: 72 63 20 3d 20 61 70 31 2d 3e 78 2e 72 70 2d 3e  rc = ap1->x.rp->
38c0: 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e 78 2e 72  index - ap2->x.r
38d0: 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  p->index;.  }.  
38e0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
38f0: 20 53 6f 72 74 20 70 61 72 73 65 72 20 61 63 74   Sort parser act
3900: 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73  ions */.static s
3910: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41 63  truct action *Ac
3920: 74 69 6f 6e 5f 73 6f 72 74 28 0a 20 20 73 74 72  tion_sort(.  str
3930: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 0a 29  uct action *ap.)
3940: 7b 0a 20 20 61 70 20 3d 20 28 73 74 72 75 63 74  {.  ap = (struct
3950: 20 61 63 74 69 6f 6e 20 2a 29 6d 73 6f 72 74 28   action *)msort(
3960: 28 63 68 61 72 20 2a 29 61 70 2c 28 63 68 61 72  (char *)ap,(char
3970: 20 2a 2a 29 26 61 70 2d 3e 6e 65 78 74 2c 0a 20   **)&ap->next,. 
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
39a0: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
39b0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 63  ,const char*))ac
39c0: 74 69 6f 6e 63 6d 70 29 3b 0a 20 20 72 65 74 75  tioncmp);.  retu
39d0: 72 6e 20 61 70 3b 0a 7d 0a 0a 76 6f 69 64 20 41  rn ap;.}..void A
39e0: 63 74 69 6f 6e 5f 61 64 64 28 61 70 70 2c 74 79  ction_add(app,ty
39f0: 70 65 2c 73 70 2c 61 72 67 29 0a 73 74 72 75 63  pe,sp,arg).struc
3a00: 74 20 61 63 74 69 6f 6e 20 2a 2a 61 70 70 3b 0a  t action **app;.
3a10: 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79  enum e_action ty
3a20: 70 65 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  pe;.struct symbo
3a30: 6c 20 2a 73 70 3b 0a 63 68 61 72 20 2a 61 72 67  l *sp;.char *arg
3a40: 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 61 63 74  ;.{.  struct act
3a50: 69 6f 6e 20 2a 6e 65 77 3b 0a 20 20 6e 65 77 20  ion *new;.  new 
3a60: 3d 20 41 63 74 69 6f 6e 5f 6e 65 77 28 29 3b 0a  = Action_new();.
3a70: 20 20 6e 65 77 2d 3e 6e 65 78 74 20 3d 20 2a 61    new->next = *a
3a80: 70 70 3b 0a 20 20 2a 61 70 70 20 3d 20 6e 65 77  pp;.  *app = new
3a90: 3b 0a 20 20 6e 65 77 2d 3e 74 79 70 65 20 3d 20  ;.  new->type = 
3aa0: 74 79 70 65 3b 0a 20 20 6e 65 77 2d 3e 73 70 20  type;.  new->sp 
3ab0: 3d 20 73 70 3b 0a 20 20 69 66 28 20 74 79 70 65  = sp;.  if( type
3ac0: 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20 6e  ==SHIFT ){.    n
3ad0: 65 77 2d 3e 78 2e 73 74 70 20 3d 20 28 73 74 72  ew->x.stp = (str
3ae0: 75 63 74 20 73 74 61 74 65 20 2a 29 61 72 67 3b  uct state *)arg;
3af0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 65  .  }else{.    ne
3b00: 77 2d 3e 78 2e 72 70 20 3d 20 28 73 74 72 75 63  w->x.rp = (struc
3b10: 74 20 72 75 6c 65 20 2a 29 61 72 67 3b 0a 20 20  t rule *)arg;.  
3b20: 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}./***********
3b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 65 77 20  *********** New 
3b40: 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
3b50: 74 20 74 68 65 20 22 61 63 74 74 61 62 22 20 6d  t the "acttab" m
3b60: 6f 64 75 6c 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  odule **********
3b70: 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 6f  */./*.** This mo
3b80: 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  dule implements 
3b90: 72 6f 75 74 69 6e 65 73 20 75 73 65 20 74 6f 20  routines use to 
3ba0: 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 79 79  construct the yy
3bb0: 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e  _action[] table.
3bc0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  .*/../*.** The s
3bd0: 74 61 74 65 20 6f 66 20 74 68 65 20 79 79 5f 61  tate of the yy_a
3be0: 63 74 69 6f 6e 20 74 61 62 6c 65 20 75 6e 64 65  ction table unde
3bf0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69  r construction i
3c00: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
3c10: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
3c20: 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 74  g structure.*/.t
3c30: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61 63  ypedef struct ac
3c40: 74 74 61 62 20 61 63 74 74 61 62 3b 0a 73 74 72  ttab acttab;.str
3c50: 75 63 74 20 61 63 74 74 61 62 20 7b 0a 20 20 69  uct acttab {.  i
3c60: 6e 74 20 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20  nt nAction;     
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3c80: 75 6d 62 65 72 20 6f 66 20 75 73 65 64 20 73 6c  umber of used sl
3c90: 6f 74 73 20 69 6e 20 61 41 63 74 69 6f 6e 5b 5d  ots in aAction[]
3ca0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f   */.  int nActio
3cb0: 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  nAlloc;         
3cc0: 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f     /* Slots allo
3cd0: 63 61 74 65 64 20 66 6f 72 20 61 41 63 74 69 6f  cated for aActio
3ce0: 6e 5b 5d 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  n[] */.  struct 
3cf0: 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 6f 6b 61 68  {.    int lookah
3d00: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
3d10: 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68 65   /* Value of the
3d20: 20 6c 6f 6f 6b 61 68 65 61 64 20 74 6f 6b 65 6e   lookahead token
3d30: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 63 74 69   */.    int acti
3d40: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
3d50: 20 20 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20     /* Action to 
3d60: 74 61 6b 65 20 6f 6e 20 74 68 65 20 67 69 76 65  take on the give
3d70: 6e 20 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20  n lookahead */. 
3d80: 20 7d 20 2a 61 41 63 74 69 6f 6e 2c 20 20 20 20   } *aAction,    
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3da0: 20 54 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d   The yy_action[]
3db0: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
3dc0: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  struction */.   
3dd0: 20 2a 61 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20   *aLookahead;   
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
3df0: 20 73 69 6e 67 6c 65 20 6e 65 77 20 74 72 61 6e   single new tran
3e00: 73 61 63 74 69 6f 6e 20 73 65 74 20 2a 2f 0a 20  saction set */. 
3e10: 20 69 6e 74 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64   int mnLookahead
3e20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3e30: 20 4d 69 6e 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68   Minimum aLookah
3e40: 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20  ead[].lookahead 
3e50: 2a 2f 0a 20 20 69 6e 74 20 6d 6e 41 63 74 69 6f  */.  int mnActio
3e60: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3e70: 20 20 2f 2a 20 41 63 74 69 6f 6e 20 61 73 73 6f    /* Action asso
3e80: 63 69 61 74 65 64 20 77 69 74 68 20 6d 6e 4c 6f  ciated with mnLo
3e90: 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74  okahead */.  int
3ea0: 20 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20   mxLookahead;   
3eb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
3ec0: 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65 61 64 5b  imum aLookahead[
3ed0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20  ].lookahead */. 
3ee0: 20 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 3b   int nLookahead;
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3f00: 20 55 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61   Used slots in a
3f10: 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a 20  Lookahead[] */. 
3f20: 20 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 41   int nLookaheadA
3f30: 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  lloc;         /*
3f40: 20 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64   Slots allocated
3f50: 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d   in aLookahead[]
3f60: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52 65 74 75 72   */.};../* Retur
3f70: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
3f80: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 79  entries in the y
3f90: 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a  y_action table *
3fa0: 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61 62  /.#define acttab
3fb0: 5f 73 69 7a 65 28 58 29 20 28 28 58 29 2d 3e 6e  _size(X) ((X)->n
3fc0: 41 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20  Action)../* The 
3fd0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 4e 2d  value for the N-
3fe0: 74 68 20 65 6e 74 72 79 20 69 6e 20 79 79 5f 61  th entry in yy_a
3ff0: 63 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  ction */.#define
4000: 20 61 63 74 74 61 62 5f 79 79 61 63 74 69 6f 6e   acttab_yyaction
4010: 28 58 2c 4e 29 20 20 28 28 58 29 2d 3e 61 41 63  (X,N)  ((X)->aAc
4020: 74 69 6f 6e 5b 4e 5d 2e 61 63 74 69 6f 6e 29 0a  tion[N].action).
4030: 0a 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 66 6f  ./* The value fo
4040: 72 20 74 68 65 20 4e 2d 74 68 20 65 6e 74 72 79  r the N-th entry
4050: 20 69 6e 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64   in yy_lookahead
4060: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74   */.#define actt
4070: 61 62 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28 58  ab_yylookahead(X
4080: 2c 4e 29 20 20 28 28 58 29 2d 3e 61 41 63 74 69  ,N)  ((X)->aActi
4090: 6f 6e 5b 4e 5d 2e 6c 6f 6f 6b 61 68 65 61 64 29  on[N].lookahead)
40a0: 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65  ../* Free all me
40b0: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
40c0: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61  with the given a
40d0: 63 74 74 61 62 20 2a 2f 0a 76 6f 69 64 20 61 63  cttab */.void ac
40e0: 74 74 61 62 5f 66 72 65 65 28 61 63 74 74 61 62  ttab_free(acttab
40f0: 20 2a 70 29 7b 0a 20 20 66 72 65 65 28 20 70 2d   *p){.  free( p-
4100: 3e 61 41 63 74 69 6f 6e 20 29 3b 0a 20 20 66 72  >aAction );.  fr
4110: 65 65 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  ee( p->aLookahea
4120: 64 20 29 3b 0a 20 20 66 72 65 65 28 20 70 20 29  d );.  free( p )
4130: 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;.}../* Allocate
4140: 20 61 20 6e 65 77 20 61 63 74 74 61 62 20 73 74   a new acttab st
4150: 72 75 63 74 75 72 65 20 2a 2f 0a 61 63 74 74 61  ructure */.actta
4160: 62 20 2a 61 63 74 74 61 62 5f 61 6c 6c 6f 63 28  b *acttab_alloc(
4170: 76 6f 69 64 29 7b 0a 20 20 61 63 74 74 61 62 20  void){.  acttab 
4180: 2a 70 20 3d 20 63 61 6c 6c 6f 63 28 20 31 2c 20  *p = calloc( 1, 
4190: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
41a0: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
41b0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
41c0: 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  Unable to alloca
41d0: 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20  te memory for a 
41e0: 6e 65 77 20 61 63 74 74 61 62 2e 22 29 3b 0a 20  new acttab.");. 
41f0: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
4200: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
4210: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 72 65  izeof(*p));.  re
4220: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 20 41 64  turn p;.}../* Ad
4230: 64 20 61 20 6e 65 77 20 61 63 74 69 6f 6e 20 74  d a new action t
4240: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  o the current tr
4250: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 0a 2a 2f  ansaction set.*/
4260: 0a 76 6f 69 64 20 61 63 74 74 61 62 5f 61 63 74  .void acttab_act
4270: 69 6f 6e 28 61 63 74 74 61 62 20 2a 70 2c 20 69  ion(acttab *p, i
4280: 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 2c 20 69 6e  nt lookahead, in
4290: 74 20 61 63 74 69 6f 6e 29 7b 0a 20 20 69 66 28  t action){.  if(
42a0: 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e 3d   p->nLookahead>=
42b0: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c  p->nLookaheadAll
42c0: 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 6f  oc ){.    p->nLo
42d0: 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 2b 3d 20  okaheadAlloc += 
42e0: 32 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 6f 6f 6b  25;.    p->aLook
42f0: 61 68 65 61 64 20 3d 20 72 65 61 6c 6c 6f 63 28  ahead = realloc(
4300: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 2c 0a   p->aLookahead,.
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
4330: 65 6f 66 28 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  eof(p->aLookahea
4340: 64 5b 30 5d 29 2a 70 2d 3e 6e 4c 6f 6f 6b 61 68  d[0])*p->nLookah
4350: 65 61 64 41 6c 6c 6f 63 20 29 3b 0a 20 20 20 20  eadAlloc );.    
4360: 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  if( p->aLookahea
4370: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  d==0 ){.      fp
4380: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61  rintf(stderr,"ma
4390: 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b  lloc failed\n");
43a0: 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a  .      exit(1);.
43b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
43c0: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3d 3d 30  p->nLookahead==0
43d0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6d 78 4c 6f 6f   ){.    p->mxLoo
43e0: 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65  kahead = lookahe
43f0: 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f  ad;.    p->mnLoo
4400: 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65  kahead = lookahe
4410: 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e 41 63 74  ad;.    p->mnAct
4420: 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20  ion = action;.  
4430: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
4440: 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 3c 6c 6f  ->mxLookahead<lo
4450: 6f 6b 61 68 65 61 64 20 29 20 70 2d 3e 6d 78 4c  okahead ) p->mxL
4460: 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61  ookahead = looka
4470: 68 65 61 64 3b 0a 20 20 20 20 69 66 28 20 70 2d  head;.    if( p-
4480: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3e 6c 6f 6f  >mnLookahead>loo
4490: 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20  kahead ){.      
44a0: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d  p->mnLookahead =
44b0: 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20   lookahead;.    
44c0: 20 20 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20    p->mnAction = 
44d0: 61 63 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20  action;.    }.  
44e0: 7d 0a 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  }.  p->aLookahea
44f0: 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d  d[p->nLookahead]
4500: 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f  .lookahead = loo
4510: 6b 61 68 65 61 64 3b 0a 20 20 70 2d 3e 61 4c 6f  kahead;.  p->aLo
4520: 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b  okahead[p->nLook
4530: 61 68 65 61 64 5d 2e 61 63 74 69 6f 6e 20 3d 20  ahead].action = 
4540: 61 63 74 69 6f 6e 3b 0a 20 20 70 2d 3e 6e 4c 6f  action;.  p->nLo
4550: 6f 6b 61 68 65 61 64 2b 2b 3b 0a 7d 0a 0a 2f 2a  okahead++;.}../*
4560: 0a 2a 2a 20 41 64 64 20 74 68 65 20 74 72 61 6e  .** Add the tran
4570: 73 61 63 74 69 6f 6e 20 73 65 74 20 62 75 69 6c  saction set buil
4580: 74 20 75 70 20 77 69 74 68 20 70 72 69 6f 72 20  t up with prior 
4590: 63 61 6c 6c 73 20 74 6f 20 61 63 74 74 61 62 5f  calls to acttab_
45a0: 61 63 74 69 6f 6e 28 29 0a 2a 2a 20 69 6e 74 6f  action().** into
45b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 63 74   the current act
45c0: 69 6f 6e 20 74 61 62 6c 65 2e 20 20 54 68 65 6e  ion table.  Then
45d0: 20 72 65 73 65 74 20 74 68 65 20 74 72 61 6e 73   reset the trans
45e0: 61 63 74 69 6f 6e 20 73 65 74 20 62 61 63 6b 0a  action set back.
45f0: 2a 2a 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 73  ** to an empty s
4600: 65 74 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  et in preparatio
4610: 6e 20 66 6f 72 20 61 20 6e 65 77 20 72 6f 75 6e  n for a new roun
4620: 64 20 6f 66 20 61 63 74 74 61 62 5f 61 63 74 69  d of acttab_acti
4630: 6f 6e 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  on() calls..**.*
4640: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
4650: 73 65 74 20 69 6e 74 6f 20 74 68 65 20 61 63 74  set into the act
4660: 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65  ion table of the
4670: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
4680: 2e 0a 2a 2f 0a 69 6e 74 20 61 63 74 74 61 62 5f  ..*/.int acttab_
4690: 69 6e 73 65 72 74 28 61 63 74 74 61 62 20 2a 70  insert(acttab *p
46a0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  ){.  int i, j, k
46b0: 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  , n;.  assert( p
46c0: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e 30 20 29  ->nLookahead>0 )
46d0: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
46e0: 65 20 77 65 20 68 61 76 65 20 65 6e 6f 75 67 68  e we have enough
46f0: 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   space to hold t
4700: 68 65 20 65 78 70 61 6e 64 65 64 20 61 63 74 69  he expanded acti
4710: 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  on table.  ** in
4720: 20 74 68 65 20 77 6f 72 73 74 20 63 61 73 65 2e   the worst case.
4730: 20 20 54 68 65 20 77 6f 72 73 74 20 63 61 73 65    The worst case
4740: 20 6f 63 63 75 72 73 20 69 66 20 74 68 65 20 74   occurs if the t
4750: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 0a 20  ransaction set. 
4760: 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 70 70 65   ** must be appe
4770: 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72  nded to the curr
4780: 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  ent action table
4790: 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 70 2d 3e 6d  .  */.  n = p->m
47a0: 78 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 31 3b 0a  xLookahead + 1;.
47b0: 20 20 69 66 28 20 70 2d 3e 6e 41 63 74 69 6f 6e    if( p->nAction
47c0: 20 2b 20 6e 20 3e 3d 20 70 2d 3e 6e 41 63 74 69   + n >= p->nActi
47d0: 6f 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69  onAlloc ){.    i
47e0: 6e 74 20 6f 6c 64 41 6c 6c 6f 63 20 3d 20 70 2d  nt oldAlloc = p-
47f0: 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 0a 20  >nActionAlloc;. 
4800: 20 20 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c     p->nActionAll
4810: 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 20  oc = p->nAction 
4820: 2b 20 6e 20 2b 20 70 2d 3e 6e 41 63 74 69 6f 6e  + n + p->nAction
4830: 41 6c 6c 6f 63 20 2b 20 32 30 3b 0a 20 20 20 20  Alloc + 20;.    
4840: 70 2d 3e 61 41 63 74 69 6f 6e 20 3d 20 72 65 61  p->aAction = rea
4850: 6c 6c 6f 63 28 20 70 2d 3e 61 41 63 74 69 6f 6e  lloc( p->aAction
4860: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4870: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
4880: 6f 66 28 70 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d  of(p->aAction[0]
4890: 29 2a 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f  )*p->nActionAllo
48a0: 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  c);.    if( p->a
48b0: 41 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20  Action==0 ){.   
48c0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
48d0: 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  r,"malloc failed
48e0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74  \n");.      exit
48f0: 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  (1);.    }.    f
4900: 6f 72 28 69 3d 6f 6c 64 41 6c 6c 6f 63 3b 20 69  or(i=oldAlloc; i
4910: 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63  <p->nActionAlloc
4920: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; i++){.      p-
4930: 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b  >aAction[i].look
4940: 61 68 65 61 64 20 3d 20 2d 31 3b 0a 20 20 20 20  ahead = -1;.    
4950: 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e    p->aAction[i].
4960: 61 63 74 69 6f 6e 20 3d 20 2d 31 3b 0a 20 20 20  action = -1;.   
4970: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61   }.  }..  /* Sca
4980: 6e 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 61  n the existing a
4990: 63 74 69 6f 6e 20 74 61 62 6c 65 20 6c 6f 6f 6b  ction table look
49a0: 69 6e 67 20 66 6f 72 20 61 6e 20 6f 66 66 73 65  ing for an offse
49b0: 74 20 77 68 65 72 65 20 77 65 20 63 61 6e 0a 20  t where we can. 
49c0: 20 2a 2a 20 69 6e 73 65 72 74 20 74 68 65 20 63   ** insert the c
49d0: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
49e0: 6f 6e 20 73 65 74 2e 20 20 46 61 6c 6c 20 6f 75  on set.  Fall ou
49f0: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 68  t of the loop wh
4a00: 65 6e 20 74 68 61 74 0a 20 20 2a 2a 20 6f 66 66  en that.  ** off
4a10: 73 65 74 20 69 73 20 66 6f 75 6e 64 2e 20 20 49  set is found.  I
4a20: 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61 73 65  n the worst case
4a30: 2c 20 77 65 20 66 61 6c 6c 20 6f 75 74 20 6f 66  , we fall out of
4a40: 20 74 68 65 20 6c 6f 6f 70 20 77 68 65 6e 0a 20   the loop when. 
4a50: 20 2a 2a 20 69 20 72 65 61 63 68 65 73 20 70 2d   ** i reaches p-
4a60: 3e 6e 41 63 74 69 6f 6e 2c 20 77 68 69 63 68 20  >nAction, which 
4a70: 6d 65 61 6e 73 20 77 65 20 61 70 70 65 6e 64 20  means we append 
4a80: 74 68 65 20 6e 65 77 20 74 72 61 6e 73 61 63 74  the new transact
4a90: 69 6f 6e 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20  ion set..  **.  
4aa0: 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64 65  ** i is the inde
4ab0: 78 20 69 6e 20 70 2d 3e 61 41 63 74 69 6f 6e 5b  x in p->aAction[
4ac0: 5d 20 77 68 65 72 65 20 70 2d 3e 6d 6e 4c 6f 6f  ] where p->mnLoo
4ad0: 6b 61 68 65 61 64 20 69 73 20 69 6e 73 65 72 74  kahead is insert
4ae0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ed..  */.  for(i
4af0: 3d 30 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e  =0; i<p->nAction
4b00: 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b  +p->mnLookahead;
4b10: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
4b20: 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f  ->aAction[i].loo
4b30: 6b 61 68 65 61 64 3c 30 20 29 7b 0a 20 20 20 20  kahead<0 ){.    
4b40: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
4b50: 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29  nLookahead; j++)
4b60: 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 70 2d  {.        k = p-
4b70: 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c  >aLookahead[j].l
4b80: 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e  ookahead - p->mn
4b90: 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20  Lookahead + i;. 
4ba0: 20 20 20 20 20 20 20 69 66 28 20 6b 3c 30 20 29         if( k<0 )
4bb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4bc0: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b  if( p->aAction[k
4bd0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3e 3d 30 20 29  ].lookahead>=0 )
4be0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4bf0: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e        if( j<p->n
4c00: 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74  Lookahead ) cont
4c10: 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
4c20: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f  j=0; j<p->nActio
4c30: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
4c40: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
4c50: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a 2b  j].lookahead==j+
4c60: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d 69  p->mnLookahead-i
4c70: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
4c80: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70  }.      if( j==p
4c90: 2d 3e 6e 41 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ->nAction ){.   
4ca0: 20 20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20       break;  /* 
4cb0: 46 69 74 73 20 69 6e 20 65 6d 70 74 79 20 73 6c  Fits in empty sl
4cc0: 6f 74 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ots */.      }. 
4cd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
4ce0: 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61  aAction[i].looka
4cf0: 68 65 61 64 3d 3d 70 2d 3e 6d 6e 4c 6f 6f 6b 61  head==p->mnLooka
4d00: 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20 69 66  head ){.      if
4d10: 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e  ( p->aAction[i].
4d20: 61 63 74 69 6f 6e 21 3d 70 2d 3e 6d 6e 41 63 74  action!=p->mnAct
4d30: 69 6f 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ion ) continue;.
4d40: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
4d50: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20  <p->nLookahead; 
4d60: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20  j++){.        k 
4d70: 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  = p->aLookahead[
4d80: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70  j].lookahead - p
4d90: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20  ->mnLookahead + 
4da0: 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b  i;.        if( k
4db0: 3c 30 20 7c 7c 20 6b 3e 3d 70 2d 3e 6e 41 63 74  <0 || k>=p->nAct
4dc0: 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ion ) break;.   
4dd0: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f       if( p->aLoo
4de0: 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68  kahead[j].lookah
4df0: 65 61 64 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b  ead!=p->aAction[
4e00: 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 29 20 62  k].lookahead ) b
4e10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  reak;.        if
4e20: 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  ( p->aLookahead[
4e30: 6a 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 61 41  j].action!=p->aA
4e40: 63 74 69 6f 6e 5b 6b 5d 2e 61 63 74 69 6f 6e 20  ction[k].action 
4e50: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
4e60: 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e  .      if( j<p->
4e70: 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e  nLookahead ) con
4e80: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 20 3d  tinue;.      n =
4e90: 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   0;.      for(j=
4ea0: 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f 6e 3b  0; j<p->nAction;
4eb0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
4ec0: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d  f( p->aAction[j]
4ed0: 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29 20 63  .lookahead<0 ) c
4ee0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
4ef0: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
4f00: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a 2b  j].lookahead==j+
4f10: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d 69  p->mnLookahead-i
4f20: 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a   ) n++;.      }.
4f30: 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 70 2d 3e        if( n==p->
4f40: 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20  nLookahead ){.  
4f50: 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a        break;  /*
4f60: 20 53 61 6d 65 20 61 73 20 61 20 70 72 69 6f 72   Same as a prior
4f70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74   transaction set
4f80: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
4f90: 7d 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  }.  }.  /* Inser
4fa0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  t transaction se
4fb0: 74 20 61 74 20 69 6e 64 65 78 20 69 2e 20 2a 2f  t at index i. */
4fc0: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d  .  for(j=0; j<p-
4fd0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b  >nLookahead; j++
4fe0: 29 7b 0a 20 20 20 20 6b 20 3d 20 70 2d 3e 61 4c  ){.    k = p->aL
4ff0: 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b  ookahead[j].look
5000: 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f  ahead - p->mnLoo
5010: 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20 20  kahead + i;.    
5020: 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 20 3d 20  p->aAction[k] = 
5030: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
5040: 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 2d 3e  ;.    if( k>=p->
5050: 6e 41 63 74 69 6f 6e 20 29 20 70 2d 3e 6e 41 63  nAction ) p->nAc
5060: 74 69 6f 6e 20 3d 20 6b 2b 31 3b 0a 20 20 7d 0a  tion = k+1;.  }.
5070: 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20    p->nLookahead 
5080: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72  = 0;..  /* Retur
5090: 6e 20 74 68 65 20 6f 66 66 73 65 74 20 74 68 61  n the offset tha
50a0: 74 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  t is added to th
50b0: 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e 20 6f  e lookahead in o
50c0: 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 0a  rder to get the.
50d0: 20 20 2a 2a 20 69 6e 64 65 78 20 69 6e 74 6f 20    ** index into 
50e0: 79 79 5f 61 63 74 69 6f 6e 20 6f 66 20 74 68 65  yy_action of the
50f0: 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 65 74   action */.  ret
5100: 75 72 6e 20 69 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f  urn i - p->mnLoo
5110: 6b 61 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  kahead;.}../****
5120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5130: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
5140: 20 22 62 75 69 6c 64 2e 63 22 20 2a 2a 2a 2a 2a   "build.c" *****
5150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5160: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
5170: 52 6f 75 74 69 6e 65 73 20 74 6f 20 63 6f 6e 73  Routines to cons
5180: 74 72 75 63 74 69 6f 6e 20 74 68 65 20 66 69 6e  truction the fin
5190: 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e  ite state machin
51a0: 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 0a  e for the LEMON.
51b0: 2a 2a 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ** parser genera
51c0: 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e 64  tor..*/../* Find
51d0: 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73 79   a precedence sy
51e0: 6d 62 6f 6c 20 6f 66 20 65 76 65 72 79 20 72 75  mbol of every ru
51f0: 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61  le in the gramma
5200: 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 6f 73 65 20  r..** .** Those 
5210: 72 75 6c 65 73 20 77 68 69 63 68 20 68 61 76 65  rules which have
5220: 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73 79   a precedence sy
5230: 6d 62 6f 6c 20 63 6f 64 65 64 20 69 6e 20 74 68  mbol coded in th
5240: 65 20 69 6e 70 75 74 0a 2a 2a 20 67 72 61 6d 6d  e input.** gramm
5250: 61 72 20 75 73 69 6e 67 20 74 68 65 20 22 5b 73  ar using the "[s
5260: 79 6d 62 6f 6c 5d 22 20 63 6f 6e 73 74 72 75 63  ymbol]" construc
5270: 74 20 77 69 6c 6c 20 61 6c 72 65 61 64 79 20 68  t will already h
5280: 61 76 65 20 74 68 65 0a 2a 2a 20 72 70 2d 3e 70  ave the.** rp->p
5290: 72 65 63 73 79 6d 20 66 69 65 6c 64 20 66 69 6c  recsym field fil
52a0: 6c 65 64 2e 20 20 4f 74 68 65 72 20 72 75 6c 65  led.  Other rule
52b0: 73 20 74 61 6b 65 20 61 73 20 74 68 65 69 72 20  s take as their 
52c0: 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73 79  precedence.** sy
52d0: 6d 62 6f 6c 20 74 68 65 20 66 69 72 73 74 20 52  mbol the first R
52e0: 48 53 20 73 79 6d 62 6f 6c 20 77 69 74 68 20 61  HS symbol with a
52f0: 20 64 65 66 69 6e 65 64 20 70 72 65 63 65 64 65   defined precede
5300: 6e 63 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  nce.  If there.*
5310: 2a 20 61 72 65 20 6e 6f 74 20 52 48 53 20 73 79  * are not RHS sy
5320: 6d 62 6f 6c 73 20 77 69 74 68 20 61 20 64 65 66  mbols with a def
5330: 69 6e 65 64 20 70 72 65 63 65 64 65 6e 63 65 2c  ined precedence,
5340: 20 74 68 65 20 70 72 65 63 65 64 65 6e 63 65 0a   the precedence.
5350: 2a 2a 20 73 79 6d 62 6f 6c 20 66 69 65 6c 64 20  ** symbol field 
5360: 69 73 20 6c 65 66 74 20 62 6c 61 6e 6b 2e 0a 2a  is left blank..*
5370: 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75 6c 65 50  /.void FindRuleP
5380: 72 65 63 65 64 65 6e 63 65 73 28 78 70 29 0a 73  recedences(xp).s
5390: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 78 70 3b  truct lemon *xp;
53a0: 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  .{.  struct rule
53b0: 20 2a 72 70 3b 0a 20 20 66 6f 72 28 72 70 3d 78   *rp;.  for(rp=x
53c0: 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
53d0: 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69  rp->next){.    i
53e0: 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d  f( rp->precsym==
53f0: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
5400: 2c 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  , j;.      for(i
5410: 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 20 26  =0; i<rp->nrhs &
5420: 26 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d 30  & rp->precsym==0
5430: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
5440: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
5450: 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a  p = rp->rhs[i];.
5460: 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e          if( sp->
5470: 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
5480: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NAL ){.         
5490: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 70 2d 3e   for(j=0; j<sp->
54a0: 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20  nsubsym; j++){. 
54b0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
54c0: 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 70 72  p->subsym[j]->pr
54d0: 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ec>=0 ){.       
54e0: 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73         rp->precs
54f0: 79 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b  ym = sp->subsym[
5500: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  j];.            
5510: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5520: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5530: 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
5540: 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30   if( sp->prec>=0
5550: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 70   ){.          rp
5560: 2d 3e 70 72 65 63 73 79 6d 20 3d 20 72 70 2d 3e  ->precsym = rp->
5570: 72 68 73 5b 69 5d 3b 0a 09 7d 0a 20 20 20 20 20  rhs[i];..}.     
5580: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
5590: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e  eturn;.}../* Fin
55a0: 64 20 61 6c 6c 20 6e 6f 6e 74 65 72 6d 69 6e 61  d all nontermina
55b0: 6c 73 20 77 68 69 63 68 20 77 69 6c 6c 20 67 65  ls which will ge
55c0: 6e 65 72 61 74 65 20 74 68 65 20 65 6d 70 74 79  nerate the empty
55d0: 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 54 68 65 6e   string..** Then
55e0: 20 67 6f 20 62 61 63 6b 20 61 6e 64 20 63 6f 6d   go back and com
55f0: 70 75 74 65 20 74 68 65 20 66 69 72 73 74 20 73  pute the first s
5600: 65 74 73 20 6f 66 20 65 76 65 72 79 20 6e 6f 6e  ets of every non
5610: 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2a 20 54 68 65  terminal..** The
5620: 20 66 69 72 73 74 20 73 65 74 20 69 73 20 74 68   first set is th
5630: 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 74 65 72  e set of all ter
5640: 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 77 68  minal symbols wh
5650: 69 63 68 20 63 61 6e 20 62 65 67 69 6e 0a 2a 2a  ich can begin.**
5660: 20 61 20 73 74 72 69 6e 67 20 67 65 6e 65 72 61   a string genera
5670: 74 65 64 20 62 79 20 74 68 61 74 20 6e 6f 6e 74  ted by that nont
5680: 65 72 6d 69 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64  erminal..*/.void
5690: 20 46 69 6e 64 46 69 72 73 74 53 65 74 73 28 6c   FindFirstSets(l
56a0: 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
56b0: 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74  n *lemp;.{.  int
56c0: 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74 20   i, j;.  struct 
56d0: 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e 74 20  rule *rp;.  int 
56e0: 70 72 6f 67 72 65 73 73 3b 0a 0a 20 20 66 6f 72  progress;..  for
56f0: 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
5700: 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
5710: 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
5720: 5d 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f  ]->lambda = LEMO
5730: 4e 5f 46 41 4c 53 45 3b 0a 20 20 7d 0a 20 20 66  N_FALSE;.  }.  f
5740: 6f 72 28 69 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d  or(i=lemp->nterm
5750: 69 6e 61 6c 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  inal; i<lemp->ns
5760: 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
5770: 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
5780: 5d 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 53 65  ]->firstset = Se
5790: 74 4e 65 77 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f  tNew();.  }..  /
57a0: 2a 20 46 69 72 73 74 20 63 6f 6d 70 75 74 65 20  * First compute 
57b0: 61 6c 6c 20 6c 61 6d 62 64 61 73 20 2a 2f 0a 20  all lambdas */. 
57c0: 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73   do{.    progres
57d0: 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 72  s = 0;.    for(r
57e0: 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
57f0: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
5800: 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68        if( rp->lh
5810: 73 2d 3e 6c 61 6d 62 64 61 20 29 20 63 6f 6e 74  s->lambda ) cont
5820: 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
5830: 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  i=0; i<rp->nrhs;
5840: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
5850: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
5860: 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a  p = rp->rhs[i];.
5870: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d           if( sp-
5880: 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20  >type!=TERMINAL 
5890: 7c 7c 20 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c  || sp->lambda==L
58a0: 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65  EMON_FALSE ) bre
58b0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
58c0: 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68    if( i==rp->nrh
58d0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72 70 2d  s ){.        rp-
58e0: 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c  >lhs->lambda = L
58f0: 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20 20  EMON_TRUE;.     
5900: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
5910: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5920: 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73   }while( progres
5930: 73 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63  s );..  /* Now c
5940: 6f 6d 70 75 74 65 20 61 6c 6c 20 66 69 72 73 74  ompute all first
5950: 20 73 65 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20   sets */.  do{. 
5960: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
5970: 20 2a 73 31 2c 20 2a 73 32 3b 0a 20 20 20 20 70   *s1, *s2;.    p
5980: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
5990: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
59a0: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
59b0: 65 78 74 29 7b 0a 20 20 20 20 20 20 73 31 20 3d  ext){.      s1 =
59c0: 20 72 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20   rp->lhs;.      
59d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
59e0: 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
59f0: 20 20 20 73 32 20 3d 20 72 70 2d 3e 72 68 73 5b     s2 = rp->rhs[
5a00: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
5a10: 73 32 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  s2->type==TERMIN
5a20: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
5a30: 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41  progress += SetA
5a40: 64 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c  dd(s1->firstset,
5a50: 73 32 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  s2->index);.    
5a60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5a70: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
5a80: 32 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  2->type==MULTITE
5a90: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
5aa0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
5ab0: 32 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29  2->nsubsym; j++)
5ac0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  {.            pr
5ad0: 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41 64 64  ogress += SetAdd
5ae0: 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32  (s1->firstset,s2
5af0: 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 69 6e 64  ->subsym[j]->ind
5b00: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ex);.          }
5b10: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
5b20: 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 31 3d  ;..}else if( s1=
5b30: 3d 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =s2 ){.         
5b40: 20 69 66 28 20 73 31 2d 3e 6c 61 6d 62 64 61 3d   if( s1->lambda=
5b50: 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62  =LEMON_FALSE ) b
5b60: 72 65 61 6b 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20  reak;..}else{.  
5b70: 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73          progress
5b80: 20 2b 3d 20 53 65 74 55 6e 69 6f 6e 28 73 31 2d   += SetUnion(s1-
5b90: 3e 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 66 69  >firstset,s2->fi
5ba0: 72 73 74 73 65 74 29 3b 0a 20 20 20 20 20 20 20  rstset);.       
5bb0: 20 20 20 69 66 28 20 73 32 2d 3e 6c 61 6d 62 64     if( s2->lambd
5bc0: 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29  a==LEMON_FALSE )
5bd0: 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 20   break;..}.     
5be0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c   }.    }.  }whil
5bf0: 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 20  e( progress );. 
5c00: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 43   return;.}../* C
5c10: 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30 29  ompute all LR(0)
5c20: 20 73 74 61 74 65 73 20 66 6f 72 20 74 68 65 20   states for the 
5c30: 67 72 61 6d 6d 61 72 2e 20 20 4c 69 6e 6b 73 0a  grammar.  Links.
5c40: 2a 2a 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ** are added to 
5c50: 62 65 74 77 65 65 6e 20 73 6f 6d 65 20 73 74 61  between some sta
5c60: 74 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  tes so that the 
5c70: 4c 52 28 31 29 20 66 6f 6c 6c 6f 77 20 73 65 74  LR(1) follow set
5c80: 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 6f 6d 70  s.** can be comp
5c90: 75 74 65 64 20 6c 61 74 65 72 2e 0a 2a 2f 0a 50  uted later..*/.P
5ca0: 52 49 56 41 54 45 20 73 74 72 75 63 74 20 73 74  RIVATE struct st
5cb0: 61 74 65 20 2a 67 65 74 73 74 61 74 65 28 2f 2a  ate *getstate(/*
5cc0: 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20   struct lemon * 
5cd0: 2a 2f 29 3b 20 20 2f 2a 20 66 6f 72 77 61 72 64  */);  /* forward
5ce0: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 76 6f   reference */.vo
5cf0: 69 64 20 46 69 6e 64 53 74 61 74 65 73 28 6c 65  id FindStates(le
5d00: 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
5d10: 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75   *lemp;.{.  stru
5d20: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20  ct symbol *sp;. 
5d30: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
5d40: 3b 0a 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  ;..  Configlist_
5d50: 69 6e 69 74 28 29 3b 0a 0a 20 20 2f 2a 20 46 69  init();..  /* Fi
5d60: 6e 64 20 74 68 65 20 73 74 61 72 74 20 73 79 6d  nd the start sym
5d70: 62 6f 6c 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d  bol */.  if( lem
5d80: 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20 20 20  p->start ){.    
5d90: 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64  sp = Symbol_find
5da0: 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20  (lemp->start);. 
5db0: 20 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a     if( sp==0 ){.
5dc0: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c        ErrorMsg(l
5dd0: 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c  emp->filename,0,
5de0: 0a 22 54 68 65 20 73 70 65 63 69 66 69 65 64 20  ."The specified 
5df0: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25  start symbol \"%
5e00: 73 5c 22 20 69 73 20 6e 6f 74 20 5c 0a 69 6e 20  s\" is not \.in 
5e10: 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6f 66  a nonterminal of
5e20: 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 5c   the grammar.  \
5e30: 22 25 73 5c 22 20 77 69 6c 6c 20 62 65 20 75 73  "%s\" will be us
5e40: 65 64 20 61 73 20 74 68 65 20 73 74 61 72 74 20  ed as the start 
5e50: 5c 0a 73 79 6d 62 6f 6c 20 69 6e 73 74 65 61 64  \.symbol instead
5e60: 2e 22 2c 6c 65 6d 70 2d 3e 73 74 61 72 74 2c 6c  .",lemp->start,l
5e70: 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 2d 3e  emp->rule->lhs->
5e80: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d  name);.      lem
5e90: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
5ea0: 20 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e       sp = lemp->
5eb0: 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 20 20 7d  rule->lhs;.    }
5ec0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70  .  }else{.    sp
5ed0: 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c   = lemp->rule->l
5ee0: 68 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  hs;.  }..  /* Ma
5ef0: 6b 65 20 73 75 72 65 20 74 68 65 20 73 74 61 72  ke sure the star
5f00: 74 20 73 79 6d 62 6f 6c 20 64 6f 65 73 6e 27 74  t symbol doesn't
5f10: 20 6f 63 63 75 72 20 6f 6e 20 74 68 65 20 72 69   occur on the ri
5f20: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
5f30: 0a 20 20 2a 2a 20 61 6e 79 20 72 75 6c 65 2e 20  .  ** any rule. 
5f40: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
5f50: 20 69 66 20 69 74 20 64 6f 65 73 2e 20 20 28 59   if it does.  (Y
5f60: 41 43 43 20 77 6f 75 6c 64 20 67 65 6e 65 72 61  ACC would genera
5f70: 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 73 74  te a new.  ** st
5f80: 61 72 74 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68  art symbol in th
5f90: 69 73 20 63 61 73 65 2e 29 20 2a 2f 0a 20 20 66  is case.) */.  f
5fa0: 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
5fb0: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
5fc0: 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  t){.    int i;. 
5fd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
5fe0: 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
5ff0: 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 5b      if( rp->rhs[
6000: 69 5d 3d 3d 73 70 20 29 7b 20 20 20 2f 2a 20 46  i]==sp ){   /* F
6010: 49 58 20 4d 45 3a 20 20 44 65 61 6c 20 77 69 74  IX ME:  Deal wit
6020: 68 20 6d 75 6c 74 69 74 65 72 6d 69 6e 61 6c 73  h multiterminals
6030: 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 72 72 6f   */.        Erro
6040: 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
6050: 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73 74 61 72  ame,0,."The star
6060: 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20  t symbol \"%s\" 
6070: 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 5c 0a  occurs on the \.
6080: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
6090: 6f 66 20 61 20 72 75 6c 65 2e 20 54 68 69 73 20  of a rule. This 
60a0: 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
60b0: 20 70 61 72 73 65 72 20 77 68 69 63 68 20 5c 0a   parser which \.
60c0: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 70 72  does not work pr
60d0: 6f 70 65 72 6c 79 2e 22 2c 73 70 2d 3e 6e 61 6d  operly.",sp->nam
60e0: 65 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 70  e);.        lemp
60f0: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
6100: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
6110: 0a 20 20 2f 2a 20 54 68 65 20 62 61 73 69 73 20  .  /* The basis 
6120: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  configuration se
6130: 74 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  t for the first 
6140: 73 74 61 74 65 0a 20 20 2a 2a 20 69 73 20 61 6c  state.  ** is al
6150: 6c 20 72 75 6c 65 73 20 77 68 69 63 68 20 68 61  l rules which ha
6160: 76 65 20 74 68 65 20 73 74 61 72 74 20 73 79 6d  ve the start sym
6170: 62 6f 6c 20 61 73 20 74 68 65 69 72 0a 20 20 2a  bol as their.  *
6180: 2a 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  * left-hand side
6190: 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 73 70 2d   */.  for(rp=sp-
61a0: 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
61b0: 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20 20  ->nextlhs){.    
61c0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
61d0: 65 77 63 66 70 3b 0a 20 20 20 20 72 70 2d 3e 6c  ewcfp;.    rp->l
61e0: 68 73 53 74 61 72 74 20 3d 20 31 3b 0a 20 20 20  hsStart = 1;.   
61f0: 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67   newcfp = Config
6200: 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 72 70  list_addbasis(rp
6210: 2c 30 29 3b 0a 20 20 20 20 53 65 74 41 64 64 28  ,0);.    SetAdd(
6220: 6e 65 77 63 66 70 2d 3e 66 77 73 2c 30 29 3b 0a  newcfp->fws,0);.
6230: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
6240: 65 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74  e the first stat
6250: 65 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 73 74  e.  All other st
6260: 61 74 65 73 20 77 69 6c 6c 20 62 65 0a 20 20 2a  ates will be.  *
6270: 2a 20 63 6f 6d 70 75 74 65 64 20 61 75 74 6f 6d  * computed autom
6280: 61 74 69 63 61 6c 6c 79 20 64 75 72 69 6e 67 20  atically during 
6290: 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
62a0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65  of the first one
62b0: 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72  ..  ** The retur
62c0: 6e 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ned pointer to t
62d0: 68 65 20 66 69 72 73 74 20 73 74 61 74 65 20 69  he first state i
62e0: 73 20 6e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20  s not used. */. 
62f0: 20 28 76 6f 69 64 29 67 65 74 73 74 61 74 65 28   (void)getstate(
6300: 6c 65 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b  lemp);.  return;
6310: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
6320: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61  pointer to a sta
6330: 74 65 20 77 68 69 63 68 20 69 73 20 64 65 73 63  te which is desc
6340: 72 69 62 65 64 20 62 79 20 74 68 65 20 63 6f 6e  ribed by the con
6350: 66 69 67 75 72 61 74 69 6f 6e 0a 2a 2a 20 6c 69  figuration.** li
6360: 73 74 20 77 68 69 63 68 20 68 61 73 20 62 65 65  st which has bee
6370: 6e 20 62 75 69 6c 74 20 66 72 6f 6d 20 63 61 6c  n built from cal
6380: 6c 73 20 74 6f 20 43 6f 6e 66 69 67 6c 69 73 74  ls to Configlist
6390: 5f 61 64 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  _add..*/.PRIVATE
63a0: 20 76 6f 69 64 20 62 75 69 6c 64 73 68 69 66 74   void buildshift
63b0: 73 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f  s(/* struct lemo
63c0: 6e 20 2a 2c 20 73 74 72 75 63 74 20 73 74 61 74  n *, struct stat
63d0: 65 20 2a 20 2a 2f 29 3b 20 2f 2a 20 46 6f 72 77  e * */); /* Forw
63e0: 64 20 72 65 66 20 2a 2f 0a 50 52 49 56 41 54 45  d ref */.PRIVATE
63f0: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 67   struct state *g
6400: 65 74 73 74 61 74 65 28 6c 65 6d 70 29 0a 73 74  etstate(lemp).st
6410: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
6420: 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  ;.{.  struct con
6430: 66 69 67 20 2a 63 66 70 2c 20 2a 62 70 3b 0a 20  fig *cfp, *bp;. 
6440: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
6450: 74 70 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63  tp;..  /* Extrac
6460: 74 20 74 68 65 20 73 6f 72 74 65 64 20 62 61 73  t the sorted bas
6470: 69 73 20 6f 66 20 74 68 65 20 6e 65 77 20 73 74  is of the new st
6480: 61 74 65 2e 20 20 54 68 65 20 62 61 73 69 73 20  ate.  The basis 
6490: 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a  was constructed.
64a0: 20 20 2a 2a 20 62 79 20 70 72 69 6f 72 20 63 61    ** by prior ca
64b0: 6c 6c 73 20 74 6f 20 22 43 6f 6e 66 69 67 6c 69  lls to "Configli
64c0: 73 74 5f 61 64 64 62 61 73 69 73 28 29 22 2e 20  st_addbasis()". 
64d0: 2a 2f 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  */.  Configlist_
64e0: 73 6f 72 74 62 61 73 69 73 28 29 3b 0a 20 20 62  sortbasis();.  b
64f0: 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 62  p = Configlist_b
6500: 61 73 69 73 28 29 3b 0a 0a 20 20 2f 2a 20 47 65  asis();..  /* Ge
6510: 74 20 61 20 73 74 61 74 65 20 77 69 74 68 20 74  t a state with t
6520: 68 65 20 73 61 6d 65 20 62 61 73 69 73 20 2a 2f  he same basis */
6530: 0a 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f 66  .  stp = State_f
6540: 69 6e 64 28 62 70 29 3b 0a 20 20 69 66 28 20 73  ind(bp);.  if( s
6550: 74 70 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 73  tp ){.    /* A s
6560: 74 61 74 65 20 77 69 74 68 20 74 68 65 20 73 61  tate with the sa
6570: 6d 65 20 62 61 73 69 73 20 61 6c 72 65 61 64 79  me basis already
6580: 20 65 78 69 73 74 73 21 20 20 43 6f 70 79 20 61   exists!  Copy a
6590: 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65  ll the follow-se
65a0: 74 0a 20 20 20 20 2a 2a 20 70 72 6f 70 61 67 61  t.    ** propaga
65b0: 74 69 6f 6e 20 6c 69 6e 6b 73 20 66 72 6f 6d 20  tion links from 
65c0: 74 68 65 20 73 74 61 74 65 20 75 6e 64 65 72 20  the state under 
65d0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 74  construction int
65e0: 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 65  o the.    ** pre
65f0: 65 78 69 73 74 69 6e 67 20 73 74 61 74 65 2c 20  existing state, 
6600: 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f  then return a po
6610: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65  inter to the pre
6620: 65 78 69 73 74 69 6e 67 20 73 74 61 74 65 20 2a  existing state *
6630: 2f 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e  /.    struct con
6640: 66 69 67 20 2a 78 2c 20 2a 79 3b 0a 20 20 20 20  fig *x, *y;.    
6650: 66 6f 72 28 78 3d 62 70 2c 20 79 3d 73 74 70 2d  for(x=bp, y=stp-
6660: 3e 62 70 3b 20 78 20 26 26 20 79 3b 20 78 3d 78  >bp; x && y; x=x
6670: 2d 3e 62 70 2c 20 79 3d 79 2d 3e 62 70 29 7b 0a  ->bp, y=y->bp){.
6680: 20 20 20 20 20 20 50 6c 69 6e 6b 5f 63 6f 70 79        Plink_copy
6690: 28 26 79 2d 3e 62 70 6c 70 2c 78 2d 3e 62 70 6c  (&y->bplp,x->bpl
66a0: 70 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f  p);.      Plink_
66b0: 64 65 6c 65 74 65 28 78 2d 3e 66 70 6c 70 29 3b  delete(x->fplp);
66c0: 0a 20 20 20 20 20 20 78 2d 3e 66 70 6c 70 20 3d  .      x->fplp =
66d0: 20 78 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20   x->bplp = 0;.  
66e0: 20 20 7d 0a 20 20 20 20 63 66 70 20 3d 20 43 6f    }.    cfp = Co
66f0: 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28  nfiglist_return(
6700: 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73  );.    Configlis
6710: 74 5f 65 61 74 28 63 66 70 29 3b 0a 20 20 7d 65  t_eat(cfp);.  }e
6720: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
6730: 20 72 65 61 6c 6c 79 20 69 73 20 61 20 6e 65 77   really is a new
6740: 20 73 74 61 74 65 2e 20 20 43 6f 6e 73 74 72 75   state.  Constru
6750: 63 74 20 61 6c 6c 20 74 68 65 20 64 65 74 61 69  ct all the detai
6760: 6c 73 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67  ls */.    Config
6770: 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 6c 65 6d  list_closure(lem
6780: 70 29 3b 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  p);    /* Comput
6790: 65 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  e the configurat
67a0: 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20  ion closure */. 
67b0: 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f     Configlist_so
67c0: 72 74 28 29 3b 20 20 20 20 20 20 20 20 20 20 20  rt();           
67d0: 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f 6e 66  /* Sort the conf
67e0: 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72  iguration closur
67f0: 65 20 2a 2f 0a 20 20 20 20 63 66 70 20 3d 20 43  e */.    cfp = C
6800: 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e  onfiglist_return
6810: 28 29 3b 20 20 20 2f 2a 20 47 65 74 20 61 20 70  ();   /* Get a p
6820: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f  ointer to the co
6830: 6e 66 69 67 20 6c 69 73 74 20 2a 2f 0a 20 20 20  nfig list */.   
6840: 20 73 74 70 20 3d 20 53 74 61 74 65 5f 6e 65 77   stp = State_new
6850: 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ();           /*
6860: 20 41 20 6e 65 77 20 73 74 61 74 65 20 73 74 72   A new state str
6870: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 4d 65  ucture */.    Me
6880: 6d 6f 72 79 43 68 65 63 6b 28 73 74 70 29 3b 0a  moryCheck(stp);.
6890: 20 20 20 20 73 74 70 2d 3e 62 70 20 3d 20 62 70      stp->bp = bp
68a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
68b0: 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65   /* Remember the
68c0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62   configuration b
68d0: 61 73 69 73 20 2a 2f 0a 20 20 20 20 73 74 70 2d  asis */.    stp-
68e0: 3e 63 66 70 20 3d 20 63 66 70 3b 20 20 20 20 20  >cfp = cfp;     
68f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65           /* Reme
6900: 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69 67 75  mber the configu
6910: 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a  ration closure *
6920: 2f 0a 20 20 20 20 73 74 70 2d 3e 73 74 61 74 65  /.    stp->state
6930: 6e 75 6d 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  num = lemp->nsta
6940: 74 65 2b 2b 3b 20 2f 2a 20 45 76 65 72 79 20 73  te++; /* Every s
6950: 74 61 74 65 20 67 65 74 73 20 61 20 73 65 71 75  tate gets a sequ
6960: 65 6e 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ence number */. 
6970: 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 30 3b 20     stp->ap = 0; 
6980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6990: 2f 2a 20 4e 6f 20 61 63 74 69 6f 6e 73 2c 20 79  /* No actions, y
69a0: 65 74 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65  et. */.    State
69b0: 5f 69 6e 73 65 72 74 28 73 74 70 2c 73 74 70 2d  _insert(stp,stp-
69c0: 3e 62 70 29 3b 20 20 20 2f 2a 20 41 64 64 20 74  >bp);   /* Add t
69d0: 6f 20 74 68 65 20 73 74 61 74 65 20 74 61 62 6c  o the state tabl
69e0: 65 20 2a 2f 0a 20 20 20 20 62 75 69 6c 64 73 68  e */.    buildsh
69f0: 69 66 74 73 28 6c 65 6d 70 2c 73 74 70 29 3b 20  ifts(lemp,stp); 
6a00: 20 20 20 20 20 20 2f 2a 20 52 65 63 75 72 73 69        /* Recursi
6a10: 76 65 6c 79 20 63 6f 6d 70 75 74 65 20 73 75 63  vely compute suc
6a20: 63 65 73 73 6f 72 20 73 74 61 74 65 73 20 2a 2f  cessor states */
6a30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 74  .  }.  return st
6a40: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
6a50: 72 6e 20 74 72 75 65 20 69 66 20 74 77 6f 20 73  rn true if two s
6a60: 79 6d 62 6f 6c 73 20 61 72 65 20 74 68 65 20 73  ymbols are the s
6a70: 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 61 6d 65  ame..*/.int same
6a80: 5f 73 79 6d 62 6f 6c 28 61 2c 62 29 0a 73 74 72  _symbol(a,b).str
6a90: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 61 3b 0a 73  uct symbol *a;.s
6aa0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62 3b  truct symbol *b;
6ab0: 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  .{.  int i;.  if
6ac0: 28 20 61 3d 3d 62 20 29 20 72 65 74 75 72 6e 20  ( a==b ) return 
6ad0: 31 3b 0a 20 20 69 66 28 20 61 2d 3e 74 79 70 65  1;.  if( a->type
6ae0: 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  !=MULTITERMINAL 
6af0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
6b00: 28 20 62 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49  ( b->type!=MULTI
6b10: 54 45 52 4d 49 4e 41 4c 20 29 20 72 65 74 75 72  TERMINAL ) retur
6b20: 6e 20 30 3b 0a 20 20 69 66 28 20 61 2d 3e 6e 73  n 0;.  if( a->ns
6b30: 75 62 73 79 6d 21 3d 62 2d 3e 6e 73 75 62 73 79  ubsym!=b->nsubsy
6b40: 6d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  m ) return 0;.  
6b50: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 2d 3e 6e 73  for(i=0; i<a->ns
6b60: 75 62 73 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubsym; i++){.   
6b70: 20 69 66 28 20 61 2d 3e 73 75 62 73 79 6d 5b 69   if( a->subsym[i
6b80: 5d 21 3d 62 2d 3e 73 75 62 73 79 6d 5b 69 5d 20  ]!=b->subsym[i] 
6b90: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
6ba0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
6bb0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c 20  * Construct all 
6bc0: 73 75 63 63 65 73 73 6f 72 20 73 74 61 74 65 73  successor states
6bd0: 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 73 74   to the given st
6be0: 61 74 65 2e 20 20 41 20 22 73 75 63 63 65 73 73  ate.  A "success
6bf0: 6f 72 22 0a 2a 2a 20 73 74 61 74 65 20 69 73 20  or".** state is 
6c00: 61 6e 79 20 73 74 61 74 65 20 77 68 69 63 68 20  any state which 
6c10: 63 61 6e 20 62 65 20 72 65 61 63 68 65 64 20 62  can be reached b
6c20: 79 20 61 20 73 68 69 66 74 20 61 63 74 69 6f 6e  y a shift action
6c30: 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  ..*/.PRIVATE voi
6c40: 64 20 62 75 69 6c 64 73 68 69 66 74 73 28 6c 65  d buildshifts(le
6c50: 6d 70 2c 73 74 70 29 0a 73 74 72 75 63 74 20 6c  mp,stp).struct l
6c60: 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 73 74 72 75  emon *lemp;.stru
6c70: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20  ct state *stp;  
6c80: 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 20     /* The state 
6c90: 66 72 6f 6d 20 77 68 69 63 68 20 73 75 63 63 65  from which succe
6ca0: 73 73 6f 72 73 20 61 72 65 20 63 6f 6d 70 75 74  ssors are comput
6cb0: 65 64 20 2a 2f 0a 7b 0a 20 20 73 74 72 75 63 74  ed */.{.  struct
6cc0: 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 2f   config *cfp;  /
6cd0: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
6ce0: 72 75 20 74 68 65 20 63 6f 6e 66 69 67 20 63 6c  ru the config cl
6cf0: 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22 20 2a  osure of "stp" *
6d00: 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  /.  struct confi
6d10: 67 20 2a 62 63 66 70 3b 20 2f 2a 20 46 6f 72 20  g *bcfp; /* For 
6d20: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 6f  the inner loop o
6d30: 6e 20 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72 65  n config closure
6d40: 20 6f 66 20 22 73 74 70 22 20 2a 2f 0a 20 20 73   of "stp" */.  s
6d50: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
6d60: 77 3b 20 20 2f 2a 20 2a 2f 0a 20 20 73 74 72 75  w;  /* */.  stru
6d70: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20 20  ct symbol *sp;  
6d80: 20 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f   /* Symbol follo
6d90: 77 69 6e 67 20 74 68 65 20 64 6f 74 20 69 6e 20  wing the dot in 
6da0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 63  configuration "c
6db0: 66 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  fp" */.  struct 
6dc0: 73 79 6d 62 6f 6c 20 2a 62 73 70 3b 20 20 2f 2a  symbol *bsp;  /*
6dd0: 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e   Symbol followin
6de0: 67 20 74 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e  g the dot in con
6df0: 66 69 67 75 72 61 74 69 6f 6e 20 22 62 63 66 70  figuration "bcfp
6e00: 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  " */.  struct st
6e10: 61 74 65 20 2a 6e 65 77 73 74 70 3b 20 2f 2a 20  ate *newstp; /* 
6e20: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  A pointer to a s
6e30: 75 63 63 65 73 73 6f 72 20 73 74 61 74 65 20 2a  uccessor state *
6e40: 2f 0a 0a 20 20 2f 2a 20 45 61 63 68 20 63 6f 6e  /..  /* Each con
6e50: 66 69 67 75 72 61 74 69 6f 6e 20 62 65 63 6f 6d  figuration becom
6e60: 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 66 74 65  es complete afte
6e70: 72 20 69 74 20 63 6f 6e 74 69 62 75 74 65 73 20  r it contibutes 
6e80: 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72 0a 20  to a successor. 
6e90: 20 2a 2a 20 73 74 61 74 65 2e 20 20 49 6e 69 74   ** state.  Init
6ea0: 69 61 6c 6c 79 2c 20 61 6c 6c 20 63 6f 6e 66 69  ially, all confi
6eb0: 67 75 72 61 74 69 6f 6e 73 20 61 72 65 20 69 6e  gurations are in
6ec0: 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 66 6f  complete */.  fo
6ed0: 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20  r(cfp=stp->cfp; 
6ee0: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
6ef0: 78 74 29 20 63 66 70 2d 3e 73 74 61 74 75 73 20  xt) cfp->status 
6f00: 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 0a 20  = INCOMPLETE;.. 
6f10: 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
6f20: 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69   all configurati
6f30: 6f 6e 73 20 6f 66 20 74 68 65 20 73 74 61 74 65  ons of the state
6f40: 20 22 73 74 70 22 20 2a 2f 0a 20 20 66 6f 72 28   "stp" */.  for(
6f50: 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66  cfp=stp->cfp; cf
6f60: 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74  p; cfp=cfp->next
6f70: 29 7b 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e  ){.    if( cfp->
6f80: 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45  status==COMPLETE
6f90: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20   ) continue;    
6fa0: 2f 2a 20 41 6c 72 65 61 64 79 20 75 73 65 64 20  /* Already used 
6fb0: 62 79 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  by inner loop */
6fc0: 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e 64 6f  .    if( cfp->do
6fd0: 74 3e 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73  t>=cfp->rp->nrhs
6fe0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a   ) continue;  /*
6ff0: 20 43 61 6e 27 74 20 73 68 69 66 74 20 74 68 69   Can't shift thi
7000: 73 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20 20  s config */.    
7010: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74  Configlist_reset
7020: 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ();             
7030: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 65           /* Rese
7040: 74 20 74 68 65 20 6e 65 77 20 63 6f 6e 66 69 67  t the new config
7050: 20 73 65 74 20 2a 2f 0a 20 20 20 20 73 70 20 3d   set */.    sp =
7060: 20 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 63 66   cfp->rp->rhs[cf
7070: 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20  p->dot];        
7080: 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 61       /* Symbol a
7090: 66 74 65 72 20 74 68 65 20 64 6f 74 20 2a 2f 0a  fter the dot */.
70a0: 0a 20 20 20 20 2f 2a 20 46 6f 72 20 65 76 65 72  .    /* For ever
70b0: 79 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  y configuration 
70c0: 69 6e 20 74 68 65 20 73 74 61 74 65 20 22 73 74  in the state "st
70d0: 70 22 20 77 68 69 63 68 20 68 61 73 20 74 68 65  p" which has the
70e0: 20 73 79 6d 62 6f 6c 20 22 73 70 22 0a 20 20 20   symbol "sp".   
70f0: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74   ** following it
7100: 73 20 64 6f 74 2c 20 61 64 64 20 74 68 65 20 73  s dot, add the s
7110: 61 6d 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ame configuratio
7120: 6e 20 74 6f 20 74 68 65 20 62 61 73 69 73 20 73  n to the basis s
7130: 65 74 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20  et under.    ** 
7140: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 62 75 74  construction but
7150: 20 77 69 74 68 20 74 68 65 20 64 6f 74 20 73 68   with the dot sh
7160: 69 66 74 65 64 20 6f 6e 65 20 73 79 6d 62 6f 6c  ifted one symbol
7170: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20 2a   to the right. *
7180: 2f 0a 20 20 20 20 66 6f 72 28 62 63 66 70 3d 63  /.    for(bcfp=c
7190: 66 70 3b 20 62 63 66 70 3b 20 62 63 66 70 3d 62  fp; bcfp; bcfp=b
71a0: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
71b0: 20 20 69 66 28 20 62 63 66 70 2d 3e 73 74 61 74    if( bcfp->stat
71c0: 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63  us==COMPLETE ) c
71d0: 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41  ontinue;    /* A
71e0: 6c 72 65 61 64 79 20 75 73 65 64 20 2a 2f 0a 20  lready used */. 
71f0: 20 20 20 20 20 69 66 28 20 62 63 66 70 2d 3e 64       if( bcfp->d
7200: 6f 74 3e 3d 62 63 66 70 2d 3e 72 70 2d 3e 6e 72  ot>=bcfp->rp->nr
7210: 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2f  hs ) continue; /
7220: 2a 20 43 61 6e 27 74 20 73 68 69 66 74 20 74 68  * Can't shift th
7230: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  is one */.      
7240: 62 73 70 20 3d 20 62 63 66 70 2d 3e 72 70 2d 3e  bsp = bcfp->rp->
7250: 72 68 73 5b 62 63 66 70 2d 3e 64 6f 74 5d 3b 20  rhs[bcfp->dot]; 
7260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74            /* Get
7270: 20 73 79 6d 62 6f 6c 20 61 66 74 65 72 20 64 6f   symbol after do
7280: 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21  t */.      if( !
7290: 73 61 6d 65 5f 73 79 6d 62 6f 6c 28 62 73 70 2c  same_symbol(bsp,
72a0: 73 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  sp) ) continue; 
72b0: 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
72c0: 73 61 6d 65 20 61 73 20 66 6f 72 20 22 63 66 70  same as for "cfp
72d0: 22 20 2a 2f 0a 20 20 20 20 20 20 62 63 66 70 2d  " */.      bcfp-
72e0: 3e 73 74 61 74 75 73 20 3d 20 43 4f 4d 50 4c 45  >status = COMPLE
72f0: 54 45 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  TE;             
7300: 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 69       /* Mark thi
7310: 73 20 63 6f 6e 66 69 67 20 61 73 20 75 73 65 64  s config as used
7320: 20 2a 2f 0a 20 20 20 20 20 20 6e 65 77 20 3d 20   */.      new = 
7330: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61  Configlist_addba
7340: 73 69 73 28 62 63 66 70 2d 3e 72 70 2c 62 63 66  sis(bcfp->rp,bcf
7350: 70 2d 3e 64 6f 74 2b 31 29 3b 0a 20 20 20 20 20  p->dot+1);.     
7360: 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6e 65 77 2d   Plink_add(&new-
7370: 3e 62 70 6c 70 2c 62 63 66 70 29 3b 0a 20 20 20  >bplp,bcfp);.   
7380: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 61   }..    /* Get a
7390: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
73a0: 73 74 61 74 65 20 64 65 73 63 72 69 62 65 64 20  state described 
73b0: 62 79 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e  by the basis con
73c0: 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 0a 20  figuration set. 
73d0: 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65     ** constructe
73e0: 64 20 69 6e 20 74 68 65 20 70 72 65 63 65 64 69  d in the precedi
73f0: 6e 67 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 6e  ng loop */.    n
7400: 65 77 73 74 70 20 3d 20 67 65 74 73 74 61 74 65  ewstp = getstate
7410: 28 6c 65 6d 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  (lemp);..    /* 
7420: 54 68 65 20 73 74 61 74 65 20 22 6e 65 77 73 74  The state "newst
7430: 70 22 20 69 73 20 72 65 61 63 68 65 64 20 66 72  p" is reached fr
7440: 6f 6d 20 74 68 65 20 73 74 61 74 65 20 22 73 74  om the state "st
7450: 70 22 20 62 79 20 61 20 73 68 69 66 74 20 61 63  p" by a shift ac
7460: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  tion.    ** on t
7470: 68 65 20 73 79 6d 62 6f 6c 20 22 73 70 22 20 2a  he symbol "sp" *
7480: 2f 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  /.    if( sp->ty
7490: 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
74a0: 4c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  L ){.      int i
74b0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
74c0: 20 69 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20   i<sp->nsubsym; 
74d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 41 63  i++){.        Ac
74e0: 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61  tion_add(&stp->a
74f0: 70 2c 53 48 49 46 54 2c 73 70 2d 3e 73 75 62 73  p,SHIFT,sp->subs
7500: 79 6d 5b 69 5d 2c 28 63 68 61 72 2a 29 6e 65 77  ym[i],(char*)new
7510: 73 74 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  stp);.      }.  
7520: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 41    }else{.      A
7530: 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e  ction_add(&stp->
7540: 61 70 2c 53 48 49 46 54 2c 73 70 2c 28 63 68 61  ap,SHIFT,sp,(cha
7550: 72 20 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20 20  r *)newstp);.   
7560: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
7570: 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 70 72  Construct the pr
7580: 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a  opagation links.
7590: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b  */.void FindLink
75a0: 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  s(lemp).struct l
75b0: 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
75c0: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
75d0: 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6f 74  config *cfp, *ot
75e0: 68 65 72 3b 0a 20 20 73 74 72 75 63 74 20 73 74  her;.  struct st
75f0: 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
7600: 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 0a  ct plink *plp;..
7610: 20 20 2f 2a 20 48 6f 75 73 65 6b 65 65 70 69 6e    /* Housekeepin
7620: 67 20 64 65 74 61 69 6c 3a 0a 20 20 2a 2a 20 41  g detail:.  ** A
7630: 64 64 20 74 6f 20 65 76 65 72 79 20 70 72 6f 70  dd to every prop
7640: 61 67 61 74 65 20 6c 69 6e 6b 20 61 20 70 6f 69  agate link a poi
7650: 6e 74 65 72 20 62 61 63 6b 20 74 6f 20 74 68 65  nter back to the
7660: 20 73 74 61 74 65 20 74 6f 0a 20 20 2a 2a 20 77   state to.  ** w
7670: 68 69 63 68 20 74 68 65 20 6c 69 6e 6b 20 69 73  hich the link is
7680: 20 61 74 74 61 63 68 65 64 2e 20 2a 2f 0a 20 20   attached. */.  
7690: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
76a0: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
76b0: 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
76c0: 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f  orted[i];.    fo
76d0: 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20  r(cfp=stp->cfp; 
76e0: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
76f0: 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e  xt){.      cfp->
7700: 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 7d  stp = stp;.    }
7710: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  .  }..  /* Conve
7720: 72 74 20 61 6c 6c 20 62 61 63 6b 6c 69 6e 6b 73  rt all backlinks
7730: 20 69 6e 74 6f 20 66 6f 72 77 61 72 64 20 6c 69   into forward li
7740: 6e 6b 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66  nks.  Only the f
7750: 6f 72 77 61 72 64 0a 20 20 2a 2a 20 6c 69 6e 6b  orward.  ** link
7760: 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  s are used in th
7770: 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 6f 6d  e follow-set com
7780: 70 75 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66  putation. */.  f
7790: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
77a0: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
77b0: 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
77c0: 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  rted[i];.    for
77d0: 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63  (cfp=stp->cfp; c
77e0: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
77f0: 74 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 6c  t){.      for(pl
7800: 70 3d 63 66 70 2d 3e 62 70 6c 70 3b 20 70 6c 70  p=cfp->bplp; plp
7810: 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29  ; plp=plp->next)
7820: 7b 0a 20 20 20 20 20 20 20 20 6f 74 68 65 72 20  {.        other 
7830: 3d 20 70 6c 70 2d 3e 63 66 70 3b 0a 20 20 20 20  = plp->cfp;.    
7840: 20 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6f      Plink_add(&o
7850: 74 68 65 72 2d 3e 66 70 6c 70 2c 63 66 70 29 3b  ther->fplp,cfp);
7860: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7870: 20 7d 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65   }.}../* Compute
7880: 20 61 6c 6c 20 66 6f 6c 6c 6f 77 73 65 74 73 2e   all followsets.
7890: 0a 2a 2a 0a 2a 2a 20 41 20 66 6f 6c 6c 6f 77 73  .**.** A follows
78a0: 65 74 20 69 73 20 74 68 65 20 73 65 74 20 6f 66  et is the set of
78b0: 20 61 6c 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69   all symbols whi
78c0: 63 68 20 63 61 6e 20 63 6f 6d 65 20 69 6d 6d 65  ch can come imme
78d0: 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72  diately.** after
78e0: 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
78f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46 6f  ..*/.void FindFo
7900: 6c 6c 6f 77 53 65 74 73 28 6c 65 6d 70 29 0a 73  llowSets(lemp).s
7910: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
7920: 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p;.{.  int i;.  
7930: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
7940: 66 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  fp;.  struct pli
7950: 6e 6b 20 2a 70 6c 70 3b 0a 20 20 69 6e 74 20 70  nk *plp;.  int p
7960: 72 6f 67 72 65 73 73 3b 0a 20 20 69 6e 74 20 63  rogress;.  int c
7970: 68 61 6e 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d  hange;..  for(i=
7980: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
7990: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  e; i++){.    for
79a0: 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65  (cfp=lemp->sorte
79b0: 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b 20  d[i]->cfp; cfp; 
79c0: 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a  cfp=cfp->next){.
79d0: 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61 74 75        cfp->statu
79e0: 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a  s = INCOMPLETE;.
79f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 64      }.  }.  .  d
7a00: 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20  o{.    progress 
7a10: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
7a20: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
7a30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; i++){.      fo
7a40: 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74  r(cfp=lemp->sort
7a50: 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b  ed[i]->cfp; cfp;
7a60: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b   cfp=cfp->next){
7a70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 66 70  .        if( cfp
7a80: 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45  ->status==COMPLE
7a90: 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  TE ) continue;. 
7aa0: 20 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d 63         for(plp=c
7ab0: 66 70 2d 3e 66 70 6c 70 3b 20 70 6c 70 3b 20 70  fp->fplp; plp; p
7ac0: 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20  lp=plp->next){. 
7ad0: 20 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 20           change 
7ae0: 3d 20 53 65 74 55 6e 69 6f 6e 28 70 6c 70 2d 3e  = SetUnion(plp->
7af0: 63 66 70 2d 3e 66 77 73 2c 63 66 70 2d 3e 66 77  cfp->fws,cfp->fw
7b00: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
7b10: 28 20 63 68 61 6e 67 65 20 29 7b 0a 20 20 20 20  ( change ){.    
7b20: 20 20 20 20 20 20 20 20 70 6c 70 2d 3e 63 66 70          plp->cfp
7b30: 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d  ->status = INCOM
7b40: 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20 20  PLETE;.         
7b50: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
7b60: 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 20  ..  }..}.       
7b70: 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 43   cfp->status = C
7b80: 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d  OMPLETE;.      }
7b90: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
7ba0: 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 7d 0a 0a   progress );.}..
7bb0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
7bc0: 76 65 5f 63 6f 6e 66 6c 69 63 74 28 29 3b 0a 0a  ve_conflict();..
7bd0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 72  /* Compute the r
7be0: 65 64 75 63 65 20 61 63 74 69 6f 6e 73 2c 20 61  educe actions, a
7bf0: 6e 64 20 72 65 73 6f 6c 76 65 20 63 6f 6e 66 6c  nd resolve confl
7c00: 69 63 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69  icts..*/.void Fi
7c10: 6e 64 41 63 74 69 6f 6e 73 28 6c 65 6d 70 29 0a  ndActions(lemp).
7c20: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
7c30: 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 6a 3b  mp;.{.  int i,j;
7c40: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
7c50: 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20   *cfp;.  struct 
7c60: 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
7c70: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
7c80: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
7c90: 72 70 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c  rp;..  /* Add al
7ca0: 6c 20 6f 66 20 74 68 65 20 72 65 64 75 63 65 20  l of the reduce 
7cb0: 61 63 74 69 6f 6e 73 20 0a 20 20 2a 2a 20 41 20  actions .  ** A 
7cc0: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 69 73  reduce action is
7cd0: 20 61 64 64 65 64 20 66 6f 72 20 65 61 63 68 20   added for each 
7ce0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 66  element of the f
7cf0: 6f 6c 6c 6f 77 73 65 74 20 6f 66 0a 20 20 2a 2a  ollowset of.  **
7d00: 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
7d10: 20 77 68 69 63 68 20 68 61 73 20 69 74 73 20 64   which has its d
7d20: 6f 74 20 61 74 20 74 68 65 20 65 78 74 72 65 6d  ot at the extrem
7d30: 65 20 72 69 67 68 74 2e 0a 20 20 2a 2f 0a 20 20  e right..  */.  
7d40: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
7d50: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 20 20  >nstate; i++){  
7d60: 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
7d70: 6c 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 20 20  l states */.    
7d80: 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
7d90: 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63  ed[i];.    for(c
7da0: 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70  fp=stp->cfp; cfp
7db0: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
7dc0: 7b 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  {  /* Loop over 
7dd0: 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  all configuratio
7de0: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ns */.      if( 
7df0: 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 3d 3d 63  cfp->rp->nrhs==c
7e00: 66 70 2d 3e 64 6f 74 20 29 7b 20 20 20 20 20 20  fp->dot ){      
7e10: 20 20 2f 2a 20 49 73 20 64 6f 74 20 61 74 20 65    /* Is dot at e
7e20: 78 74 72 65 6d 65 20 72 69 67 68 74 3f 20 2a 2f  xtreme right? */
7e30: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
7e40: 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; j<lemp->ntermi
7e50: 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nal; j++){.     
7e60: 20 20 20 20 20 69 66 28 20 53 65 74 46 69 6e 64       if( SetFind
7e70: 28 63 66 70 2d 3e 66 77 73 2c 6a 29 20 29 7b 0a  (cfp->fws,j) ){.
7e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
7e90: 64 64 20 61 20 72 65 64 75 63 65 20 61 63 74 69  dd a reduce acti
7ea0: 6f 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  on to the state 
7eb0: 22 73 74 70 22 20 77 68 69 63 68 20 77 69 6c 6c  "stp" which will
7ec0: 20 72 65 64 75 63 65 20 62 79 20 74 68 65 0a 20   reduce by the. 
7ed0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 75             ** ru
7ee0: 6c 65 20 22 63 66 70 2d 3e 72 70 22 20 69 66 20  le "cfp->rp" if 
7ef0: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 73 79  the lookahead sy
7f00: 6d 62 6f 6c 20 69 73 20 22 6c 65 6d 70 2d 3e 73  mbol is "lemp->s
7f10: 79 6d 62 6f 6c 73 5b 6a 5d 22 20 2a 2f 0a 20 20  ymbols[j]" */.  
7f20: 20 20 20 20 20 20 20 20 20 20 41 63 74 69 6f 6e            Action
7f30: 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 52 45  _add(&stp->ap,RE
7f40: 44 55 43 45 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  DUCE,lemp->symbo
7f50: 6c 73 5b 6a 5d 2c 28 63 68 61 72 20 2a 29 63 66  ls[j],(char *)cf
7f60: 70 2d 3e 72 70 29 3b 0a 20 20 20 20 20 20 20 20  p->rp);.        
7f70: 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20    }..}.      }. 
7f80: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
7f90: 64 64 20 74 68 65 20 61 63 63 65 70 74 69 6e 67  dd the accepting
7fa0: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 66 28 20   token */.  if( 
7fb0: 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20  lemp->start ){. 
7fc0: 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66     sp = Symbol_f
7fd0: 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29  ind(lemp->start)
7fe0: 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20  ;.    if( sp==0 
7ff0: 29 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c  ) sp = lemp->rul
8000: 65 2d 3e 6c 68 73 3b 0a 20 20 7d 65 6c 73 65 7b  e->lhs;.  }else{
8010: 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e  .    sp = lemp->
8020: 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 20  rule->lhs;.  }. 
8030: 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65 20 66   /* Add to the f
8040: 69 72 73 74 20 73 74 61 74 65 20 28 77 68 69 63  irst state (whic
8050: 68 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  h is always the 
8060: 73 74 61 72 74 69 6e 67 20 73 74 61 74 65 20 6f  starting state o
8070: 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e 69 74  f the.  ** finit
8080: 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 29  e state machine)
8090: 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20 41 43   an action to AC
80a0: 43 45 50 54 20 69 66 20 74 68 65 20 6c 6f 6f 6b  CEPT if the look
80b0: 61 68 65 61 64 20 69 73 20 74 68 65 0a 20 20 2a  ahead is the.  *
80c0: 2a 20 73 74 61 72 74 20 6e 6f 6e 74 65 72 6d 69  * start nontermi
80d0: 6e 61 6c 2e 20 20 2a 2f 0a 20 20 41 63 74 69 6f  nal.  */.  Actio
80e0: 6e 5f 61 64 64 28 26 6c 65 6d 70 2d 3e 73 6f 72  n_add(&lemp->sor
80f0: 74 65 64 5b 30 5d 2d 3e 61 70 2c 41 43 43 45 50  ted[0]->ap,ACCEP
8100: 54 2c 73 70 2c 30 29 3b 0a 0a 20 20 2f 2a 20 52  T,sp,0);..  /* R
8110: 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73  esolve conflicts
8120: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
8130: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
8140: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
8150: 61 63 74 69 6f 6e 20 2a 61 70 2c 20 2a 6e 61 70  action *ap, *nap
8160: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  ;.    struct sta
8170: 74 65 20 2a 73 74 70 3b 0a 20 20 20 20 73 74 70  te *stp;.    stp
8180: 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
8190: 69 5d 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72  i];.    /* asser
81a0: 74 28 20 73 74 70 2d 3e 61 70 20 29 3b 20 2a 2f  t( stp->ap ); */
81b0: 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 41  .    stp->ap = A
81c0: 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e  ction_sort(stp->
81d0: 61 70 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  ap);.    for(ap=
81e0: 73 74 70 2d 3e 61 70 3b 20 61 70 20 26 26 20 61  stp->ap; ap && a
81f0: 70 2d 3e 6e 65 78 74 3b 20 61 70 3d 61 70 2d 3e  p->next; ap=ap->
8200: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66 6f 72  next){.      for
8210: 28 6e 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 6e  (nap=ap->next; n
8220: 61 70 20 26 26 20 6e 61 70 2d 3e 73 70 3d 3d 61  ap && nap->sp==a
8230: 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e 61 70 2d 3e  p->sp; nap=nap->
8240: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  next){.         
8250: 2f 2a 20 54 68 65 20 74 77 6f 20 61 63 74 69 6f  /* The two actio
8260: 6e 73 20 22 61 70 22 20 61 6e 64 20 22 6e 61 70  ns "ap" and "nap
8270: 22 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  " have the same 
8280: 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20 20  lookahead..     
8290: 20 20 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75      ** Figure ou
82a0: 74 20 77 68 69 63 68 20 6f 6e 65 20 73 68 6f 75  t which one shou
82b0: 6c 64 20 62 65 20 75 73 65 64 20 2a 2f 0a 20 20  ld be used */.  
82c0: 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 6e 63 6f         lemp->nco
82d0: 6e 66 6c 69 63 74 20 2b 3d 20 72 65 73 6f 6c 76  nflict += resolv
82e0: 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70 2c 6e 61  e_conflict(ap,na
82f0: 70 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 29 3b  p,lemp->errsym);
8300: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8310: 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20   }..  /* Report 
8320: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 65 61 63  an error for eac
8330: 68 20 72 75 6c 65 20 74 68 61 74 20 63 61 6e 20  h rule that can 
8340: 6e 65 76 65 72 20 62 65 20 72 65 64 75 63 65 64  never be reduced
8350: 2e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65  . */.  for(rp=le
8360: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
8370: 3d 72 70 2d 3e 6e 65 78 74 29 20 72 70 2d 3e 63  =rp->next) rp->c
8380: 61 6e 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e  anReduce = LEMON
8390: 5f 46 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d  _FALSE;.  for(i=
83a0: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
83b0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  e; i++){.    str
83c0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
83d0: 20 20 20 20 66 6f 72 28 61 70 3d 6c 65 6d 70 2d      for(ap=lemp-
83e0: 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 61 70 3b 20  >sorted[i]->ap; 
83f0: 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
8400: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  {.      if( ap->
8410: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 20 61  type==REDUCE ) a
8420: 70 2d 3e 78 2e 72 70 2d 3e 63 61 6e 52 65 64 75  p->x.rp->canRedu
8430: 63 65 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45 3b  ce = LEMON_TRUE;
8440: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
8450: 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
8460: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
8470: 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63 61  {.    if( rp->ca
8480: 6e 52 65 64 75 63 65 20 29 20 63 6f 6e 74 69 6e  nReduce ) contin
8490: 75 65 3b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67  ue;.    ErrorMsg
84a0: 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
84b0: 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 22 54 68  rp->ruleline,"Th
84c0: 69 73 20 72 75 6c 65 20 63 61 6e 20 6e 6f 74 20  is rule can not 
84d0: 62 65 20 72 65 64 75 63 65 64 2e 5c 6e 22 29 3b  be reduced.\n");
84e0: 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72  .    lemp->error
84f0: 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  cnt++;.  }.}../*
8500: 20 52 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c   Resolve a confl
8510: 69 63 74 20 62 65 74 77 65 65 6e 20 74 68 65 20  ict between the 
8520: 74 77 6f 20 67 69 76 65 6e 20 61 63 74 69 6f 6e  two given action
8530: 73 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 6f  s.  If the.** co
8540: 6e 66 6c 69 63 74 20 63 61 6e 27 74 20 62 65 20  nflict can't be 
8550: 72 65 73 6f 6c 76 65 64 2c 20 72 65 74 75 72 6e  resolved, return
8560: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
8570: 20 4e 4f 20 4c 4f 4e 47 45 52 20 54 52 55 45 3a   NO LONGER TRUE:
8580: 0a 2a 2a 20 20 20 54 6f 20 72 65 73 6f 6c 76 65  .**   To resolve
8590: 20 61 20 63 6f 6e 66 6c 69 63 74 2c 20 66 69 72   a conflict, fir
85a0: 73 74 20 6c 6f 6f 6b 20 74 6f 20 73 65 65 20 69  st look to see i
85b0: 66 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e 0a  f either action.
85c0: 2a 2a 20 20 20 69 73 20 6f 6e 20 61 6e 20 65 72  **   is on an er
85d0: 72 6f 72 20 72 75 6c 65 2e 20 20 49 6e 20 74 68  ror rule.  In th
85e0: 61 74 20 63 61 73 65 2c 20 74 61 6b 65 20 74 68  at case, take th
85f0: 65 20 61 63 74 69 6f 6e 20 77 68 69 63 68 0a 2a  e action which.*
8600: 2a 20 20 20 69 73 20 6e 6f 74 20 61 73 73 6f 63  *   is not assoc
8610: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 65  iated with the e
8620: 72 72 6f 72 20 72 75 6c 65 2e 20 20 49 66 20 6e  rror rule.  If n
8630: 65 69 74 68 65 72 20 6f 72 20 62 6f 74 68 0a 2a  either or both.*
8640: 2a 20 20 20 61 63 74 69 6f 6e 73 20 61 72 65 20  *   actions are 
8650: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
8660: 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2c 20 74  an error rule, t
8670: 68 65 6e 20 74 72 79 20 74 6f 0a 2a 2a 20 20 20  hen try to.**   
8680: 75 73 65 20 70 72 65 63 65 64 65 6e 63 65 20 74  use precedence t
8690: 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 63 6f  o resolve the co
86a0: 6e 66 6c 69 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  nflict..**.** If
86b0: 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e 20 69   either action i
86c0: 73 20 61 20 53 48 49 46 54 2c 20 74 68 65 6e 20  s a SHIFT, then 
86d0: 69 74 20 6d 75 73 74 20 62 65 20 61 70 78 2e 20  it must be apx. 
86e0: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
86f0: 6e 20 77 6f 6e 27 74 20 77 6f 72 6b 20 69 66 20  n won't work if 
8700: 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43  apx->type==REDUC
8710: 45 20 61 6e 64 20 61 70 79 2d 3e 74 79 70 65 3d  E and apy->type=
8720: 3d 53 48 49 46 54 2e 0a 2a 2f 0a 73 74 61 74 69  =SHIFT..*/.stati
8730: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63 6f  c int resolve_co
8740: 6e 66 6c 69 63 74 28 61 70 78 2c 61 70 79 2c 65  nflict(apx,apy,e
8750: 72 72 73 79 6d 29 0a 73 74 72 75 63 74 20 61 63  rrsym).struct ac
8760: 74 69 6f 6e 20 2a 61 70 78 3b 0a 73 74 72 75 63  tion *apx;.struc
8770: 74 20 61 63 74 69 6f 6e 20 2a 61 70 79 3b 0a 73  t action *apy;.s
8780: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 65 72  truct symbol *er
8790: 72 73 79 6d 3b 20 20 20 2f 2a 20 54 68 65 20 65  rsym;   /* The e
87a0: 72 72 6f 72 20 73 79 6d 62 6f 6c 20 28 69 66 20  rror symbol (if 
87b0: 64 65 66 69 6e 65 64 2e 20 20 4e 55 4c 4c 20 6f  defined.  NULL o
87c0: 74 68 65 72 77 69 73 65 29 20 2a 2f 0a 7b 0a 20  therwise) */.{. 
87d0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
87e0: 73 70 78 2c 20 2a 73 70 79 3b 0a 20 20 69 6e 74  spx, *spy;.  int
87f0: 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61   errcnt = 0;.  a
8800: 73 73 65 72 74 28 20 61 70 78 2d 3e 73 70 3d 3d  ssert( apx->sp==
8810: 61 70 79 2d 3e 73 70 20 29 3b 20 20 2f 2a 20 4f  apy->sp );  /* O
8820: 74 68 65 72 77 69 73 65 20 74 68 65 72 65 20 77  therwise there w
8830: 6f 75 6c 64 20 62 65 20 6e 6f 20 63 6f 6e 66 6c  ould be no confl
8840: 69 63 74 20 2a 2f 0a 20 20 69 66 28 20 61 70 78  ict */.  if( apx
8850: 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26 26  ->type==SHIFT &&
8860: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46   apy->type==SHIF
8870: 54 20 29 7b 0a 20 20 20 20 61 70 79 2d 3e 74 79  T ){.    apy->ty
8880: 70 65 20 3d 20 53 53 43 4f 4e 46 4c 49 43 54 3b  pe = SSCONFLICT;
8890: 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20  .    errcnt++;. 
88a0: 20 7d 0a 20 20 69 66 28 20 61 70 78 2d 3e 74 79   }.  if( apx->ty
88b0: 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70 79  pe==SHIFT && apy
88c0: 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29  ->type==REDUCE )
88d0: 7b 0a 20 20 20 20 73 70 78 20 3d 20 61 70 78 2d  {.    spx = apx-
88e0: 3e 73 70 3b 0a 20 20 20 20 73 70 79 20 3d 20 61  >sp;.    spy = a
88f0: 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79  py->x.rp->precsy
8900: 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 79 3d 3d  m;.    if( spy==
8910: 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30  0 || spx->prec<0
8920: 20 7c 7c 20 73 70 79 2d 3e 70 72 65 63 3c 30 20   || spy->prec<0 
8930: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  ){.      /* Not 
8940: 65 6e 6f 75 67 68 20 70 72 65 63 65 64 65 6e 63  enough precedenc
8950: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a  e information. *
8960: 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  /.      apy->typ
8970: 65 20 3d 20 53 52 43 4f 4e 46 4c 49 43 54 3b 0a  e = SRCONFLICT;.
8980: 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a        errcnt++;.
8990: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
89a0: 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72 65  x->prec>spy->pre
89b0: 63 20 29 7b 20 20 20 20 2f 2a 20 4c 6f 77 65 72  c ){    /* Lower
89c0: 20 70 72 65 63 65 64 65 6e 63 65 20 77 69 6e 73   precedence wins
89d0: 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74   */.      apy->t
89e0: 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45  ype = RD_RESOLVE
89f0: 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  D;.    }else if(
8a00: 20 73 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e   spx->prec<spy->
8a10: 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70  prec ){.      ap
8a20: 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52 45 53  x->type = SH_RES
8a30: 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65  OLVED;.    }else
8a40: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d   if( spx->prec==
8a50: 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78  spy->prec && spx
8a60: 2d 3e 61 73 73 6f 63 3d 3d 52 49 47 48 54 20 29  ->assoc==RIGHT )
8a70: 7b 20 2f 2a 20 55 73 65 20 6f 70 65 72 61 74 6f  { /* Use operato
8a80: 72 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e  r */.      apy->
8a90: 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56  type = RD_RESOLV
8aa0: 45 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ED;             
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ac0: 2f 2a 20 61 73 73 6f 63 69 61 74 69 76 69 74 79  /* associativity
8ad0: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   */.    }else if
8ae0: 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79  ( spx->prec==spy
8af0: 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61  ->prec && spx->a
8b00: 73 73 6f 63 3d 3d 4c 45 46 54 20 29 7b 20 20 2f  ssoc==LEFT ){  /
8b10: 2a 20 74 6f 20 62 72 65 61 6b 20 74 69 65 20 2a  * to break tie *
8b20: 2f 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  /.      apx->typ
8b30: 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b  e = SH_RESOLVED;
8b40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8b50: 20 20 61 73 73 65 72 74 28 20 73 70 78 2d 3e 70    assert( spx->p
8b60: 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26  rec==spy->prec &
8b70: 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4e 4f  & spx->assoc==NO
8b80: 4e 45 20 29 3b 0a 20 20 20 20 20 20 61 70 79 2d  NE );.      apy-
8b90: 3e 74 79 70 65 20 3d 20 53 52 43 4f 4e 46 4c 49  >type = SRCONFLI
8ba0: 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63 6e 74  CT;.      errcnt
8bb0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ++;.    }.  }els
8bc0: 65 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d  e if( apx->type=
8bd0: 3d 52 45 44 55 43 45 20 26 26 20 61 70 79 2d 3e  =REDUCE && apy->
8be0: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a  type==REDUCE ){.
8bf0: 20 20 20 20 73 70 78 20 3d 20 61 70 78 2d 3e 78      spx = apx->x
8c00: 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20  .rp->precsym;.  
8c10: 20 20 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72    spy = apy->x.r
8c20: 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20  p->precsym;.    
8c30: 69 66 28 20 73 70 78 3d 3d 30 20 7c 7c 20 73 70  if( spx==0 || sp
8c40: 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65  y==0 || spx->pre
8c50: 63 3c 30 20 7c 7c 0a 20 20 20 20 73 70 79 2d 3e  c<0 ||.    spy->
8c60: 70 72 65 63 3c 30 20 7c 7c 20 73 70 78 2d 3e 70  prec<0 || spx->p
8c70: 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 29  rec==spy->prec )
8c80: 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  {.      apy->typ
8c90: 65 20 3d 20 52 52 43 4f 4e 46 4c 49 43 54 3b 0a  e = RRCONFLICT;.
8ca0: 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a        errcnt++;.
8cb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
8cc0: 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72 65  x->prec>spy->pre
8cd0: 63 20 29 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e  c ){.      apy->
8ce0: 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56  type = RD_RESOLV
8cf0: 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ED;.    }else if
8d00: 28 20 73 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d  ( spx->prec<spy-
8d10: 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61  >prec ){.      a
8d20: 70 78 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45  px->type = RD_RE
8d30: 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SOLVED;.    }.  
8d40: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
8d50: 74 28 20 0a 20 20 20 20 20 20 61 70 78 2d 3e 74  t( .      apx->t
8d60: 79 70 65 3d 3d 53 48 5f 52 45 53 4f 4c 56 45 44  ype==SH_RESOLVED
8d70: 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   ||.      apx->t
8d80: 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44  ype==RD_RESOLVED
8d90: 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   ||.      apx->t
8da0: 79 70 65 3d 3d 53 53 43 4f 4e 46 4c 49 43 54 20  ype==SSCONFLICT 
8db0: 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79  ||.      apx->ty
8dc0: 70 65 3d 3d 53 52 43 4f 4e 46 4c 49 43 54 20 7c  pe==SRCONFLICT |
8dd0: 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  |.      apx->typ
8de0: 65 3d 3d 52 52 43 4f 4e 46 4c 49 43 54 20 7c 7c  e==RRCONFLICT ||
8df0: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
8e00: 3d 3d 53 48 5f 52 45 53 4f 4c 56 45 44 20 7c 7c  ==SH_RESOLVED ||
8e10: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
8e20: 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c  ==RD_RESOLVED ||
8e30: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
8e40: 3d 3d 53 53 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a  ==SSCONFLICT ||.
8e50: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d        apy->type=
8e60: 3d 53 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20  =SRCONFLICT ||. 
8e70: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d       apy->type==
8e80: 52 52 43 4f 4e 46 4c 49 43 54 0a 20 20 20 20 29  RRCONFLICT.    )
8e90: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 52 45 44  ;.    /* The RED
8ea0: 55 43 45 2f 53 48 49 46 54 20 63 61 73 65 20 63  UCE/SHIFT case c
8eb0: 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20 62 65 63  annot happen bec
8ec0: 61 75 73 65 20 53 48 49 46 54 73 20 63 6f 6d 65  ause SHIFTs come
8ed0: 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 52   before.    ** R
8ee0: 45 44 55 43 45 73 20 6f 6e 20 74 68 65 20 6c 69  EDUCEs on the li
8ef0: 73 74 2e 20 20 49 66 20 77 65 20 72 65 61 63 68  st.  If we reach
8f00: 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d   this point it m
8f10: 75 73 74 20 62 65 20 62 65 63 61 75 73 65 0a 20  ust be because. 
8f20: 20 20 20 2a 2a 20 74 68 65 20 70 61 72 73 65 72     ** the parser
8f30: 20 63 6f 6e 66 6c 69 63 74 20 68 61 64 20 61 6c   conflict had al
8f40: 72 65 61 64 79 20 62 65 65 6e 20 72 65 73 6f 6c  ready been resol
8f50: 76 65 64 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  ved. */.  }.  re
8f60: 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 2f  turn errcnt;.}./
8f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f80: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
8f90: 69 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e  ile "configlist.
8fa0: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
8fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
8fc0: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  .** Routines to 
8fd0: 70 72 6f 63 65 73 73 69 6e 67 20 61 20 63 6f 6e  processing a con
8fe0: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
8ff0: 61 6e 64 20 62 75 69 6c 64 69 6e 67 20 61 20 73  and building a s
9000: 74 61 74 65 0a 2a 2a 20 69 6e 20 74 68 65 20 4c  tate.** in the L
9010: 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65  EMON parser gene
9020: 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69  rator..*/..stati
9030: 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  c struct config 
9040: 2a 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 20 20  *freelist = 0;  
9050: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
9060: 72 65 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ree configuratio
9070: 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ns */.static str
9080: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 75 72 72  uct config *curr
9090: 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ent = 0;       /
90a0: 2a 20 54 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66  * Top of list of
90b0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
90c0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
90d0: 20 63 6f 6e 66 69 67 20 2a 2a 63 75 72 72 65 6e   config **curren
90e0: 74 65 6e 64 20 3d 20 30 3b 20 20 20 2f 2a 20 4c  tend = 0;   /* L
90f0: 61 73 74 20 6f 6e 20 6c 69 73 74 20 6f 66 20 63  ast on list of c
9100: 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61 74 69 63  onfigs */.static
9110: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
9120: 62 61 73 69 73 20 3d 20 30 3b 20 20 20 20 20 20  basis = 0;      
9130: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6c 69 73     /* Top of lis
9140: 74 20 6f 66 20 62 61 73 69 73 20 63 6f 6e 66 69  t of basis confi
9150: 67 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  gs */.static str
9160: 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a 62 61 73  uct config **bas
9170: 69 73 65 6e 64 20 3d 20 30 3b 20 20 20 20 20 2f  isend = 0;     /
9180: 2a 20 45 6e 64 20 6f 66 20 6c 69 73 74 20 6f 66  * End of list of
9190: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 73 20 2a   basis configs *
91a0: 2f 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  /../* Return a p
91b0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
91c0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f  configuration */
91d0: 0a 50 52 49 56 41 54 45 20 73 74 72 75 63 74 20  .PRIVATE struct 
91e0: 63 6f 6e 66 69 67 20 2a 6e 65 77 63 6f 6e 66 69  config *newconfi
91f0: 67 28 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  g(){.  struct co
9200: 6e 66 69 67 20 2a 6e 65 77 3b 0a 20 20 69 66 28  nfig *new;.  if(
9210: 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a   freelist==0 ){.
9220: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
9230: 6e 74 20 61 6d 74 20 3d 20 33 3b 0a 20 20 20 20  nt amt = 3;.    
9240: 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75  freelist = (stru
9250: 63 74 20 63 6f 6e 66 69 67 20 2a 29 63 61 6c 6c  ct config *)call
9260: 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28  oc( amt, sizeof(
9270: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 29 20 29  struct config) )
9280: 3b 0a 20 20 20 20 69 66 28 20 66 72 65 65 6c 69  ;.    if( freeli
9290: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  st==0 ){.      f
92a0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55  printf(stderr,"U
92b0: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
92c0: 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e  e memory for a n
92d0: 65 77 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ew configuration
92e0: 2e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  .");.      exit(
92f0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  1);.    }.    fo
9300: 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20  r(i=0; i<amt-1; 
9310: 69 2b 2b 29 20 66 72 65 65 6c 69 73 74 5b 69 5d  i++) freelist[i]
9320: 2e 6e 65 78 74 20 3d 20 26 66 72 65 65 6c 69 73  .next = &freelis
9330: 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65  t[i+1];.    free
9340: 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74  list[amt-1].next
9350: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 20   = 0;.  }.  new 
9360: 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72  = freelist;.  fr
9370: 65 65 6c 69 73 74 20 3d 20 66 72 65 65 6c 69 73  eelist = freelis
9380: 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72  t->next;.  retur
9390: 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  n new;.}../* The
93a0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22   configuration "
93b0: 6f 6c 64 22 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  old" is no longe
93c0: 72 20 75 73 65 64 20 2a 2f 0a 50 52 49 56 41 54  r used */.PRIVAT
93d0: 45 20 76 6f 69 64 20 64 65 6c 65 74 65 63 6f 6e  E void deletecon
93e0: 66 69 67 28 6f 6c 64 29 0a 73 74 72 75 63 74 20  fig(old).struct 
93f0: 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 7b 0a 20  config *old;.{. 
9400: 20 6f 6c 64 2d 3e 6e 65 78 74 20 3d 20 66 72 65   old->next = fre
9410: 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73  elist;.  freelis
9420: 74 20 3d 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 49  t = old;.}../* I
9430: 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20 63  nitialized the c
9440: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
9450: 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69  t builder */.voi
9460: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69  d Configlist_ini
9470: 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d  t(){.  current =
9480: 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64   0;.  currentend
9490: 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20 20 62   = &current;.  b
94a0: 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69  asis = 0;.  basi
94b0: 73 65 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a 20  send = &basis;. 
94c0: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69   Configtable_ini
94d0: 74 28 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  t();.  return;.}
94e0: 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64  ../* Initialized
94f0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
9500: 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65 72 20  on list builder 
9510: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
9520: 73 74 5f 72 65 73 65 74 28 29 7b 0a 20 20 63 75  st_reset(){.  cu
9530: 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72  rrent = 0;.  cur
9540: 72 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65  rentend = &curre
9550: 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b  nt;.  basis = 0;
9560: 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62  .  basisend = &b
9570: 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61  asis;.  Configta
9580: 62 6c 65 5f 63 6c 65 61 72 28 30 29 3b 0a 20 20  ble_clear(0);.  
9590: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64  return;.}../* Ad
95a0: 64 20 61 6e 6f 74 68 65 72 20 63 6f 6e 66 69 67  d another config
95b0: 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63  uration to the c
95c0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
95d0: 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  t */.struct conf
95e0: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61  ig *Configlist_a
95f0: 64 64 28 72 70 2c 64 6f 74 29 0a 73 74 72 75 63  dd(rp,dot).struc
9600: 74 20 72 75 6c 65 20 2a 72 70 3b 20 20 20 20 2f  t rule *rp;    /
9610: 2a 20 54 68 65 20 72 75 6c 65 20 2a 2f 0a 69 6e  * The rule */.in
9620: 74 20 64 6f 74 3b 20 20 20 20 20 20 20 20 20 20  t dot;          
9630: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20    /* Index into 
9640: 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 72  the RHS of the r
9650: 75 6c 65 20 77 68 65 72 65 20 74 68 65 20 64 6f  ule where the do
9660: 74 20 67 6f 65 73 20 2a 2f 0a 7b 0a 20 20 73 74  t goes */.{.  st
9670: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
9680: 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73 65  , model;..  asse
9690: 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d  rt( currentend!=
96a0: 30 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20  0 );.  model.rp 
96b0: 3d 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f  = rp;.  model.do
96c0: 74 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d  t = dot;.  cfp =
96d0: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e   Configtable_fin
96e0: 64 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28  d(&model);.  if(
96f0: 20 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63   cfp==0 ){.    c
9700: 66 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29  fp = newconfig()
9710: 3b 0a 20 20 20 20 63 66 70 2d 3e 72 70 20 3d 20  ;.    cfp->rp = 
9720: 72 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74  rp;.    cfp->dot
9730: 20 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d   = dot;.    cfp-
9740: 3e 66 77 73 20 3d 20 53 65 74 4e 65 77 28 29 3b  >fws = SetNew();
9750: 0a 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20  .    cfp->stp = 
9760: 30 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c 70  0;.    cfp->fplp
9770: 20 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30   = cfp->bplp = 0
9780: 3b 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78 74 20  ;.    cfp->next 
9790: 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70  = 0;.    cfp->bp
97a0: 20 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72 72 65   = 0;.    *curre
97b0: 6e 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20  ntend = cfp;.   
97c0: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63   currentend = &c
97d0: 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 43 6f  fp->next;.    Co
97e0: 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74  nfigtable_insert
97f0: 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (cfp);.  }.  ret
9800: 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 41  urn cfp;.}../* A
9810: 64 64 20 61 20 62 61 73 69 73 20 63 6f 6e 66 69  dd a basis confi
9820: 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  guration to the 
9830: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
9840: 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e  st */.struct con
9850: 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f  fig *Configlist_
9860: 61 64 64 62 61 73 69 73 28 72 70 2c 64 6f 74 29  addbasis(rp,dot)
9870: 0a 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70  .struct rule *rp
9880: 3b 0a 69 6e 74 20 64 6f 74 3b 0a 7b 0a 20 20 73  ;.int dot;.{.  s
9890: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
98a0: 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73  p, model;..  ass
98b0: 65 72 74 28 20 62 61 73 69 73 65 6e 64 21 3d 30  ert( basisend!=0
98c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
98d0: 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20  rrentend!=0 );. 
98e0: 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a   model.rp = rp;.
98f0: 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f    model.dot = do
9900: 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69  t;.  cfp = Confi
9910: 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64  gtable_find(&mod
9920: 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d  el);.  if( cfp==
9930: 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e  0 ){.    cfp = n
9940: 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20  ewconfig();.    
9950: 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20  cfp->rp = rp;.  
9960: 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74    cfp->dot = dot
9970: 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d  ;.    cfp->fws =
9980: 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63   SetNew();.    c
9990: 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20  fp->stp = 0;.   
99a0: 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70   cfp->fplp = cfp
99b0: 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20  ->bplp = 0;.    
99c0: 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20  cfp->next = 0;. 
99d0: 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a     cfp->bp = 0;.
99e0: 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20      *currentend 
99f0: 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65  = cfp;.    curre
9a00: 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65  ntend = &cfp->ne
9a10: 78 74 3b 0a 20 20 20 20 2a 62 61 73 69 73 65 6e  xt;.    *basisen
9a20: 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 62 61 73  d = cfp;.    bas
9a30: 69 73 65 6e 64 20 3d 20 26 63 66 70 2d 3e 62 70  isend = &cfp->bp
9a40: 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c  ;.    Configtabl
9a50: 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20  e_insert(cfp);. 
9a60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b   }.  return cfp;
9a70: 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74  .}../* Compute t
9a80: 68 65 20 63 6c 6f 73 75 72 65 20 6f 66 20 74 68  he closure of th
9a90: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
9aa0: 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  list */.void Con
9ab0: 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28  figlist_closure(
9ac0: 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
9ad0: 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74  on *lemp;.{.  st
9ae0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
9af0: 2c 20 2a 6e 65 77 63 66 70 3b 0a 20 20 73 74 72  , *newcfp;.  str
9b00: 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a 6e  uct rule *rp, *n
9b10: 65 77 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73  ewrp;.  struct s
9b20: 79 6d 62 6f 6c 20 2a 73 70 2c 20 2a 78 73 70 3b  ymbol *sp, *xsp;
9b30: 0a 20 20 69 6e 74 20 69 2c 20 64 6f 74 3b 0a 0a  .  int i, dot;..
9b40: 20 20 61 73 73 65 72 74 28 20 63 75 72 72 65 6e    assert( curren
9b50: 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 66 6f 72  tend!=0 );.  for
9b60: 28 63 66 70 3d 63 75 72 72 65 6e 74 3b 20 63 66  (cfp=current; cf
9b70: 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74  p; cfp=cfp->next
9b80: 29 7b 0a 20 20 20 20 72 70 20 3d 20 63 66 70 2d  ){.    rp = cfp-
9b90: 3e 72 70 3b 0a 20 20 20 20 64 6f 74 20 3d 20 63  >rp;.    dot = c
9ba0: 66 70 2d 3e 64 6f 74 3b 0a 20 20 20 20 69 66 28  fp->dot;.    if(
9bb0: 20 64 6f 74 3e 3d 72 70 2d 3e 6e 72 68 73 20 29   dot>=rp->nrhs )
9bc0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73   continue;.    s
9bd0: 70 20 3d 20 72 70 2d 3e 72 68 73 5b 64 6f 74 5d  p = rp->rhs[dot]
9be0: 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  ;.    if( sp->ty
9bf0: 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20  pe==NONTERMINAL 
9c00: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d  ){.      if( sp-
9c10: 3e 72 75 6c 65 3d 3d 30 20 26 26 20 73 70 21 3d  >rule==0 && sp!=
9c20: 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a  lemp->errsym ){.
9c30: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
9c40: 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
9c50: 72 70 2d 3e 6c 69 6e 65 2c 22 4e 6f 6e 74 65 72  rp->line,"Nonter
9c60: 6d 69 6e 61 6c 20 5c 22 25 73 5c 22 20 68 61 73  minal \"%s\" has
9c70: 20 6e 6f 20 72 75 6c 65 73 2e 22 2c 0a 20 20 20   no rules.",.   
9c80: 20 20 20 20 20 20 20 73 70 2d 3e 6e 61 6d 65 29         sp->name)
9c90: 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e  ;.        lemp->
9ca0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
9cb0: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e 65    }.      for(ne
9cc0: 77 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 6e 65  wrp=sp->rule; ne
9cd0: 77 72 70 3b 20 6e 65 77 72 70 3d 6e 65 77 72 70  wrp; newrp=newrp
9ce0: 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20 20  ->nextlhs){.    
9cf0: 20 20 20 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e      newcfp = Con
9d00: 66 69 67 6c 69 73 74 5f 61 64 64 28 6e 65 77 72  figlist_add(newr
9d10: 70 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  p,0);.        fo
9d20: 72 28 69 3d 64 6f 74 2b 31 3b 20 69 3c 72 70 2d  r(i=dot+1; i<rp-
9d30: 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
9d40: 20 20 20 20 20 20 20 78 73 70 20 3d 20 72 70 2d         xsp = rp-
9d50: 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20  >rhs[i];.       
9d60: 20 20 20 69 66 28 20 78 73 70 2d 3e 74 79 70 65     if( xsp->type
9d70: 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  ==TERMINAL ){.  
9d80: 20 20 20 20 20 20 20 20 20 20 53 65 74 41 64 64            SetAdd
9d90: 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78 73 70  (newcfp->fws,xsp
9da0: 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
9db0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9dc0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
9dd0: 20 78 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54   xsp->type==MULT
9de0: 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  ITERMINAL ){.   
9df0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a           int k;.
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
9e10: 6b 3d 30 3b 20 6b 3c 78 73 70 2d 3e 6e 73 75 62  k=0; k<xsp->nsub
9e20: 73 79 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  sym; k++){.     
9e30: 20 20 20 20 20 20 20 20 20 53 65 74 41 64 64 28           SetAdd(
9e40: 6e 65 77 63 66 70 2d 3e 66 77 73 2c 20 78 73 70  newcfp->fws, xsp
9e50: 2d 3e 73 75 62 73 79 6d 5b 6b 5d 2d 3e 69 6e 64  ->subsym[k]->ind
9e60: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ex);.           
9e70: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62   }.            b
9e80: 72 65 61 6b 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a  reak;..  }else{.
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74 55              SetU
9ea0: 6e 69 6f 6e 28 6e 65 77 63 66 70 2d 3e 66 77 73  nion(newcfp->fws
9eb0: 2c 78 73 70 2d 3e 66 69 72 73 74 73 65 74 29 3b  ,xsp->firstset);
9ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
9ed0: 20 78 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45   xsp->lambda==LE
9ee0: 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61  MON_FALSE ) brea
9ef0: 6b 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20  k;..  }..}.     
9f00: 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72     if( i==rp->nr
9f10: 68 73 20 29 20 50 6c 69 6e 6b 5f 61 64 64 28 26  hs ) Plink_add(&
9f20: 63 66 70 2d 3e 66 70 6c 70 2c 6e 65 77 63 66 70  cfp->fplp,newcfp
9f30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9f40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
9f50: 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f  ../* Sort the co
9f60: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
9f70: 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c   */.void Configl
9f80: 69 73 74 5f 73 6f 72 74 28 29 7b 0a 20 20 63 75  ist_sort(){.  cu
9f90: 72 72 65 6e 74 20 3d 20 28 73 74 72 75 63 74 20  rrent = (struct 
9fa0: 63 6f 6e 66 69 67 20 2a 29 6d 73 6f 72 74 28 28  config *)msort((
9fb0: 63 68 61 72 20 2a 29 63 75 72 72 65 6e 74 2c 28  char *)current,(
9fc0: 63 68 61 72 20 2a 2a 29 26 28 63 75 72 72 65 6e  char **)&(curren
9fd0: 74 2d 3e 6e 65 78 74 29 2c 43 6f 6e 66 69 67 63  t->next),Configc
9fe0: 6d 70 29 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e  mp);.  currenten
9ff0: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  d = 0;.  return;
a000: 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20  .}../* Sort the 
a010: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
a020: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64  ion list */.void
a030: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74   Configlist_sort
a040: 62 61 73 69 73 28 29 7b 0a 20 20 62 61 73 69 73  basis(){.  basis
a050: 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69   = (struct confi
a060: 67 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20  g *)msort((char 
a070: 2a 29 63 75 72 72 65 6e 74 2c 28 63 68 61 72 20  *)current,(char 
a080: 2a 2a 29 26 28 63 75 72 72 65 6e 74 2d 3e 62 70  **)&(current->bp
a090: 29 2c 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20  ),Configcmp);.  
a0a0: 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20  basisend = 0;.  
a0b0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65  return;.}../* Re
a0c0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
a0d0: 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
a0e0: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
a0f0: 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65  list and.** rese
a100: 74 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74  t the list */.st
a110: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
a120: 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29  figlist_return()
a130: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
a140: 67 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20  g *old;.  old = 
a150: 63 75 72 72 65 6e 74 3b 0a 20 20 63 75 72 72 65  current;.  curre
a160: 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e  nt = 0;.  curren
a170: 74 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  tend = 0;.  retu
a180: 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 52 65  rn old;.}../* Re
a190: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
a1a0: 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
a1b0: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
a1c0: 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65  list and.** rese
a1d0: 74 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74  t the list */.st
a1e0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
a1f0: 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28 29 7b  figlist_basis(){
a200: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
a210: 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 62   *old;.  old = b
a220: 61 73 69 73 3b 0a 20 20 62 61 73 69 73 20 3d 20  asis;.  basis = 
a230: 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20  0;.  basisend = 
a240: 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b  0;.  return old;
a250: 0a 7d 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20  .}../* Free all 
a260: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
a270: 67 69 76 65 6e 20 63 6f 6e 66 69 67 75 72 61 74  given configurat
a280: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64  ion list */.void
a290: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28   Configlist_eat(
a2a0: 63 66 70 29 0a 73 74 72 75 63 74 20 63 6f 6e 66  cfp).struct conf
a2b0: 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72  ig *cfp;.{.  str
a2c0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 78 74  uct config *next
a2d0: 63 66 70 3b 0a 20 20 66 6f 72 28 3b 20 63 66 70  cfp;.  for(; cfp
a2e0: 3b 20 63 66 70 3d 6e 65 78 74 63 66 70 29 7b 0a  ; cfp=nextcfp){.
a2f0: 20 20 20 20 6e 65 78 74 63 66 70 20 3d 20 63 66      nextcfp = cf
a300: 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 61 73 73  p->next;.    ass
a310: 65 72 74 28 20 63 66 70 2d 3e 66 70 6c 70 3d 3d  ert( cfp->fplp==
a320: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
a330: 20 63 66 70 2d 3e 62 70 6c 70 3d 3d 30 20 29 3b   cfp->bplp==0 );
a340: 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e 66 77  .    if( cfp->fw
a350: 73 20 29 20 53 65 74 46 72 65 65 28 63 66 70 2d  s ) SetFree(cfp-
a360: 3e 66 77 73 29 3b 0a 20 20 20 20 64 65 6c 65 74  >fws);.    delet
a370: 65 63 6f 6e 66 69 67 28 63 66 70 29 3b 0a 20 20  econfig(cfp);.  
a380: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 2f 2a  }.  return;.}./*
a390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3a0: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
a3b0: 65 72 72 6f 72 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  error.c" *******
a3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
a3e0: 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 69 6e 74  * Code for print
a3f0: 69 6e 67 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ing error messag
a400: 65 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e 64 20 61  e..*/../* Find a
a410: 20 67 6f 6f 64 20 70 6c 61 63 65 20 74 6f 20 62   good place to b
a420: 72 65 61 6b 20 22 6d 73 67 22 20 73 6f 20 74 68  reak "msg" so th
a430: 61 74 20 69 74 73 20 6c 65 6e 67 74 68 20 69 73  at its length is
a440: 20 61 74 20 6c 65 61 73 74 20 22 6d 69 6e 22 0a   at least "min".
a450: 2a 2a 20 62 75 74 20 6e 6f 20 6d 6f 72 65 20 74  ** but no more t
a460: 68 61 6e 20 22 6d 61 78 22 2e 20 20 4d 61 6b 65  han "max".  Make
a470: 20 74 68 65 20 70 6f 69 6e 74 20 61 73 20 63 6c   the point as cl
a480: 6f 73 65 20 74 6f 20 6d 61 78 20 61 73 20 70 6f  ose to max as po
a490: 73 73 69 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  ssible..*/.stati
a4a0: 63 20 69 6e 74 20 66 69 6e 64 62 72 65 61 6b 28  c int findbreak(
a4b0: 6d 73 67 2c 6d 69 6e 2c 6d 61 78 29 0a 63 68 61  msg,min,max).cha
a4c0: 72 20 2a 6d 73 67 3b 0a 69 6e 74 20 6d 69 6e 3b  r *msg;.int min;
a4d0: 0a 69 6e 74 20 6d 61 78 3b 0a 7b 0a 20 20 69 6e  .int max;.{.  in
a4e0: 74 20 69 2c 73 70 6f 74 3b 0a 20 20 63 68 61 72  t i,spot;.  char
a4f0: 20 63 3b 0a 20 20 66 6f 72 28 69 3d 73 70 6f 74   c;.  for(i=spot
a500: 3d 6d 69 6e 3b 20 69 3c 3d 6d 61 78 3b 20 69 2b  =min; i<=max; i+
a510: 2b 29 7b 0a 20 20 20 20 63 20 3d 20 6d 73 67 5b  +){.    c = msg[
a520: 69 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27  i];.    if( c=='
a530: 5c 74 27 20 29 20 6d 73 67 5b 69 5d 20 3d 20 27  \t' ) msg[i] = '
a540: 20 27 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   ';.    if( c=='
a550: 5c 6e 27 20 29 7b 20 6d 73 67 5b 69 5d 20 3d 20  \n' ){ msg[i] = 
a560: 27 20 27 3b 20 73 70 6f 74 20 3d 20 69 3b 20 62  ' '; spot = i; b
a570: 72 65 61 6b 3b 20 7d 0a 20 20 20 20 69 66 28 20  reak; }.    if( 
a580: 63 3d 3d 30 20 29 7b 20 73 70 6f 74 20 3d 20 69  c==0 ){ spot = i
a590: 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 69  ; break; }.    i
a5a0: 66 28 20 63 3d 3d 27 2d 27 20 26 26 20 69 3c 6d  f( c=='-' && i<m
a5b0: 61 78 2d 31 20 29 20 73 70 6f 74 20 3d 20 69 2b  ax-1 ) spot = i+
a5c0: 31 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 20  1;.    if( c==' 
a5d0: 27 20 29 20 73 70 6f 74 20 3d 20 69 3b 0a 20 20  ' ) spot = i;.  
a5e0: 7d 0a 20 20 72 65 74 75 72 6e 20 73 70 6f 74 3b  }.  return spot;
a5f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 72  .}../*.** The er
a600: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
a610: 70 6c 69 74 20 61 63 72 6f 73 73 20 6d 75 6c 74  plit across mult
a620: 69 70 6c 65 20 6c 69 6e 65 73 20 69 66 20 6e 65  iple lines if ne
a630: 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a  cessary.  The.**
a640: 20 73 70 6c 69 74 73 20 6f 63 63 75 72 20 61 74   splits occur at
a650: 20 61 20 73 70 61 63 65 2c 20 69 66 20 74 68 65   a space, if the
a660: 72 65 20 69 73 20 61 20 73 70 61 63 65 20 61 76  re is a space av
a670: 61 69 6c 61 62 6c 65 20 6e 65 61 72 20 74 68 65  ailable near the
a680: 20 65 6e 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6c   end.** of the l
a690: 69 6e 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ine..*/.#define 
a6a0: 45 52 52 4d 53 47 53 49 5a 45 20 20 31 30 30 30  ERRMSGSIZE  1000
a6b0: 30 20 2f 2a 20 48 6f 70 65 20 74 68 69 73 20 69  0 /* Hope this i
a6c0: 73 20 62 69 67 20 65 6e 6f 75 67 68 2e 20 20 4e  s big enough.  N
a6d0: 6f 20 77 61 79 20 74 6f 20 65 72 72 6f 72 20 63  o way to error c
a6e0: 68 65 63 6b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  heck */.#define 
a6f0: 4c 49 4e 45 57 49 44 54 48 20 20 20 20 20 20 37  LINEWIDTH      7
a700: 39 20 2f 2a 20 4d 61 78 20 77 69 64 74 68 20 6f  9 /* Max width o
a710: 66 20 61 6e 79 20 6f 75 74 70 75 74 20 6c 69 6e  f any output lin
a720: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 45  e */.#define PRE
a730: 46 49 58 4c 49 4d 49 54 20 20 20 20 33 30 20 2f  FIXLIMIT    30 /
a740: 2a 20 4d 61 78 20 77 69 64 74 68 20 6f 66 20 74  * Max width of t
a750: 68 65 20 70 72 65 66 69 78 20 6f 6e 20 65 61 63  he prefix on eac
a760: 68 20 6c 69 6e 65 20 2a 2f 0a 76 6f 69 64 20 45  h line */.void E
a770: 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63 68  rrorMsg(const ch
a780: 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 69 6e  ar *filename, in
a790: 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20  t lineno, const 
a7a0: 63 68 61 72 20 2a 66 6f 72 6d 61 74 2c 20 2e 2e  char *format, ..
a7b0: 2e 29 7b 0a 20 20 63 68 61 72 20 65 72 72 6d 73  .){.  char errms
a7c0: 67 5b 45 52 52 4d 53 47 53 49 5a 45 5d 3b 0a 20  g[ERRMSGSIZE];. 
a7d0: 20 63 68 61 72 20 70 72 65 66 69 78 5b 50 52 45   char prefix[PRE
a7e0: 46 49 58 4c 49 4d 49 54 2b 31 30 5d 3b 0a 20 20  FIXLIMIT+10];.  
a7f0: 69 6e 74 20 65 72 72 6d 73 67 73 69 7a 65 3b 0a  int errmsgsize;.
a800: 20 20 69 6e 74 20 70 72 65 66 69 78 73 69 7a 65    int prefixsize
a810: 3b 0a 20 20 69 6e 74 20 61 76 61 69 6c 61 62 6c  ;.  int availabl
a820: 65 77 69 64 74 68 3b 0a 20 20 76 61 5f 6c 69 73  ewidth;.  va_lis
a830: 74 20 61 70 3b 0a 20 20 69 6e 74 20 65 6e 64 2c  t ap;.  int end,
a840: 20 72 65 73 74 61 72 74 2c 20 62 61 73 65 3b 0a   restart, base;.
a850: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
a860: 66 6f 72 6d 61 74 29 3b 0a 20 20 2f 2a 20 50 72  format);.  /* Pr
a870: 65 70 61 72 65 20 61 20 70 72 65 66 69 78 20 74  epare a prefix t
a880: 6f 20 62 65 20 70 72 65 70 65 6e 64 65 64 20 74  o be prepended t
a890: 6f 20 65 76 65 72 79 20 6f 75 74 70 75 74 20 6c  o every output l
a8a0: 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 6c 69 6e  ine */.  if( lin
a8b0: 65 6e 6f 3e 30 20 29 7b 0a 20 20 20 20 73 70 72  eno>0 ){.    spr
a8c0: 69 6e 74 66 28 70 72 65 66 69 78 2c 22 25 2e 2a  intf(prefix,"%.*
a8d0: 73 3a 25 64 3a 20 22 2c 50 52 45 46 49 58 4c 49  s:%d: ",PREFIXLI
a8e0: 4d 49 54 2d 31 30 2c 66 69 6c 65 6e 61 6d 65 2c  MIT-10,filename,
a8f0: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65  lineno);.  }else
a900: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 70 72  {.    sprintf(pr
a910: 65 66 69 78 2c 22 25 2e 2a 73 3a 20 22 2c 50 52  efix,"%.*s: ",PR
a920: 45 46 49 58 4c 49 4d 49 54 2d 31 30 2c 66 69 6c  EFIXLIMIT-10,fil
a930: 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 72  ename);.  }.  pr
a940: 65 66 69 78 73 69 7a 65 20 3d 20 6c 65 6d 6f 6e  efixsize = lemon
a950: 53 74 72 6c 65 6e 28 70 72 65 66 69 78 29 3b 0a  Strlen(prefix);.
a960: 20 20 61 76 61 69 6c 61 62 6c 65 77 69 64 74 68    availablewidth
a970: 20 3d 20 4c 49 4e 45 57 49 44 54 48 20 2d 20 70   = LINEWIDTH - p
a980: 72 65 66 69 78 73 69 7a 65 3b 0a 0a 20 20 2f 2a  refixsize;..  /*
a990: 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 72   Generate the er
a9a0: 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20  ror message */. 
a9b0: 20 76 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67   vsprintf(errmsg
a9c0: 2c 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20 20 76  ,format,ap);.  v
a9d0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 65 72 72  a_end(ap);.  err
a9e0: 6d 73 67 73 69 7a 65 20 3d 20 6c 65 6d 6f 6e 53  msgsize = lemonS
a9f0: 74 72 6c 65 6e 28 65 72 72 6d 73 67 29 3b 0a 20  trlen(errmsg);. 
aa00: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 72 61 69 6c   /* Remove trail
aa10: 69 6e 67 20 27 5c 6e 27 73 20 66 72 6f 6d 20 74  ing '\n's from t
aa20: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
aa30: 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 65 72  . */.  while( er
aa40: 72 6d 73 67 73 69 7a 65 3e 30 20 26 26 20 65 72  rmsgsize>0 && er
aa50: 72 6d 73 67 5b 65 72 72 6d 73 67 73 69 7a 65 2d  rmsg[errmsgsize-
aa60: 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20  1]=='\n' ){.    
aa70: 20 65 72 72 6d 73 67 5b 2d 2d 65 72 72 6d 73 67   errmsg[--errmsg
aa80: 73 69 7a 65 5d 20 3d 20 30 3b 0a 20 20 7d 0a 0a  size] = 0;.  }..
aa90: 20 20 2f 2a 20 50 72 69 6e 74 20 74 68 65 20 65    /* Print the e
aaa0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a  rror message */.
aab0: 20 20 62 61 73 65 20 3d 20 30 3b 0a 20 20 77 68    base = 0;.  wh
aac0: 69 6c 65 28 20 65 72 72 6d 73 67 5b 62 61 73 65  ile( errmsg[base
aad0: 5d 21 3d 30 20 29 7b 0a 20 20 20 20 65 6e 64 20  ]!=0 ){.    end 
aae0: 3d 20 72 65 73 74 61 72 74 20 3d 20 66 69 6e 64  = restart = find
aaf0: 62 72 65 61 6b 28 26 65 72 72 6d 73 67 5b 62 61  break(&errmsg[ba
ab00: 73 65 5d 2c 30 2c 61 76 61 69 6c 61 62 6c 65 77  se],0,availablew
ab10: 69 64 74 68 29 3b 0a 20 20 20 20 72 65 73 74 61  idth);.    resta
ab20: 72 74 20 2b 3d 20 62 61 73 65 3b 0a 20 20 20 20  rt += base;.    
ab30: 77 68 69 6c 65 28 20 65 72 72 6d 73 67 5b 72 65  while( errmsg[re
ab40: 73 74 61 72 74 5d 3d 3d 27 20 27 20 29 20 72 65  start]==' ' ) re
ab50: 73 74 61 72 74 2b 2b 3b 0a 20 20 20 20 66 70 72  start++;.    fpr
ab60: 69 6e 74 66 28 73 74 64 6f 75 74 2c 22 25 73 25  intf(stdout,"%s%
ab70: 2e 2a 73 5c 6e 22 2c 70 72 65 66 69 78 2c 65 6e  .*s\n",prefix,en
ab80: 64 2c 26 65 72 72 6d 73 67 5b 62 61 73 65 5d 29  d,&errmsg[base])
ab90: 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 72 65 73  ;.    base = res
aba0: 74 61 72 74 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a  tart;.  }.}./***
abb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
abc0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6d 61 69  om the file "mai
abd0: 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n.c" ***********
abe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
abf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
ac00: 20 4d 61 69 6e 20 70 72 6f 67 72 61 6d 20 66 69   Main program fi
ac10: 6c 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e  le for the LEMON
ac20: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
ac30: 72 2e 0a 2a 2f 0a 0a 2f 2a 20 52 65 70 6f 72 74  r..*/../* Report
ac40: 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
ac50: 79 20 63 6f 6e 64 69 74 69 6f 6e 20 61 6e 64 20  y condition and 
ac60: 61 62 6f 72 74 2e 20 20 54 68 69 73 20 66 75 6e  abort.  This fun
ac70: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64  ction.** is used
ac80: 20 6d 6f 73 74 6c 79 20 62 79 20 74 68 65 20 22   mostly by the "
ac90: 4d 65 6d 6f 72 79 43 68 65 63 6b 22 20 6d 61 63  MemoryCheck" mac
aca0: 72 6f 20 69 6e 20 73 74 72 75 63 74 2e 68 0a 2a  ro in struct.h.*
acb0: 2f 0a 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72  /.void memory_er
acc0: 72 6f 72 28 29 7b 0a 20 20 66 70 72 69 6e 74 66  ror(){.  fprintf
acd0: 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20  (stderr,"Out of 
ace0: 6d 65 6d 6f 72 79 2e 20 20 41 62 6f 72 74 69 6e  memory.  Abortin
acf0: 67 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 65 78 69 74  g...\n");.  exit
ad00: 28 31 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  (1);.}..static i
ad10: 6e 74 20 6e 44 65 66 69 6e 65 20 3d 20 30 3b 20  nt nDefine = 0; 
ad20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ad30: 66 20 2d 44 20 6f 70 74 69 6f 6e 73 20 6f 6e 20  f -D options on 
ad40: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
ad50: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
ad60: 2a 2a 61 7a 44 65 66 69 6e 65 20 3d 20 30 3b 20  **azDefine = 0; 
ad70: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
ad80: 2d 44 20 6d 61 63 72 6f 73 20 2a 2f 0a 0a 2f 2a  -D macros */../*
ad90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
ada0: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
adb0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 65 61 63   argument to eac
adc0: 68 20 2d 44 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  h -D command-lin
add0: 65 20 6f 70 74 69 6f 6e 2e 0a 2a 2a 20 41 64 64  e option..** Add
ade0: 20 74 68 65 20 6d 61 63 72 6f 20 64 65 66 69 6e   the macro defin
adf0: 65 64 20 74 6f 20 74 68 65 20 61 7a 44 65 66 69  ed to the azDefi
ae00: 6e 65 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  ne array..*/.sta
ae10: 74 69 63 20 76 6f 69 64 20 68 61 6e 64 6c 65 5f  tic void handle_
ae20: 44 5f 6f 70 74 69 6f 6e 28 63 68 61 72 20 2a 7a  D_option(char *z
ae30: 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70 61 7a 3b  ){.  char **paz;
ae40: 0a 20 20 6e 44 65 66 69 6e 65 2b 2b 3b 0a 20 20  .  nDefine++;.  
ae50: 61 7a 44 65 66 69 6e 65 20 3d 20 72 65 61 6c 6c  azDefine = reall
ae60: 6f 63 28 61 7a 44 65 66 69 6e 65 2c 20 73 69 7a  oc(azDefine, siz
ae70: 65 6f 66 28 61 7a 44 65 66 69 6e 65 5b 30 5d 29  eof(azDefine[0])
ae80: 2a 6e 44 65 66 69 6e 65 29 3b 0a 20 20 69 66 28  *nDefine);.  if(
ae90: 20 61 7a 44 65 66 69 6e 65 3d 3d 30 20 29 7b 0a   azDefine==0 ){.
aea0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
aeb0: 72 72 2c 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  rr,"out of memor
aec0: 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  y\n");.    exit(
aed0: 31 29 3b 0a 20 20 7d 0a 20 20 70 61 7a 20 3d 20  1);.  }.  paz = 
aee0: 26 61 7a 44 65 66 69 6e 65 5b 6e 44 65 66 69 6e  &azDefine[nDefin
aef0: 65 2d 31 5d 3b 0a 20 20 2a 70 61 7a 20 3d 20 6d  e-1];.  *paz = m
af00: 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c  alloc( lemonStrl
af10: 65 6e 28 7a 29 2b 31 20 29 3b 0a 20 20 69 66 28  en(z)+1 );.  if(
af20: 20 2a 70 61 7a 3d 3d 30 20 29 7b 0a 20 20 20 20   *paz==0 ){.    
af30: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
af40: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22  out of memory\n"
af50: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
af60: 20 20 7d 0a 20 20 73 74 72 63 70 79 28 2a 70 61    }.  strcpy(*pa
af70: 7a 2c 20 7a 29 3b 0a 20 20 66 6f 72 28 7a 3d 2a  z, z);.  for(z=*
af80: 70 61 7a 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d 27  paz; *z && *z!='
af90: 3d 27 3b 20 7a 2b 2b 29 7b 7d 0a 20 20 2a 7a 20  ='; z++){}.  *z 
afa0: 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 20 54 68 65 20  = 0;.}.../* The 
afb0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 20 50  main program.  P
afc0: 61 72 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64  arse the command
afd0: 20 6c 69 6e 65 20 61 6e 64 20 64 6f 20 69 74 2e   line and do it.
afe0: 2e 2e 20 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28 61  .. */.int main(a
aff0: 72 67 63 2c 61 72 67 76 29 0a 69 6e 74 20 61 72  rgc,argv).int ar
b000: 67 63 3b 0a 63 68 61 72 20 2a 2a 61 72 67 76 3b  gc;.char **argv;
b010: 0a 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  .{.  static int 
b020: 76 65 72 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73  version = 0;.  s
b030: 74 61 74 69 63 20 69 6e 74 20 72 70 66 6c 61 67  tatic int rpflag
b040: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
b050: 6e 74 20 62 61 73 69 73 66 6c 61 67 20 3d 20 30  nt basisflag = 0
b060: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63  ;.  static int c
b070: 6f 6d 70 72 65 73 73 20 3d 20 30 3b 0a 20 20 73  ompress = 0;.  s
b080: 74 61 74 69 63 20 69 6e 74 20 71 75 69 65 74 20  tatic int quiet 
b090: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
b0a0: 74 20 73 74 61 74 69 73 74 69 63 73 20 3d 20 30  t statistics = 0
b0b0: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6d  ;.  static int m
b0c0: 68 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61  hflag = 0;.  sta
b0d0: 74 69 63 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f  tic int nolineno
b0e0: 73 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61  sflag = 0;.  sta
b0f0: 74 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74  tic struct s_opt
b100: 69 6f 6e 73 20 6f 70 74 69 6f 6e 73 5b 5d 20 3d  ions options[] =
b110: 20 7b 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47   {.    {OPT_FLAG
b120: 2c 20 22 62 22 2c 20 28 63 68 61 72 2a 29 26 62  , "b", (char*)&b
b130: 61 73 69 73 66 6c 61 67 2c 20 22 50 72 69 6e 74  asisflag, "Print
b140: 20 6f 6e 6c 79 20 74 68 65 20 62 61 73 69 73 20   only the basis 
b150: 69 6e 20 72 65 70 6f 72 74 2e 22 7d 2c 0a 20 20  in report."},.  
b160: 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 63 22    {OPT_FLAG, "c"
b170: 2c 20 28 63 68 61 72 2a 29 26 63 6f 6d 70 72 65  , (char*)&compre
b180: 73 73 2c 20 22 44 6f 6e 27 74 20 63 6f 6d 70 72  ss, "Don't compr
b190: 65 73 73 20 74 68 65 20 61 63 74 69 6f 6e 20 74  ess the action t
b1a0: 61 62 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  able."},.    {OP
b1b0: 54 5f 46 53 54 52 2c 20 22 44 22 2c 20 28 63 68  T_FSTR, "D", (ch
b1c0: 61 72 2a 29 68 61 6e 64 6c 65 5f 44 5f 6f 70 74  ar*)handle_D_opt
b1d0: 69 6f 6e 2c 20 22 44 65 66 69 6e 65 20 61 6e 20  ion, "Define an 
b1e0: 25 69 66 64 65 66 20 6d 61 63 72 6f 2e 22 7d 2c  %ifdef macro."},
b1f0: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20  .    {OPT_FLAG, 
b200: 22 67 22 2c 20 28 63 68 61 72 2a 29 26 72 70 66  "g", (char*)&rpf
b210: 6c 61 67 2c 20 22 50 72 69 6e 74 20 67 72 61 6d  lag, "Print gram
b220: 6d 61 72 20 77 69 74 68 6f 75 74 20 61 63 74 69  mar without acti
b230: 6f 6e 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ons."},.    {OPT
b240: 5f 46 4c 41 47 2c 20 22 6d 22 2c 20 28 63 68 61  _FLAG, "m", (cha
b250: 72 2a 29 26 6d 68 66 6c 61 67 2c 20 22 4f 75 74  r*)&mhflag, "Out
b260: 70 75 74 20 61 20 6d 61 6b 65 68 65 61 64 65 72  put a makeheader
b270: 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c  s compatible fil
b280: 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  e."},.    {OPT_F
b290: 4c 41 47 2c 20 22 6c 22 2c 20 28 63 68 61 72 2a  LAG, "l", (char*
b2a0: 29 26 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 2c  )&nolinenosflag,
b2b0: 20 22 44 6f 20 6e 6f 74 20 70 72 69 6e 74 20 23   "Do not print #
b2c0: 6c 69 6e 65 20 73 74 61 74 65 6d 65 6e 74 73 2e  line statements.
b2d0: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
b2e0: 47 2c 20 22 71 22 2c 20 28 63 68 61 72 2a 29 26  G, "q", (char*)&
b2f0: 71 75 69 65 74 2c 20 22 28 51 75 69 65 74 29 20  quiet, "(Quiet) 
b300: 44 6f 6e 27 74 20 70 72 69 6e 74 20 74 68 65 20  Don't print the 
b310: 72 65 70 6f 72 74 20 66 69 6c 65 2e 22 7d 2c 0a  report file."},.
b320: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
b330: 73 22 2c 20 28 63 68 61 72 2a 29 26 73 74 61 74  s", (char*)&stat
b340: 69 73 74 69 63 73 2c 0a 20 20 20 20 20 20 20 20  istics,.        
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b360: 20 20 20 20 20 20 20 20 20 20 20 22 50 72 69 6e             "Prin
b370: 74 20 70 61 72 73 65 72 20 73 74 61 74 73 20 74  t parser stats t
b380: 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75  o standard outpu
b390: 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  t."},.    {OPT_F
b3a0: 4c 41 47 2c 20 22 78 22 2c 20 28 63 68 61 72 2a  LAG, "x", (char*
b3b0: 29 26 76 65 72 73 69 6f 6e 2c 20 22 50 72 69 6e  )&version, "Prin
b3c0: 74 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75  t the version nu
b3d0: 6d 62 65 72 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  mber."},.    {OP
b3e0: 54 5f 46 4c 41 47 2c 30 2c 30 2c 30 7d 0a 20 20  T_FLAG,0,0,0}.  
b3f0: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  };.  int i;.  st
b400: 72 75 63 74 20 6c 65 6d 6f 6e 20 6c 65 6d 3b 0a  ruct lemon lem;.
b410: 0a 20 20 4f 70 74 49 6e 69 74 28 61 72 67 76 2c  .  OptInit(argv,
b420: 6f 70 74 69 6f 6e 73 2c 73 74 64 65 72 72 29 3b  options,stderr);
b430: 0a 20 20 69 66 28 20 76 65 72 73 69 6f 6e 20 29  .  if( version )
b440: 7b 0a 20 20 20 20 20 70 72 69 6e 74 66 28 22 4c  {.     printf("L
b450: 65 6d 6f 6e 20 76 65 72 73 69 6f 6e 20 31 2e 30  emon version 1.0
b460: 5c 6e 22 29 3b 0a 20 20 20 20 20 65 78 69 74 28  \n");.     exit(
b470: 30 29 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20 4f  0); .  }.  if( O
b480: 70 74 4e 41 72 67 73 28 29 21 3d 31 20 29 7b 0a  ptNArgs()!=1 ){.
b490: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
b4a0: 72 72 2c 22 45 78 61 63 74 6c 79 20 6f 6e 65 20  rr,"Exactly one 
b4b0: 66 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  filename argumen
b4c0: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 5c 6e  t is required.\n
b4d0: 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
b4e0: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6c  .  }.  memset(&l
b4f0: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c 65  em, 0, sizeof(le
b500: 6d 29 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 6f 72  m));.  lem.error
b510: 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  cnt = 0;..  /* I
b520: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 61  nitialize the ma
b530: 63 68 69 6e 65 20 2a 2f 0a 20 20 53 74 72 73 61  chine */.  Strsa
b540: 66 65 5f 69 6e 69 74 28 29 3b 0a 20 20 53 79 6d  fe_init();.  Sym
b550: 62 6f 6c 5f 69 6e 69 74 28 29 3b 0a 20 20 53 74  bol_init();.  St
b560: 61 74 65 5f 69 6e 69 74 28 29 3b 0a 20 20 6c 65  ate_init();.  le
b570: 6d 2e 61 72 67 76 30 20 3d 20 61 72 67 76 5b 30  m.argv0 = argv[0
b580: 5d 3b 0a 20 20 6c 65 6d 2e 66 69 6c 65 6e 61 6d  ];.  lem.filenam
b590: 65 20 3d 20 4f 70 74 41 72 67 28 30 29 3b 0a 20  e = OptArg(0);. 
b5a0: 20 6c 65 6d 2e 62 61 73 69 73 66 6c 61 67 20 3d   lem.basisflag =
b5b0: 20 62 61 73 69 73 66 6c 61 67 3b 0a 20 20 6c 65   basisflag;.  le
b5c0: 6d 2e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20  m.nolinenosflag 
b5d0: 3d 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 3b  = nolinenosflag;
b5e0: 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 24  .  Symbol_new("$
b5f0: 22 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d  ");.  lem.errsym
b600: 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 65   = Symbol_new("e
b610: 72 72 6f 72 22 29 3b 0a 20 20 6c 65 6d 2e 65 72  rror");.  lem.er
b620: 72 73 79 6d 2d 3e 75 73 65 43 6e 74 20 3d 20 30  rsym->useCnt = 0
b630: 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68  ;..  /* Parse th
b640: 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
b650: 20 20 50 61 72 73 65 28 26 6c 65 6d 29 3b 0a 20    Parse(&lem);. 
b660: 20 69 66 28 20 6c 65 6d 2e 65 72 72 6f 72 63 6e   if( lem.errorcn
b670: 74 20 29 20 65 78 69 74 28 6c 65 6d 2e 65 72 72  t ) exit(lem.err
b680: 6f 72 63 6e 74 29 3b 0a 20 20 69 66 28 20 6c 65  orcnt);.  if( le
b690: 6d 2e 6e 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20  m.nrule==0 ){.  
b6a0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
b6b0: 2c 22 45 6d 70 74 79 20 67 72 61 6d 6d 61 72 2e  ,"Empty grammar.
b6c0: 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
b6d0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 75  );.  }..  /* Cou
b6e0: 6e 74 20 61 6e 64 20 69 6e 64 65 78 20 74 68 65  nt and index the
b6f0: 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20   symbols of the 
b700: 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 6c 65 6d  grammar */.  lem
b710: 2e 6e 73 79 6d 62 6f 6c 20 3d 20 53 79 6d 62 6f  .nsymbol = Symbo
b720: 6c 5f 63 6f 75 6e 74 28 29 3b 0a 20 20 53 79 6d  l_count();.  Sym
b730: 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c  bol_new("{defaul
b740: 74 7d 22 29 3b 0a 20 20 6c 65 6d 2e 73 79 6d 62  t}");.  lem.symb
b750: 6f 6c 73 20 3d 20 53 79 6d 62 6f 6c 5f 61 72 72  ols = Symbol_arr
b760: 61 79 6f 66 28 29 3b 0a 20 20 66 6f 72 28 69 3d  ayof();.  for(i=
b770: 30 3b 20 69 3c 3d 6c 65 6d 2e 6e 73 79 6d 62 6f  0; i<=lem.nsymbo
b780: 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e 73 79 6d 62  l; i++) lem.symb
b790: 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65 78 20 3d 20  ols[i]->index = 
b7a0: 69 3b 0a 20 20 71 73 6f 72 74 28 6c 65 6d 2e 73  i;.  qsort(lem.s
b7b0: 79 6d 62 6f 6c 73 2c 6c 65 6d 2e 6e 73 79 6d 62  ymbols,lem.nsymb
b7c0: 6f 6c 2b 31 2c 73 69 7a 65 6f 66 28 73 74 72 75  ol+1,sizeof(stru
b7d0: 63 74 20 73 79 6d 62 6f 6c 2a 29 2c 0a 20 20 20  ct symbol*),.   
b7e0: 20 20 20 20 20 28 69 6e 74 28 2a 29 28 29 29 53       (int(*)())S
b7f0: 79 6d 62 6f 6c 63 6d 70 70 29 3b 0a 20 20 66 6f  ymbolcmpp);.  fo
b800: 72 28 69 3d 30 3b 20 69 3c 3d 6c 65 6d 2e 6e 73  r(i=0; i<=lem.ns
b810: 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e  ymbol; i++) lem.
b820: 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65  symbols[i]->inde
b830: 78 20 3d 20 69 3b 0a 20 20 66 6f 72 28 69 3d 31  x = i;.  for(i=1
b840: 3b 20 69 73 75 70 70 65 72 28 6c 65 6d 2e 73 79  ; isupper(lem.sy
b850: 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 5b 30  mbols[i]->name[0
b860: 5d 29 3b 20 69 2b 2b 29 3b 0a 20 20 6c 65 6d 2e  ]); i++);.  lem.
b870: 6e 74 65 72 6d 69 6e 61 6c 20 3d 20 69 3b 0a 0a  nterminal = i;..
b880: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
b890: 72 65 70 72 69 6e 74 20 6f 66 20 74 68 65 20 67  reprint of the g
b8a0: 72 61 6d 6d 61 72 2c 20 69 66 20 72 65 71 75 65  rammar, if reque
b8b0: 73 74 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  sted on the comm
b8c0: 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 66  and line */.  if
b8d0: 28 20 72 70 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( rpflag ){.    
b8e0: 52 65 70 72 69 6e 74 28 26 6c 65 6d 29 3b 0a 20  Reprint(&lem);. 
b8f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
b900: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 69  nitialize the si
b910: 7a 65 20 66 6f 72 20 61 6c 6c 20 66 6f 6c 6c 6f  ze for all follo
b920: 77 20 61 6e 64 20 66 69 72 73 74 20 73 65 74 73  w and first sets
b930: 20 2a 2f 0a 20 20 20 20 53 65 74 53 69 7a 65 28   */.    SetSize(
b940: 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2b 31 29  lem.nterminal+1)
b950: 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74  ;..    /* Find t
b960: 68 65 20 70 72 65 63 65 64 65 6e 63 65 20 66 6f  he precedence fo
b970: 72 20 65 76 65 72 79 20 70 72 6f 64 75 63 74 69  r every producti
b980: 6f 6e 20 72 75 6c 65 20 28 74 68 61 74 20 68 61  on rule (that ha
b990: 73 20 6f 6e 65 29 20 2a 2f 0a 20 20 20 20 46 69  s one) */.    Fi
b9a0: 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65  ndRulePrecedence
b9b0: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
b9c0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 61 6d   Compute the lam
b9d0: 62 64 61 2d 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73  bda-nonterminals
b9e0: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 2d 73   and the first-s
b9f0: 65 74 73 20 66 6f 72 20 65 76 65 72 79 0a 20 20  ets for every.  
ba00: 20 20 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c    ** nonterminal
ba10: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46 69 72 73   */.    FindFirs
ba20: 74 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  tSets(&lem);..  
ba30: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c    /* Compute all
ba40: 20 4c 52 28 30 29 20 73 74 61 74 65 73 2e 20 20   LR(0) states.  
ba50: 41 6c 73 6f 20 72 65 63 6f 72 64 20 66 6f 6c 6c  Also record foll
ba60: 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69  ow-set propagati
ba70: 6f 6e 0a 20 20 20 20 2a 2a 20 6c 69 6e 6b 73 20  on.    ** links 
ba80: 73 6f 20 74 68 61 74 20 74 68 65 20 66 6f 6c 6c  so that the foll
ba90: 6f 77 2d 73 65 74 20 63 61 6e 20 62 65 20 63 6f  ow-set can be co
baa0: 6d 70 75 74 65 64 20 6c 61 74 65 72 20 2a 2f 0a  mputed later */.
bab0: 20 20 20 20 6c 65 6d 2e 6e 73 74 61 74 65 20 3d      lem.nstate =
bac0: 20 30 3b 0a 20 20 20 20 46 69 6e 64 53 74 61 74   0;.    FindStat
bad0: 65 73 28 26 6c 65 6d 29 3b 0a 20 20 20 20 6c 65  es(&lem);.    le
bae0: 6d 2e 73 6f 72 74 65 64 20 3d 20 53 74 61 74 65  m.sorted = State
baf0: 5f 61 72 72 61 79 6f 66 28 29 3b 0a 0a 20 20 20  _arrayof();..   
bb00: 20 2f 2a 20 54 69 65 20 75 70 20 6c 6f 6f 73 65   /* Tie up loose
bb10: 20 65 6e 64 73 20 6f 6e 20 74 68 65 20 70 72 6f   ends on the pro
bb20: 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a  pagation links *
bb30: 2f 0a 20 20 20 20 46 69 6e 64 4c 69 6e 6b 73 28  /.    FindLinks(
bb40: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  &lem);..    /* C
bb50: 6f 6d 70 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f  ompute the follo
bb60: 77 20 73 65 74 20 6f 66 20 65 76 65 72 79 20 72  w set of every r
bb70: 65 64 75 63 69 62 6c 65 20 63 6f 6e 66 69 67 75  educible configu
bb80: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 46 69  ration */.    Fi
bb90: 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28 26 6c 65  ndFollowSets(&le
bba0: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
bbb0: 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74  ute the action t
bbc0: 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 46 69 6e  ables */.    Fin
bbd0: 64 41 63 74 69 6f 6e 73 28 26 6c 65 6d 29 3b 0a  dActions(&lem);.
bbe0: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73  .    /* Compress
bbf0: 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
bc00: 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f  es */.    if( co
bc10: 6d 70 72 65 73 73 3d 3d 30 20 29 20 43 6f 6d 70  mpress==0 ) Comp
bc20: 72 65 73 73 54 61 62 6c 65 73 28 26 6c 65 6d 29  ressTables(&lem)
bc30: 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6f 72 64 65  ;..    /* Reorde
bc40: 72 20 61 6e 64 20 72 65 6e 75 6d 62 65 72 20 74  r and renumber t
bc50: 68 65 20 73 74 61 74 65 73 20 73 6f 20 74 68 61  he states so tha
bc60: 74 20 73 74 61 74 65 73 20 77 69 74 68 20 66 65  t states with fe
bc70: 77 65 72 20 63 68 6f 69 63 65 73 0a 20 20 20 20  wer choices.    
bc80: 2a 2a 20 6f 63 63 75 72 20 61 74 20 74 68 65 20  ** occur at the 
bc90: 65 6e 64 2e 20 2a 2f 0a 20 20 20 20 52 65 73 6f  end. */.    Reso
bca0: 72 74 53 74 61 74 65 73 28 26 6c 65 6d 29 3b 0a  rtStates(&lem);.
bcb0: 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
bcc0: 20 61 20 72 65 70 6f 72 74 20 6f 66 20 74 68 65   a report of the
bcd0: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 65   parser generate
bce0: 64 2e 20 20 28 74 68 65 20 22 79 2e 6f 75 74 70  d.  (the "y.outp
bcf0: 75 74 22 20 66 69 6c 65 29 20 2a 2f 0a 20 20 20  ut" file) */.   
bd00: 20 69 66 28 20 21 71 75 69 65 74 20 29 20 52 65   if( !quiet ) Re
bd10: 70 6f 72 74 4f 75 74 70 75 74 28 26 6c 65 6d 29  portOutput(&lem)
bd20: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
bd30: 74 65 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f  te the source co
bd40: 64 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  de for the parse
bd50: 72 20 2a 2f 0a 20 20 20 20 52 65 70 6f 72 74 54  r */.    ReportT
bd60: 61 62 6c 65 28 26 6c 65 6d 2c 20 6d 68 66 6c 61  able(&lem, mhfla
bd70: 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 64  g);..    /* Prod
bd80: 75 63 65 20 61 20 68 65 61 64 65 72 20 66 69 6c  uce a header fil
bd90: 65 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  e for use by the
bda0: 20 73 63 61 6e 6e 65 72 2e 20 20 28 54 68 69 73   scanner.  (This
bdb0: 20 73 74 65 70 20 69 73 0a 20 20 20 20 2a 2a 20   step is.    ** 
bdc0: 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 22  omitted if the "
bdd0: 2d 6d 22 20 6f 70 74 69 6f 6e 20 69 73 20 75 73  -m" option is us
bde0: 65 64 20 62 65 63 61 75 73 65 20 6d 61 6b 65 68  ed because makeh
bdf0: 65 61 64 65 72 73 20 77 69 6c 6c 0a 20 20 20 20  eaders will.    
be00: 2a 2a 20 67 65 6e 65 72 61 74 65 20 74 68 65 20  ** generate the 
be10: 66 69 6c 65 20 66 6f 72 20 75 73 2e 29 20 2a 2f  file for us.) */
be20: 0a 20 20 20 20 69 66 28 20 21 6d 68 66 6c 61 67  .    if( !mhflag
be30: 20 29 20 52 65 70 6f 72 74 48 65 61 64 65 72 28   ) ReportHeader(
be40: 26 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  &lem);.  }.  if(
be50: 20 73 74 61 74 69 73 74 69 63 73 20 29 7b 0a 20   statistics ){. 
be60: 20 20 20 70 72 69 6e 74 66 28 22 50 61 72 73 65     printf("Parse
be70: 72 20 73 74 61 74 69 73 74 69 63 73 3a 20 25 64  r statistics: %d
be80: 20 74 65 72 6d 69 6e 61 6c 73 2c 20 25 64 20 6e   terminals, %d n
be90: 6f 6e 74 65 72 6d 69 6e 61 6c 73 2c 20 25 64 20  onterminals, %d 
bea0: 72 75 6c 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rules\n",.      
beb0: 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2c 20 6c  lem.nterminal, l
bec0: 65 6d 2e 6e 73 79 6d 62 6f 6c 20 2d 20 6c 65 6d  em.nsymbol - lem
bed0: 2e 6e 74 65 72 6d 69 6e 61 6c 2c 20 6c 65 6d 2e  .nterminal, lem.
bee0: 6e 72 75 6c 65 29 3b 0a 20 20 20 20 70 72 69 6e  nrule);.    prin
bef0: 74 66 28 22 20 20 20 20 20 20 20 20 20 20 20 20  tf("            
bf00: 20 20 20 20 20 20 20 25 64 20 73 74 61 74 65 73         %d states
bf10: 2c 20 25 64 20 70 61 72 73 65 72 20 74 61 62 6c  , %d parser tabl
bf20: 65 20 65 6e 74 72 69 65 73 2c 20 25 64 20 63 6f  e entries, %d co
bf30: 6e 66 6c 69 63 74 73 5c 6e 22 2c 0a 20 20 20 20  nflicts\n",.    
bf40: 20 20 6c 65 6d 2e 6e 73 74 61 74 65 2c 20 6c 65    lem.nstate, le
bf50: 6d 2e 74 61 62 6c 65 73 69 7a 65 2c 20 6c 65 6d  m.tablesize, lem
bf60: 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20 7d  .nconflict);.  }
bf70: 0a 20 20 69 66 28 20 6c 65 6d 2e 6e 63 6f 6e 66  .  if( lem.nconf
bf80: 6c 69 63 74 20 29 7b 0a 20 20 20 20 66 70 72 69  lict ){.    fpri
bf90: 6e 74 66 28 73 74 64 65 72 72 2c 22 25 64 20 70  ntf(stderr,"%d p
bfa0: 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73  arsing conflicts
bfb0: 2e 5c 6e 22 2c 6c 65 6d 2e 6e 63 6f 6e 66 6c 69  .\n",lem.nconfli
bfc0: 63 74 29 3b 0a 20 20 7d 0a 20 20 65 78 69 74 28  ct);.  }.  exit(
bfd0: 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 2b 20 6c  lem.errorcnt + l
bfe0: 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20  em.nconflict);. 
bff0: 20 72 65 74 75 72 6e 20 28 6c 65 6d 2e 65 72 72   return (lem.err
c000: 6f 72 63 6e 74 20 2b 20 6c 65 6d 2e 6e 63 6f 6e  orcnt + lem.ncon
c010: 66 6c 69 63 74 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  flict);.}./*****
c020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
c030: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6d  From the file "m
c040: 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  sort.c" ********
c050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c060: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41  *******/./*.** A
c070: 20 67 65 6e 65 72 69 63 20 6d 65 72 67 65 2d 73   generic merge-s
c080: 6f 72 74 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a  ort program..**.
c090: 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a 20 4c 65 74  ** USAGE:.** Let
c0a0: 20 22 70 74 72 22 20 62 65 20 61 20 70 6f 69 6e   "ptr" be a poin
c0b0: 74 65 72 20 74 6f 20 73 6f 6d 65 20 73 74 72 75  ter to some stru
c0c0: 63 74 75 72 65 20 77 68 69 63 68 20 69 73 20 61  cture which is a
c0d0: 74 20 74 68 65 20 68 65 61 64 20 6f 66 0a 2a 2a  t the head of.**
c0e0: 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74   a null-terminat
c0f0: 65 64 20 6c 69 73 74 2e 20 20 54 68 65 6e 20 74  ed list.  Then t
c100: 6f 20 73 6f 72 74 20 74 68 65 20 6c 69 73 74 20  o sort the list 
c110: 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  call:.**.**     
c120: 70 74 72 20 3d 20 6d 73 6f 72 74 28 70 74 72 2c  ptr = msort(ptr,
c130: 26 28 70 74 72 2d 3e 6e 65 78 74 29 2c 63 6d 70  &(ptr->next),cmp
c140: 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  fnc);.**.** In t
c150: 68 65 20 61 62 6f 76 65 2c 20 22 63 6d 70 66 6e  he above, "cmpfn
c160: 63 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  c" is a pointer 
c170: 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 68  to a function wh
c180: 69 63 68 20 63 6f 6d 70 61 72 65 73 0a 2a 2a 20  ich compares.** 
c190: 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  two instances of
c1a0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 61   the structure a
c1b0: 6e 64 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e  nd returns an in
c1c0: 74 65 67 65 72 2c 20 61 73 20 69 6e 0a 2a 2a 20  teger, as in.** 
c1d0: 73 74 72 63 6d 70 2e 20 20 54 68 65 20 73 65 63  strcmp.  The sec
c1e0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
c1f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
c200: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
c210: 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  ** second elemen
c220: 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20  t of the linked 
c230: 6c 69 73 74 2e 20 20 54 68 69 73 20 61 64 64 72  list.  This addr
c240: 65 73 73 20 69 73 20 75 73 65 64 20 74 6f 20 63  ess is used to c
c250: 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 6f 66  ompute.** the of
c260: 66 73 65 74 20 74 6f 20 74 68 65 20 22 6e 65 78  fset to the "nex
c270: 74 22 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20  t" field within 
c280: 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  the structure.  
c290: 54 68 65 20 6f 66 66 73 65 74 20 74 6f 0a 2a 2a  The offset to.**
c2a0: 20 74 68 65 20 22 6e 65 78 74 22 20 66 69 65 6c   the "next" fiel
c2b0: 64 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61  d must be consta
c2c0: 6e 74 20 66 6f 72 20 61 6c 6c 20 73 74 72 75 63  nt for all struc
c2d0: 74 75 72 65 73 20 69 6e 20 74 68 65 20 6c 69 73  tures in the lis
c2e0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 75 6e  t..**.** The fun
c2f0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
c300: 6e 65 77 20 70 6f 69 6e 74 65 72 20 77 68 69 63  new pointer whic
c310: 68 20 69 73 20 74 68 65 20 68 65 61 64 20 6f 66  h is the head of
c320: 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 61 66 74   the list.** aft
c330: 65 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a 0a 2a  er sorting..**.*
c340: 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a 20  * ALGORITHM:.** 
c350: 4d 65 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f 0a 0a  Merge-sort..*/..
c360: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
c370: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
c380: 78 74 20 73 74 72 75 63 74 75 72 65 20 69 6e 20  xt structure in 
c390: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  the linked list.
c3a0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 45 58 54  .*/.#define NEXT
c3b0: 28 41 29 20 28 2a 28 63 68 61 72 2a 2a 29 28 28  (A) (*(char**)((
c3c0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 41  (unsigned long)A
c3d0: 29 2b 6f 66 66 73 65 74 29 29 0a 0a 2f 2a 0a 2a  )+offset))../*.*
c3e0: 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 61  * Inputs:.**   a
c3f0: 3a 20 20 20 20 20 20 20 41 20 73 6f 72 74 65 64  :       A sorted
c400: 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65  , null-terminate
c410: 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20  d linked list.  
c420: 28 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a  (May be null)..*
c430: 2a 20 20 20 62 3a 20 20 20 20 20 20 20 41 20 73  *   b:       A s
c440: 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d  orted, null-term
c450: 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69  inated linked li
c460: 73 74 2e 20 20 28 4d 61 79 20 62 65 20 6e 75 6c  st.  (May be nul
c470: 6c 29 2e 0a 2a 2a 20 20 20 63 6d 70 3a 20 20 20  l)..**   cmp:   
c480: 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74    A pointer to t
c490: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  he comparison fu
c4a0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 20 20 6f 66 66  nction..**   off
c4b0: 73 65 74 3a 20 20 4f 66 66 73 65 74 20 69 6e 20  set:  Offset in 
c4c0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  the structure to
c4d0: 20 74 68 65 20 22 6e 65 78 74 22 20 66 69 65 6c   the "next" fiel
c4e0: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
c4f0: 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41 20 70 6f  Value:.**   A po
c500: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
c510: 64 20 6f 66 20 61 20 73 6f 72 74 65 64 20 6c 69  d of a sorted li
c520: 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  st containing th
c530: 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20 20  e elements.**   
c540: 6f 66 20 62 6f 74 68 20 61 20 61 6e 64 20 62 2e  of both a and b.
c550: 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66 66 65  .**.** Side effe
c560: 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20 22 6e  cts:.**   The "n
c570: 65 78 74 22 20 70 6f 69 6e 74 65 72 73 20 66 6f  ext" pointers fo
c580: 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  r elements in th
c590: 65 20 6c 69 73 74 73 20 61 20 61 6e 64 20 62 20  e lists a and b 
c5a0: 61 72 65 0a 2a 2a 20 20 20 63 68 61 6e 67 65 64  are.**   changed
c5b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
c5c0: 20 2a 6d 65 72 67 65 28 0a 20 20 63 68 61 72 20   *merge(.  char 
c5d0: 2a 61 2c 0a 20 20 63 68 61 72 20 2a 62 2c 0a 20  *a,.  char *b,. 
c5e0: 20 69 6e 74 20 28 2a 63 6d 70 29 28 63 6f 6e 73   int (*cmp)(cons
c5f0: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
c600: 61 72 2a 29 2c 0a 20 20 69 6e 74 20 6f 66 66 73  ar*),.  int offs
c610: 65 74 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 74  et.){.  char *pt
c620: 72 2c 20 2a 68 65 61 64 3b 0a 0a 20 20 69 66 28  r, *head;..  if(
c630: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 68 65 61   a==0 ){.    hea
c640: 64 20 3d 20 62 3b 0a 20 20 7d 65 6c 73 65 20 69  d = b;.  }else i
c650: 66 28 20 62 3d 3d 30 20 29 7b 0a 20 20 20 20 68  f( b==0 ){.    h
c660: 65 61 64 20 3d 20 61 3b 0a 20 20 7d 65 6c 73 65  ead = a;.  }else
c670: 7b 0a 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29  {.    if( (*cmp)
c680: 28 61 2c 62 29 3c 30 20 29 7b 0a 20 20 20 20 20  (a,b)<0 ){.     
c690: 20 70 74 72 20 3d 20 61 3b 0a 20 20 20 20 20 20   ptr = a;.      
c6a0: 61 20 3d 20 4e 45 58 54 28 61 29 3b 0a 20 20 20  a = NEXT(a);.   
c6b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 74   }else{.      pt
c6c0: 72 20 3d 20 62 3b 0a 20 20 20 20 20 20 62 20 3d  r = b;.      b =
c6d0: 20 4e 45 58 54 28 62 29 3b 0a 20 20 20 20 7d 0a   NEXT(b);.    }.
c6e0: 20 20 20 20 68 65 61 64 20 3d 20 70 74 72 3b 0a      head = ptr;.
c6f0: 20 20 20 20 77 68 69 6c 65 28 20 61 20 26 26 20      while( a && 
c700: 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  b ){.      if( (
c710: 2a 63 6d 70 29 28 61 2c 62 29 3c 30 20 29 7b 0a  *cmp)(a,b)<0 ){.
c720: 20 20 20 20 20 20 20 20 4e 45 58 54 28 70 74 72          NEXT(ptr
c730: 29 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70  ) = a;.        p
c740: 74 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  tr = a;.        
c750: 61 20 3d 20 4e 45 58 54 28 61 29 3b 0a 20 20 20  a = NEXT(a);.   
c760: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c770: 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 62 3b    NEXT(ptr) = b;
c780: 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d 20 62  .        ptr = b
c790: 3b 0a 20 20 20 20 20 20 20 20 62 20 3d 20 4e 45  ;.        b = NE
c7a0: 58 54 28 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  XT(b);.      }. 
c7b0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61 20 29     }.    if( a )
c7c0: 20 4e 45 58 54 28 70 74 72 29 20 3d 20 61 3b 0a   NEXT(ptr) = a;.
c7d0: 20 20 20 20 65 6c 73 65 20 20 20 20 4e 45 58 54      else    NEXT
c7e0: 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 7d 0a 20  (ptr) = b;.  }. 
c7f0: 20 72 65 74 75 72 6e 20 68 65 61 64 3b 0a 7d 0a   return head;.}.
c800: 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a  ./*.** Inputs:.*
c810: 2a 20 20 20 6c 69 73 74 3a 20 20 20 20 20 20 50  *   list:      P
c820: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67  ointer to a sing
c830: 6c 79 2d 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ly-linked list o
c840: 66 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a  f structures..**
c850: 20 20 20 6e 65 78 74 3a 20 20 20 20 20 20 50 6f     next:      Po
c860: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 65 72  inter to pointer
c870: 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 20 65   to the second e
c880: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69  lement of the li
c890: 73 74 2e 0a 2a 2a 20 20 20 63 6d 70 3a 20 20 20  st..**   cmp:   
c8a0: 20 20 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e      A comparison
c8b0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
c8c0: 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a   Return Value:.*
c8d0: 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  *   A pointer to
c8e0: 20 74 68 65 20 68 65 61 64 20 6f 66 20 61 20 73   the head of a s
c8f0: 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e 74 61  orted list conta
c900: 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e  ining the elemen
c910: 74 73 0a 2a 2a 20 20 20 6f 72 67 69 6e 61 6c 6c  ts.**   orginall
c920: 79 20 69 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  y in list..**.**
c930: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2a   Side effects:.*
c940: 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22 20 70  *   The "next" p
c950: 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65 6d  ointers for elem
c960: 65 6e 74 73 20 69 6e 20 6c 69 73 74 20 61 72 65  ents in list are
c970: 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 64 65   changed..*/.#de
c980: 66 69 6e 65 20 4c 49 53 54 53 49 5a 45 20 33 30  fine LISTSIZE 30
c990: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6d 73  .static char *ms
c9a0: 6f 72 74 28 0a 20 20 63 68 61 72 20 2a 6c 69 73  ort(.  char *lis
c9b0: 74 2c 0a 20 20 63 68 61 72 20 2a 2a 6e 65 78 74  t,.  char **next
c9c0: 2c 0a 20 20 69 6e 74 20 28 2a 63 6d 70 29 28 63  ,.  int (*cmp)(c
c9d0: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
c9e0: 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20 75 6e 73   char*).){.  uns
c9f0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 66 66 73 65  igned long offse
ca00: 74 3b 0a 20 20 63 68 61 72 20 2a 65 70 3b 0a 20  t;.  char *ep;. 
ca10: 20 63 68 61 72 20 2a 73 65 74 5b 4c 49 53 54 53   char *set[LISTS
ca20: 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  IZE];.  int i;. 
ca30: 20 6f 66 66 73 65 74 20 3d 20 28 75 6e 73 69 67   offset = (unsig
ca40: 6e 65 64 20 6c 6f 6e 67 29 6e 65 78 74 20 2d 20  ned long)next - 
ca50: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 6c  (unsigned long)l
ca60: 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ist;.  for(i=0; 
ca70: 69 3c 4c 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29  i<LISTSIZE; i++)
ca80: 20 73 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 77   set[i] = 0;.  w
ca90: 68 69 6c 65 28 20 6c 69 73 74 20 29 7b 0a 20 20  hile( list ){.  
caa0: 20 20 65 70 20 3d 20 6c 69 73 74 3b 0a 20 20 20    ep = list;.   
cab0: 20 6c 69 73 74 20 3d 20 4e 45 58 54 28 6c 69 73   list = NEXT(lis
cac0: 74 29 3b 0a 20 20 20 20 4e 45 58 54 28 65 70 29  t);.    NEXT(ep)
cad0: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
cae0: 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 2d 31 20  0; i<LISTSIZE-1 
caf0: 26 26 20 73 65 74 5b 69 5d 21 3d 30 3b 20 69 2b  && set[i]!=0; i+
cb00: 2b 29 7b 0a 20 20 20 20 20 20 65 70 20 3d 20 6d  +){.      ep = m
cb10: 65 72 67 65 28 65 70 2c 73 65 74 5b 69 5d 2c 63  erge(ep,set[i],c
cb20: 6d 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  mp,offset);.    
cb30: 20 20 73 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20    set[i] = 0;.  
cb40: 20 20 7d 0a 20 20 20 20 73 65 74 5b 69 5d 20 3d    }.    set[i] =
cb50: 20 65 70 3b 0a 20 20 7d 0a 20 20 65 70 20 3d 20   ep;.  }.  ep = 
cb60: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
cb70: 4c 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 69  LISTSIZE; i++) i
cb80: 66 28 20 73 65 74 5b 69 5d 20 29 20 65 70 20 3d  f( set[i] ) ep =
cb90: 20 6d 65 72 67 65 28 65 70 2c 73 65 74 5b 69 5d   merge(ep,set[i]
cba0: 2c 63 6d 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20  ,cmp,offset);.  
cbb0: 72 65 74 75 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a  return ep;.}./**
cbc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cbd0: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
cbe0: 66 69 6c 65 20 22 6f 70 74 69 6f 6e 2e 63 22 20  file "option.c" 
cbf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cc00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74  **********/.stat
cc10: 69 63 20 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a  ic char **argv;.
cc20: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f  static struct s_
cc30: 6f 70 74 69 6f 6e 73 20 2a 6f 70 3b 0a 73 74 61  options *op;.sta
cc40: 74 69 63 20 46 49 4c 45 20 2a 65 72 72 73 74 72  tic FILE *errstr
cc50: 65 61 6d 3b 0a 0a 23 64 65 66 69 6e 65 20 49 53  eam;..#define IS
cc60: 4f 50 54 28 58 29 20 28 28 58 29 5b 30 5d 3d 3d  OPT(X) ((X)[0]==
cc70: 27 2d 27 7c 7c 28 58 29 5b 30 5d 3d 3d 27 2b 27  '-'||(X)[0]=='+'
cc80: 7c 7c 73 74 72 63 68 72 28 28 58 29 2c 27 3d 27  ||strchr((X),'='
cc90: 29 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  )!=0)../*.** Pri
cca0: 6e 74 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  nt the command l
ccb0: 69 6e 65 20 77 69 74 68 20 61 20 63 61 72 72 6f  ine with a carro
ccc0: 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  t pointing to th
ccd0: 65 20 6b 2d 74 68 20 63 68 61 72 61 63 74 65 72  e k-th character
cce0: 0a 2a 2a 20 6f 66 20 74 68 65 20 6e 2d 74 68 20  .** of the n-th 
ccf0: 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  field..*/.static
cd00: 20 76 6f 69 64 20 65 72 72 6c 69 6e 65 28 6e 2c   void errline(n,
cd10: 6b 2c 65 72 72 29 0a 69 6e 74 20 6e 3b 0a 69 6e  k,err).int n;.in
cd20: 74 20 6b 3b 0a 46 49 4c 45 20 2a 65 72 72 3b 0a  t k;.FILE *err;.
cd30: 7b 0a 20 20 69 6e 74 20 73 70 63 6e 74 2c 20 69  {.  int spcnt, i
cd40: 3b 0a 20 20 69 66 28 20 61 72 67 76 5b 30 5d 20  ;.  if( argv[0] 
cd50: 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25  ) fprintf(err,"%
cd60: 73 22 2c 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73  s",argv[0]);.  s
cd70: 70 63 6e 74 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c  pcnt = lemonStrl
cd80: 65 6e 28 61 72 67 76 5b 30 5d 29 20 2b 20 31 3b  en(argv[0]) + 1;
cd90: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20  .  for(i=1; i<n 
cda0: 26 26 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29  && argv[i]; i++)
cdb0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72  {.    fprintf(er
cdc0: 72 2c 22 20 25 73 22 2c 61 72 67 76 5b 69 5d 29  r," %s",argv[i])
cdd0: 3b 0a 20 20 20 20 73 70 63 6e 74 20 2b 3d 20 6c  ;.    spcnt += l
cde0: 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67 76 5b  emonStrlen(argv[
cdf0: 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20 20 73 70 63  i])+1;.  }.  spc
ce00: 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66 6f 72 28 3b  nt += k;.  for(;
ce10: 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 20 66   argv[i]; i++) f
ce20: 70 72 69 6e 74 66 28 65 72 72 2c 22 20 25 73 22  printf(err," %s"
ce30: 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20 69 66 28  ,argv[i]);.  if(
ce40: 20 73 70 63 6e 74 3c 32 30 20 29 7b 0a 20 20 20   spcnt<20 ){.   
ce50: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e   fprintf(err,"\n
ce60: 25 2a 73 5e 2d 2d 20 68 65 72 65 5c 6e 22 2c 73  %*s^-- here\n",s
ce70: 70 63 6e 74 2c 22 22 29 3b 0a 20 20 7d 65 6c 73  pcnt,"");.  }els
ce80: 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65  e{.    fprintf(e
ce90: 72 72 2c 22 5c 6e 25 2a 73 68 65 72 65 20 2d 2d  rr,"\n%*shere --
cea0: 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37 2c 22 22 29  ^\n",spcnt-7,"")
ceb0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
cec0: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
ced0: 6f 66 20 74 68 65 20 4e 2d 74 68 20 6e 6f 6e 2d  of the N-th non-
cee0: 73 77 69 74 63 68 20 61 72 67 75 6d 65 6e 74 2e  switch argument.
cef0: 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69    Return -1.** i
cf00: 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f N is out of ra
cf10: 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nge..*/.static i
cf20: 6e 74 20 61 72 67 69 6e 64 65 78 28 6e 29 0a 69  nt argindex(n).i
cf30: 6e 74 20 6e 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b  nt n;.{.  int i;
cf40: 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73 68 20  .  int dashdash 
cf50: 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 76 21  = 0;.  if( argv!
cf60: 3d 30 20 26 26 20 2a 61 72 67 76 21 3d 30 20 29  =0 && *argv!=0 )
cf70: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61  {.    for(i=1; a
cf80: 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  rgv[i]; i++){.  
cf90: 20 20 20 20 69 66 28 20 64 61 73 68 64 61 73 68      if( dashdash
cfa0: 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b   || !ISOPT(argv[
cfb0: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i]) ){.        i
cfc0: 66 28 20 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( n==0 ) return
cfd0: 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b   i;.        n--;
cfe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
cff0: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69  f( strcmp(argv[i
d000: 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73  ],"--")==0 ) das
d010: 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d  hdash = 1;.    }
d020: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
d030: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72  ;.}..static char
d040: 20 65 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61   emsg[] = "Comma
d050: 6e 64 20 6c 69 6e 65 20 73 79 6e 74 61 78 20 65  nd line syntax e
d060: 72 72 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20  rror: ";../*.** 
d070: 50 72 6f 63 65 73 73 20 61 20 66 6c 61 67 20 63  Process a flag c
d080: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67 75  ommand line argu
d090: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
d0a0: 69 6e 74 20 68 61 6e 64 6c 65 66 6c 61 67 73 28  int handleflags(
d0b0: 69 2c 65 72 72 29 0a 69 6e 74 20 69 3b 0a 46 49  i,err).int i;.FI
d0c0: 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74  LE *err;.{.  int
d0d0: 20 76 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74   v;.  int errcnt
d0e0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   = 0;.  int j;. 
d0f0: 20 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e   for(j=0; op[j].
d100: 6c 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  label; j++){.   
d110: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 26 61 72   if( strncmp(&ar
d120: 67 76 5b 69 5d 5b 31 5d 2c 6f 70 5b 6a 5d 2e 6c  gv[i][1],op[j].l
d130: 61 62 65 6c 2c 6c 65 6d 6f 6e 53 74 72 6c 65 6e  abel,lemonStrlen
d140: 28 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 29 3d 3d  (op[j].label))==
d150: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  0 ) break;.  }. 
d160: 20 76 20 3d 20 61 72 67 76 5b 69 5d 5b 30 5d 3d   v = argv[i][0]=
d170: 3d 27 2d 27 20 3f 20 31 20 3a 20 30 3b 0a 20 20  ='-' ? 1 : 0;.  
d180: 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d  if( op[j].label=
d190: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72  =0 ){.    if( er
d1a0: 72 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  r ){.      fprin
d1b0: 74 66 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69  tf(err,"%sundefi
d1c0: 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65  ned option.\n",e
d1d0: 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c  msg);.      errl
d1e0: 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a 20 20  ine(i,1,err);.  
d1f0: 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b    }.    errcnt++
d200: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
d210: 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 4c  [j].type==OPT_FL
d220: 41 47 20 29 7b 0a 20 20 20 20 2a 28 28 69 6e 74  AG ){.    *((int
d230: 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 76  *)op[j].arg) = v
d240: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
d250: 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 46  [j].type==OPT_FF
d260: 4c 41 47 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f  LAG ){.    (*(vo
d270: 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61  id(*)())(op[j].a
d280: 72 67 29 29 28 76 29 3b 0a 20 20 7d 65 6c 73 65  rg))(v);.  }else
d290: 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d   if( op[j].type=
d2a0: 3d 4f 50 54 5f 46 53 54 52 20 29 7b 0a 20 20 20  =OPT_FSTR ){.   
d2b0: 20 28 2a 28 76 6f 69 64 28 2a 29 28 29 29 28 6f   (*(void(*)())(o
d2c0: 70 5b 6a 5d 2e 61 72 67 29 29 28 26 61 72 67 76  p[j].arg))(&argv
d2d0: 5b 69 5d 5b 32 5d 29 3b 0a 20 20 7d 65 6c 73 65  [i][2]);.  }else
d2e0: 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20 29 7b  {.    if( err ){
d2f0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65  .      fprintf(e
d300: 72 72 2c 22 25 73 6d 69 73 73 69 6e 67 20 61 72  rr,"%smissing ar
d310: 67 75 6d 65 6e 74 20 6f 6e 20 73 77 69 74 63 68  gument on switch
d320: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
d330: 20 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72    errline(i,1,er
d340: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72  r);.    }.    er
d350: 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  rcnt++;.  }.  re
d360: 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a  turn errcnt;.}..
d370: 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20  /*.** Process a 
d380: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 73 77 69  command line swi
d390: 74 63 68 20 77 68 69 63 68 20 68 61 73 20 61 6e  tch which has an
d3a0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
d3b0: 61 74 69 63 20 69 6e 74 20 68 61 6e 64 6c 65 73  atic int handles
d3c0: 77 69 74 63 68 28 69 2c 65 72 72 29 0a 69 6e 74  witch(i,err).int
d3d0: 20 69 3b 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b   i;.FILE *err;.{
d3e0: 0a 20 20 69 6e 74 20 6c 76 20 3d 20 30 3b 0a 20  .  int lv = 0;. 
d3f0: 20 64 6f 75 62 6c 65 20 64 76 20 3d 20 30 2e 30   double dv = 0.0
d400: 3b 0a 20 20 63 68 61 72 20 2a 73 76 20 3d 20 30  ;.  char *sv = 0
d410: 2c 20 2a 65 6e 64 3b 0a 20 20 63 68 61 72 20 2a  , *end;.  char *
d420: 63 70 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69  cp;.  int j;.  i
d430: 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20  nt errcnt = 0;. 
d440: 20 63 70 20 3d 20 73 74 72 63 68 72 28 61 72 67   cp = strchr(arg
d450: 76 5b 69 5d 2c 27 3d 27 29 3b 0a 20 20 61 73 73  v[i],'=');.  ass
d460: 65 72 74 28 20 63 70 21 3d 30 20 29 3b 0a 20 20  ert( cp!=0 );.  
d470: 2a 63 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6a  *cp = 0;.  for(j
d480: 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b  =0; op[j].label;
d490: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   j++){.    if( s
d4a0: 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 6f 70  trcmp(argv[i],op
d4b0: 5b 6a 5d 2e 6c 61 62 65 6c 29 3d 3d 30 20 29 20  [j].label)==0 ) 
d4c0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 2a 63 70  break;.  }.  *cp
d4d0: 20 3d 20 27 3d 27 3b 0a 20 20 69 66 28 20 6f 70   = '=';.  if( op
d4e0: 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a  [j].label==0 ){.
d4f0: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
d500: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
d510: 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70  ,"%sundefined op
d520: 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  tion.\n",emsg);.
d530: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
d540: 30 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  0,err);.    }.  
d550: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65    errcnt++;.  }e
d560: 6c 73 65 7b 0a 20 20 20 20 63 70 2b 2b 3b 0a 20  lse{.    cp++;. 
d570: 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d     switch( op[j]
d580: 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  .type ){.      c
d590: 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20  ase OPT_FLAG:.  
d5a0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c      case OPT_FFL
d5b0: 41 47 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20  AG:.        if( 
d5c0: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  err ){.         
d5d0: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
d5e0: 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
d5f0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c  an argument.\n",
d600: 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  emsg);.         
d610: 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72   errline(i,0,err
d620: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d630: 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20       errcnt++;. 
d640: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d650: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c      case OPT_DBL
d660: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
d670: 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 64  _FDBL:.        d
d680: 76 20 3d 20 73 74 72 74 6f 64 28 63 70 2c 26 65  v = strtod(cp,&e
d690: 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nd);.        if(
d6a0: 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20   *end ){.       
d6b0: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
d6c0: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
d6d0: 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c  f(err,"%sillegal
d6e0: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 66 6c   character in fl
d6f0: 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 61 72 67  oating-point arg
d700: 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b  ument.\n",emsg);
d710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72  .            err
d720: 6c 69 6e 65 28 69 2c 28 28 75 6e 73 69 67 6e 65  line(i,((unsigne
d730: 64 20 6c 6f 6e 67 29 65 6e 64 29 2d 28 75 6e 73  d long)end)-(uns
d740: 69 67 6e 65 64 20 6c 6f 6e 67 29 61 72 67 76 5b  igned long)argv[
d750: 69 5d 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20  i],err);.       
d760: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65     }.          e
d770: 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  rrcnt++;.       
d780: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
d790: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
d7a0: 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65  _INT:.      case
d7b0: 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20   OPT_FINT:.     
d7c0: 20 20 20 6c 76 20 3d 20 73 74 72 74 6f 6c 28 63     lv = strtol(c
d7d0: 70 2c 26 65 6e 64 2c 30 29 3b 0a 20 20 20 20 20  p,&end,0);.     
d7e0: 20 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20     if( *end ){. 
d7f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72           if( err
d800: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d810: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 69  fprintf(err,"%si
d820: 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72  llegal character
d830: 20 69 6e 20 69 6e 74 65 67 65 72 20 61 72 67 75   in integer argu
d840: 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  ment.\n",emsg);.
d850: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6c              errl
d860: 69 6e 65 28 69 2c 28 28 75 6e 73 69 67 6e 65 64  ine(i,((unsigned
d870: 20 6c 6f 6e 67 29 65 6e 64 29 2d 28 75 6e 73 69   long)end)-(unsi
d880: 67 6e 65 64 20 6c 6f 6e 67 29 61 72 67 76 5b 69  gned long)argv[i
d890: 5d 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20  ],err);.        
d8a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72    }.          er
d8b0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
d8c0: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
d8d0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
d8e0: 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20  STR:.      case 
d8f0: 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20  OPT_FSTR:.      
d900: 20 20 73 76 20 3d 20 63 70 3b 0a 20 20 20 20 20    sv = cp;.     
d910: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d920: 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a      switch( op[j
d930: 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  ].type ){.      
d940: 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20  case OPT_FLAG:. 
d950: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46       case OPT_FF
d960: 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65  LAG:.        bre
d970: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
d980: 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 20 20  PT_DBL:.        
d990: 2a 28 64 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d  *(double*)(op[j]
d9a0: 2e 61 72 67 29 20 3d 20 64 76 3b 0a 20 20 20 20  .arg) = dv;.    
d9b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d9c0: 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a   case OPT_FDBL:.
d9d0: 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28          (*(void(
d9e0: 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  *)())(op[j].arg)
d9f0: 29 28 64 76 29 3b 0a 20 20 20 20 20 20 20 20 62  )(dv);.        b
da00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
da10: 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20   OPT_INT:.      
da20: 20 20 2a 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d 2e    *(int*)(op[j].
da30: 61 72 67 29 20 3d 20 6c 76 3b 0a 20 20 20 20 20  arg) = lv;.     
da40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
da50: 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20  case OPT_FINT:. 
da60: 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a         (*(void(*
da70: 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29  )())(op[j].arg))
da80: 28 28 69 6e 74 29 6c 76 29 3b 0a 20 20 20 20 20  ((int)lv);.     
da90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
daa0: 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20  case OPT_STR:.  
dab0: 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 28        *(char**)(
dac0: 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 73 76 3b  op[j].arg) = sv;
dad0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
dae0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
daf0: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 28 2a 28  STR:.        (*(
db00: 76 6f 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d  void(*)())(op[j]
db10: 2e 61 72 67 29 29 28 73 76 29 3b 0a 20 20 20 20  .arg))(sv);.    
db20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
db30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72  .  }.  return er
db40: 72 63 6e 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74  rcnt;.}..int Opt
db50: 49 6e 69 74 28 61 2c 6f 2c 65 72 72 29 0a 63 68  Init(a,o,err).ch
db60: 61 72 20 2a 2a 61 3b 0a 73 74 72 75 63 74 20 73  ar **a;.struct s
db70: 5f 6f 70 74 69 6f 6e 73 20 2a 6f 3b 0a 46 49 4c  _options *o;.FIL
db80: 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20  E *err;.{.  int 
db90: 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61 72  errcnt = 0;.  ar
dba0: 67 76 20 3d 20 61 3b 0a 20 20 6f 70 20 3d 20 6f  gv = a;.  op = o
dbb0: 3b 0a 20 20 65 72 72 73 74 72 65 61 6d 20 3d 20  ;.  errstream = 
dbc0: 65 72 72 3b 0a 20 20 69 66 28 20 61 72 67 76 20  err;.  if( argv 
dbd0: 26 26 20 2a 61 72 67 76 20 26 26 20 6f 70 20 29  && *argv && op )
dbe0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
dbf0: 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69   for(i=1; argv[i
dc00: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
dc10: 66 28 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27  f( argv[i][0]=='
dc20: 2b 27 20 7c 7c 20 61 72 67 76 5b 69 5d 5b 30 5d  +' || argv[i][0]
dc30: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
dc40: 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c   errcnt += handl
dc50: 65 66 6c 61 67 73 28 69 2c 65 72 72 29 3b 0a 20  eflags(i,err);. 
dc60: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
dc70: 74 72 63 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d  trchr(argv[i],'=
dc80: 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72  ') ){.        er
dc90: 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 73 77  rcnt += handlesw
dca0: 69 74 63 68 28 69 2c 65 72 72 29 3b 0a 20 20 20  itch(i,err);.   
dcb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
dcc0: 20 69 66 28 20 65 72 72 63 6e 74 3e 30 20 29 7b   if( errcnt>0 ){
dcd0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
dce0: 2c 22 56 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 20  ,"Valid command 
dcf0: 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72  line options for
dd00: 20 5c 22 25 73 5c 22 20 61 72 65 3a 5c 6e 22 2c   \"%s\" are:\n",
dd10: 2a 61 29 3b 0a 20 20 20 20 4f 70 74 50 72 69 6e  *a);.    OptPrin
dd20: 74 28 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  t();.    exit(1)
dd30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
dd40: 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 4e 41 72 67  ;.}..int OptNArg
dd50: 73 28 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  s(){.  int cnt =
dd60: 20 30 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61   0;.  int dashda
dd70: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
dd80: 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30 20 26  .  if( argv!=0 &
dd90: 26 20 61 72 67 76 5b 30 5d 21 3d 30 20 29 7b 0a  & argv[0]!=0 ){.
dda0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67      for(i=1; arg
ddb0: 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  v[i]; i++){.    
ddc0: 20 20 69 66 28 20 64 61 73 68 64 61 73 68 20 7c    if( dashdash |
ddd0: 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d  | !ISOPT(argv[i]
dde0: 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  ) ) cnt++;.     
ddf0: 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
de00: 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64  [i],"--")==0 ) d
de10: 61 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20  ashdash = 1;.   
de20: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
de30: 63 6e 74 3b 0a 7d 0a 0a 63 68 61 72 20 2a 4f 70  cnt;.}..char *Op
de40: 74 41 72 67 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b  tArg(n).int n;.{
de50: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20  .  int i;.  i = 
de60: 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 72  argindex(n);.  r
de70: 65 74 75 72 6e 20 69 3e 3d 30 20 3f 20 61 72 67  eturn i>=0 ? arg
de80: 76 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69  v[i] : 0;.}..voi
de90: 64 20 4f 70 74 45 72 72 28 6e 29 0a 69 6e 74 20  d OptErr(n).int 
dea0: 6e 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  n;.{.  int i;.  
deb0: 69 20 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b  i = argindex(n);
dec0: 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 65 72  .  if( i>=0 ) er
ded0: 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 73 74 72  rline(i,0,errstr
dee0: 65 61 6d 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70  eam);.}..void Op
def0: 74 50 72 69 6e 74 28 29 7b 0a 20 20 69 6e 74 20  tPrint(){.  int 
df00: 69 3b 0a 20 20 69 6e 74 20 6d 61 78 2c 20 6c 65  i;.  int max, le
df10: 6e 3b 0a 20 20 6d 61 78 20 3d 20 30 3b 0a 20 20  n;.  max = 0;.  
df20: 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c  for(i=0; op[i].l
df30: 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  abel; i++){.    
df40: 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  len = lemonStrle
df50: 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 20 2b  n(op[i].label) +
df60: 20 31 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20   1;.    switch( 
df70: 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[i].type ){.  
df80: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
df90: 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
dfa0: 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
dfb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
dfc0: 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20  se OPT_INT:.    
dfd0: 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a    case OPT_FINT:
dfe0: 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20  .        len += 
dff0: 39 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67  9;       /* leng
e000: 74 68 20 6f 66 20 22 3c 69 6e 74 65 67 65 72 3e  th of "<integer>
e010: 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  " */.        bre
e020: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
e030: 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61  PT_DBL:.      ca
e040: 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20  se OPT_FDBL:.   
e050: 20 20 20 20 20 6c 65 6e 20 2b 3d 20 36 3b 20 20       len += 6;  
e060: 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f       /* length o
e070: 66 20 22 3c 72 65 61 6c 3e 22 20 2a 2f 0a 20 20  f "<real>" */.  
e080: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e090: 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a     case OPT_STR:
e0a0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
e0b0: 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 6c 65  FSTR:.        le
e0c0: 6e 20 2b 3d 20 38 3b 20 20 20 20 20 20 20 2f 2a  n += 8;       /*
e0d0: 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 73 74 72   length of "<str
e0e0: 69 6e 67 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20  ing>" */.       
e0f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e100: 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 20 29 20    if( len>max ) 
e110: 6d 61 78 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20  max = len;.  }. 
e120: 20 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e   for(i=0; op[i].
e130: 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  label; i++){.   
e140: 20 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74   switch( op[i].t
e150: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
e160: 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20  e OPT_FLAG:.    
e170: 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47    case OPT_FFLAG
e180: 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  :.        fprint
e190: 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d  f(errstream,"  -
e1a0: 25 2d 2a 73 20 20 25 73 5c 6e 22 2c 6d 61 78 2c  %-*s  %s\n",max,
e1b0: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 6f 70 5b 69  op[i].label,op[i
e1c0: 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20  ].message);.    
e1d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e1e0: 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20   case OPT_INT:. 
e1f0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49       case OPT_FI
e200: 4e 54 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69  NT:.        fpri
e210: 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20  ntf(errstream," 
e220: 20 25 73 3d 3c 69 6e 74 65 67 65 72 3e 25 2a 73   %s=<integer>%*s
e230: 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61    %s\n",op[i].la
e240: 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28  bel,.          (
e250: 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74  int)(max-lemonSt
e260: 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c  rlen(op[i].label
e270: 29 2d 39 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65  )-9),"",op[i].me
e280: 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  ssage);.        
e290: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
e2a0: 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20  e OPT_DBL:.     
e2b0: 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a   case OPT_FDBL:.
e2c0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
e2d0: 65 72 72 73 74 72 65 61 6d 2c 22 20 20 25 73 3d  errstream,"  %s=
e2e0: 3c 72 65 61 6c 3e 25 2a 73 20 20 25 73 5c 6e 22  <real>%*s  %s\n"
e2f0: 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20  ,op[i].label,.  
e300: 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61          (int)(ma
e310: 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70  x-lemonStrlen(op
e320: 5b 69 5d 2e 6c 61 62 65 6c 29 2d 36 29 2c 22 22  [i].label)-6),""
e330: 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b  ,op[i].message);
e340: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e350: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53        case OPT_S
e360: 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  TR:.      case O
e370: 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20  PT_FSTR:.       
e380: 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65   fprintf(errstre
e390: 61 6d 2c 22 20 20 25 73 3d 3c 73 74 72 69 6e 67  am,"  %s=<string
e3a0: 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69  >%*s  %s\n",op[i
e3b0: 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  ].label,.       
e3c0: 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d     (int)(max-lem
e3d0: 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c  onStrlen(op[i].l
e3e0: 61 62 65 6c 29 2d 38 29 2c 22 22 2c 6f 70 5b 69  abel)-8),"",op[i
e3f0: 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20  ].message);.    
e400: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e410: 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  .  }.}./********
e420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
e430: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70  From the file "p
e440: 61 72 73 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  arse.c" ********
e450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e460: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 70 75  ****/./*.** Inpu
e470: 74 20 66 69 6c 65 20 70 61 72 73 65 72 20 66 6f  t file parser fo
e480: 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  r the LEMON pars
e490: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
e4a0: 0a 0a 2f 2a 20 54 68 65 20 73 74 61 74 65 20 6f  ../* The state o
e4b0: 66 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a  f the parser */.
e4c0: 73 74 72 75 63 74 20 70 73 74 61 74 65 20 7b 0a  struct pstate {.
e4d0: 20 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65    char *filename
e4e0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
e4f0: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  of the input fil
e500: 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 6b 65 6e  e */.  int token
e510: 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 2f 2a 20  lineno;      /* 
e520: 4c 69 6e 65 6e 75 6d 62 65 72 20 61 74 20 77 68  Linenumber at wh
e530: 69 63 68 20 63 75 72 72 65 6e 74 20 74 6f 6b 65  ich current toke
e540: 6e 20 73 74 61 72 74 73 20 2a 2f 0a 20 20 69 6e  n starts */.  in
e550: 74 20 65 72 72 6f 72 63 6e 74 3b 20 20 20 20 20  t errorcnt;     
e560: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e570: 20 65 72 72 6f 72 73 20 73 6f 20 66 61 72 20 2a   errors so far *
e580: 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 73  /.  char *tokens
e590: 74 61 72 74 3b 20 20 20 20 20 2f 2a 20 54 65 78  tart;     /* Tex
e5a0: 74 20 6f 66 20 63 75 72 72 65 6e 74 20 74 6f 6b  t of current tok
e5b0: 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c  en */.  struct l
e5c0: 65 6d 6f 6e 20 2a 67 70 3b 20 20 20 20 20 2f 2a  emon *gp;     /*
e5d0: 20 47 6c 6f 62 61 6c 20 73 74 61 74 65 20 76 65   Global state ve
e5e0: 63 74 6f 72 20 2a 2f 0a 20 20 65 6e 75 6d 20 65  ctor */.  enum e
e5f0: 5f 73 74 61 74 65 20 7b 0a 20 20 20 20 49 4e 49  _state {.    INI
e600: 54 49 41 4c 49 5a 45 2c 0a 20 20 20 20 57 41 49  TIALIZE,.    WAI
e610: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
e620: 5f 52 55 4c 45 2c 0a 20 20 20 20 57 41 49 54 49  _RULE,.    WAITI
e630: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57  NG_FOR_DECL_KEYW
e640: 4f 52 44 2c 0a 20 20 20 20 57 41 49 54 49 4e 47  ORD,.    WAITING
e650: 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 2c 0a 20  _FOR_DECL_ARG,. 
e660: 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50     WAITING_FOR_P
e670: 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c  RECEDENCE_SYMBOL
e680: 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f  ,.    WAITING_FO
e690: 52 5f 41 52 52 4f 57 2c 0a 20 20 20 20 49 4e 5f  R_ARROW,.    IN_
e6a0: 52 48 53 2c 0a 20 20 20 20 4c 48 53 5f 41 4c 49  RHS,.    LHS_ALI
e6b0: 41 53 5f 31 2c 0a 20 20 20 20 4c 48 53 5f 41 4c  AS_1,.    LHS_AL
e6c0: 49 41 53 5f 32 2c 0a 20 20 20 20 4c 48 53 5f 41  IAS_2,.    LHS_A
e6d0: 4c 49 41 53 5f 33 2c 0a 20 20 20 20 52 48 53 5f  LIAS_3,.    RHS_
e6e0: 41 4c 49 41 53 5f 31 2c 0a 20 20 20 20 52 48 53  ALIAS_1,.    RHS
e6f0: 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 20 20 50 52  _ALIAS_2,.    PR
e700: 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 2c  ECEDENCE_MARK_1,
e710: 0a 20 20 20 20 50 52 45 43 45 44 45 4e 43 45 5f  .    PRECEDENCE_
e720: 4d 41 52 4b 5f 32 2c 0a 20 20 20 20 52 45 53 59  MARK_2,.    RESY
e730: 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
e740: 52 4f 52 2c 0a 20 20 20 20 52 45 53 59 4e 43 5f  ROR,.    RESYNC_
e750: 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
e760: 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f  ,.    WAITING_FO
e770: 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d  R_DESTRUCTOR_SYM
e780: 42 4f 4c 2c 0a 20 20 20 20 57 41 49 54 49 4e 47  BOL,.    WAITING
e790: 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59  _FOR_DATATYPE_SY
e7a0: 4d 42 4f 4c 2c 0a 20 20 20 20 57 41 49 54 49 4e  MBOL,.    WAITIN
e7b0: 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49  G_FOR_FALLBACK_I
e7c0: 44 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46  D,.    WAITING_F
e7d0: 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 0a 20  OR_WILDCARD_ID. 
e7e0: 20 7d 20 73 74 61 74 65 3b 20 20 20 20 20 20 20   } state;       
e7f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e800: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
e810: 70 61 72 73 65 72 20 2a 2f 0a 20 20 73 74 72 75  parser */.  stru
e820: 63 74 20 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62  ct symbol *fallb
e830: 61 63 6b 3b 20 20 20 2f 2a 20 54 68 65 20 66 61  ack;   /* The fa
e840: 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20 2a 2f 0a  llback token */.
e850: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
e860: 2a 6c 68 73 3b 20 20 20 20 20 20 20 20 2f 2a 20  *lhs;        /* 
e870: 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  Left-hand side o
e880: 66 20 63 75 72 72 65 6e 74 20 72 75 6c 65 20 2a  f current rule *
e890: 2f 0a 20 20 63 68 61 72 20 2a 6c 68 73 61 6c 69  /.  char *lhsali
e8a0: 61 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  as;            /
e8b0: 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20  * Alias for the 
e8c0: 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68  LHS */.  int nrh
e8d0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
e8e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e8f0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
e900: 20 73 79 6d 62 6f 6c 73 20 73 65 65 6e 20 2a 2f   symbols seen */
e910: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
e920: 20 2a 72 68 73 5b 4d 41 58 52 48 53 5d 3b 20 20   *rhs[MAXRHS];  
e930: 2f 2a 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a  /* RHS symbols *
e940: 2f 0a 20 20 63 68 61 72 20 2a 61 6c 69 61 73 5b  /.  char *alias[
e950: 4d 41 58 52 48 53 5d 3b 20 20 20 20 20 20 20 2f  MAXRHS];       /
e960: 2a 20 41 6c 69 61 73 65 73 20 66 6f 72 20 65 61  * Aliases for ea
e970: 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 6f  ch RHS symbol (o
e980: 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73 74 72  r NULL) */.  str
e990: 75 63 74 20 72 75 6c 65 20 2a 70 72 65 76 72 75  uct rule *prevru
e9a0: 6c 65 3b 20 20 20 20 20 2f 2a 20 50 72 65 76 69  le;     /* Previ
e9b0: 6f 75 73 20 72 75 6c 65 20 70 61 72 73 65 64 20  ous rule parsed 
e9c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 64 65 63 6c 6b  */.  char *declk
e9d0: 65 79 77 6f 72 64 3b 20 20 20 20 20 20 20 20 20  eyword;         
e9e0: 2f 2a 20 4b 65 79 77 6f 72 64 20 6f 66 20 61 20  /* Keyword of a 
e9f0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 20  declaration */. 
ea00: 20 63 68 61 72 20 2a 2a 64 65 63 6c 61 72 67 73   char **declargs
ea10: 6c 6f 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  lot;        /* W
ea20: 68 65 72 65 20 74 68 65 20 64 65 63 6c 61 72 61  here the declara
ea30: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20 73 68  tion argument sh
ea40: 6f 75 6c 64 20 62 65 20 70 75 74 20 2a 2f 0a 20  ould be put */. 
ea50: 20 69 6e 74 20 69 6e 73 65 72 74 4c 69 6e 65 4d   int insertLineM
ea60: 61 63 72 6f 3b 20 20 20 20 20 20 20 2f 2a 20 41  acro;       /* A
ea70: 64 64 20 23 6c 69 6e 65 20 62 65 66 6f 72 65 20  dd #line before 
ea80: 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e 73 65  declaration inse
ea90: 72 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 64 65 63  rt */.  int *dec
eaa0: 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3b 20 20 20 20  llinenoslot;    
eab0: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
eac0: 72 69 74 65 20 64 65 63 6c 61 72 61 74 69 6f 6e  rite declaration
ead0: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
eae0: 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 64    enum e_assoc d
eaf0: 65 63 6c 61 73 73 6f 63 3b 20 20 20 20 2f 2a 20  eclassoc;    /* 
eb00: 41 73 73 69 67 6e 20 74 68 69 73 20 61 73 73 6f  Assign this asso
eb10: 63 69 61 74 69 6f 6e 20 74 6f 20 64 65 63 6c 20  ciation to decl 
eb20: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69  arguments */.  i
eb30: 6e 74 20 70 72 65 63 63 6f 75 6e 74 65 72 3b 20  nt preccounter; 
eb40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
eb50: 69 67 6e 20 74 68 69 73 20 70 72 65 63 65 64 65  ign this precede
eb60: 6e 63 65 20 74 6f 20 64 65 63 6c 20 61 72 67 75  nce to decl argu
eb70: 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75 63  ments */.  struc
eb80: 74 20 72 75 6c 65 20 2a 66 69 72 73 74 72 75 6c  t rule *firstrul
eb90: 65 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  e;    /* Pointer
eba0: 20 74 6f 20 66 69 72 73 74 20 72 75 6c 65 20 69   to first rule i
ebb0: 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f  n the grammar */
ebc0: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
ebd0: 6c 61 73 74 72 75 6c 65 3b 20 20 20 20 20 2f 2a  lastrule;     /*
ebe0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
ebf0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
ec00: 72 73 65 64 20 72 75 6c 65 20 2a 2f 0a 7d 3b 0a  rsed rule */.};.
ec10: 0a 2f 2a 20 50 61 72 73 65 20 61 20 73 69 6e 67  ./* Parse a sing
ec20: 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73 74 61 74  le token */.stat
ec30: 69 63 20 76 6f 69 64 20 70 61 72 73 65 6f 6e 65  ic void parseone
ec40: 74 6f 6b 65 6e 28 70 73 70 29 0a 73 74 72 75 63  token(psp).struc
ec50: 74 20 70 73 74 61 74 65 20 2a 70 73 70 3b 0a 7b  t pstate *psp;.{
ec60: 0a 20 20 63 68 61 72 20 2a 78 3b 0a 20 20 78 20  .  char *x;.  x 
ec70: 3d 20 53 74 72 73 61 66 65 28 70 73 70 2d 3e 74  = Strsafe(psp->t
ec80: 6f 6b 65 6e 73 74 61 72 74 29 3b 20 20 20 20 20  okenstart);     
ec90: 2f 2a 20 53 61 76 65 20 74 68 65 20 74 6f 6b 65  /* Save the toke
eca0: 6e 20 70 65 72 6d 61 6e 65 6e 74 6c 79 20 2a 2f  n permanently */
ecb0: 0a 23 69 66 20 30 0a 20 20 70 72 69 6e 74 66 28  .#if 0.  printf(
ecc0: 22 25 73 3a 25 64 3a 20 54 6f 6b 65 6e 3d 5b 25  "%s:%d: Token=[%
ecd0: 73 5d 20 73 74 61 74 65 3d 25 64 5c 6e 22 2c 70  s] state=%d\n",p
ece0: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
ecf0: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
ed00: 20 20 20 78 2c 70 73 70 2d 3e 73 74 61 74 65 29     x,psp->state)
ed10: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63  ;.#endif.  switc
ed20: 68 28 20 70 73 70 2d 3e 73 74 61 74 65 20 29 7b  h( psp->state ){
ed30: 0a 20 20 20 20 63 61 73 65 20 49 4e 49 54 49 41  .    case INITIA
ed40: 4c 49 5a 45 3a 0a 20 20 20 20 20 20 70 73 70 2d  LIZE:.      psp-
ed50: 3e 70 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20  >prevrule = 0;. 
ed60: 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f       psp->precco
ed70: 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  unter = 0;.     
ed80: 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20   psp->firstrule 
ed90: 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20  = psp->lastrule 
eda0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e  = 0;.      psp->
edb0: 67 70 2d 3e 6e 72 75 6c 65 20 3d 20 30 3b 0a 20  gp->nrule = 0;. 
edc0: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
edd0: 75 20 74 6f 20 6e 65 78 74 20 63 61 73 65 20 2a  u to next case *
ede0: 2f 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  /.    case WAITI
edf0: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
ee00: 55 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20 78  ULE:.      if( x
ee10: 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20 20  [0]=='%' ){.    
ee20: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
ee30: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
ee40: 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20  L_KEYWORD;.     
ee50: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 6c 6f 77   }else if( islow
ee60: 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  er(x[0]) ){.    
ee70: 20 20 20 20 70 73 70 2d 3e 6c 68 73 20 3d 20 53      psp->lhs = S
ee80: 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
ee90: 20 20 20 20 20 20 70 73 70 2d 3e 6e 72 68 73 20        psp->nrhs 
eea0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = 0;.        psp
eeb0: 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 30 3b 0a  ->lhsalias = 0;.
eec0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
eed0: 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
eee0: 5f 41 52 52 4f 57 3b 0a 20 20 20 20 20 20 7d 65  _ARROW;.      }e
eef0: 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b  lse if( x[0]=='{
ef00: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
ef10: 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d   psp->prevrule==
ef20: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
ef30: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
ef40: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
ef50: 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65 72 65 20 69  lineno,."There i
ef60: 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65 20  s no prior rule 
ef70: 6f 70 6f 6e 20 77 68 69 63 68 20 74 6f 20 61 74  opon which to at
ef80: 74 61 63 68 20 74 68 65 20 63 6f 64 65 20 5c 0a  tach the code \.
ef90: 66 72 61 67 6d 65 6e 74 20 77 68 69 63 68 20 62  fragment which b
efa0: 65 67 69 6e 73 20 6f 6e 20 74 68 69 73 20 6c 69  egins on this li
efb0: 6e 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ne.");.         
efc0: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
efd0: 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 70 73 70  ;..}else if( psp
efe0: 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64 65  ->prevrule->code
eff0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
f000: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
f010: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
f020: 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 6f 64 65 20  enlineno,."Code 
f030: 66 72 61 67 6d 65 6e 74 20 62 65 67 69 6e 6e 69  fragment beginni
f040: 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20  ng on this line 
f050: 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  is not the first
f060: 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65   \.to follow the
f070: 20 70 72 65 76 69 6f 75 73 20 72 75 6c 65 2e 22   previous rule."
f080: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
f090: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
f0a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f0b0: 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76         psp->prev
f0c0: 72 75 6c 65 2d 3e 6c 69 6e 65 20 3d 20 70 73 70  rule->line = psp
f0d0: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20  ->tokenlineno;. 
f0e0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
f0f0: 65 76 72 75 6c 65 2d 3e 63 6f 64 65 20 3d 20 26  evrule->code = &
f100: 78 5b 31 5d 3b 0a 09 7d 0a 20 20 20 20 20 20 7d  x[1];..}.      }
f110: 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27  else if( x[0]=='
f120: 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  [' ){.        ps
f130: 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43 45  p->state = PRECE
f140: 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3b 0a 20 20  DENCE_MARK_1;.  
f150: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f160: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
f170: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
f180: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
f190: 20 20 20 20 20 20 22 54 6f 6b 65 6e 20 5c 22 25        "Token \"%
f1a0: 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 65 69  s\" should be ei
f1b0: 74 68 65 72 20 5c 22 25 25 5c 22 20 6f 72 20 61  ther \"%%\" or a
f1c0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6e 61 6d   nonterminal nam
f1d0: 65 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78  e.",.          x
f1e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
f1f0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
f200: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
f210: 0a 20 20 20 20 63 61 73 65 20 50 52 45 43 45 44  .    case PRECED
f220: 45 4e 43 45 5f 4d 41 52 4b 5f 31 3a 0a 20 20 20  ENCE_MARK_1:.   
f230: 20 20 20 69 66 28 20 21 69 73 75 70 70 65 72 28     if( !isupper(
f240: 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
f250: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
f260: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
f270: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
f280: 20 20 20 20 22 54 68 65 20 70 72 65 63 65 64 65      "The precede
f290: 6e 63 65 20 73 79 6d 62 6f 6c 20 6d 75 73 74 20  nce symbol must 
f2a0: 62 65 20 61 20 74 65 72 6d 69 6e 61 6c 2e 22 29  be a terminal.")
f2b0: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
f2c0: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
f2d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e   }else if( psp->
f2e0: 70 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a 20  prevrule==0 ){. 
f2f0: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
f300: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
f310: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
f320: 20 20 20 20 20 20 20 20 20 20 22 54 68 65 72 65            "There
f330: 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c   is no prior rul
f340: 65 20 74 6f 20 61 73 73 69 67 6e 20 70 72 65 63  e to assign prec
f350: 65 64 65 6e 63 65 20 5c 22 5b 25 73 5d 5c 22 2e  edence \"[%s]\".
f360: 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ",x);.        ps
f370: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
f380: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
f390: 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72  sp->prevrule->pr
f3a0: 65 63 73 79 6d 21 3d 30 20 29 7b 0a 20 20 20 20  ecsym!=0 ){.    
f3b0: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
f3c0: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
f3d0: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 50 72  tokenlineno,."Pr
f3e0: 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 20 6f 6e  ecedence mark on
f3f0: 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f   this line is no
f400: 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f  t the first \.to
f410: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76   follow the prev
f420: 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20  ious rule.");.  
f430: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
f440: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  cnt++;.      }el
f450: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  se{.        psp-
f460: 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63 73  >prevrule->precs
f470: 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  ym = Symbol_new(
f480: 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
f490: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50    psp->state = P
f4a0: 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32  RECEDENCE_MARK_2
f4b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f4c0: 20 20 20 63 61 73 65 20 50 52 45 43 45 44 45 4e     case PRECEDEN
f4d0: 43 45 5f 4d 41 52 4b 5f 32 3a 0a 20 20 20 20 20  CE_MARK_2:.     
f4e0: 20 69 66 28 20 78 5b 30 5d 21 3d 27 5d 27 20 29   if( x[0]!=']' )
f4f0: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
f500: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
f510: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
f520: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69  o,.          "Mi
f530: 73 73 69 6e 67 20 5c 22 5d 5c 22 20 6f 6e 20 70  ssing \"]\" on p
f540: 72 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 2e 22  recedence mark."
f550: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
f560: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
f570: 20 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73    }.      psp->s
f580: 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
f590: 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
f5a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f5b0: 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
f5c0: 4f 52 5f 41 52 52 4f 57 3a 0a 20 20 20 20 20 20  OR_ARROW:.      
f5d0: 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26 26  if( x[0]==':' &&
f5e0: 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78 5b   x[1]==':' && x[
f5f0: 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20  2]=='=' ){.     
f600: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f610: 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65  IN_RHS;.      }e
f620: 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28  lse if( x[0]=='(
f630: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
f640: 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c  ->state = LHS_AL
f650: 49 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c  IAS_1;.      }el
f660: 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
f670: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
f680: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
f690: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
f6a0: 45 78 70 65 63 74 65 64 20 74 6f 20 73 65 65 20  Expected to see 
f6b0: 61 20 5c 22 3a 5c 22 20 66 6f 6c 6c 6f 77 69 6e  a \":\" followin
f6c0: 67 20 74 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c  g the LHS symbol
f6d0: 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20   \"%s\".",.     
f6e0: 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e       psp->lhs->n
f6f0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ame);.        ps
f700: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
f710: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
f720: 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
f730: 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20  _RULE_ERROR;.   
f740: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
f750: 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41  ;.    case LHS_A
f760: 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66  LIAS_1:.      if
f770: 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20  ( isalpha(x[0]) 
f780: 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
f790: 6c 68 73 61 6c 69 61 73 20 3d 20 78 3b 0a 20 20  lhsalias = x;.  
f7a0: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
f7b0: 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3b 0a   = LHS_ALIAS_2;.
f7c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f7d0: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
f7e0: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
f7f0: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
f800: 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20          "\"%s\" 
f810: 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61  is not a valid a
f820: 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53  lias for the LHS
f830: 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20   \"%s\"\n",.    
f840: 20 20 20 20 20 20 78 2c 70 73 70 2d 3e 6c 68 73        x,psp->lhs
f850: 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
f860: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
f870: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
f880: 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
f890: 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
f8a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
f8b0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48  eak;.    case LH
f8c0: 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20  S_ALIAS_2:.     
f8d0: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29   if( x[0]==')' )
f8e0: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
f8f0: 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53  tate = LHS_ALIAS
f900: 5f 33 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _3;.      }else{
f910: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
f920: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
f930: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
f940: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73  ,.          "Mis
f950: 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f  sing \")\" follo
f960: 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e  wing LHS alias n
f970: 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70  ame \"%s\".",psp
f980: 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->lhsalias);.   
f990: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
f9a0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
f9b0: 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
f9c0: 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
f9d0: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
f9e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
f9f0: 65 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3a 0a 20  e LHS_ALIAS_3:. 
fa00: 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
fa10: 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20  :' && x[1]==':' 
fa20: 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a  && x[2]=='=' ){.
fa30: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
fa40: 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20  te = IN_RHS;.   
fa50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fa60: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
fa70: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
fa80: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
fa90: 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22       "Missing \"
faa0: 2d 3e 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20  ->\" following: 
fab0: 5c 22 25 73 28 25 73 29 5c 22 2e 22 2c 0a 20 20  \"%s(%s)\".",.  
fac0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68           psp->lh
fad0: 73 2d 3e 6e 61 6d 65 2c 70 73 70 2d 3e 6c 68 73  s->name,psp->lhs
fae0: 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20  alias);.        
faf0: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
fb00: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
fb10: 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
fb20: 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20  ER_RULE_ERROR;. 
fb30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
fb40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 49 4e 5f  ak;.    case IN_
fb50: 52 48 53 3a 0a 20 20 20 20 20 20 69 66 28 20 78  RHS:.      if( x
fb60: 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]=='.' ){.    
fb70: 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65 20      struct rule 
fb80: 2a 72 70 3b 0a 20 20 20 20 20 20 20 20 72 70 20  *rp;.        rp 
fb90: 3d 20 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a  = (struct rule *
fba0: 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )calloc( sizeof(
fbb0: 73 74 72 75 63 74 20 72 75 6c 65 29 20 2b 20 0a  struct rule) + .
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
fbd0: 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
fbe0: 6c 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 20 2b 20  l*)*psp->nrhs + 
fbf0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 73  sizeof(char*)*ps
fc00: 70 2d 3e 6e 72 68 73 2c 20 31 29 3b 0a 20 20 20  p->nrhs, 1);.   
fc10: 20 20 20 20 20 69 66 28 20 72 70 3d 3d 30 20 29       if( rp==0 )
fc20: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
fc30: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
fc40: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
fc50: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
fc60: 20 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65   "Can't allocate
fc70: 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 66   enough memory f
fc80: 6f 72 20 74 68 69 73 20 72 75 6c 65 2e 22 29 3b  or this rule.");
fc90: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
fca0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
fcb0: 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72        psp->prevr
fcc0: 75 6c 65 20 3d 20 30 3b 0a 09 7d 65 6c 73 65 7b  ule = 0;..}else{
fcd0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
fce0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
fcf0: 72 75 6c 65 6c 69 6e 65 20 3d 20 70 73 70 2d 3e  ruleline = psp->
fd00: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20  tokenlineno;.   
fd10: 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 20 3d         rp->rhs =
fd20: 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a   (struct symbol*
fd30: 2a 29 26 72 70 5b 31 5d 3b 0a 20 20 20 20 20 20  *)&rp[1];.      
fd40: 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73      rp->rhsalias
fd50: 20 3d 20 28 63 68 61 72 2a 2a 29 26 28 72 70 2d   = (char**)&(rp-
fd60: 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 29  >rhs[psp->nrhs])
fd70: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
fd80: 69 3d 30 3b 20 69 3c 70 73 70 2d 3e 6e 72 68 73  i=0; i<psp->nrhs
fd90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
fda0: 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 20 3d      rp->rhs[i] =
fdb0: 20 70 73 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20   psp->rhs[i];.  
fdc0: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
fdd0: 73 61 6c 69 61 73 5b 69 5d 20 3d 20 70 73 70 2d  salias[i] = psp-
fde0: 3e 61 6c 69 61 73 5b 69 5d 3b 0a 09 20 20 7d 0a  >alias[i];..  }.
fdf0: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68            rp->lh
fe00: 73 20 3d 20 70 73 70 2d 3e 6c 68 73 3b 0a 20 20  s = psp->lhs;.  
fe10: 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61          rp->lhsa
fe20: 6c 69 61 73 20 3d 20 70 73 70 2d 3e 6c 68 73 61  lias = psp->lhsa
fe30: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
fe40: 72 70 2d 3e 6e 72 68 73 20 3d 20 70 73 70 2d 3e  rp->nrhs = psp->
fe50: 6e 72 68 73 3b 0a 20 20 20 20 20 20 20 20 20 20  nrhs;.          
fe60: 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20 20  rp->code = 0;.  
fe70: 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63          rp->prec
fe80: 73 79 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  sym = 0;.       
fe90: 20 20 20 72 70 2d 3e 69 6e 64 65 78 20 3d 20 70     rp->index = p
fea0: 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 2b 2b 3b  sp->gp->nrule++;
feb0: 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e  .          rp->n
fec0: 65 78 74 6c 68 73 20 3d 20 72 70 2d 3e 6c 68 73  extlhs = rp->lhs
fed0: 2d 3e 72 75 6c 65 3b 0a 20 20 20 20 20 20 20 20  ->rule;.        
fee0: 20 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65 20    rp->lhs->rule 
fef0: 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20  = rp;.          
ff00: 72 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  rp->next = 0;.  
ff10: 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d          if( psp-
ff20: 3e 66 69 72 73 74 72 75 6c 65 3d 3d 30 20 29 7b  >firstrule==0 ){
ff30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 73 70  .            psp
ff40: 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20 70 73  ->firstrule = ps
ff50: 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72 70  p->lastrule = rp
ff60: 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ;..  }else{.    
ff70: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61 73          psp->las
ff80: 74 72 75 6c 65 2d 3e 6e 65 78 74 20 3d 20 72 70  trule->next = rp
ff90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 73  ;.            ps
ffa0: 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72 70  p->lastrule = rp
ffb0: 3b 0a 09 20 20 7d 0a 20 20 20 20 20 20 20 20 20  ;..  }.         
ffc0: 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d   psp->prevrule =
ffd0: 20 72 70 3b 0a 09 7d 0a 20 20 20 20 20 20 20 20   rp;..}.        
ffe0: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
fff0: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
10000 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  _RULE;.      }el
10010 73 65 20 69 66 28 20 69 73 61 6c 70 68 61 28 78  se if( isalpha(x
10020 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
10030 69 66 28 20 70 73 70 2d 3e 6e 72 68 73 3e 3d 4d  if( psp->nrhs>=M
10040 41 58 52 48 53 20 29 7b 0a 20 20 20 20 20 20 20  AXRHS ){.       
10050 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
10060 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
10070 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
10080 20 20 20 20 20 20 20 20 22 54 6f 6f 20 6d 61 6e          "Too man
10090 79 20 73 79 6d 62 6f 6c 73 20 6f 6e 20 52 48 53  y symbols on RHS
100a0 20 6f 66 20 72 75 6c 65 20 62 65 67 69 6e 6e 69   of rule beginni
100b0 6e 67 20 61 74 20 5c 22 25 73 5c 22 2e 22 2c 0a  ng at \"%s\".",.
100c0 20 20 20 20 20 20 20 20 20 20 20 20 78 29 3b 0a              x);.
100d0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
100e0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
100f0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10100 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
10110 55 4c 45 5f 45 52 52 4f 52 3b 0a 09 7d 65 6c 73  ULE_ERROR;..}els
10120 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  e{.          psp
10130 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d  ->rhs[psp->nrhs]
10140 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
10150 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
10160 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73  >alias[psp->nrhs
10170 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
10180 20 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 09 7d   psp->nrhs++;..}
10190 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
101a0 20 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c 7c 20 78   (x[0]=='|' || x
101b0 5b 30 5d 3d 3d 27 2f 27 29 20 26 26 20 70 73 70  [0]=='/') && psp
101c0 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20 20 20 20  ->nrhs>0 ){.    
101d0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
101e0 6c 20 2a 6d 73 70 20 3d 20 70 73 70 2d 3e 72 68  l *msp = psp->rh
101f0 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 3b 0a  s[psp->nrhs-1];.
10200 20 20 20 20 20 20 20 20 69 66 28 20 6d 73 70 2d          if( msp-
10210 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d  >type!=MULTITERM
10220 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
10230 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
10240 2a 6f 72 69 67 73 70 20 3d 20 6d 73 70 3b 0a 20  *origsp = msp;. 
10250 20 20 20 20 20 20 20 20 20 6d 73 70 20 3d 20 63           msp = c
10260 61 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f 66 28 2a  alloc(1,sizeof(*
10270 6d 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20 20  msp));.         
10280 20 6d 65 6d 73 65 74 28 6d 73 70 2c 20 30 2c 20   memset(msp, 0, 
10290 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20  sizeof(*msp));. 
102a0 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 74 79           msp->ty
102b0 70 65 20 3d 20 4d 55 4c 54 49 54 45 52 4d 49 4e  pe = MULTITERMIN
102c0 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73  AL;.          ms
102d0 70 2d 3e 6e 73 75 62 73 79 6d 20 3d 20 31 3b 0a  p->nsubsym = 1;.
102e0 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73            msp->s
102f0 75 62 73 79 6d 20 3d 20 63 61 6c 6c 6f 63 28 31  ubsym = calloc(1
10300 2c 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73  ,sizeof(struct s
10310 79 6d 62 6f 6c 2a 29 29 3b 0a 20 20 20 20 20 20  ymbol*));.      
10320 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b      msp->subsym[
10330 30 5d 20 3d 20 6f 72 69 67 73 70 3b 0a 20 20 20  0] = origsp;.   
10340 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 61 6d 65         msp->name
10350 20 3d 20 6f 72 69 67 73 70 2d 3e 6e 61 6d 65 3b   = origsp->name;
10360 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10370 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d  rhs[psp->nrhs-1]
10380 20 3d 20 6d 73 70 3b 0a 20 20 20 20 20 20 20 20   = msp;.        
10390 7d 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e  }.        msp->n
103a0 73 75 62 73 79 6d 2b 2b 3b 0a 20 20 20 20 20 20  subsym++;.      
103b0 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20    msp->subsym = 
103c0 72 65 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62  realloc(msp->sub
103d0 73 79 6d 2c 20 73 69 7a 65 6f 66 28 73 74 72 75  sym, sizeof(stru
103e0 63 74 20 73 79 6d 62 6f 6c 2a 29 2a 6d 73 70 2d  ct symbol*)*msp-
103f0 3e 6e 73 75 62 73 79 6d 29 3b 0a 20 20 20 20 20  >nsubsym);.     
10400 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 6d     msp->subsym[m
10410 73 70 2d 3e 6e 73 75 62 73 79 6d 2d 31 5d 20 3d  sp->nsubsym-1] =
10420 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 26 78 5b 31   Symbol_new(&x[1
10430 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
10440 69 73 6c 6f 77 65 72 28 78 5b 31 5d 29 20 7c 7c  islower(x[1]) ||
10450 20 69 73 6c 6f 77 65 72 28 6d 73 70 2d 3e 73 75   islower(msp->su
10460 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 5b 30 5d  bsym[0]->name[0]
10470 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ) ){.          E
10480 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
10490 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
104a0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
104b0 20 20 20 20 22 43 61 6e 6e 6f 74 20 66 6f 72 6d      "Cannot form
104c0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 63 6f 6e 74   a compound cont
104d0 61 69 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 65 72  aining a non-ter
104e0 6d 69 6e 61 6c 22 29 3b 0a 20 20 20 20 20 20 20  minal");.       
104f0 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
10500 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
10510 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b      }else if( x[
10520 30 5d 3d 3d 27 28 27 20 26 26 20 70 73 70 2d 3e  0]=='(' && psp->
10530 6e 72 68 73 3e 30 20 29 7b 0a 20 20 20 20 20 20  nrhs>0 ){.      
10540 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
10550 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20  HS_ALIAS_1;.    
10560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10570 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
10580 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
10590 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
105a0 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 63 68 61      "Illegal cha
105b0 72 61 63 74 65 72 20 6f 6e 20 52 48 53 20 6f 66  racter on RHS of
105c0 20 72 75 6c 65 3a 20 5c 22 25 73 5c 22 2e 22 2c   rule: \"%s\".",
105d0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
105e0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
105f0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10600 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
10610 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
10620 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
10630 20 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c 49      case RHS_ALI
10640 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20  AS_1:.      if( 
10650 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b  isalpha(x[0]) ){
10660 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61 6c  .        psp->al
10670 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d  ias[psp->nrhs-1]
10680 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73   = x;.        ps
10690 70 2d 3e 73 74 61 74 65 20 3d 20 52 48 53 5f 41  p->state = RHS_A
106a0 4c 49 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65  LIAS_2;.      }e
106b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
106c0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
106d0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
106e0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
106f0 22 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61  "\"%s\" is not a
10700 20 76 61 6c 69 64 20 61 6c 69 61 73 20 66 6f 72   valid alias for
10710 20 74 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 20   the RHS symbol 
10720 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20  \"%s\"\n",.     
10730 20 20 20 20 20 78 2c 70 73 70 2d 3e 72 68 73 5b       x,psp->rhs[
10740 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 2d 3e 6e 61  psp->nrhs-1]->na
10750 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  me);.        psp
10760 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
10770 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10780 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
10790 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
107a0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
107b0 0a 20 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c  .    case RHS_AL
107c0 49 41 53 5f 32 3a 0a 20 20 20 20 20 20 69 66 28  IAS_2:.      if(
107d0 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20 20   x[0]==')' ){.  
107e0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
107f0 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20   = IN_RHS;.     
10800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10810 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
10820 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
10830 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
10840 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c     "Missing \")\
10850 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20  " following LHS 
10860 61 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c  alias name \"%s\
10870 22 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61  ".",psp->lhsalia
10880 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  s);.        psp-
10890 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
108a0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
108b0 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
108c0 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
108d0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
108e0 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
108f0 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52  _FOR_DECL_KEYWOR
10900 44 3a 0a 20 20 20 20 20 20 69 66 28 20 69 73 61  D:.      if( isa
10910 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20  lpha(x[0]) ){.  
10920 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6b        psp->declk
10930 65 79 77 6f 72 64 20 3d 20 78 3b 0a 20 20 20 20  eyword = x;.    
10940 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
10950 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  slot = 0;.      
10960 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e    psp->decllinen
10970 6f 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20  oslot = 0;.     
10980 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
10990 6e 65 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20 20  neMacro = 1;.   
109a0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
109b0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
109c0 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 20 20  CL_ARG;.        
109d0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 61  if( strcmp(x,"na
109e0 6d 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  me")==0 ){.     
109f0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10a00 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10a10 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p->name);.      
10a20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c      psp->insertL
10a30 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 09 7d  ineMacro = 0;..}
10a40 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10a50 78 2c 22 69 6e 63 6c 75 64 65 22 29 3d 3d 30 20  x,"include")==0 
10a60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
10a70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
10a80 26 28 70 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75  &(psp->gp->inclu
10a90 64 65 29 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  de);..}else if( 
10aa0 73 74 72 63 6d 70 28 78 2c 22 63 6f 64 65 22 29  strcmp(x,"code")
10ab0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10ac0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10ad0 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65  t = &(psp->gp->e
10ae0 78 74 72 61 63 6f 64 65 29 3b 0a 09 7d 65 6c 73  xtracode);..}els
10af0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
10b00 74 6f 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f 72  token_destructor
10b10 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10b20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
10b30 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e  lot = &psp->gp->
10b40 74 6f 6b 65 6e 64 65 73 74 3b 0a 09 7d 65 6c 73  tokendest;..}els
10b50 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
10b60 64 65 66 61 75 6c 74 5f 64 65 73 74 72 75 63 74  default_destruct
10b70 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  or")==0 ){.     
10b80 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10b90 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70  gslot = &psp->gp
10ba0 2d 3e 76 61 72 64 65 73 74 3b 0a 09 7d 65 6c 73  ->vardest;..}els
10bb0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
10bc0 74 6f 6b 65 6e 5f 70 72 65 66 69 78 22 29 3d 3d  token_prefix")==
10bd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
10be0 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
10bf0 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65  = &psp->gp->toke
10c00 6e 70 72 65 66 69 78 3b 0a 20 20 20 20 20 20 20  nprefix;.       
10c10 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
10c20 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 09 7d 65  neMacro = 0;..}e
10c30 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
10c40 2c 22 73 79 6e 74 61 78 5f 65 72 72 6f 72 22 29  ,"syntax_error")
10c50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10c60 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10c70 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65  t = &(psp->gp->e
10c80 72 72 6f 72 29 3b 0a 09 7d 65 6c 73 65 20 69 66  rror);..}else if
10c90 28 20 73 74 72 63 6d 70 28 78 2c 22 70 61 72 73  ( strcmp(x,"pars
10ca0 65 5f 61 63 63 65 70 74 22 29 3d 3d 30 20 29 7b  e_accept")==0 ){
10cb0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10cc0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
10cd0 70 73 70 2d 3e 67 70 2d 3e 61 63 63 65 70 74 29  psp->gp->accept)
10ce0 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72  ;..}else if( str
10cf0 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 66 61 69  cmp(x,"parse_fai
10d00 6c 75 72 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  lure")==0 ){.   
10d10 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
10d20 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
10d30 3e 67 70 2d 3e 66 61 69 6c 75 72 65 29 3b 0a 09  >gp->failure);..
10d40 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10d50 28 78 2c 22 73 74 61 63 6b 5f 6f 76 65 72 66 6c  (x,"stack_overfl
10d60 6f 77 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ow")==0 ){.     
10d70 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10d80 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10d90 70 2d 3e 6f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  p->overflow);.  
10da0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10db0 73 74 72 63 6d 70 28 78 2c 22 65 78 74 72 61 5f  strcmp(x,"extra_
10dc0 61 72 67 75 6d 65 6e 74 22 29 3d 3d 30 20 29 7b  argument")==0 ){
10dd0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10de0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
10df0 70 73 70 2d 3e 67 70 2d 3e 61 72 67 29 3b 0a 20  psp->gp->arg);. 
10e00 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e           psp->in
10e10 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
10e20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
10e30 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74   if( strcmp(x,"t
10e40 6f 6b 65 6e 5f 74 79 70 65 22 29 3d 3d 30 20 29  oken_type")==0 )
10e50 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
10e60 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
10e70 28 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 74  (psp->gp->tokent
10e80 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ype);.          
10e90 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d  psp->insertLineM
10ea0 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  acro = 0;.      
10eb0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
10ec0 6d 70 28 78 2c 22 64 65 66 61 75 6c 74 5f 74 79  mp(x,"default_ty
10ed0 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pe")==0 ){.     
10ee0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10ef0 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10f00 70 2d 3e 76 61 72 74 79 70 65 29 3b 0a 20 20 20  p->vartype);.   
10f10 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
10f20 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b  rtLineMacro = 0;
10f30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
10f40 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61  f( strcmp(x,"sta
10f50 63 6b 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a  ck_size")==0 ){.
10f60 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
10f70 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
10f80 73 70 2d 3e 67 70 2d 3e 73 74 61 63 6b 73 69 7a  sp->gp->stacksiz
10f90 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  e);.          ps
10fa0 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
10fb0 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
10fc0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10fd0 28 78 2c 22 73 74 61 72 74 5f 73 79 6d 62 6f 6c  (x,"start_symbol
10fe0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10ff0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
11000 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
11010 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20  >start);.       
11020 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
11030 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20  neMacro = 0;.   
11040 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
11050 74 72 63 6d 70 28 78 2c 22 6c 65 66 74 22 29 3d  trcmp(x,"left")=
11060 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11070 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72  psp->preccounter
11080 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
11090 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 4c  p->declassoc = L
110a0 45 46 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70  EFT;.          p
110b0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
110c0 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
110d0 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20  CE_SYMBOL;.     
110e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
110f0 63 6d 70 28 78 2c 22 72 69 67 68 74 22 29 3d 3d  cmp(x,"right")==
11100 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
11110 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b  sp->preccounter+
11120 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  +;.          psp
11130 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 52 49  ->declassoc = RI
11140 47 48 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70  GHT;.          p
11150 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
11160 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
11170 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20  CE_SYMBOL;.     
11180 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
11190 63 6d 70 28 78 2c 22 6e 6f 6e 61 73 73 6f 63 22  cmp(x,"nonassoc"
111a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
111b0 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74    psp->preccount
111c0 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  er++;.          
111d0 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d  psp->declassoc =
111e0 20 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 20   NONE;.         
111f0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
11200 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44  ITING_FOR_PRECED
11210 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65  ENCE_SYMBOL;..}e
11220 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
11230 2c 22 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d  ,"destructor")==
11240 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
11250 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
11260 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54  ING_FOR_DESTRUCT
11270 4f 52 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73  OR_SYMBOL;..}els
11280 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
11290 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  type")==0 ){.   
112a0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
112b0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
112c0 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3b  DATATYPE_SYMBOL;
112d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
112e0 66 28 20 73 74 72 63 6d 70 28 78 2c 22 66 61 6c  f( strcmp(x,"fal
112f0 6c 62 61 63 6b 22 29 3d 3d 30 20 29 7b 0a 20 20  lback")==0 ){.  
11300 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66 61 6c          psp->fal
11310 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20  lback = 0;.     
11320 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11330 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41  = WAITING_FOR_FA
11340 4c 4c 42 41 43 4b 5f 49 44 3b 0a 20 20 20 20 20  LLBACK_ID;.     
11350 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
11360 63 6d 70 28 78 2c 22 77 69 6c 64 63 61 72 64 22  cmp(x,"wildcard"
11370 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
11380 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
11390 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43  AITING_FOR_WILDC
113a0 41 52 44 5f 49 44 3b 0a 20 20 20 20 20 20 20 20  ARD_ID;.        
113b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
113c0 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
113d0 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
113e0 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
113f0 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20 64        "Unknown d
11400 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f  eclaration keywo
11410 72 64 3a 20 5c 22 25 25 25 73 5c 22 2e 22 2c 78  rd: \"%%%s\".",x
11420 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
11430 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
11440 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11450 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
11460 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  R_DECL_ERROR;..}
11470 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11480 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11490 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
114a0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
114b0 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61           "Illega
114c0 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65  l declaration ke
114d0 79 77 6f 72 64 3a 20 5c 22 25 73 5c 22 2e 22 2c  yword: \"%s\".",
114e0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
114f0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11500 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11510 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
11520 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
11530 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
11540 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
11550 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f  _FOR_DESTRUCTOR_
11560 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66  SYMBOL:.      if
11570 28 20 21 69 73 61 6c 70 68 61 28 78 5b 30 5d 29  ( !isalpha(x[0])
11580 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
11590 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
115a0 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
115b0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
115c0 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73  Symbol name miss
115d0 69 6e 67 20 61 66 74 65 72 20 25 64 65 73 74 72  ing after %destr
115e0 75 63 74 6f 72 20 6b 65 79 77 6f 72 64 22 29 3b  uctor keyword");
115f0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
11600 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
11610 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
11620 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
11630 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
11640 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72  lse{.        str
11650 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
11660 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
11670 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
11680 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e  largslot = &sp->
11690 64 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 20 20  destructor;.    
116a0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e      psp->decllin
116b0 65 6e 6f 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64  enoslot = &sp->d
116c0 65 73 74 4c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20  estLineno;.     
116d0 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
116e0 6e 65 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20 20  neMacro = 1;.   
116f0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11700 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
11710 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 7d 0a  CL_ARG;.      }.
11720 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11730 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
11740 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f  R_DATATYPE_SYMBO
11750 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  L:.      if( !is
11760 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20  alpha(x[0]) ){. 
11770 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
11780 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
11790 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
117a0 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f            "Symbo
117b0 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61  l name missing a
117c0 66 74 65 72 20 25 64 65 73 74 72 75 63 74 6f 72  fter %destructor
117d0 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20   keyword");.    
117e0 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
117f0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
11800 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
11810 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
11820 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
11830 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
11840 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62  ymbol *sp = Symb
11850 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
11860 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
11870 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 61 74 61 74  lot = &sp->datat
11880 79 70 65 3b 0a 20 20 20 20 20 20 20 20 70 73 70  ype;.        psp
11890 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
118a0 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  o = 0;.        p
118b0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
118c0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47  ING_FOR_DECL_ARG
118d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
118e0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
118f0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43  WAITING_FOR_PREC
11900 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3a 0a 20  EDENCE_SYMBOL:. 
11910 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
11920 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  .' ){.        ps
11930 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
11940 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
11950 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
11960 20 69 66 28 20 69 73 75 70 70 65 72 28 78 5b 30   if( isupper(x[0
11970 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  ]) ){.        st
11980 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
11990 0a 20 20 20 20 20 20 20 20 73 70 20 3d 20 53 79  .        sp = Sy
119a0 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
119b0 20 20 20 20 20 69 66 28 20 73 70 2d 3e 70 72 65       if( sp->pre
119c0 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c>=0 ){.        
119d0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
119e0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
119f0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
11a00 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 5c         "Symbol \
11a10 22 25 73 5c 22 20 68 61 73 20 61 6c 72 65 61 64  "%s\" has alread
11a20 79 20 62 65 20 67 69 76 65 6e 20 61 20 70 72 65  y be given a pre
11a30 63 65 64 65 6e 63 65 2e 22 2c 78 29 3b 0a 20 20  cedence.",x);.  
11a40 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
11a50 6f 72 63 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65 7b  orcnt++;..}else{
11a60 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 70  .          sp->p
11a70 72 65 63 20 3d 20 70 73 70 2d 3e 70 72 65 63 63  rec = psp->precc
11a80 6f 75 6e 74 65 72 3b 0a 20 20 20 20 20 20 20 20  ounter;.        
11a90 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20 70 73    sp->assoc = ps
11aa0 70 2d 3e 64 65 63 6c 61 73 73 6f 63 3b 0a 09 7d  p->declassoc;..}
11ab0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11ac0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11ad0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
11ae0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
11af0 20 20 20 20 20 20 20 20 20 22 43 61 6e 27 74 20           "Can't 
11b00 61 73 73 69 67 6e 20 61 20 70 72 65 63 65 64 65  assign a precede
11b10 6e 63 65 20 74 6f 20 5c 22 25 73 5c 22 2e 22 2c  nce to \"%s\".",
11b20 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
11b30 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11b40 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
11b50 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  ;.    case WAITI
11b60 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3a  NG_FOR_DECL_ARG:
11b70 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
11b80 3d 27 7b 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c  ='{' || x[0]=='\
11b90 22 27 20 7c 7c 20 69 73 61 6c 6e 75 6d 28 78 5b  "' || isalnum(x[
11ba0 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  0]) ){.        c
11bb0 68 61 72 20 2a 7a 4f 6c 64 2c 20 2a 7a 4e 65 77  har *zOld, *zNew
11bc0 2c 20 2a 7a 42 75 66 2c 20 2a 7a 3b 0a 20 20 20  , *zBuf, *z;.   
11bd0 20 20 20 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 6e       int nOld, n
11be0 2c 20 6e 4c 69 6e 65 2c 20 6e 4e 65 77 2c 20 6e  , nLine, nNew, n
11bf0 42 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e  Back;.        in
11c00 74 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 3b 0a  t addLineMacro;.
11c10 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 4c 69          char zLi
11c20 6e 65 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20  ne[50];.        
11c30 7a 4e 65 77 20 3d 20 78 3b 0a 20 20 20 20 20 20  zNew = x;.      
11c40 20 20 69 66 28 20 7a 4e 65 77 5b 30 5d 3d 3d 27    if( zNew[0]=='
11c50 22 27 20 7c 7c 20 7a 4e 65 77 5b 30 5d 3d 3d 27  "' || zNew[0]=='
11c60 7b 27 20 29 20 7a 4e 65 77 2b 2b 3b 0a 20 20 20  {' ) zNew++;.   
11c70 20 20 20 20 20 6e 4e 65 77 20 3d 20 6c 65 6d 6f       nNew = lemo
11c80 6e 53 74 72 6c 65 6e 28 7a 4e 65 77 29 3b 0a 20  nStrlen(zNew);. 
11c90 20 20 20 20 20 20 20 69 66 28 20 2a 70 73 70 2d         if( *psp-
11ca0 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 29 7b 0a  >declargslot ){.
11cb0 20 20 20 20 20 20 20 20 20 20 7a 4f 6c 64 20 3d            zOld =
11cc0 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c   *psp->declargsl
11cd0 6f 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ot;.        }els
11ce0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c  e{.          zOl
11cf0 64 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  d = "";.        
11d00 7d 0a 20 20 20 20 20 20 20 20 6e 4f 6c 64 20 3d  }.        nOld =
11d10 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4f 6c   lemonStrlen(zOl
11d20 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20  d);.        n = 
11d30 6e 4f 6c 64 20 2b 20 6e 4e 65 77 20 2b 20 32 30  nOld + nNew + 20
11d40 3b 0a 20 20 20 20 20 20 20 20 61 64 64 4c 69 6e  ;.        addLin
11d50 65 4d 61 63 72 6f 20 3d 20 21 70 73 70 2d 3e 67  eMacro = !psp->g
11d60 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  p->nolinenosflag
11d70 20 26 26 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c   && psp->insertL
11d80 69 6e 65 4d 61 63 72 6f 20 26 26 0a 20 20 20 20  ineMacro &&.    
11d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11da0 20 20 20 20 28 70 73 70 2d 3e 64 65 63 6c 6c 69      (psp->declli
11db0 6e 65 6e 6f 73 6c 6f 74 3d 3d 30 20 7c 7c 20 70  nenoslot==0 || p
11dc0 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c  sp->decllinenosl
11dd0 6f 74 5b 30 5d 21 3d 30 29 3b 0a 20 20 20 20 20  ot[0]!=0);.     
11de0 20 20 20 69 66 28 20 61 64 64 4c 69 6e 65 4d 61     if( addLineMa
11df0 63 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  cro ){.         
11e00 20 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65   for(z=psp->file
11e10 6e 61 6d 65 2c 20 6e 42 61 63 6b 3d 30 3b 20 2a  name, nBack=0; *
11e20 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  z; z++){.       
11e30 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c       if( *z=='\\
11e40 27 20 29 20 6e 42 61 63 6b 2b 2b 3b 0a 20 20 20  ' ) nBack++;.   
11e50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11e60 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65     sprintf(zLine
11e70 2c 20 22 23 6c 69 6e 65 20 25 64 20 22 2c 20 70  , "#line %d ", p
11e80 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 29  sp->tokenlineno)
11e90 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e  ;.          nLin
11ea0 65 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  e = lemonStrlen(
11eb0 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  zLine);.        
11ec0 20 20 6e 20 2b 3d 20 6e 4c 69 6e 65 20 2b 20 6c    n += nLine + l
11ed0 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 73 70 2d 3e  emonStrlen(psp->
11ee0 66 69 6c 65 6e 61 6d 65 29 20 2b 20 6e 42 61 63  filename) + nBac
11ef0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
11f00 20 20 20 20 20 2a 70 73 70 2d 3e 64 65 63 6c 61       *psp->decla
11f10 72 67 73 6c 6f 74 20 3d 20 7a 42 75 66 20 3d 20  rgslot = zBuf = 
11f20 72 65 61 6c 6c 6f 63 28 2a 70 73 70 2d 3e 64 65  realloc(*psp->de
11f30 63 6c 61 72 67 73 6c 6f 74 2c 20 6e 29 3b 0a 20  clargslot, n);. 
11f40 20 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 6e         zBuf += n
11f50 4f 6c 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Old;.        if(
11f60 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 20 29 7b   addLineMacro ){
11f70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
11f80 4f 6c 64 20 26 26 20 7a 42 75 66 5b 2d 31 5d 21  Old && zBuf[-1]!
11f90 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\n' ){.       
11fa0 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
11fb0 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20   '\n';.         
11fc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
11fd0 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c  cpy(zBuf, zLine,
11fe0 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20   nLine);.       
11ff0 20 20 20 7a 42 75 66 20 2b 3d 20 6e 4c 69 6e 65     zBuf += nLine
12000 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42  ;.          *(zB
12010 75 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20  uf++) = '"';.   
12020 20 20 20 20 20 20 20 66 6f 72 28 7a 3d 70 73 70         for(z=psp
12030 2d 3e 66 69 6c 65 6e 61 6d 65 3b 20 2a 7a 3b 20  ->filename; *z; 
12040 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  z++){.          
12050 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20 29    if( *z=='\\' )
12060 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
12070 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 5c 27  *(zBuf++) = '\\'
12080 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
12090 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42              *(zB
120a0 75 66 2b 2b 29 20 3d 20 2a 7a 3b 0a 20 20 20 20  uf++) = *z;.    
120b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
120c0 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 22    *(zBuf++) = '"
120d0 27 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a  ';.          *(z
120e0 42 75 66 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a 20  Buf++) = '\n';. 
120f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12100 20 69 66 28 20 70 73 70 2d 3e 64 65 63 6c 6c 69   if( psp->declli
12110 6e 65 6e 6f 73 6c 6f 74 20 26 26 20 70 73 70 2d  nenoslot && psp-
12120 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b  >decllinenoslot[
12130 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0]==0 ){.       
12140 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65     psp->declline
12150 6e 6f 73 6c 6f 74 5b 30 5d 20 3d 20 70 73 70 2d  noslot[0] = psp-
12160 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20  >tokenlineno;.  
12170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12180 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4e 65  memcpy(zBuf, zNe
12190 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20  w, nNew);.      
121a0 20 20 7a 42 75 66 20 2b 3d 20 6e 4e 65 77 3b 0a    zBuf += nNew;.
121b0 20 20 20 20 20 20 20 20 2a 7a 42 75 66 20 3d 20          *zBuf = 
121c0 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
121d0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
121e0 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
121f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12200 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
12210 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
12220 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
12230 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67            "Illeg
12240 61 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 25  al argument to %
12250 25 25 73 3a 20 25 73 22 2c 70 73 70 2d 3e 64 65  %%s: %s",psp->de
12260 63 6c 6b 65 79 77 6f 72 64 2c 78 29 3b 0a 20 20  clkeyword,x);.  
12270 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
12280 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
12290 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
122a0 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
122b0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
122c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
122d0 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46  se WAITING_FOR_F
122e0 41 4c 4c 42 41 43 4b 5f 49 44 3a 0a 20 20 20 20  ALLBACK_ID:.    
122f0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
12300 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
12310 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
12320 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
12330 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
12340 28 20 21 69 73 75 70 70 65 72 28 78 5b 30 5d 29  ( !isupper(x[0])
12350 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
12360 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
12370 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
12380 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
12390 22 25 25 66 61 6c 6c 62 61 63 6b 20 61 72 67 75  "%%fallback argu
123a0 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75  ment \"%s\" shou
123b0 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20  ld be a token", 
123c0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
123d0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
123e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
123f0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
12400 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  *sp = Symbol_new
12410 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (x);.        if(
12420 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d   psp->fallback==
12430 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
12440 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 73  sp->fallback = s
12450 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
12460 20 69 66 28 20 73 70 2d 3e 66 61 6c 6c 62 61 63   if( sp->fallbac
12470 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  k ){.          E
12480 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
12490 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65  ename, psp->toke
124a0 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
124b0 20 20 20 20 20 22 4d 6f 72 65 20 74 68 61 6e 20       "More than 
124c0 6f 6e 65 20 66 61 6c 6c 62 61 63 6b 20 61 73 73  one fallback ass
124d0 69 67 6e 65 64 20 74 6f 20 74 6f 6b 65 6e 20 25  igned to token %
124e0 73 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  s", x);.        
124f0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
12500 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
12510 7b 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e  {.          sp->
12520 66 61 6c 6c 62 61 63 6b 20 3d 20 70 73 70 2d 3e  fallback = psp->
12530 66 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20  fallback;.      
12540 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 68 61 73      psp->gp->has
12550 5f 66 61 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  _fallback = 1;. 
12560 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12570 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12580 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
12590 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 3a 0a  OR_WILDCARD_ID:.
125a0 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
125b0 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '.' ){.        p
125c0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
125d0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
125e0 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RULE;.      }els
125f0 65 20 69 66 28 20 21 69 73 75 70 70 65 72 28 78  e if( !isupper(x
12600 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
12610 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
12620 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b  lename, psp->tok
12630 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
12640 20 20 20 20 22 25 25 77 69 6c 64 63 61 72 64 20      "%%wildcard 
12650 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20  argument \"%s\" 
12660 73 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65  should be a toke
12670 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  n", x);.        
12680 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
12690 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
126a0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
126b0 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c  bol *sp = Symbol
126c0 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
126d0 20 69 66 28 20 70 73 70 2d 3e 67 70 2d 3e 77 69   if( psp->gp->wi
126e0 6c 64 63 61 72 64 3d 3d 30 20 29 7b 0a 20 20 20  ldcard==0 ){.   
126f0 20 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e         psp->gp->
12700 77 69 6c 64 63 61 72 64 20 3d 20 73 70 3b 0a 20  wildcard = sp;. 
12710 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
12720 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
12730 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  (psp->filename, 
12740 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
12750 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 45  ,.            "E
12760 78 74 72 61 20 77 69 6c 64 63 61 72 64 20 74 6f  xtra wildcard to
12770 20 74 6f 6b 65 6e 3a 20 25 73 22 2c 20 78 29 3b   token: %s", x);
12780 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12790 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
127a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
127b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
127c0 61 73 65 20 52 45 53 59 4e 43 5f 41 46 54 45 52  ase RESYNC_AFTER
127d0 5f 52 55 4c 45 5f 45 52 52 4f 52 3a 0a 2f 2a 20  _RULE_ERROR:./* 
127e0 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
127f0 2e 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20  .' ) psp->state 
12800 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
12810 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 2a 2a 20 20  CL_OR_RULE;.**  
12820 20 20 20 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20      break; */.  
12830 20 20 63 61 73 65 20 52 45 53 59 4e 43 5f 41 46    case RESYNC_AF
12840 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3a 0a  TER_DECL_ERROR:.
12850 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
12860 27 2e 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65  '.' ) psp->state
12870 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
12880 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20  ECL_OR_RULE;.   
12890 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 25 27     if( x[0]=='%'
128a0 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20   ) psp->state = 
128b0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
128c0 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20 20  _KEYWORD;.      
128d0 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  break;.  }.}../*
128e0 20 52 75 6e 20 74 68 65 20 70 72 65 70 72 6f 63   Run the preproc
128f0 65 73 73 6f 72 20 6f 76 65 72 20 74 68 65 20 69  essor over the i
12900 6e 70 75 74 20 66 69 6c 65 20 74 65 78 74 2e 20  nput file text. 
12910 20 54 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   The global vari
12920 61 62 6c 65 73 0a 2a 2a 20 61 7a 44 65 66 69 6e  ables.** azDefin
12930 65 5b 30 5d 20 74 68 72 6f 75 67 68 20 61 7a 44  e[0] through azD
12940 65 66 69 6e 65 5b 6e 44 65 66 69 6e 65 2d 31 5d  efine[nDefine-1]
12950 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
12960 6d 65 73 20 6f 66 20 61 6c 6c 20 64 65 66 69 6e  mes of all defin
12970 65 64 0a 2a 2a 20 6d 61 63 72 6f 73 2e 20 20 54  ed.** macros.  T
12980 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
12990 73 20 66 6f 72 20 22 25 69 66 64 65 66 22 20 61  s for "%ifdef" a
129a0 6e 64 20 22 25 69 66 6e 64 65 66 22 20 61 6e 64  nd "%ifndef" and
129b0 20 22 25 65 6e 64 69 66 22 20 61 6e 64 0a 2a 2a   "%endif" and.**
129c0 20 63 6f 6d 6d 65 6e 74 73 20 74 68 65 6d 20 6f   comments them o
129d0 75 74 2e 20 20 54 65 78 74 20 69 6e 20 62 65 74  ut.  Text in bet
129e0 77 65 65 6e 20 69 73 20 61 6c 73 6f 20 63 6f 6d  ween is also com
129f0 6d 65 6e 74 65 64 20 6f 75 74 20 61 73 20 61 70  mented out as ap
12a00 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74  propriate..*/.st
12a10 61 74 69 63 20 76 6f 69 64 20 70 72 65 70 72 6f  atic void prepro
12a20 63 65 73 73 5f 69 6e 70 75 74 28 63 68 61 72 20  cess_input(char 
12a30 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  *z){.  int i, j,
12a40 20 6b 2c 20 6e 3b 0a 20 20 69 6e 74 20 65 78 63   k, n;.  int exc
12a50 6c 75 64 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lude = 0;.  int 
12a60 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74  start = 0;.  int
12a70 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 69   lineno = 1;.  i
12a80 6e 74 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 20  nt start_lineno 
12a90 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 1;.  for(i=0; 
12aa0 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
12ab0 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29  if( z[i]=='\n' )
12ac0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69   lineno++;.    i
12ad0 66 28 20 7a 5b 69 5d 21 3d 27 25 27 20 7c 7c 20  f( z[i]!='%' || 
12ae0 28 69 3e 30 20 26 26 20 7a 5b 69 2d 31 5d 21 3d  (i>0 && z[i-1]!=
12af0 27 5c 6e 27 29 20 29 20 63 6f 6e 74 69 6e 75 65  '\n') ) continue
12b00 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  ;.    if( strncm
12b10 70 28 26 7a 5b 69 5d 2c 22 25 65 6e 64 69 66 22  p(&z[i],"%endif"
12b20 2c 36 29 3d 3d 30 20 26 26 20 69 73 73 70 61 63  ,6)==0 && isspac
12b30 65 28 7a 5b 69 2b 36 5d 29 20 29 7b 0a 20 20 20  e(z[i+6]) ){.   
12b40 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29     if( exclude )
12b50 7b 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75 64  {.        exclud
12b60 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e--;.        if(
12b70 20 65 78 63 6c 75 64 65 3d 3d 30 20 29 7b 0a 20   exclude==0 ){. 
12b80 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 73           for(j=s
12b90 74 61 72 74 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 20  tart; j<i; j++) 
12ba0 69 66 28 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 20 29  if( z[j]!='\n' )
12bb0 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20   z[j] = ' ';.   
12bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12bd0 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b       for(j=i; z[
12be0 6a 5d 20 26 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27  j] && z[j]!='\n'
12bf0 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20  ; j++) z[j] = ' 
12c00 27 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ';.    }else if(
12c10 20 28 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c   (strncmp(&z[i],
12c20 22 25 69 66 64 65 66 22 2c 36 29 3d 3d 30 20 26  "%ifdef",6)==0 &
12c30 26 20 69 73 73 70 61 63 65 28 7a 5b 69 2b 36 5d  & isspace(z[i+6]
12c40 29 29 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  )).          || 
12c50 28 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22  (strncmp(&z[i],"
12c60 25 69 66 6e 64 65 66 22 2c 37 29 3d 3d 30 20 26  %ifndef",7)==0 &
12c70 26 20 69 73 73 70 61 63 65 28 7a 5b 69 2b 37 5d  & isspace(z[i+7]
12c80 29 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  )) ){.      if( 
12c90 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20  exclude ){.     
12ca0 20 20 20 65 78 63 6c 75 64 65 2b 2b 3b 0a 20 20     exclude++;.  
12cb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12cc0 20 20 20 66 6f 72 28 6a 3d 69 2b 37 3b 20 69 73     for(j=i+7; is
12cd0 73 70 61 63 65 28 7a 5b 6a 5d 29 3b 20 6a 2b 2b  space(z[j]); j++
12ce0 29 7b 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ){}.        for(
12cf0 6e 3d 30 3b 20 7a 5b 6a 2b 6e 5d 20 26 26 20 21  n=0; z[j+n] && !
12d00 69 73 73 70 61 63 65 28 7a 5b 6a 2b 6e 5d 29 3b  isspace(z[j+n]);
12d10 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   n++){}.        
12d20 65 78 63 6c 75 64 65 20 3d 20 31 3b 0a 20 20 20  exclude = 1;.   
12d30 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
12d40 6e 44 65 66 69 6e 65 3b 20 6b 2b 2b 29 7b 0a 20  nDefine; k++){. 
12d50 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72           if( str
12d60 6e 63 6d 70 28 61 7a 44 65 66 69 6e 65 5b 6b 5d  ncmp(azDefine[k]
12d70 2c 26 7a 5b 6a 5d 2c 6e 29 3d 3d 30 20 26 26 20  ,&z[j],n)==0 && 
12d80 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 7a 44 65  lemonStrlen(azDe
12d90 66 69 6e 65 5b 6b 5d 29 3d 3d 6e 20 29 7b 0a 20  fine[k])==n ){. 
12da0 20 20 20 20 20 20 20 20 20 20 20 65 78 63 6c 75             exclu
12db0 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
12dc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
12dd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
12de0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
12df0 2b 33 5d 3d 3d 27 6e 27 20 29 20 65 78 63 6c 75  +3]=='n' ) exclu
12e00 64 65 20 3d 20 21 65 78 63 6c 75 64 65 3b 0a 20  de = !exclude;. 
12e10 20 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75         if( exclu
12e20 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
12e30 73 74 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20  start = i;.     
12e40 20 20 20 20 20 73 74 61 72 74 5f 6c 69 6e 65 6e       start_linen
12e50 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20  o = lineno;.    
12e60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
12e70 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a      for(j=i; z[j
12e80 5d 20 26 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b  ] && z[j]!='\n';
12e90 20 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20 27   j++) z[j] = ' '
12ea0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
12eb0 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20  ( exclude ){.   
12ec0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
12ed0 22 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 25 25  "unterminated %%
12ee0 69 66 64 65 66 20 73 74 61 72 74 69 6e 67 20 6f  ifdef starting o
12ef0 6e 20 6c 69 6e 65 20 25 64 5c 6e 22 2c 20 73 74  n line %d\n", st
12f00 61 72 74 5f 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  art_lineno);.   
12f10 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a   exit(1);.  }.}.
12f20 0a 2f 2a 20 49 6e 20 73 70 69 74 65 20 6f 66 20  ./* In spite of 
12f30 69 74 73 20 6e 61 6d 65 2c 20 74 68 69 73 20 66  its name, this f
12f40 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 61 6c 6c  unction is reall
12f50 79 20 61 20 73 63 61 6e 6e 65 72 2e 20 20 49 74  y a scanner.  It
12f60 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
12f70 65 6e 74 69 72 65 20 69 6e 70 75 74 20 66 69 6c  entire input fil
12f80 65 20 28 61 6c 6c 20 61 74 20 6f 6e 63 65 29 20  e (all at once) 
12f90 74 68 65 6e 20 74 6f 6b 65 6e 69 7a 65 73 20 69  then tokenizes i
12fa0 74 2e 20 20 45 61 63 68 0a 2a 2a 20 74 6f 6b 65  t.  Each.** toke
12fb0 6e 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  n is passed to t
12fc0 68 65 20 66 75 6e 63 74 69 6f 6e 20 22 70 61 72  he function "par
12fd0 73 65 6f 6e 65 74 6f 6b 65 6e 22 20 77 68 69 63  seonetoken" whic
12fe0 68 20 62 75 69 6c 64 73 20 61 6c 6c 0a 2a 2a 20  h builds all.** 
12ff0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
13000 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
13010 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c 20 73 74  in the global st
13020 61 74 65 20 76 65 63 74 6f 72 20 22 67 70 22 2e  ate vector "gp".
13030 0a 2a 2f 0a 76 6f 69 64 20 50 61 72 73 65 28 67  .*/.void Parse(g
13040 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
13050 2a 67 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  *gp;.{.  struct 
13060 70 73 74 61 74 65 20 70 73 3b 0a 20 20 46 49 4c  pstate ps;.  FIL
13070 45 20 2a 66 70 3b 0a 20 20 63 68 61 72 20 2a 66  E *fp;.  char *f
13080 69 6c 65 62 75 66 3b 0a 20 20 69 6e 74 20 66 69  ilebuf;.  int fi
13090 6c 65 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 69  lesize;.  int li
130a0 6e 65 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a 20  neno;.  int c;. 
130b0 20 63 68 61 72 20 2a 63 70 2c 20 2a 6e 65 78 74   char *cp, *next
130c0 63 70 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 6c  cp;.  int startl
130d0 69 6e 65 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73  ine = 0;..  mems
130e0 65 74 28 26 70 73 2c 20 27 5c 30 27 2c 20 73 69  et(&ps, '\0', si
130f0 7a 65 6f 66 28 70 73 29 29 3b 0a 20 20 70 73 2e  zeof(ps));.  ps.
13100 67 70 20 3d 20 67 70 3b 0a 20 20 70 73 2e 66 69  gp = gp;.  ps.fi
13110 6c 65 6e 61 6d 65 20 3d 20 67 70 2d 3e 66 69 6c  lename = gp->fil
13120 65 6e 61 6d 65 3b 0a 20 20 70 73 2e 65 72 72 6f  ename;.  ps.erro
13130 72 63 6e 74 20 3d 20 30 3b 0a 20 20 70 73 2e 73  rcnt = 0;.  ps.s
13140 74 61 74 65 20 3d 20 49 4e 49 54 49 41 4c 49 5a  tate = INITIALIZ
13150 45 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62  E;..  /* Begin b
13160 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 69 6e  y reading the in
13170 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 66 70  put file */.  fp
13180 20 3d 20 66 6f 70 65 6e 28 70 73 2e 66 69 6c 65   = fopen(ps.file
13190 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69 66  name,"rb");.  if
131a0 28 20 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 45  ( fp==0 ){.    E
131b0 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e  rrorMsg(ps.filen
131c0 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20 6f 70 65  ame,0,"Can't ope
131d0 6e 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20  n this file for 
131e0 72 65 61 64 69 6e 67 2e 22 29 3b 0a 20 20 20 20  reading.");.    
131f0 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  gp->errorcnt++;.
13200 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
13210 20 20 66 73 65 65 6b 28 66 70 2c 30 2c 32 29 3b    fseek(fp,0,2);
13220 0a 20 20 66 69 6c 65 73 69 7a 65 20 3d 20 66 74  .  filesize = ft
13230 65 6c 6c 28 66 70 29 3b 0a 20 20 72 65 77 69 6e  ell(fp);.  rewin
13240 64 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66  d(fp);.  filebuf
13250 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f   = (char *)mallo
13260 63 28 20 66 69 6c 65 73 69 7a 65 2b 31 20 29 3b  c( filesize+1 );
13270 0a 20 20 69 66 28 20 66 69 6c 65 62 75 66 3d 3d  .  if( filebuf==
13280 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73  0 ){.    ErrorMs
13290 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c  g(ps.filename,0,
132a0 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20  "Can't allocate 
132b0 25 64 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  %d of memory to 
132c0 68 6f 6c 64 20 74 68 69 73 20 66 69 6c 65 2e 22  hold this file."
132d0 2c 0a 20 20 20 20 20 20 66 69 6c 65 73 69 7a 65  ,.      filesize
132e0 2b 31 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72  +1);.    gp->err
132f0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  orcnt++;.    ret
13300 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  urn;.  }.  if( f
13310 72 65 61 64 28 66 69 6c 65 62 75 66 2c 31 2c 66  read(filebuf,1,f
13320 69 6c 65 73 69 7a 65 2c 66 70 29 21 3d 66 69 6c  ilesize,fp)!=fil
13330 65 73 69 7a 65 20 29 7b 0a 20 20 20 20 45 72 72  esize ){.    Err
13340 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d  orMsg(ps.filenam
13350 65 2c 30 2c 22 43 61 6e 27 74 20 72 65 61 64 20  e,0,"Can't read 
13360 69 6e 20 61 6c 6c 20 25 64 20 62 79 74 65 73 20  in all %d bytes 
13370 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a  of this file.",.
13380 20 20 20 20 20 20 66 69 6c 65 73 69 7a 65 29 3b        filesize);
13390 0a 20 20 20 20 66 72 65 65 28 66 69 6c 65 62 75  .    free(filebu
133a0 66 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f  f);.    gp->erro
133b0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  rcnt++;.    retu
133c0 72 6e 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  rn;.  }.  fclose
133d0 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 5b  (fp);.  filebuf[
133e0 66 69 6c 65 73 69 7a 65 5d 20 3d 20 30 3b 0a 0a  filesize] = 0;..
133f0 20 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 69 6e 69    /* Make an ini
13400 74 69 61 6c 20 70 61 73 73 20 74 68 72 6f 75 67  tial pass throug
13410 68 20 74 68 65 20 66 69 6c 65 20 74 6f 20 68 61  h the file to ha
13420 6e 64 6c 65 20 25 69 66 64 65 66 20 61 6e 64 20  ndle %ifdef and 
13430 25 69 66 6e 64 65 66 20 2a 2f 0a 20 20 70 72 65  %ifndef */.  pre
13440 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 66 69  process_input(fi
13450 6c 65 62 75 66 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  lebuf);..  /* No
13460 77 20 73 63 61 6e 20 74 68 65 20 74 65 78 74 20  w scan the text 
13470 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  of the input fil
13480 65 20 2a 2f 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20  e */.  lineno = 
13490 31 3b 0a 20 20 66 6f 72 28 63 70 3d 66 69 6c 65  1;.  for(cp=file
134a0 62 75 66 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30  buf; (c= *cp)!=0
134b0 3b 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ; ){.    if( c==
134c0 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
134d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
134e0 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
134f0 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a  he line number *
13500 2f 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63  /.    if( isspac
13510 65 28 63 29 20 29 7b 20 63 70 2b 2b 3b 20 63 6f  e(c) ){ cp++; co
13520 6e 74 69 6e 75 65 3b 20 7d 20 20 2f 2a 20 53 6b  ntinue; }  /* Sk
13530 69 70 20 61 6c 6c 20 77 68 69 74 65 20 73 70 61  ip all white spa
13540 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d  ce */.    if( c=
13550 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='/' && cp[1]=='
13560 2f 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f  /' ){          /
13570 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65  * Skip C++ style
13580 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   comments */.   
13590 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20     cp+=2;.      
135a0 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
135b0 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20  =0 && c!='\n' ) 
135c0 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74  cp++;.      cont
135d0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
135e0 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70  if( c=='/' && cp
135f0 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 20 20 20  [1]=='*' ){     
13600 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 20 73       /* Skip C s
13610 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f  tyle comments */
13620 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20  .      cp+=2;.  
13630 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a      while( (c= *
13640 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d 27 2f  cp)!=0 && (c!='/
13650 27 20 7c 7c 20 63 70 5b 2d 31 5d 21 3d 27 2a 27  ' || cp[-1]!='*'
13660 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
13670 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e   c=='\n' ) linen
13680 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 70 2b  o++;.        cp+
13690 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
136a0 20 69 66 28 20 63 20 29 20 63 70 2b 2b 3b 0a 20   if( c ) cp++;. 
136b0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
136c0 20 20 20 7d 0a 20 20 20 20 70 73 2e 74 6f 6b 65     }.    ps.toke
136d0 6e 73 74 61 72 74 20 3d 20 63 70 3b 20 20 20 20  nstart = cp;    
136e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
136f0 61 72 6b 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ark the beginnin
13700 67 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 2a  g of the token *
13710 2f 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e 6c 69  /.    ps.tokenli
13720 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 20 20  neno = lineno;  
13730 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
13740 6e 75 6d 62 65 72 20 6f 6e 20 77 68 69 63 68 20  number on which 
13750 74 6f 6b 65 6e 20 62 65 67 69 6e 73 20 2a 2f 0a  token begins */.
13760 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 22 27 20      if( c=='\"' 
13770 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
13780 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67         /* String
13790 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20   literals */.   
137a0 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 77     cp++;.      w
137b0 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d  hile( (c= *cp)!=
137c0 30 20 26 26 20 63 21 3d 27 5c 22 27 20 29 7b 0a  0 && c!='\"' ){.
137d0 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
137e0 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n' ) lineno++;.
137f0 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20          cp++;.  
13800 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13810 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
13820 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65  ErrorMsg(ps.file
13830 6e 61 6d 65 2c 73 74 61 72 74 6c 69 6e 65 2c 0a  name,startline,.
13840 22 53 74 72 69 6e 67 20 73 74 61 72 74 69 6e 67  "String starting
13850 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73   on this line is
13860 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20   not terminated 
13870 62 65 66 6f 72 65 20 74 68 65 20 65 6e 64 20 6f  before the end o
13880 66 20 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20  f the file.");. 
13890 20 20 20 20 20 20 20 70 73 2e 65 72 72 6f 72 63         ps.errorc
138a0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65  nt++;.        ne
138b0 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 20  xtcp = cp;.     
138c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
138d0 6e 65 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20  nextcp = cp+1;. 
138e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
138f0 20 69 66 28 20 63 3d 3d 27 7b 27 20 29 7b 20 20   if( c=='{' ){  
13900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13910 41 20 62 6c 6f 63 6b 20 6f 66 20 43 20 63 6f 64  A block of C cod
13920 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c  e */.      int l
13930 65 76 65 6c 3b 0a 20 20 20 20 20 20 63 70 2b 2b  evel;.      cp++
13940 3b 0a 20 20 20 20 20 20 66 6f 72 28 6c 65 76 65  ;.      for(leve
13950 6c 3d 31 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30  l=1; (c= *cp)!=0
13960 20 26 26 20 28 6c 65 76 65 6c 3e 31 20 7c 7c 20   && (level>1 || 
13970 63 21 3d 27 7d 27 29 3b 20 63 70 2b 2b 29 7b 0a  c!='}'); cp++){.
13980 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
13990 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n' ) lineno++;.
139a0 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
139b0 20 63 3d 3d 27 7b 27 20 29 20 6c 65 76 65 6c 2b   c=='{' ) level+
139c0 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20  +;.        else 
139d0 69 66 28 20 63 3d 3d 27 7d 27 20 29 20 6c 65 76  if( c=='}' ) lev
139e0 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20 65 6c  el--;.        el
139f0 73 65 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26  se if( c=='/' &&
13a00 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20   cp[1]=='*' ){  
13a10 2f 2a 20 53 6b 69 70 20 63 6f 6d 6d 65 6e 74 73  /* Skip comments
13a20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
13a30 74 20 70 72 65 76 63 3b 0a 20 20 20 20 20 20 20  t prevc;.       
13a40 20 20 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a     cp = &cp[2];.
13a50 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63 20            prevc 
13a60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 77  = 0;.          w
13a70 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d  hile( (c= *cp)!=
13a80 30 20 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20  0 && (c!='/' || 
13a90 70 72 65 76 63 21 3d 27 2a 27 29 20 29 7b 0a 20  prevc!='*') ){. 
13aa0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
13ab0 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
13ac0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  +;.            p
13ad0 72 65 76 63 20 3d 20 63 3b 0a 20 20 20 20 20 20  revc = c;.      
13ae0 20 20 20 20 20 20 63 70 2b 2b 3b 0a 09 20 20 7d        cp++;..  }
13af0 0a 09 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27  ..}else if( c=='
13b00 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27  /' && cp[1]=='/'
13b10 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b   ){  /* Skip C++
13b20 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20   style comments 
13b30 74 6f 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  too */.         
13b40 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20   cp = &cp[2];.  
13b50 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
13b60 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21  c= *cp)!=0 && c!
13b70 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20  ='\n' ) cp++;.  
13b80 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 20          if( c ) 
13b90 6c 69 6e 65 6e 6f 2b 2b 3b 0a 09 7d 65 6c 73 65  lineno++;..}else
13ba0 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c 20   if( c=='\'' || 
13bb0 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 2f 2a  c=='\"' ){    /*
13bc0 20 53 74 72 69 6e 67 20 61 20 63 68 61 72 61 63   String a charac
13bd0 74 65 72 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a  ter literals */.
13be0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 73 74            int st
13bf0 61 72 74 63 68 61 72 2c 20 70 72 65 76 63 3b 0a  artchar, prevc;.
13c00 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 63            startc
13c10 68 61 72 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  har = c;.       
13c20 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20     prevc = 0;.  
13c30 20 20 20 20 20 20 20 20 66 6f 72 28 63 70 2b 2b          for(cp++
13c40 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ; (c= *cp)!=0 &&
13c50 20 28 63 21 3d 73 74 61 72 74 63 68 61 72 20 7c   (c!=startchar |
13c60 7c 20 70 72 65 76 63 3d 3d 27 5c 5c 27 29 3b 20  | prevc=='\\'); 
13c70 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  cp++){.         
13c80 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
13c90 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
13ca0 20 20 20 20 20 20 20 69 66 28 20 70 72 65 76 63         if( prevc
13cb0 3d 3d 27 5c 5c 27 20 29 20 70 72 65 76 63 20 3d  =='\\' ) prevc =
13cc0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
13cd0 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
13ce0 20 20 70 72 65 76 63 20 3d 20 63 3b 0a 09 20 20    prevc = c;..  
13cf0 7d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20  }..}.      }.   
13d00 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
13d10 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
13d20 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 70 73 2e 74  ps.filename,ps.t
13d30 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20 63  okenlineno,."C c
13d40 6f 64 65 20 73 74 61 72 74 69 6e 67 20 6f 6e 20  ode starting on 
13d50 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74  this line is not
13d60 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f   terminated befo
13d70 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  re the end of th
13d80 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20  e file.");.     
13d90 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b     ps.errorcnt++
13da0 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70  ;.        nextcp
13db0 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c   = cp;.      }el
13dc0 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74  se{.        next
13dd0 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20  cp = cp+1;.     
13de0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
13df0 20 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b 20 20   isalnum(c) ){  
13e00 20 20 20 20 20 20 20 20 2f 2a 20 49 64 65 6e 74          /* Ident
13e10 69 66 69 65 72 73 20 2a 2f 0a 20 20 20 20 20 20  ifiers */.      
13e20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
13e30 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 63  =0 && (isalnum(c
13e40 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63  ) || c=='_') ) c
13e50 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63  p++;.      nextc
13e60 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73  p = cp;.    }els
13e70 65 20 69 66 28 20 63 3d 3d 27 3a 27 20 26 26 20  e if( c==':' && 
13e80 63 70 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 63 70  cp[1]==':' && cp
13e90 5b 32 5d 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20 54  [2]=='=' ){ /* T
13ea0 68 65 20 6f 70 65 72 61 74 6f 72 20 22 3a 3a 3d  he operator "::=
13eb0 22 20 2a 2f 0a 20 20 20 20 20 20 63 70 20 2b 3d  " */.      cp +=
13ec0 20 33 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70   3;.      nextcp
13ed0 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65   = cp;.    }else
13ee0 20 69 66 28 20 28 63 3d 3d 27 2f 27 20 7c 7c 20   if( (c=='/' || 
13ef0 63 3d 3d 27 7c 27 29 20 26 26 20 69 73 61 6c 70  c=='|') && isalp
13f00 68 61 28 63 70 5b 31 5d 29 20 29 7b 0a 20 20 20  ha(cp[1]) ){.   
13f10 20 20 20 63 70 20 2b 3d 20 32 3b 0a 20 20 20 20     cp += 2;.    
13f20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 63    while( (c = *c
13f30 70 29 21 3d 30 20 26 26 20 28 69 73 61 6c 6e 75  p)!=0 && (isalnu
13f40 6d 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20  m(c) || c=='_') 
13f50 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65  ) cp++;.      ne
13f60 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d  xtcp = cp;.    }
13f70 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
13f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13f90 2a 20 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65  * All other (one
13fa0 20 63 68 61 72 61 63 74 65 72 29 20 6f 70 65 72   character) oper
13fb0 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 63  ators */.      c
13fc0 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63  p++;.      nextc
13fd0 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20  p = cp;.    }.  
13fe0 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a    c = *cp;.    *
13ff0 63 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  cp = 0;         
14000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14010 2a 20 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65  * Null terminate
14020 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20   the token */.  
14030 20 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28    parseonetoken(
14040 26 70 73 29 3b 20 20 20 20 20 20 20 20 20 20 20  &ps);           
14050 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 74    /* Parse the t
14060 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20  oken */.    *cp 
14070 3d 20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  = c;            
14080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14090 65 73 74 6f 72 65 20 74 68 65 20 62 75 66 66 65  estore the buffe
140a0 72 20 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65  r */.    cp = ne
140b0 78 74 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65  xtcp;.  }.  free
140c0 28 66 69 6c 65 62 75 66 29 3b 20 20 20 20 20 20  (filebuf);      
140d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
140e0 20 52 65 6c 65 61 73 65 20 74 68 65 20 62 75 66   Release the buf
140f0 66 65 72 20 61 66 74 65 72 20 70 61 72 73 69 6e  fer after parsin
14100 67 20 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20  g */.  gp->rule 
14110 3d 20 70 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a  = ps.firstrule;.
14120 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d    gp->errorcnt =
14130 20 70 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a   ps.errorcnt;.}.
14140 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
14150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
14160 6d 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69 6e  m the file "plin
14170 6b 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  k.c" ***********
14180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
14190 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65  * Routines proce
141a0 73 73 69 6e 67 20 63 6f 6e 66 69 67 75 72 61 74  ssing configurat
141b0 69 6f 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70  ion follow-set p
141c0 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73  ropagation links
141d0 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e  .** in the LEMON
141e0 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
141f0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  r..*/.static str
14200 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b  uct plink *plink
14210 5f 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a  _freelist = 0;..
14220 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
14230 77 20 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63  w plink */.struc
14240 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e  t plink *Plink_n
14250 65 77 28 29 7b 0a 20 20 73 74 72 75 63 74 20 70  ew(){.  struct p
14260 6c 69 6e 6b 20 2a 6e 65 77 3b 0a 0a 20 20 69 66  link *new;..  if
14270 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74  ( plink_freelist
14280 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
14290 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20  ;.    int amt = 
142a0 31 30 30 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66  100;.    plink_f
142b0 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63  reelist = (struc
142c0 74 20 70 6c 69 6e 6b 20 2a 29 63 61 6c 6c 6f 63  t plink *)calloc
142d0 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74  ( amt, sizeof(st
142e0 72 75 63 74 20 70 6c 69 6e 6b 29 20 29 3b 0a 20  ruct plink) );. 
142f0 20 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65     if( plink_fre
14300 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
14310 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
14320 2c 0a 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20  ,.      "Unable 
14330 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
14340 72 79 20 66 6f 72 20 61 20 6e 65 77 20 66 6f 6c  ry for a new fol
14350 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74  low-set propagat
14360 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20  ion link.\n");. 
14370 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
14380 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
14390 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 70   i<amt-1; i++) p
143a0 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 5d  link_freelist[i]
143b0 2e 6e 65 78 74 20 3d 20 26 70 6c 69 6e 6b 5f 66  .next = &plink_f
143c0 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20  reelist[i+1];.  
143d0 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74    plink_freelist
143e0 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30  [amt-1].next = 0
143f0 3b 0a 20 20 7d 0a 20 20 6e 65 77 20 3d 20 70 6c  ;.  }.  new = pl
14400 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20  ink_freelist;.  
14410 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d  plink_freelist =
14420 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 2d   plink_freelist-
14430 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20  >next;.  return 
14440 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61  new;.}../* Add a
14450 20 70 6c 69 6e 6b 20 74 6f 20 61 20 70 6c 69 6e   plink to a plin
14460 6b 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50  k list */.void P
14470 6c 69 6e 6b 5f 61 64 64 28 70 6c 70 70 2c 63 66  link_add(plpp,cf
14480 70 29 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  p).struct plink 
14490 2a 2a 70 6c 70 70 3b 0a 73 74 72 75 63 74 20 63  **plpp;.struct c
144a0 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20  onfig *cfp;.{.  
144b0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
144c0 77 3b 0a 20 20 6e 65 77 20 3d 20 50 6c 69 6e 6b  w;.  new = Plink
144d0 5f 6e 65 77 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e  _new();.  new->n
144e0 65 78 74 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a  ext = *plpp;.  *
144f0 70 6c 70 70 20 3d 20 6e 65 77 3b 0a 20 20 6e 65  plpp = new;.  ne
14500 77 2d 3e 63 66 70 20 3d 20 63 66 70 3b 0a 7d 0a  w->cfp = cfp;.}.
14510 0a 2f 2a 20 54 72 61 6e 73 66 65 72 20 65 76 65  ./* Transfer eve
14520 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20  ry plink on the 
14530 6c 69 73 74 20 22 66 72 6f 6d 22 20 74 6f 20 74  list "from" to t
14540 68 65 20 6c 69 73 74 20 22 74 6f 22 20 2a 2f 0a  he list "to" */.
14550 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28  void Plink_copy(
14560 74 6f 2c 66 72 6f 6d 29 0a 73 74 72 75 63 74 20  to,from).struct 
14570 70 6c 69 6e 6b 20 2a 2a 74 6f 3b 0a 73 74 72 75  plink **to;.stru
14580 63 74 20 70 6c 69 6e 6b 20 2a 66 72 6f 6d 3b 0a  ct plink *from;.
14590 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  {.  struct plink
145a0 20 2a 6e 65 78 74 70 6c 3b 0a 20 20 77 68 69 6c   *nextpl;.  whil
145b0 65 28 20 66 72 6f 6d 20 29 7b 0a 20 20 20 20 6e  e( from ){.    n
145c0 65 78 74 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65  extpl = from->ne
145d0 78 74 3b 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e 65  xt;.    from->ne
145e0 78 74 20 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a 74  xt = *to;.    *t
145f0 6f 20 3d 20 66 72 6f 6d 3b 0a 20 20 20 20 66 72  o = from;.    fr
14600 6f 6d 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d  om = nextpl;.  }
14610 0a 7d 0a 0a 2f 2a 20 44 65 6c 65 74 65 20 65 76  .}../* Delete ev
14620 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65  ery plink on the
14630 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c   list */.void Pl
14640 69 6e 6b 5f 64 65 6c 65 74 65 28 70 6c 70 29 0a  ink_delete(plp).
14650 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c  struct plink *pl
14660 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c  p;.{.  struct pl
14670 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20  ink *nextpl;..  
14680 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20  while( plp ){.  
14690 20 20 6e 65 78 74 70 6c 20 3d 20 70 6c 70 2d 3e    nextpl = plp->
146a0 6e 65 78 74 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e  next;.    plp->n
146b0 65 78 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65  ext = plink_free
146c0 6c 69 73 74 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f  list;.    plink_
146d0 66 72 65 65 6c 69 73 74 20 3d 20 70 6c 70 3b 0a  freelist = plp;.
146e0 20 20 20 20 70 6c 70 20 3d 20 6e 65 78 74 70 6c      plp = nextpl
146f0 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  ;.  }.}./*******
14700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14710 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
14720 72 65 70 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  report.c" ******
14730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14740 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  ****/./*.** Proc
14750 65 64 75 72 65 73 20 66 6f 72 20 67 65 6e 65 72  edures for gener
14760 61 74 69 6e 67 20 72 65 70 6f 72 74 73 20 61 6e  ating reports an
14770 64 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  d tables in the 
14780 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
14790 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47  erator..*/../* G
147a0 65 6e 65 72 61 74 65 20 61 20 66 69 6c 65 6e 61  enerate a filena
147b0 6d 65 20 77 69 74 68 20 74 68 65 20 67 69 76 65  me with the give
147c0 6e 20 73 75 66 66 69 78 2e 20 20 53 70 61 63 65  n suffix.  Space
147d0 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
147e0 6e 61 6d 65 20 63 6f 6d 65 73 20 66 72 6f 6d 20  name comes from 
147f0 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  malloc() and mus
14800 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
14810 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
14820 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54  ction..*/.PRIVAT
14830 45 20 63 68 61 72 20 2a 66 69 6c 65 5f 6d 61 6b  E char *file_mak
14840 65 6e 61 6d 65 28 6c 65 6d 70 2c 73 75 66 66 69  ename(lemp,suffi
14850 78 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  x).struct lemon 
14860 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73 75 66  *lemp;.char *suf
14870 66 69 78 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 6e  fix;.{.  char *n
14880 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b  ame;.  char *cp;
14890 0a 0a 20 20 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f  ..  name = mallo
148a0 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c  c( lemonStrlen(l
148b0 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 20 2b  emp->filename) +
148c0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 75 66   lemonStrlen(suf
148d0 66 69 78 29 20 2b 20 35 20 29 3b 0a 20 20 69 66  fix) + 5 );.  if
148e0 28 20 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  ( name==0 ){.   
148f0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14900 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20  "Can't allocate 
14910 73 70 61 63 65 20 66 6f 72 20 61 20 66 69 6c 65  space for a file
14920 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20 20 20 20 65  name.\n");.    e
14930 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 73 74  xit(1);.  }.  st
14940 72 63 70 79 28 6e 61 6d 65 2c 6c 65 6d 70 2d 3e  rcpy(name,lemp->
14950 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 63 70 20  filename);.  cp 
14960 3d 20 73 74 72 72 63 68 72 28 6e 61 6d 65 2c 27  = strrchr(name,'
14970 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20 29 20  .');.  if( cp ) 
14980 2a 63 70 20 3d 20 30 3b 0a 20 20 73 74 72 63 61  *cp = 0;.  strca
14990 74 28 6e 61 6d 65 2c 73 75 66 66 69 78 29 3b 0a  t(name,suffix);.
149a0 20 20 72 65 74 75 72 6e 20 6e 61 6d 65 3b 0a 7d    return name;.}
149b0 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  ../* Open a file
149c0 20 77 69 74 68 20 61 20 6e 61 6d 65 20 62 61 73   with a name bas
149d0 65 64 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20 6f  ed on the name o
149e0 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
149f0 2c 0a 2a 2a 20 62 75 74 20 77 69 74 68 20 61 20  ,.** but with a 
14a00 64 69 66 66 65 72 65 6e 74 20 28 73 70 65 63 69  different (speci
14a10 66 69 65 64 29 20 73 75 66 66 69 78 2c 20 61 6e  fied) suffix, an
14a20 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
14a30 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 72  er.** to the str
14a40 65 61 6d 20 2a 2f 0a 50 52 49 56 41 54 45 20 46  eam */.PRIVATE F
14a50 49 4c 45 20 2a 66 69 6c 65 5f 6f 70 65 6e 28 6c  ILE *file_open(l
14a60 65 6d 70 2c 73 75 66 66 69 78 2c 6d 6f 64 65 29  emp,suffix,mode)
14a70 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
14a80 65 6d 70 3b 0a 63 68 61 72 20 2a 73 75 66 66 69  emp;.char *suffi
14a90 78 3b 0a 63 68 61 72 20 2a 6d 6f 64 65 3b 0a 7b  x;.char *mode;.{
14aa0 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20  .  FILE *fp;..  
14ab0 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  if( lemp->outnam
14ac0 65 20 29 20 66 72 65 65 28 6c 65 6d 70 2d 3e 6f  e ) free(lemp->o
14ad0 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d 70 2d  utname);.  lemp-
14ae0 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c 65 5f  >outname = file_
14af0 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 73  makename(lemp, s
14b00 75 66 66 69 78 29 3b 0a 20 20 66 70 20 3d 20 66  uffix);.  fp = f
14b10 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61  open(lemp->outna
14b20 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66 28 20  me,mode);.  if( 
14b30 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65 3d 3d  fp==0 && *mode==
14b40 27 77 27 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  'w' ){.    fprin
14b50 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74  tf(stderr,"Can't
14b60 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25 73 5c   open file \"%s\
14b70 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75 74 6e  ".\n",lemp->outn
14b80 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e  ame);.    lemp->
14b90 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
14ba0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
14bb0 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a 2f 2a  return fp;.}../*
14bc0 20 44 75 70 6c 69 63 61 74 65 20 74 68 65 20 69   Duplicate the i
14bd0 6e 70 75 74 20 66 69 6c 65 20 77 69 74 68 6f 75  nput file withou
14be0 74 20 63 6f 6d 6d 65 6e 74 73 20 61 6e 64 20 77  t comments and w
14bf0 69 74 68 6f 75 74 20 61 63 74 69 6f 6e 73 20 0a  ithout actions .
14c00 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a 2f 0a 76  ** on rules */.v
14c10 6f 69 64 20 52 65 70 72 69 6e 74 28 6c 65 6d 70  oid Reprint(lemp
14c20 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
14c30 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74  lemp;.{.  struct
14c40 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72   rule *rp;.  str
14c50 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
14c60 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6d 61 78 6c    int i, j, maxl
14c70 65 6e 2c 20 6c 65 6e 2c 20 6e 63 6f 6c 75 6d 6e  en, len, ncolumn
14c80 73 2c 20 73 6b 69 70 3b 0a 20 20 70 72 69 6e 74  s, skip;.  print
14c90 66 28 22 2f 2f 20 52 65 70 72 69 6e 74 20 6f 66  f("// Reprint of
14ca0 20 69 6e 70 75 74 20 66 69 6c 65 20 5c 22 25 73   input file \"%s
14cb0 5c 22 2e 5c 6e 2f 2f 20 53 79 6d 62 6f 6c 73 3a  \".\n// Symbols:
14cc0 5c 6e 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  \n",lemp->filena
14cd0 6d 65 29 3b 0a 20 20 6d 61 78 6c 65 6e 20 3d 20  me);.  maxlen = 
14ce0 31 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  10;.  for(i=0; i
14cf0 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
14d00 69 2b 2b 29 7b 0a 20 20 20 20 73 70 20 3d 20 6c  i++){.    sp = l
14d10 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
14d20 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e  .    len = lemon
14d30 53 74 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29  Strlen(sp->name)
14d40 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61  ;.    if( len>ma
14d50 78 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20  xlen ) maxlen = 
14d60 6c 65 6e 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75  len;.  }.  ncolu
14d70 6d 6e 73 20 3d 20 37 36 2f 28 6d 61 78 6c 65 6e  mns = 76/(maxlen
14d80 2b 35 29 3b 0a 20 20 69 66 28 20 6e 63 6f 6c 75  +5);.  if( ncolu
14d90 6d 6e 73 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e 73  mns<1 ) ncolumns
14da0 20 3d 20 31 3b 0a 20 20 73 6b 69 70 20 3d 20 28   = 1;.  skip = (
14db0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20  lemp->nsymbol + 
14dc0 6e 63 6f 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e 63  ncolumns - 1)/nc
14dd0 6f 6c 75 6d 6e 73 3b 0a 20 20 66 6f 72 28 69 3d  olumns;.  for(i=
14de0 30 3b 20 69 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b  0; i<skip; i++){
14df0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2f 2f 22  .    printf("//"
14e00 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20  );.    for(j=i; 
14e10 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  j<lemp->nsymbol;
14e20 20 6a 2b 3d 73 6b 69 70 29 7b 0a 20 20 20 20 20   j+=skip){.     
14e30 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62   sp = lemp->symb
14e40 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73  ols[j];.      as
14e50 73 65 72 74 28 20 73 70 2d 3e 69 6e 64 65 78 3d  sert( sp->index=
14e60 3d 6a 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6e  =j );.      prin
14e70 74 66 28 22 20 25 33 64 20 25 2d 2a 2e 2a 73 22  tf(" %3d %-*.*s"
14e80 2c 6a 2c 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e  ,j,maxlen,maxlen
14e90 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  ,sp->name);.    
14ea0 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e  }.    printf("\n
14eb0 22 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70  ");.  }.  for(rp
14ec0 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
14ed0 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
14ee0 20 20 20 70 72 69 6e 74 66 28 22 25 73 22 2c 72     printf("%s",r
14ef0 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20  p->lhs->name);. 
14f00 20 20 20 2f 2a 20 20 20 20 69 66 28 20 72 70 2d     /*    if( rp-
14f10 3e 6c 68 73 61 6c 69 61 73 20 29 20 70 72 69 6e  >lhsalias ) prin
14f20 74 66 28 22 28 25 73 29 22 2c 72 70 2d 3e 6c 68  tf("(%s)",rp->lh
14f30 73 61 6c 69 61 73 29 3b 20 2a 2f 0a 20 20 20 20  salias); */.    
14f40 70 72 69 6e 74 66 28 22 20 3a 3a 3d 22 29 3b 0a  printf(" ::=");.
14f50 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
14f60 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
14f70 20 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68       sp = rp->rh
14f80 73 5b 69 5d 3b 0a 20 20 20 20 20 20 70 72 69 6e  s[i];.      prin
14f90 74 66 28 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61  tf(" %s", sp->na
14fa0 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  me);.      if( s
14fb0 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  p->type==MULTITE
14fc0 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
14fd0 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70 2d    for(j=1; j<sp-
14fe0 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a  >nsubsym; j++){.
14ff0 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66            printf
15000 28 22 7c 25 73 22 2c 20 73 70 2d 3e 73 75 62 73  ("|%s", sp->subs
15010 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ym[j]->name);.  
15020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15030 20 20 20 20 20 20 2f 2a 20 69 66 28 20 72 70 2d        /* if( rp-
15040 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 29 20 70  >rhsalias[i] ) p
15050 72 69 6e 74 66 28 22 28 25 73 29 22 2c 72 70 2d  rintf("(%s)",rp-
15060 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 20 2a  >rhsalias[i]); *
15070 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e  /.    }.    prin
15080 74 66 28 22 2e 22 29 3b 0a 20 20 20 20 69 66 28  tf(".");.    if(
15090 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 29 20 70   rp->precsym ) p
150a0 72 69 6e 74 66 28 22 20 5b 25 73 5d 22 2c 72 70  rintf(" [%s]",rp
150b0 2d 3e 70 72 65 63 73 79 6d 2d 3e 6e 61 6d 65 29  ->precsym->name)
150c0 3b 0a 20 20 20 20 2f 2a 20 69 66 28 20 72 70 2d  ;.    /* if( rp-
150d0 3e 63 6f 64 65 20 29 20 70 72 69 6e 74 66 28 22  >code ) printf("
150e0 5c 6e 20 20 20 20 25 73 22 2c 72 70 2d 3e 63 6f  \n    %s",rp->co
150f0 64 65 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e  de); */.    prin
15100 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a  tf("\n");.  }.}.
15110 0a 76 6f 69 64 20 43 6f 6e 66 69 67 50 72 69 6e  .void ConfigPrin
15120 74 28 66 70 2c 63 66 70 29 0a 46 49 4c 45 20 2a  t(fp,cfp).FILE *
15130 66 70 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  fp;.struct confi
15140 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72 75  g *cfp;.{.  stru
15150 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73  ct rule *rp;.  s
15160 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
15170 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
15180 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20  rp = cfp->rp;.  
15190 66 70 72 69 6e 74 66 28 66 70 2c 22 25 73 20 3a  fprintf(fp,"%s :
151a0 3a 3d 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d  :=",rp->lhs->nam
151b0 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e);.  for(i=0; i
151c0 3c 3d 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  <=rp->nrhs; i++)
151d0 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 63 66 70  {.    if( i==cfp
151e0 2d 3e 64 6f 74 20 29 20 66 70 72 69 6e 74 66 28  ->dot ) fprintf(
151f0 66 70 2c 22 20 2a 22 29 3b 0a 20 20 20 20 69 66  fp," *");.    if
15200 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20  ( i==rp->nrhs ) 
15210 62 72 65 61 6b 3b 0a 20 20 20 20 73 70 20 3d 20  break;.    sp = 
15220 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20  rp->rhs[i];.    
15230 66 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73 22  fprintf(fp," %s"
15240 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  , sp->name);.   
15250 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d   if( sp->type==M
15260 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
15270 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a        for(j=1; j
15280 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b  <sp->nsubsym; j+
15290 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
152a0 6e 74 66 28 66 70 2c 22 7c 25 73 22 2c 73 70 2d  ntf(fp,"|%s",sp-
152b0 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65  >subsym[j]->name
152c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
152d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 23 64 65 66 69  .  }.}../* #defi
152e0 6e 65 20 54 45 53 54 20 2a 2f 0a 23 69 66 20 30  ne TEST */.#if 0
152f0 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 65 74 20  ./* Print a set 
15300 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
15310 53 65 74 50 72 69 6e 74 28 6f 75 74 2c 73 65 74  SetPrint(out,set
15320 2c 6c 65 6d 70 29 0a 46 49 4c 45 20 2a 6f 75 74  ,lemp).FILE *out
15330 3b 0a 63 68 61 72 20 2a 73 65 74 3b 0a 73 74 72  ;.char *set;.str
15340 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
15350 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  .{.  int i;.  ch
15360 61 72 20 2a 73 70 61 63 65 72 3b 0a 20 20 73 70  ar *spacer;.  sp
15370 61 63 65 72 20 3d 20 22 22 3b 0a 20 20 66 70 72  acer = "";.  fpr
15380 69 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 5b 22  intf(out,"%12s["
15390 2c 22 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ,"");.  for(i=0;
153a0 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e   i<lemp->ntermin
153b0 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  al; i++){.    if
153c0 28 20 53 65 74 46 69 6e 64 28 73 65 74 2c 69 29  ( SetFind(set,i)
153d0 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
153e0 66 28 6f 75 74 2c 22 25 73 25 73 22 2c 73 70 61  f(out,"%s%s",spa
153f0 63 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  cer,lemp->symbol
15400 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  s[i]->name);.   
15410 20 20 20 73 70 61 63 65 72 20 3d 20 22 20 22 3b     spacer = " ";
15420 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
15430 69 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e 22 29 3b  intf(out,"]\n");
15440 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 70  .}../* Print a p
15450 6c 69 6e 6b 20 63 68 61 69 6e 20 2a 2f 0a 50 52  link chain */.PR
15460 49 56 41 54 45 20 76 6f 69 64 20 50 6c 69 6e 6b  IVATE void Plink
15470 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2c 74 61  Print(out,plp,ta
15480 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74  g).FILE *out;.st
15490 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b  ruct plink *plp;
154a0 0a 63 68 61 72 20 2a 74 61 67 3b 0a 7b 0a 20 20  .char *tag;.{.  
154b0 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20  while( plp ){.  
154c0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
154d0 31 32 73 25 73 20 28 73 74 61 74 65 20 25 32 64  12s%s (state %2d
154e0 29 20 22 2c 22 22 2c 74 61 67 2c 70 6c 70 2d 3e  ) ","",tag,plp->
154f0 63 66 70 2d 3e 73 74 70 2d 3e 73 74 61 74 65 6e  cfp->stp->staten
15500 75 6d 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 50  um);.    ConfigP
15510 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2d 3e 63 66  rint(out,plp->cf
15520 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  p);.    fprintf(
15530 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 70  out,"\n");.    p
15540 6c 70 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a  lp = plp->next;.
15550 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
15560 20 50 72 69 6e 74 20 61 6e 20 61 63 74 69 6f 6e   Print an action
15570 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69   to the given fi
15580 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
15590 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a  Return FALSE if.
155a0 2a 2a 20 6e 6f 74 68 69 6e 67 20 77 61 73 20 61  ** nothing was a
155b0 63 74 75 61 6c 6c 79 20 70 72 69 6e 74 65 64 2e  ctually printed.
155c0 0a 2a 2f 0a 69 6e 74 20 50 72 69 6e 74 41 63 74  .*/.int PrintAct
155d0 69 6f 6e 28 73 74 72 75 63 74 20 61 63 74 69 6f  ion(struct actio
155e0 6e 20 2a 61 70 2c 20 46 49 4c 45 20 2a 66 70 2c  n *ap, FILE *fp,
155f0 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20   int indent){.  
15600 69 6e 74 20 72 65 73 75 6c 74 20 3d 20 31 3b 0a  int result = 1;.
15610 20 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79    switch( ap->ty
15620 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  pe ){.    case S
15630 48 49 46 54 3a 0a 20 20 20 20 20 20 66 70 72 69  HIFT:.      fpri
15640 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66  ntf(fp,"%*s shif
15650 74 20 20 25 64 22 2c 69 6e 64 65 6e 74 2c 61 70  t  %d",indent,ap
15660 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78  ->sp->name,ap->x
15670 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b  .stp->statenum);
15680 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15690 20 20 63 61 73 65 20 52 45 44 55 43 45 3a 0a 20    case REDUCE:. 
156a0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
156b0 22 25 2a 73 20 72 65 64 75 63 65 20 25 64 22 2c  "%*s reduce %d",
156c0 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e  indent,ap->sp->n
156d0 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e  ame,ap->x.rp->in
156e0 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  dex);.      brea
156f0 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 43 43 45  k;.    case ACCE
15700 50 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74  PT:.      fprint
15710 66 28 66 70 2c 22 25 2a 73 20 61 63 63 65 70 74  f(fp,"%*s accept
15720 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d  ",indent,ap->sp-
15730 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  >name);.      br
15740 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 52  eak;.    case ER
15750 52 4f 52 3a 0a 20 20 20 20 20 20 66 70 72 69 6e  ROR:.      fprin
15760 74 66 28 66 70 2c 22 25 2a 73 20 65 72 72 6f 72  tf(fp,"%*s error
15770 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d  ",indent,ap->sp-
15780 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  >name);.      br
15790 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 52  eak;.    case SR
157a0 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 63 61  CONFLICT:.    ca
157b0 73 65 20 52 52 43 4f 4e 46 4c 49 43 54 3a 0a 20  se RRCONFLICT:. 
157c0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
157d0 22 25 2a 73 20 72 65 64 75 63 65 20 25 2d 33 64  "%*s reduce %-3d
157e0 20 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66   ** Parsing conf
157f0 6c 69 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20  lict **",.      
15800 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d    indent,ap->sp-
15810 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e  >name,ap->x.rp->
15820 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72  index);.      br
15830 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53  eak;.    case SS
15840 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20  CONFLICT:.      
15850 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20  fprintf(fp,"%*s 
15860 73 68 69 66 74 20 20 25 64 20 2a 2a 20 50 61 72  shift  %d ** Par
15870 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a  sing conflict **
15880 22 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 64 65  ", .        inde
15890 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c  nt,ap->sp->name,
158a0 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65  ap->x.stp->state
158b0 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  num);.      brea
158c0 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 48 5f 52  k;.    case SH_R
158d0 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 63 61 73  ESOLVED:.    cas
158e0 65 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a 20  e RD_RESOLVED:. 
158f0 20 20 20 63 61 73 65 20 4e 4f 54 5f 55 53 45 44     case NOT_USED
15900 3a 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d  :.      result =
15910 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
15920 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
15930 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  sult;.}../* Gene
15940 72 61 74 65 20 74 68 65 20 22 79 2e 6f 75 74 70  rate the "y.outp
15950 75 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a  ut" log file */.
15960 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75  void ReportOutpu
15970 74 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  t(lemp).struct l
15980 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
15990 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
159a0 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
159b0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
159c0 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
159d0 6e 20 2a 61 70 3b 0a 20 20 46 49 4c 45 20 2a 66  n *ap;.  FILE *f
159e0 70 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65 5f  p;..  fp = file_
159f0 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74 22  open(lemp,".out"
15a00 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 66 70  ,"wb");.  if( fp
15a10 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
15a20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
15a30 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
15a40 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
15a50 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 70  orted[i];.    fp
15a60 72 69 6e 74 66 28 66 70 2c 22 53 74 61 74 65 20  rintf(fp,"State 
15a70 25 64 3a 5c 6e 22 2c 73 74 70 2d 3e 73 74 61 74  %d:\n",stp->stat
15a80 65 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 6c  enum);.    if( l
15a90 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29  emp->basisflag )
15aa0 20 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a 20 20   cfp=stp->bp;.  
15ab0 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
15ac0 20 20 20 20 20 20 20 20 63 66 70 3d 73 74 70 2d          cfp=stp-
15ad0 3e 63 66 70 3b 0a 20 20 20 20 77 68 69 6c 65 28  >cfp;.    while(
15ae0 20 63 66 70 20 29 7b 0a 20 20 20 20 20 20 63 68   cfp ){.      ch
15af0 61 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20 20 20  ar buf[20];.    
15b00 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3d 3d    if( cfp->dot==
15b10 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 7b  cfp->rp->nrhs ){
15b20 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
15b30 28 62 75 66 2c 22 28 25 64 29 22 2c 63 66 70 2d  (buf,"(%d)",cfp-
15b40 3e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  >rp->index);.   
15b50 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
15b60 22 20 20 20 20 25 35 73 20 22 2c 62 75 66 29 3b  "    %5s ",buf);
15b70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15b80 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
15b90 2c 22 20 20 20 20 20 20 20 20 20 20 22 29 3b 0a  ,"          ");.
15ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 43 6f        }.      Co
15bb0 6e 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66 70  nfigPrint(fp,cfp
15bc0 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
15bd0 28 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 20 30  (fp,"\n");.#if 0
15be0 0a 20 20 20 20 20 20 53 65 74 50 72 69 6e 74 28  .      SetPrint(
15bf0 66 70 2c 63 66 70 2d 3e 66 77 73 2c 6c 65 6d 70  fp,cfp->fws,lemp
15c00 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72  );.      PlinkPr
15c10 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66 70 6c 70  int(fp,cfp->fplp
15c20 2c 22 54 6f 20 20 22 29 3b 0a 20 20 20 20 20 20  ,"To  ");.      
15c30 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66  PlinkPrint(fp,cf
15c40 70 2d 3e 62 70 6c 70 2c 22 46 72 6f 6d 22 29 3b  p->bplp,"From");
15c50 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
15c60 28 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61  ( lemp->basisfla
15c70 67 20 29 20 63 66 70 3d 63 66 70 2d 3e 62 70 3b  g ) cfp=cfp->bp;
15c80 0a 20 20 20 20 20 20 65 6c 73 65 20 20 20 20 20  .      else     
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 63 66 70               cfp
15ca0 3d 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20  =cfp->next;.    
15cb0 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70  }.    fprintf(fp
15cc0 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28  ,"\n");.    for(
15cd0 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
15ce0 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
15cf0 20 20 20 20 69 66 28 20 50 72 69 6e 74 41 63 74      if( PrintAct
15d00 69 6f 6e 28 61 70 2c 66 70 2c 33 30 29 20 29 20  ion(ap,fp,30) ) 
15d10 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29  fprintf(fp,"\n")
15d20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
15d30 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20  ntf(fp,"\n");.  
15d40 7d 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20  }.  fprintf(fp, 
15d50 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  "---------------
15d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d80 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 66 70 72  -----\n");.  fpr
15d90 69 6e 74 66 28 66 70 2c 20 22 53 79 6d 62 6f 6c  intf(fp, "Symbol
15da0 73 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69 3d  s:\n");.  for(i=
15db0 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
15dc0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ol; i++){.    in
15dd0 74 20 6a 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t j;.    struct 
15de0 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 20  symbol *sp;..   
15df0 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62   sp = lemp->symb
15e00 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69  ols[i];.    fpri
15e10 6e 74 66 28 66 70 2c 20 22 20 20 25 33 64 3a 20  ntf(fp, "  %3d: 
15e20 25 73 22 2c 20 69 2c 20 73 70 2d 3e 6e 61 6d 65  %s", i, sp->name
15e30 29 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74  );.    if( sp->t
15e40 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c  ype==NONTERMINAL
15e50 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
15e60 66 28 66 70 2c 20 22 3a 22 29 3b 0a 20 20 20 20  f(fp, ":");.    
15e70 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61    if( sp->lambda
15e80 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
15e90 6e 74 66 28 66 70 2c 20 22 20 3c 6c 61 6d 62 64  ntf(fp, " <lambd
15ea0 61 3e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  a>");.      }.  
15eb0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c      for(j=0; j<l
15ec0 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
15ed0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
15ee0 28 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20 26  ( sp->firstset &
15ef0 26 20 53 65 74 46 69 6e 64 28 73 70 2d 3e 66 69  & SetFind(sp->fi
15f00 72 73 74 73 65 74 2c 20 6a 29 20 29 7b 0a 20 20  rstset, j) ){.  
15f10 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
15f20 66 70 2c 20 22 20 25 73 22 2c 20 6c 65 6d 70 2d  fp, " %s", lemp-
15f30 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2d 3e 6e 61 6d  >symbols[j]->nam
15f40 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
15f50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15f60 66 70 72 69 6e 74 66 28 66 70 2c 20 22 5c 6e 22  fprintf(fp, "\n"
15f70 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28  );.  }.  fclose(
15f80 66 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  fp);.  return;.}
15f90 0a 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20  ../* Search for 
15fa0 74 68 65 20 66 69 6c 65 20 22 6e 61 6d 65 22 20  the file "name" 
15fb0 77 68 69 63 68 20 69 73 20 69 6e 20 74 68 65 20  which is in the 
15fc0 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
15fd0 73 0a 2a 2a 20 74 68 65 20 65 78 61 63 75 74 61  s.** the exacuta
15fe0 62 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 63  ble */.PRIVATE c
15ff0 68 61 72 20 2a 70 61 74 68 73 65 61 72 63 68 28  har *pathsearch(
16000 61 72 67 76 30 2c 6e 61 6d 65 2c 6d 6f 64 65 6d  argv0,name,modem
16010 61 73 6b 29 0a 63 68 61 72 20 2a 61 72 67 76 30  ask).char *argv0
16020 3b 0a 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 69 6e  ;.char *name;.in
16030 74 20 6d 6f 64 65 6d 61 73 6b 3b 0a 7b 0a 20 20  t modemask;.{.  
16040 63 68 61 72 20 2a 70 61 74 68 6c 69 73 74 3b 0a  char *pathlist;.
16050 20 20 63 68 61 72 20 2a 70 61 74 68 2c 2a 63 70    char *path,*cp
16060 3b 0a 20 20 63 68 61 72 20 63 3b 0a 0a 23 69 66  ;.  char c;..#if
16070 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 20 20  def __WIN32__.  
16080 63 70 20 3d 20 73 74 72 72 63 68 72 28 61 72 67  cp = strrchr(arg
16090 76 30 2c 27 5c 5c 27 29 3b 0a 23 65 6c 73 65 0a  v0,'\\');.#else.
160a0 20 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 61    cp = strrchr(a
160b0 72 67 76 30 2c 27 2f 27 29 3b 0a 23 65 6e 64 69  rgv0,'/');.#endi
160c0 66 0a 20 20 69 66 28 20 63 70 20 29 7b 0a 20 20  f.  if( cp ){.  
160d0 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a    c = *cp;.    *
160e0 63 70 20 3d 20 30 3b 0a 20 20 20 20 70 61 74 68  cp = 0;.    path
160f0 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f   = (char *)mallo
16100 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61  c( lemonStrlen(a
16110 72 67 76 30 29 20 2b 20 6c 65 6d 6f 6e 53 74 72  rgv0) + lemonStr
16120 6c 65 6e 28 6e 61 6d 65 29 20 2b 20 32 20 29 3b  len(name) + 2 );
16130 0a 20 20 20 20 69 66 28 20 70 61 74 68 20 29 20  .    if( path ) 
16140 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73  sprintf(path,"%s
16150 2f 25 73 22 2c 61 72 67 76 30 2c 6e 61 6d 65 29  /%s",argv0,name)
16160 3b 0a 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20  ;.    *cp = c;. 
16170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 78 74 65   }else{.    exte
16180 72 6e 20 63 68 61 72 20 2a 67 65 74 65 6e 76 28  rn char *getenv(
16190 29 3b 0a 20 20 20 20 70 61 74 68 6c 69 73 74 20  );.    pathlist 
161a0 3d 20 67 65 74 65 6e 76 28 22 50 41 54 48 22 29  = getenv("PATH")
161b0 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68 6c 69  ;.    if( pathli
161c0 73 74 3d 3d 30 20 29 20 70 61 74 68 6c 69 73 74  st==0 ) pathlist
161d0 20 3d 20 22 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f   = ".:/bin:/usr/
161e0 62 69 6e 22 3b 0a 20 20 20 20 70 61 74 68 20 3d  bin";.    path =
161f0 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28   (char *)malloc(
16200 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74   lemonStrlen(pat
16210 68 6c 69 73 74 29 2b 6c 65 6d 6f 6e 53 74 72 6c  hlist)+lemonStrl
16220 65 6e 28 6e 61 6d 65 29 2b 32 20 29 3b 0a 20 20  en(name)+2 );.  
16230 20 20 69 66 28 20 70 61 74 68 21 3d 30 20 29 7b    if( path!=0 ){
16240 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 70  .      while( *p
16250 61 74 68 6c 69 73 74 20 29 7b 0a 20 20 20 20 20  athlist ){.     
16260 20 20 20 63 70 20 3d 20 73 74 72 63 68 72 28 70     cp = strchr(p
16270 61 74 68 6c 69 73 74 2c 27 3a 27 29 3b 0a 20 20  athlist,':');.  
16280 20 20 20 20 20 20 69 66 28 20 63 70 3d 3d 30 20        if( cp==0 
16290 29 20 63 70 20 3d 20 26 70 61 74 68 6c 69 73 74  ) cp = &pathlist
162a0 5b 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74  [lemonStrlen(pat
162b0 68 6c 69 73 74 29 5d 3b 0a 20 20 20 20 20 20 20  hlist)];.       
162c0 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20   c = *cp;.      
162d0 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 20    *cp = 0;.     
162e0 20 20 20 73 70 72 69 6e 74 66 28 70 61 74 68 2c     sprintf(path,
162f0 22 25 73 2f 25 73 22 2c 70 61 74 68 6c 69 73 74  "%s/%s",pathlist
16300 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ,name);.        
16310 2a 63 70 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  *cp = c;.       
16320 20 69 66 28 20 63 3d 3d 30 20 29 20 70 61 74 68   if( c==0 ) path
16330 6c 69 73 74 20 3d 20 22 22 3b 0a 20 20 20 20 20  list = "";.     
16340 20 20 20 65 6c 73 65 20 70 61 74 68 6c 69 73 74     else pathlist
16350 20 3d 20 26 63 70 5b 31 5d 3b 0a 20 20 20 20 20   = &cp[1];.     
16360 20 20 20 69 66 28 20 61 63 63 65 73 73 28 70 61     if( access(pa
16370 74 68 2c 6d 6f 64 65 6d 61 73 6b 29 3d 3d 30 20  th,modemask)==0 
16380 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
16390 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
163a0 75 72 6e 20 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20  urn path;.}../* 
163b0 47 69 76 65 6e 20 61 6e 20 61 63 74 69 6f 6e 2c  Given an action,
163c0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 69 6e 74   compute the int
163d0 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74  eger value for t
163e0 68 61 74 20 61 63 74 69 6f 6e 0a 2a 2a 20 77 68  hat action.** wh
163f0 69 63 68 20 69 73 20 74 6f 20 62 65 20 70 75 74  ich is to be put
16400 20 69 6e 20 74 68 65 20 61 63 74 69 6f 6e 20 74   in the action t
16410 61 62 6c 65 20 6f 66 20 74 68 65 20 67 65 6e 65  able of the gene
16420 72 61 74 65 64 20 6d 61 63 68 69 6e 65 2e 0a 2a  rated machine..*
16430 2a 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76  * Return negativ
16440 65 20 69 66 20 6e 6f 20 61 63 74 69 6f 6e 20 73  e if no action s
16450 68 6f 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74  hould be generat
16460 65 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 69  ed..*/.PRIVATE i
16470 6e 74 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f  nt compute_actio
16480 6e 28 6c 65 6d 70 2c 61 70 29 0a 73 74 72 75 63  n(lemp,ap).struc
16490 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 73  t lemon *lemp;.s
164a0 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
164b0 3b 0a 7b 0a 20 20 69 6e 74 20 61 63 74 3b 0a 20  ;.{.  int act;. 
164c0 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70   switch( ap->typ
164d0 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48  e ){.    case SH
164e0 49 46 54 3a 20 20 61 63 74 20 3d 20 61 70 2d 3e  IFT:  act = ap->
164f0 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 3b  x.stp->statenum;
16500 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
16510 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45 44 55  k;.    case REDU
16520 43 45 3a 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e  CE: act = ap->x.
16530 72 70 2d 3e 69 6e 64 65 78 20 2b 20 6c 65 6d 70  rp->index + lemp
16540 2d 3e 6e 73 74 61 74 65 3b 20 62 72 65 61 6b 3b  ->nstate; break;
16550 0a 20 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a  .    case ERROR:
16560 20 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73    act = lemp->ns
16570 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75  tate + lemp->nru
16580 6c 65 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  le;     break;. 
16590 20 20 20 63 61 73 65 20 41 43 43 45 50 54 3a 20     case ACCEPT: 
165a0 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  act = lemp->nsta
165b0 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  te + lemp->nrule
165c0 20 2b 20 31 3b 20 62 72 65 61 6b 3b 0a 20 20 20   + 1; break;.   
165d0 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 61 63   default:     ac
165e0 74 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 0a 20  t = -1; break;. 
165f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 63 74 3b   }.  return act;
16600 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45  .}..#define LINE
16610 53 49 5a 45 20 31 30 30 30 0a 2f 2a 20 54 68 65  SIZE 1000./* The
16620 20 6e 65 78 74 20 63 6c 75 73 74 65 72 20 6f 66   next cluster of
16630 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 66 6f   routines are fo
16640 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 74 65  r reading the te
16650 6d 70 6c 61 74 65 20 66 69 6c 65 0a 2a 2a 20 61  mplate file.** a
16660 6e 64 20 77 72 69 74 69 6e 67 20 74 68 65 20 72  nd writing the r
16670 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 67 65  esults to the ge
16680 6e 65 72 61 74 65 64 20 70 61 72 73 65 72 20 2a  nerated parser *
16690 2f 0a 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66  /./* The first f
166a0 75 6e 63 74 69 6f 6e 20 74 72 61 6e 73 66 65 72  unction transfer
166b0 73 20 64 61 74 61 20 66 72 6f 6d 20 22 69 6e 22  s data from "in"
166c0 20 74 6f 20 22 6f 75 74 22 20 75 6e 74 69 6c 0a   to "out" until.
166d0 2a 2a 20 61 20 6c 69 6e 65 20 69 73 20 73 65 65  ** a line is see
166e0 6e 20 77 68 69 63 68 20 62 65 67 69 6e 73 20 77  n which begins w
166f0 69 74 68 20 22 25 25 22 2e 20 20 54 68 65 20 6c  ith "%%".  The l
16700 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ine number is.**
16710 20 74 72 61 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20   tracked..**.** 
16720 69 66 20 6e 61 6d 65 21 3d 30 2c 20 74 68 65 6e  if name!=0, then
16730 20 61 6e 79 20 77 6f 72 64 20 74 68 61 74 20 62   any word that b
16740 65 67 69 6e 20 77 69 74 68 20 22 50 61 72 73 65  egin with "Parse
16750 22 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a  " is changed to.
16760 2a 2a 20 62 65 67 69 6e 20 77 69 74 68 20 2a 6e  ** begin with *n
16770 61 6d 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a  ame instead..*/.
16780 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c  PRIVATE void tpl
16790 74 5f 78 66 65 72 28 6e 61 6d 65 2c 69 6e 2c 6f  t_xfer(name,in,o
167a0 75 74 2c 6c 69 6e 65 6e 6f 29 0a 63 68 61 72 20  ut,lineno).char 
167b0 2a 6e 61 6d 65 3b 0a 46 49 4c 45 20 2a 69 6e 3b  *name;.FILE *in;
167c0 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 69 6e 74 20  .FILE *out;.int 
167d0 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 6e 74  *lineno;.{.  int
167e0 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 63 68   i, iStart;.  ch
167f0 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45  ar line[LINESIZE
16800 5d 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74  ];.  while( fget
16810 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c  s(line,LINESIZE,
16820 69 6e 29 20 26 26 20 28 6c 69 6e 65 5b 30 5d 21  in) && (line[0]!
16830 3d 27 25 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d 21  ='%' || line[1]!
16840 3d 27 25 27 29 20 29 7b 0a 20 20 20 20 28 2a 6c  ='%') ){.    (*l
16850 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69 53  ineno)++;.    iS
16860 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  tart = 0;.    if
16870 28 20 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  ( name ){.      
16880 66 6f 72 28 69 3d 30 3b 20 6c 69 6e 65 5b 69 5d  for(i=0; line[i]
16890 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
168a0 69 66 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50 27  if( line[i]=='P'
168b0 20 26 26 20 73 74 72 6e 63 6d 70 28 26 6c 69 6e   && strncmp(&lin
168c0 65 5b 69 5d 2c 22 50 61 72 73 65 22 2c 35 29 3d  e[i],"Parse",5)=
168d0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
168e0 28 69 3d 3d 30 20 7c 7c 20 21 69 73 61 6c 70 68  (i==0 || !isalph
168f0 61 28 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a 20 20  a(line[i-1])).  
16900 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
16910 20 20 20 69 66 28 20 69 3e 69 53 74 61 72 74 20     if( i>iStart 
16920 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25  ) fprintf(out,"%
16930 2e 2a 73 22 2c 69 2d 69 53 74 61 72 74 2c 26 6c  .*s",i-iStart,&l
16940 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20  ine[iStart]);.  
16950 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
16960 6f 75 74 2c 22 25 73 22 2c 6e 61 6d 65 29 3b 0a  out,"%s",name);.
16970 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34            i += 4
16980 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53 74 61  ;.          iSta
16990 72 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20  rt = i+1;.      
169a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
169b0 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  }.    fprintf(ou
169c0 74 2c 22 25 73 22 2c 26 6c 69 6e 65 5b 69 53 74  t,"%s",&line[iSt
169d0 61 72 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  art]);.  }.}../*
169e0 20 54 68 65 20 6e 65 78 74 20 66 75 6e 63 74 69   The next functi
169f0 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 74 65 6d  on finds the tem
16a00 70 6c 61 74 65 20 66 69 6c 65 20 61 6e 64 20 6f  plate file and o
16a10 70 65 6e 73 20 69 74 2c 20 72 65 74 75 72 6e 69  pens it, returni
16a20 6e 67 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  ng.** a pointer 
16a30 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69  to the opened fi
16a40 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20 46  le. */.PRIVATE F
16a50 49 4c 45 20 2a 74 70 6c 74 5f 6f 70 65 6e 28 6c  ILE *tplt_open(l
16a60 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
16a70 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 61  n *lemp;.{.  sta
16a80 74 69 63 20 63 68 61 72 20 74 65 6d 70 6c 61 74  tic char templat
16a90 65 6e 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d 70 61  ename[] = "lempa
16aa0 72 2e 63 22 3b 0a 20 20 63 68 61 72 20 62 75 66  r.c";.  char buf
16ab0 5b 31 30 30 30 5d 3b 0a 20 20 46 49 4c 45 20 2a  [1000];.  FILE *
16ac0 69 6e 3b 0a 20 20 63 68 61 72 20 2a 74 70 6c 74  in;.  char *tplt
16ad0 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70  name;.  char *cp
16ae0 3b 0a 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68  ;..  cp = strrch
16af0 72 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  r(lemp->filename
16b00 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20  ,'.');.  if( cp 
16b10 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 62  ){.    sprintf(b
16b20 75 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28 69 6e  uf,"%.*s.lt",(in
16b30 74 29 28 63 70 2d 6c 65 6d 70 2d 3e 66 69 6c 65  t)(cp-lemp->file
16b40 6e 61 6d 65 29 2c 6c 65 6d 70 2d 3e 66 69 6c 65  name),lemp->file
16b50 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  name);.  }else{.
16b60 20 20 20 20 73 70 72 69 6e 74 66 28 62 75 66 2c      sprintf(buf,
16b70 22 25 73 2e 6c 74 22 2c 6c 65 6d 70 2d 3e 66 69  "%s.lt",lemp->fi
16b80 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69  lename);.  }.  i
16b90 66 28 20 61 63 63 65 73 73 28 62 75 66 2c 30 30  f( access(buf,00
16ba0 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c  4)==0 ){.    tpl
16bb0 74 6e 61 6d 65 20 3d 20 62 75 66 3b 0a 20 20 7d  tname = buf;.  }
16bc0 65 6c 73 65 20 69 66 28 20 61 63 63 65 73 73 28  else if( access(
16bd0 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34  templatename,004
16be0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74  )==0 ){.    tplt
16bf0 6e 61 6d 65 20 3d 20 74 65 6d 70 6c 61 74 65 6e  name = templaten
16c00 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ame;.  }else{.  
16c10 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 70 61 74    tpltname = pat
16c20 68 73 65 61 72 63 68 28 6c 65 6d 70 2d 3e 61 72  hsearch(lemp->ar
16c30 67 76 30 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65  gv0,templatename
16c40 2c 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  ,0);.  }.  if( t
16c50 70 6c 74 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  pltname==0 ){.  
16c60 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
16c70 2c 22 43 61 6e 27 74 20 66 69 6e 64 20 74 68 65  ,"Can't find the
16c80 20 70 61 72 73 65 72 20 64 72 69 76 65 72 20 74   parser driver t
16c90 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25  emplate file \"%
16ca0 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 74 65 6d  s\".\n",.    tem
16cb0 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20  platename);.    
16cc0 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
16cd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
16ce0 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e    }.  in = fopen
16cf0 28 74 70 6c 74 6e 61 6d 65 2c 22 72 62 22 29 3b  (tpltname,"rb");
16d00 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a  .  if( in==0 ){.
16d10 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
16d20 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74  rr,"Can't open t
16d30 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  he template file
16d40 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70   \"%s\".\n",temp
16d50 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c  latename);.    l
16d60 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
16d70 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
16d80 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a   }.  return in;.
16d90 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 23 6c  }../* Print a #l
16da0 69 6e 65 20 64 69 72 65 63 74 69 76 65 20 6c 69  ine directive li
16db0 6e 65 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ne to the output
16dc0 20 66 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54   file. */.PRIVAT
16dd0 45 20 76 6f 69 64 20 74 70 6c 74 5f 6c 69 6e 65  E void tplt_line
16de0 64 69 72 28 6f 75 74 2c 6c 69 6e 65 6e 6f 2c 66  dir(out,lineno,f
16df0 69 6c 65 6e 61 6d 65 29 0a 46 49 4c 45 20 2a 6f  ilename).FILE *o
16e00 75 74 3b 0a 69 6e 74 20 6c 69 6e 65 6e 6f 3b 0a  ut;.int lineno;.
16e10 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 0a  char *filename;.
16e20 7b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  {.  fprintf(out,
16e30 22 23 6c 69 6e 65 20 25 64 20 5c 22 22 2c 6c 69  "#line %d \"",li
16e40 6e 65 6e 6f 29 3b 0a 20 20 77 68 69 6c 65 28 20  neno);.  while( 
16e50 2a 66 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20  *filename ){.   
16e60 20 69 66 28 20 2a 66 69 6c 65 6e 61 6d 65 20 3d   if( *filename =
16e70 3d 20 27 5c 5c 27 20 29 20 70 75 74 63 28 27 5c  = '\\' ) putc('\
16e80 5c 27 2c 6f 75 74 29 3b 0a 20 20 20 20 70 75 74  \',out);.    put
16e90 63 28 2a 66 69 6c 65 6e 61 6d 65 2c 6f 75 74 29  c(*filename,out)
16ea0 3b 0a 20 20 20 20 66 69 6c 65 6e 61 6d 65 2b 2b  ;.    filename++
16eb0 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  ;.  }.  fprintf(
16ec0 6f 75 74 2c 22 5c 22 5c 6e 22 29 3b 0a 7d 0a 0a  out,"\"\n");.}..
16ed0 2f 2a 20 50 72 69 6e 74 20 61 20 73 74 72 69 6e  /* Print a strin
16ee0 67 20 74 6f 20 74 68 65 20 66 69 6c 65 20 61 6e  g to the file an
16ef0 64 20 6b 65 65 70 20 74 68 65 20 6c 69 6e 65 6e  d keep the linen
16f00 75 6d 62 65 72 20 75 70 20 74 6f 20 64 61 74 65  umber up to date
16f10 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64   */.PRIVATE void
16f20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
16f30 6c 65 6d 70 2c 73 74 72 2c 6c 69 6e 65 6e 6f 29  lemp,str,lineno)
16f40 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75  .FILE *out;.stru
16f50 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
16f60 63 68 61 72 20 2a 73 74 72 3b 0a 69 6e 74 20 2a  char *str;.int *
16f70 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 66 28 20  lineno;.{.  if( 
16f80 73 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  str==0 ) return;
16f90 0a 20 20 77 68 69 6c 65 28 20 2a 73 74 72 20 29  .  while( *str )
16fa0 7b 0a 20 20 20 20 70 75 74 63 28 2a 73 74 72 2c  {.    putc(*str,
16fb0 6f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 73  out);.    if( *s
16fc0 74 72 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e  tr=='\n' ) (*lin
16fd0 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 73 74 72 2b  eno)++;.    str+
16fe0 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72  +;.  }.  if( str
16ff0 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20  [-1]!='\n' ){.  
17000 20 20 70 75 74 63 28 27 5c 6e 27 2c 6f 75 74 29    putc('\n',out)
17010 3b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b  ;.    (*lineno)+
17020 2b 3b 0a 20 20 7d 0a 20 20 69 66 20 28 21 6c 65  +;.  }.  if (!le
17030 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61  mp->nolinenosfla
17040 67 29 20 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e  g) {.    (*linen
17050 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64  o)++; tplt_lined
17060 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c  ir(out,*lineno,l
17070 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 0a  emp->outname); .
17080 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a    }.  return;.}.
17090 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
170a0 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 65 6d 69  wing routine emi
170b0 74 73 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ts code for the 
170c0 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  destructor for t
170d0 68 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 73 70 0a  he.** symbol sp.
170e0 2a 2f 0a 76 6f 69 64 20 65 6d 69 74 5f 64 65 73  */.void emit_des
170f0 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74  tructor_code(out
17100 2c 73 70 2c 6c 65 6d 70 2c 6c 69 6e 65 6e 6f 29  ,sp,lemp,lineno)
17110 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75  .FILE *out;.stru
17120 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 73  ct symbol *sp;.s
17130 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
17140 70 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a  p;.int *lineno;.
17150 7b 0a 20 63 68 61 72 20 2a 63 70 20 3d 20 30 3b  {. char *cp = 0;
17160 0a 0a 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d  .. if( sp->type=
17170 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  =TERMINAL ){.   
17180 63 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  cp = lemp->token
17190 64 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70 3d  dest;.   if( cp=
171a0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
171b0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e  fprintf(out,"{\n
171c0 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  "); (*lineno)++;
171d0 0a 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e  . }else if( sp->
171e0 64 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  destructor ){.  
171f0 20 63 70 20 3d 20 73 70 2d 3e 64 65 73 74 72 75   cp = sp->destru
17200 63 74 6f 72 3b 0a 20 20 20 66 70 72 69 6e 74 66  ctor;.   fprintf
17210 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c  (out,"{\n"); (*l
17220 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66 20  ineno)++;.   if 
17230 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f  (!lemp->nolineno
17240 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65 6e  sflag) { (*linen
17250 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64  o)++; tplt_lined
17260 69 72 28 6f 75 74 2c 73 70 2d 3e 64 65 73 74 4c  ir(out,sp->destL
17270 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 66 69 6c 65  ineno,lemp->file
17280 6e 61 6d 65 29 3b 20 7d 0a 20 7d 65 6c 73 65 20  name); }. }else 
17290 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73  if( lemp->vardes
172a0 74 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d  t ){.   cp = lem
172b0 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20 69  p->vardest;.   i
172c0 66 28 20 63 70 3d 3d 30 20 29 20 72 65 74 75 72  f( cp==0 ) retur
172d0 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75  n;.   fprintf(ou
172e0 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65  t,"{\n"); (*line
172f0 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65 7b 0a 20  no)++;. }else{. 
17300 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20    assert( 0 );  
17310 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e  /* Cannot happen
17320 20 2a 2f 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a 63   */. }. for(; *c
17330 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 69 66 28  p; cp++){.   if(
17340 20 2a 63 70 3d 3d 27 24 27 20 26 26 20 63 70 5b   *cp=='$' && cp[
17350 31 5d 3d 3d 27 24 27 20 29 7b 0a 20 20 20 20 20  1]=='$' ){.     
17360 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 28 79 79  fprintf(out,"(yy
17370 70 6d 69 6e 6f 72 2d 3e 79 79 25 64 29 22 2c 73  pminor->yy%d)",s
17380 70 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20  p->dtnum);.     
17390 63 70 2b 2b 3b 0a 20 20 20 20 20 63 6f 6e 74 69  cp++;.     conti
173a0 6e 75 65 3b 0a 20 20 20 7d 0a 20 20 20 69 66 28  nue;.   }.   if(
173b0 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c   *cp=='\n' ) (*l
173c0 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 66 70 75  ineno)++;.   fpu
173d0 74 63 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a  tc(*cp,out);. }.
173e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e   fprintf(out,"\n
173f0 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  "); (*lineno)++;
17400 0a 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c  . if (!lemp->nol
17410 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 20 0a 20  inenosflag) { . 
17420 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74    (*lineno)++; t
17430 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c  plt_linedir(out,
17440 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75  *lineno,lemp->ou
17450 74 6e 61 6d 65 29 3b 20 0a 20 7d 0a 20 66 70 72  tname); . }. fpr
17460 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b  intf(out,"}\n");
17470 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 72   (*lineno)++;. r
17480 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
17490 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e  Return TRUE (non
174a0 2d 7a 65 72 6f 29 20 69 66 20 74 68 65 20 67 69  -zero) if the gi
174b0 76 65 6e 20 73 79 6d 62 6f 6c 20 68 61 73 20 61  ven symbol has a
174c0 20 64 65 73 74 72 75 63 74 6f 72 2e 0a 2a 2f 0a   destructor..*/.
174d0 69 6e 74 20 68 61 73 5f 64 65 73 74 72 75 63 74  int has_destruct
174e0 6f 72 28 73 70 2c 20 6c 65 6d 70 29 0a 73 74 72  or(sp, lemp).str
174f0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
17500 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
17510 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 72 65 74 3b  mp;.{.  int ret;
17520 0a 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d  .  if( sp->type=
17530 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  =TERMINAL ){.   
17540 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b   ret = lemp->tok
17550 65 6e 64 65 73 74 21 3d 30 3b 0a 20 20 7d 65 6c  endest!=0;.  }el
17560 73 65 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c 65  se{.    ret = le
17570 6d 70 2d 3e 76 61 72 64 65 73 74 21 3d 30 20 7c  mp->vardest!=0 |
17580 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72  | sp->destructor
17590 21 3d 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  !=0;.  }.  retur
175a0 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
175b0 41 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20 61  Append text to a
175c0 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
175d0 6f 63 61 74 65 64 20 73 74 72 69 6e 67 2e 20 20  ocated string.  
175e0 49 66 20 7a 54 65 78 74 20 69 73 20 30 20 74 68  If zText is 0 th
175f0 65 6e 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  en.** reset the 
17600 73 74 72 69 6e 67 20 74 6f 20 62 65 20 65 6d 70  string to be emp
17610 74 79 20 61 67 61 69 6e 2e 20 20 41 6c 77 61 79  ty again.  Alway
17620 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6d  s return the com
17630 70 6c 65 74 65 20 74 65 78 74 0a 2a 2a 20 6f 66  plete text.** of
17640 20 74 68 65 20 73 74 72 69 6e 67 20 28 77 68 69   the string (whi
17650 63 68 20 69 73 20 6f 76 65 72 77 72 69 74 74 65  ch is overwritte
17660 6e 20 77 69 74 68 20 65 61 63 68 20 63 61 6c 6c  n with each call
17670 29 2e 0a 2a 2a 0a 2a 2a 20 6e 20 62 79 74 65 73  )..**.** n bytes
17680 20 6f 66 20 7a 54 65 78 74 20 61 72 65 20 73 74   of zText are st
17690 6f 72 65 64 2e 20 20 49 66 20 6e 3d 3d 30 20 74  ored.  If n==0 t
176a0 68 65 6e 20 61 6c 6c 20 6f 66 20 7a 54 65 78 74  hen all of zText
176b0 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
176c0 0a 2a 2a 20 5c 30 30 30 20 74 65 72 6d 69 6e 61  .** \000 termina
176d0 74 6f 72 20 69 73 20 73 74 6f 72 65 64 2e 20 20  tor is stored.  
176e0 7a 54 65 78 74 20 63 61 6e 20 63 6f 6e 74 61 69  zText can contai
176f0 6e 20 75 70 20 74 6f 20 74 77 6f 20 69 6e 73 74  n up to two inst
17700 61 6e 63 65 73 20 6f 66 0a 2a 2a 20 25 64 2e 20  ances of.** %d. 
17710 20 54 68 65 20 76 61 6c 75 65 73 20 6f 66 20 70   The values of p
17720 31 20 61 6e 64 20 70 32 20 61 72 65 20 77 72 69  1 and p2 are wri
17730 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 66 69  tten into the fi
17740 72 73 74 20 61 6e 64 20 73 65 63 6f 6e 64 0a 2a  rst and second.*
17750 2a 20 25 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  * %d..**.** If n
17760 3d 3d 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 70  ==-1, then the p
17770 72 65 76 69 6f 75 73 20 63 68 61 72 61 63 74 65  revious characte
17780 72 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  r is overwritten
17790 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 63 68 61  ..*/.PRIVATE cha
177a0 72 20 2a 61 70 70 65 6e 64 5f 73 74 72 28 63 68  r *append_str(ch
177b0 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 6e  ar *zText, int n
177c0 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32  , int p1, int p2
177d0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
177e0 20 2a 7a 20 3d 20 30 3b 0a 20 20 73 74 61 74 69   *z = 0;.  stati
177f0 63 20 69 6e 74 20 61 6c 6c 6f 63 65 64 20 3d 20  c int alloced = 
17800 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
17810 75 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  used = 0;.  int 
17820 63 3b 0a 20 20 63 68 61 72 20 7a 49 6e 74 5b 34  c;.  char zInt[4
17830 30 5d 3b 0a 0a 20 20 69 66 28 20 7a 54 65 78 74  0];..  if( zText
17840 3d 3d 30 20 29 7b 0a 20 20 20 20 75 73 65 64 20  ==0 ){.    used 
17850 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
17860 7a 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c 3d  z;.  }.  if( n<=
17870 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 3c 30  0 ){.    if( n<0
17880 20 29 7b 0a 20 20 20 20 20 20 75 73 65 64 20 2b   ){.      used +
17890 3d 20 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = n;.      asser
178a0 74 28 20 75 73 65 64 3e 3d 30 20 29 3b 0a 20 20  t( used>=0 );.  
178b0 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6c 65 6d 6f    }.    n = lemo
178c0 6e 53 74 72 6c 65 6e 28 7a 54 65 78 74 29 3b 0a  nStrlen(zText);.
178d0 20 20 7d 0a 20 20 69 66 28 20 6e 2b 73 69 7a 65    }.  if( n+size
178e0 6f 66 28 7a 49 6e 74 29 2a 32 2b 75 73 65 64 20  of(zInt)*2+used 
178f0 3e 3d 20 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20  >= alloced ){.  
17900 20 20 61 6c 6c 6f 63 65 64 20 3d 20 6e 20 2b 20    alloced = n + 
17910 73 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 20 2b  sizeof(zInt)*2 +
17920 20 75 73 65 64 20 2b 20 32 30 30 3b 0a 20 20 20   used + 200;.   
17930 20 7a 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 2c 20   z = realloc(z, 
17940 20 61 6c 6c 6f 63 65 64 29 3b 0a 20 20 7d 0a 20   alloced);.  }. 
17950 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
17960 72 6e 20 22 22 3b 0a 20 20 77 68 69 6c 65 28 20  rn "";.  while( 
17970 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 63  n-- > 0 ){.    c
17980 20 3d 20 2a 28 7a 54 65 78 74 2b 2b 29 3b 0a 20   = *(zText++);. 
17990 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 26 26     if( c=='%' &&
179a0 20 6e 3e 30 20 26 26 20 7a 54 65 78 74 5b 30 5d   n>0 && zText[0]
179b0 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20 20 20 73  =='d' ){.      s
179c0 70 72 69 6e 74 66 28 7a 49 6e 74 2c 20 22 25 64  printf(zInt, "%d
179d0 22 2c 20 70 31 29 3b 0a 20 20 20 20 20 20 70 31  ", p1);.      p1
179e0 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 73 74 72   = p2;.      str
179f0 63 70 79 28 26 7a 5b 75 73 65 64 5d 2c 20 7a 49  cpy(&z[used], zI
17a00 6e 74 29 3b 0a 20 20 20 20 20 20 75 73 65 64 20  nt);.      used 
17a10 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 26  += lemonStrlen(&
17a20 7a 5b 75 73 65 64 5d 29 3b 0a 20 20 20 20 20 20  z[used]);.      
17a30 7a 54 65 78 74 2b 2b 3b 0a 20 20 20 20 20 20 6e  zText++;.      n
17a40 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  --;.    }else{. 
17a50 20 20 20 20 20 7a 5b 75 73 65 64 2b 2b 5d 20 3d       z[used++] =
17a60 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   c;.    }.  }.  
17a70 7a 5b 75 73 65 64 5d 20 3d 20 30 3b 0a 20 20 72  z[used] = 0;.  r
17a80 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
17a90 2a 20 7a 43 6f 64 65 20 69 73 20 61 20 73 74 72  * zCode is a str
17aa0 69 6e 67 20 74 68 61 74 20 69 73 20 74 68 65 20  ing that is the 
17ab0 61 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65  action associate
17ac0 64 20 77 69 74 68 20 61 20 72 75 6c 65 2e 20 20  d with a rule.  
17ad0 45 78 70 61 6e 64 0a 2a 2a 20 74 68 65 20 73 79  Expand.** the sy
17ae0 6d 62 6f 6c 73 20 69 6e 20 74 68 69 73 20 73 74  mbols in this st
17af0 72 69 6e 67 20 73 6f 20 74 68 61 74 20 74 68 65  ring so that the
17b00 20 72 65 66 65 72 20 74 6f 20 65 6c 65 6d 65 6e   refer to elemen
17b10 74 73 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  ts of the parser
17b20 0a 2a 2a 20 73 74 61 63 6b 2e 0a 2a 2f 0a 50 52  .** stack..*/.PR
17b30 49 56 41 54 45 20 76 6f 69 64 20 74 72 61 6e 73  IVATE void trans
17b40 6c 61 74 65 5f 63 6f 64 65 28 73 74 72 75 63 74  late_code(struct
17b50 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74   lemon *lemp, st
17b60 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a  ruct rule *rp){.
17b70 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 78 70 3b    char *cp, *xp;
17b80 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
17b90 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 20 20 20   lhsused = 0;   
17ba0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
17bb0 4c 48 53 20 65 6c 65 6d 65 6e 74 20 68 61 73 20  LHS element has 
17bc0 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20 63  been used */.  c
17bd0 68 61 72 20 75 73 65 64 5b 4d 41 58 52 48 53 5d  har used[MAXRHS]
17be0 3b 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20  ;   /* True for 
17bf0 65 61 63 68 20 52 48 53 20 65 6c 65 6d 65 6e 74  each RHS element
17c00 20 77 68 69 63 68 20 69 73 20 75 73 65 64 20 2a   which is used *
17c10 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  /..  for(i=0; i<
17c20 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 20 75  rp->nrhs; i++) u
17c30 73 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 6c 68  sed[i] = 0;.  lh
17c40 73 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66  sused = 0;..  if
17c50 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 7b  ( rp->code==0 ){
17c60 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20  .    rp->code = 
17c70 22 5c 6e 22 3b 0a 20 20 20 20 72 70 2d 3e 6c 69  "\n";.    rp->li
17c80 6e 65 20 3d 20 72 70 2d 3e 72 75 6c 65 6c 69 6e  ne = rp->rulelin
17c90 65 3b 0a 20 20 7d 0a 0a 20 20 61 70 70 65 6e 64  e;.  }..  append
17ca0 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 20  _str(0,0,0,0);. 
17cb0 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65   for(cp=rp->code
17cc0 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20  ; *cp; cp++){.  
17cd0 20 20 69 66 28 20 69 73 61 6c 70 68 61 28 2a 63    if( isalpha(*c
17ce0 70 29 20 26 26 20 28 63 70 3d 3d 72 70 2d 3e 63  p) && (cp==rp->c
17cf0 6f 64 65 20 7c 7c 20 28 21 69 73 61 6c 6e 75 6d  ode || (!isalnum
17d00 28 63 70 5b 2d 31 5d 29 20 26 26 20 63 70 5b 2d  (cp[-1]) && cp[-
17d10 31 5d 21 3d 27 5f 27 29 29 20 29 7b 0a 20 20 20  1]!='_')) ){.   
17d20 20 20 20 63 68 61 72 20 73 61 76 65 64 3b 0a 20     char saved;. 
17d30 20 20 20 20 20 66 6f 72 28 78 70 3d 20 26 63 70       for(xp= &cp
17d40 5b 31 5d 3b 20 69 73 61 6c 6e 75 6d 28 2a 78 70  [1]; isalnum(*xp
17d50 29 20 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b 20 78  ) || *xp=='_'; x
17d60 70 2b 2b 29 3b 0a 20 20 20 20 20 20 73 61 76 65  p++);.      save
17d70 64 20 3d 20 2a 78 70 3b 0a 20 20 20 20 20 20 2a  d = *xp;.      *
17d80 78 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  xp = 0;.      if
17d90 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26  ( rp->lhsalias &
17da0 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e  & strcmp(cp,rp->
17db0 6c 68 73 61 6c 69 61 73 29 3d 3d 30 20 29 7b 0a  lhsalias)==0 ){.
17dc0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73          append_s
17dd0 74 72 28 22 79 79 67 6f 74 6f 6d 69 6e 6f 72 2e  tr("yygotominor.
17de0 79 79 25 64 22 2c 30 2c 72 70 2d 3e 6c 68 73 2d  yy%d",0,rp->lhs-
17df0 3e 64 74 6e 75 6d 2c 30 29 3b 0a 20 20 20 20 20  >dtnum,0);.     
17e00 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20     cp = xp;.    
17e10 20 20 20 20 6c 68 73 75 73 65 64 20 3d 20 31 3b      lhsused = 1;
17e20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17e30 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
17e40 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
17e50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
17e60 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26  p->rhsalias[i] &
17e70 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e  & strcmp(cp,rp->
17e80 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30 20  rhsalias[i])==0 
17e90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
17ea0 66 28 20 63 70 21 3d 72 70 2d 3e 63 6f 64 65 20  f( cp!=rp->code 
17eb0 26 26 20 63 70 5b 2d 31 5d 3d 3d 27 40 27 20 29  && cp[-1]=='@' )
17ec0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
17ed0 2f 2a 20 49 66 20 74 68 65 20 61 72 67 75 6d 65  /* If the argume
17ee0 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
17ef0 6d 20 40 58 20 74 68 65 6e 20 73 75 62 73 74 69  m @X then substi
17f00 74 75 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  tuted.          
17f10 20 20 20 20 2a 2a 20 74 68 65 20 74 6f 6b 65 6e      ** the token
17f20 20 6e 75 6d 62 65 72 20 6f 66 20 58 2c 20 6e 6f   number of X, no
17f30 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 58  t the value of X
17f40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
17f50 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79    append_str("yy
17f60 6d 73 70 5b 25 64 5d 2e 6d 61 6a 6f 72 22 2c 2d  msp[%d].major",-
17f70 31 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 30  1,i-rp->nrhs+1,0
17f80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
17f90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
17fa0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
17fb0 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b  l *sp = rp->rhs[
17fc0 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
17fd0 20 20 69 6e 74 20 64 74 6e 75 6d 3b 0a 20 20 20    int dtnum;.   
17fe0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
17ff0 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  p->type==MULTITE
18000 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
18010 20 20 20 20 20 20 20 20 20 20 64 74 6e 75 6d 20            dtnum 
18020 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d  = sp->subsym[0]-
18030 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20  >dtnum;.        
18040 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18050 20 20 20 20 20 20 20 20 20 20 20 20 20 64 74 6e               dtn
18060 75 6d 20 3d 20 73 70 2d 3e 64 74 6e 75 6d 3b 0a  um = sp->dtnum;.
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
18080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
18090 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73 70 5b  pend_str("yymsp[
180a0 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 22 2c  %d].minor.yy%d",
180b0 30 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 20  0,i-rp->nrhs+1, 
180c0 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  dtnum);.        
180d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
180e0 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20    cp = xp;.     
180f0 20 20 20 20 20 20 20 75 73 65 64 5b 69 5d 20 3d         used[i] =
18100 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
18110 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
18120 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
18130 20 20 20 7d 0a 20 20 20 20 20 20 2a 78 70 20 3d     }.      *xp =
18140 20 73 61 76 65 64 3b 0a 20 20 20 20 7d 0a 20 20   saved;.    }.  
18150 20 20 61 70 70 65 6e 64 5f 73 74 72 28 63 70 2c    append_str(cp,
18160 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 20 2f   1, 0, 0);.  } /
18170 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 0a 20  * End loop */.. 
18180 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b   /* Check to mak
18190 65 20 73 75 72 65 20 74 68 65 20 4c 48 53 20 68  e sure the LHS h
181a0 61 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a  as been used */.
181b0 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69    if( rp->lhsali
181c0 61 73 20 26 26 20 21 6c 68 73 75 73 65 64 20 29  as && !lhsused )
181d0 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c  {.    ErrorMsg(l
181e0 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70  emp->filename,rp
181f0 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20  ->ruleline,.    
18200 20 20 22 4c 61 62 65 6c 20 5c 22 25 73 5c 22 20    "Label \"%s\" 
18210 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22 20 69  for \"%s(%s)\" i
18220 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22 2c 0a  s never used.",.
18230 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61          rp->lhsa
18240 6c 69 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61  lias,rp->lhs->na
18250 6d 65 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29  me,rp->lhsalias)
18260 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f  ;.    lemp->erro
18270 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  rcnt++;.  }..  /
18280 2a 20 47 65 6e 65 72 61 74 65 20 64 65 73 74 72  * Generate destr
18290 75 63 74 6f 72 20 63 6f 64 65 20 66 6f 72 20 52  uctor code for R
182a0 48 53 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68  HS symbols which
182b0 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e   are not used in
182c0 20 74 68 65 0a 20 20 2a 2a 20 72 65 64 75 63 65   the.  ** reduce
182d0 20 63 6f 64 65 20 2a 2f 0a 20 20 66 6f 72 28 69   code */.  for(i
182e0 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
182f0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 70  i++){.    if( rp
18300 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26 26  ->rhsalias[i] &&
18310 20 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20 20 20   !used[i] ){.   
18320 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
18330 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72  ->filename,rp->r
18340 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20  uleline,.       
18350 20 22 4c 61 62 65 6c 20 25 73 20 66 6f 72 20 5c   "Label %s for \
18360 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76  "%s(%s)\" is nev
18370 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20  er used.",.     
18380 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b     rp->rhsalias[
18390 69 5d 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e  i],rp->rhs[i]->n
183a0 61 6d 65 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73  ame,rp->rhsalias
183b0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70  [i]);.      lemp
183c0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
183d0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 70 2d 3e    }else if( rp->
183e0 72 68 73 61 6c 69 61 73 5b 69 5d 3d 3d 30 20 29  rhsalias[i]==0 )
183f0 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 5f  {.      if( has_
18400 64 65 73 74 72 75 63 74 6f 72 28 72 70 2d 3e 72  destructor(rp->r
18410 68 73 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20  hs[i],lemp) ){. 
18420 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74         append_st
18430 72 28 22 20 20 79 79 5f 64 65 73 74 72 75 63 74  r("  yy_destruct
18440 6f 72 28 79 79 70 50 61 72 73 65 72 2c 25 64 2c  or(yypParser,%d,
18450 26 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72  &yymsp[%d].minor
18460 29 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20 20 20  );\n", 0,.      
18470 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d       rp->rhs[i]-
18480 3e 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e 72 68  >index,i-rp->nrh
18490 73 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  s+1);.      }els
184a0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  e{.        /* No
184b0 20 64 65 73 74 72 75 63 74 6f 72 20 64 65 66 69   destructor defi
184c0 6e 65 64 20 66 6f 72 20 74 68 69 73 20 74 65 72  ned for this ter
184d0 6d 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  m */.      }.   
184e0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 70 2d   }.  }.  if( rp-
184f0 3e 63 6f 64 65 20 29 7b 0a 20 20 20 20 63 70 20  >code ){.    cp 
18500 3d 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30  = append_str(0,0
18510 2c 30 2c 30 29 3b 0a 20 20 20 20 72 70 2d 3e 63  ,0,0);.    rp->c
18520 6f 64 65 20 3d 20 53 74 72 73 61 66 65 28 63 70  ode = Strsafe(cp
18530 3f 63 70 3a 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  ?cp:"");.  }.}..
18540 2f 2a 20 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  /* .** Generate 
18550 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
18560 74 65 73 20 77 68 65 6e 20 74 68 65 20 72 75 6c  tes when the rul
18570 65 20 22 72 70 22 20 69 73 20 72 65 64 75 63 65  e "rp" is reduce
18580 64 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65  d.  Write.** the
18590 20 63 6f 64 65 20 74 6f 20 22 6f 75 74 22 2e 20   code to "out". 
185a0 20 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e 65 6e   Make sure linen
185b0 6f 20 73 74 61 79 73 20 75 70 2d 74 6f 2d 64 61  o stays up-to-da
185c0 74 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76  te..*/.PRIVATE v
185d0 6f 69 64 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75  oid emit_code(ou
185e0 74 2c 72 70 2c 6c 65 6d 70 2c 6c 69 6e 65 6e 6f  t,rp,lemp,lineno
185f0 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72  ).FILE *out;.str
18600 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 73 74  uct rule *rp;.st
18610 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
18620 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b  ;.int *lineno;.{
18630 0a 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 2f 2a  . char *cp;.. /*
18640 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
18650 6f 20 64 6f 20 74 68 65 20 72 65 64 75 63 65 20  o do the reduce 
18660 61 63 74 69 6f 6e 20 2a 2f 0a 20 69 66 28 20 72  action */. if( r
18670 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 69 66  p->code ){.   if
18680 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e   (!lemp->nolinen
18690 6f 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65  osflag) { (*line
186a0 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65  no)++; tplt_line
186b0 64 69 72 28 6f 75 74 2c 72 70 2d 3e 6c 69 6e 65  dir(out,rp->line
186c0 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
186d0 3b 20 7d 0a 20 20 20 66 70 72 69 6e 74 66 28 6f  ; }.   fprintf(o
186e0 75 74 2c 22 7b 25 73 22 2c 72 70 2d 3e 63 6f 64  ut,"{%s",rp->cod
186f0 65 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72 70  e);.   for(cp=rp
18700 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b  ->code; *cp; cp+
18710 2b 29 7b 0a 20 20 20 20 20 69 66 28 20 2a 63 70  +){.     if( *cp
18720 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e  =='\n' ) (*linen
18730 6f 29 2b 2b 3b 0a 20 20 20 7d 20 2f 2a 20 45 6e  o)++;.   } /* En
18740 64 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 66 70 72  d loop */.   fpr
18750 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b  intf(out,"}\n");
18760 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
18770 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69   if (!lemp->noli
18780 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 20 28 2a 6c  nenosflag) { (*l
18790 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c  ineno)++; tplt_l
187a0 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65  inedir(out,*line
187b0 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  no,lemp->outname
187c0 29 3b 20 7d 0a 20 7d 20 2f 2a 20 45 6e 64 20 69  ); }. } /* End i
187d0 66 28 20 72 70 2d 3e 63 6f 64 65 20 29 20 2a 2f  f( rp->code ) */
187e0 0a 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .. return;.}../*
187f0 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 64 65  .** Print the de
18800 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  finition of the 
18810 75 6e 69 6f 6e 20 75 73 65 64 20 66 6f 72 20 74  union used for t
18820 68 65 20 70 61 72 73 65 72 27 73 20 64 61 74 61  he parser's data
18830 20 73 74 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20   stack..** This 
18840 75 6e 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 66  union contains f
18850 69 65 6c 64 73 20 66 6f 72 20 65 76 65 72 79 20  ields for every 
18860 70 6f 73 73 69 62 6c 65 20 64 61 74 61 20 74 79  possible data ty
18870 70 65 20 66 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a  pe for tokens.**
18880 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
18890 73 2e 20 20 49 6e 20 74 68 65 20 70 72 6f 63 65  s.  In the proce
188a0 73 73 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20  ss of computing 
188b0 61 6e 64 20 70 72 69 6e 74 69 6e 67 20 74 68 69  and printing thi
188c0 73 0a 2a 2a 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f  s.** union, also
188d0 20 73 65 74 20 74 68 65 20 22 2e 64 74 6e 75 6d   set the ".dtnum
188e0 22 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79  " field of every
188f0 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f   terminal and no
18900 6e 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d  nterminal.** sym
18910 62 6f 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 70 72 69  bol..*/.void pri
18920 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 6f  nt_stack_union(o
18930 75 74 2c 6c 65 6d 70 2c 70 6c 69 6e 65 6e 6f 2c  ut,lemp,plineno,
18940 6d 68 66 6c 61 67 29 0a 46 49 4c 45 20 2a 6f 75  mhflag).FILE *ou
18950 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
18960 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75      /* The outpu
18970 74 20 73 74 72 65 61 6d 20 2a 2f 0a 73 74 72 75  t stream */.stru
18980 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 20  ct lemon *lemp; 
18990 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
189a0 61 69 6e 20 69 6e 66 6f 20 73 74 72 75 63 74 75  ain info structu
189b0 72 65 20 66 6f 72 20 74 68 69 73 20 70 61 72 73  re for this pars
189c0 65 72 20 2a 2f 0a 69 6e 74 20 2a 70 6c 69 6e 65  er */.int *pline
189d0 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
189e0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
189f0 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  the line number 
18a00 2a 2f 0a 69 6e 74 20 6d 68 66 6c 61 67 3b 20 20  */.int mhflag;  
18a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18a20 2a 20 54 72 75 65 20 69 66 20 67 65 6e 65 72 61  * True if genera
18a30 74 69 6e 67 20 6d 61 6b 65 68 65 61 64 65 72 73  ting makeheaders
18a40 20 6f 75 74 70 75 74 20 2a 2f 0a 7b 0a 20 20 69   output */.{.  i
18a50 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69  nt lineno = *pli
18a60 6e 65 6e 6f 3b 20 20 20 20 2f 2a 20 54 68 65 20  neno;    /* The 
18a70 6c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  line number of t
18a80 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 63  he output */.  c
18a90 68 61 72 20 2a 2a 74 79 70 65 73 3b 20 20 20 20  har **types;    
18aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 68 61           /* A ha
18ab0 73 68 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61  sh table of data
18ac0 74 79 70 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61  types */.  int a
18ad0 72 72 61 79 73 69 7a 65 3b 20 20 20 20 20 20 20  rraysize;       
18ae0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
18af0 74 68 65 20 22 74 79 70 65 73 22 20 61 72 72 61  the "types" arra
18b00 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 64 74  y */.  int maxdt
18b10 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 20  length;         
18b20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67   /* Maximum leng
18b30 74 68 20 6f 66 20 61 6e 79 20 22 2e 64 61 74 61  th of any ".data
18b40 74 79 70 65 22 20 66 69 65 6c 64 2e 20 2a 2f 0a  type" field. */.
18b50 20 20 63 68 61 72 20 2a 73 74 64 64 74 3b 20 20    char *stddt;  
18b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18b70 74 61 6e 64 61 72 64 69 7a 65 64 20 6e 61 6d 65  tandardized name
18b80 20 66 6f 72 20 61 20 64 61 74 61 74 79 70 65 20   for a datatype 
18b90 2a 2f 0a 20 20 69 6e 74 20 69 2c 6a 3b 20 20 20  */.  int i,j;   
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18bb0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
18bc0 2a 2f 0a 20 20 69 6e 74 20 68 61 73 68 3b 20 20  */.  int hash;  
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18be0 2a 20 46 6f 72 20 68 61 73 68 69 6e 67 20 74 68  * For hashing th
18bf0 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 79 70 65  e name of a type
18c00 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65   */.  char *name
18c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18c20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70  /* Name of the p
18c30 61 72 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41  arser */..  /* A
18c40 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
18c50 69 61 6c 69 7a 65 20 74 79 70 65 73 5b 5d 20 61  ialize types[] a
18c60 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73 74 64 64  nd allocate stdd
18c70 74 5b 5d 20 2a 2f 0a 20 20 61 72 72 61 79 73 69  t[] */.  arraysi
18c80 7a 65 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62  ze = lemp->nsymb
18c90 6f 6c 20 2a 20 32 3b 0a 20 20 74 79 70 65 73 20  ol * 2;.  types 
18ca0 3d 20 28 63 68 61 72 2a 2a 29 63 61 6c 6c 6f 63  = (char**)calloc
18cb0 28 20 61 72 72 61 79 73 69 7a 65 2c 20 73 69 7a  ( arraysize, siz
18cc0 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 20 20  eof(char*) );.  
18cd0 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61 79  for(i=0; i<array
18ce0 73 69 7a 65 3b 20 69 2b 2b 29 20 74 79 70 65 73  size; i++) types
18cf0 5b 69 5d 20 3d 20 30 3b 0a 20 20 6d 61 78 64 74  [i] = 0;.  maxdt
18d00 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20 69 66  length = 0;.  if
18d10 28 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 20  ( lemp->vartype 
18d20 29 7b 0a 20 20 20 20 6d 61 78 64 74 6c 65 6e 67  ){.    maxdtleng
18d30 74 68 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  th = lemonStrlen
18d40 28 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 29 3b  (lemp->vartype);
18d50 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
18d60 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
18d70 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c   i++){.    int l
18d80 65 6e 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  en;.    struct s
18d90 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
18da0 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
18db0 20 20 69 66 28 20 73 70 2d 3e 64 61 74 61 74 79    if( sp->dataty
18dc0 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  pe==0 ) continue
18dd0 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f  ;.    len = lemo
18de0 6e 53 74 72 6c 65 6e 28 73 70 2d 3e 64 61 74 61  nStrlen(sp->data
18df0 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20 6c  type);.    if( l
18e00 65 6e 3e 6d 61 78 64 74 6c 65 6e 67 74 68 20 29  en>maxdtlength )
18e10 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c   maxdtlength = l
18e20 65 6e 3b 0a 20 20 7d 0a 20 20 73 74 64 64 74 20  en;.  }.  stddt 
18e30 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28  = (char*)malloc(
18e40 20 6d 61 78 64 74 6c 65 6e 67 74 68 2a 32 20 2b   maxdtlength*2 +
18e50 20 31 20 29 3b 0a 20 20 69 66 28 20 74 79 70 65   1 );.  if( type
18e60 73 3d 3d 30 20 7c 7c 20 73 74 64 64 74 3d 3d 30  s==0 || stddt==0
18e70 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
18e80 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d  stderr,"Out of m
18e90 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20  emory.\n");.    
18ea0 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20  exit(1);.  }..  
18eb0 2f 2a 20 42 75 69 6c 64 20 61 20 68 61 73 68 20  /* Build a hash 
18ec0 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70  table of datatyp
18ed0 65 73 2e 20 54 68 65 20 22 2e 64 74 6e 75 6d 22  es. The ".dtnum"
18ee0 20 66 69 65 6c 64 20 6f 66 20 65 61 63 68 20 73   field of each s
18ef0 79 6d 62 6f 6c 0a 20 20 2a 2a 20 69 73 20 66 69  ymbol.  ** is fi
18f00 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 74 68 65  lled in with the
18f10 20 68 61 73 68 20 69 6e 64 65 78 20 70 6c 75 73   hash index plus
18f20 20 31 2e 20 20 41 20 22 2e 64 74 6e 75 6d 22 20   1.  A ".dtnum" 
18f30 76 61 6c 75 65 20 6f 66 20 30 20 69 73 0a 20 20  value of 0 is.  
18f40 2a 2a 20 75 73 65 64 20 66 6f 72 20 74 65 72 6d  ** used for term
18f50 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 2e 20 20 49  inal symbols.  I
18f60 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 25 64  f there is no %d
18f70 65 66 61 75 6c 74 5f 74 79 70 65 20 64 65 66 69  efault_type defi
18f80 6e 65 64 20 74 68 65 6e 0a 20 20 2a 2a 20 30 20  ned then.  ** 0 
18f90 69 73 20 61 6c 73 6f 20 75 73 65 64 20 61 73 20  is also used as 
18fa0 74 68 65 20 2e 64 74 6e 75 6d 20 76 61 6c 75 65  the .dtnum value
18fb0 20 66 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   for nonterminal
18fc0 73 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 73  s which do not s
18fd0 70 65 63 69 66 79 0a 20 20 2a 2a 20 61 20 64 61  pecify.  ** a da
18fe0 74 61 74 79 70 65 20 75 73 69 6e 67 20 74 68 65  tatype using the
18ff0 20 25 74 79 70 65 20 64 69 72 65 63 74 69 76 65   %type directive
19000 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
19010 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
19020 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  l; i++){.    str
19030 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
19040 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
19050 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 70 3b  ];.    char *cp;
19060 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 6c 65 6d  .    if( sp==lem
19070 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20  p->errsym ){.   
19080 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 61     sp->dtnum = a
19090 72 72 61 79 73 69 7a 65 2b 31 3b 0a 20 20 20 20  rraysize+1;.    
190a0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
190b0 7d 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  }.    if( sp->ty
190c0 70 65 21 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20  pe!=NONTERMINAL 
190d0 7c 7c 20 28 73 70 2d 3e 64 61 74 61 74 79 70 65  || (sp->datatype
190e0 3d 3d 30 20 26 26 20 6c 65 6d 70 2d 3e 76 61 72  ==0 && lemp->var
190f0 74 79 70 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  type==0) ){.    
19100 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b    sp->dtnum = 0;
19110 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
19120 0a 20 20 20 20 7d 0a 20 20 20 20 63 70 20 3d 20  .    }.    cp = 
19130 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20 20  sp->datatype;.  
19140 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70    if( cp==0 ) cp
19150 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65   = lemp->vartype
19160 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20  ;.    j = 0;.   
19170 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
19180 2a 63 70 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20  *cp) ) cp++;.   
19190 20 77 68 69 6c 65 28 20 2a 63 70 20 29 20 73 74   while( *cp ) st
191a0 64 64 74 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b  ddt[j++] = *cp++
191b0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30  ;.    while( j>0
191c0 20 26 26 20 69 73 73 70 61 63 65 28 73 74 64 64   && isspace(stdd
191d0 74 5b 6a 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20  t[j-1]) ) j--;. 
191e0 20 20 20 73 74 64 64 74 5b 6a 5d 20 3d 20 30 3b     stddt[j] = 0;
191f0 0a 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74  .    if( lemp->t
19200 6f 6b 65 6e 74 79 70 65 20 26 26 20 73 74 72 63  okentype && strc
19210 6d 70 28 73 74 64 64 74 2c 20 6c 65 6d 70 2d 3e  mp(stddt, lemp->
19220 74 6f 6b 65 6e 74 79 70 65 29 3d 3d 30 20 29 7b  tokentype)==0 ){
19230 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d  .      sp->dtnum
19240 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 0;.      cont
19250 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
19260 68 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 66 6f  hash = 0;.    fo
19270 72 28 6a 3d 30 3b 20 73 74 64 64 74 5b 6a 5d 3b  r(j=0; stddt[j];
19280 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 68 61 73   j++){.      has
19290 68 20 3d 20 68 61 73 68 2a 35 33 20 2b 20 73 74  h = hash*53 + st
192a0 64 64 74 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20  ddt[j];.    }.  
192b0 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 20 26    hash = (hash &
192c0 20 30 78 37 66 66 66 66 66 66 66 29 25 61 72 72   0x7fffffff)%arr
192d0 61 79 73 69 7a 65 3b 0a 20 20 20 20 77 68 69 6c  aysize;.    whil
192e0 65 28 20 74 79 70 65 73 5b 68 61 73 68 5d 20 29  e( types[hash] )
192f0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
19300 6d 70 28 74 79 70 65 73 5b 68 61 73 68 5d 2c 73  mp(types[hash],s
19310 74 64 64 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tddt)==0 ){.    
19320 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20      sp->dtnum = 
19330 68 61 73 68 20 2b 20 31 3b 0a 20 20 20 20 20 20  hash + 1;.      
19340 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
19350 0a 20 20 20 20 20 20 68 61 73 68 2b 2b 3b 0a 20  .      hash++;. 
19360 20 20 20 20 20 69 66 28 20 68 61 73 68 3e 3d 61       if( hash>=a
19370 72 72 61 79 73 69 7a 65 20 29 20 68 61 73 68 20  rraysize ) hash 
19380 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
19390 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d  f( types[hash]==
193a0 30 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64  0 ){.      sp->d
193b0 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b  tnum = hash + 1;
193c0 0a 20 20 20 20 20 20 74 79 70 65 73 5b 68 61 73  .      types[has
193d0 68 5d 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c  h] = (char*)mall
193e0 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  oc( lemonStrlen(
193f0 73 74 64 64 74 29 2b 31 20 29 3b 0a 20 20 20 20  stddt)+1 );.    
19400 20 20 69 66 28 20 74 79 70 65 73 5b 68 61 73 68    if( types[hash
19410 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]==0 ){.        
19420 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
19430 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e  Out of memory.\n
19440 22 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74  ");.        exit
19450 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (1);.      }.   
19460 20 20 20 73 74 72 63 70 79 28 74 79 70 65 73 5b     strcpy(types[
19470 68 61 73 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20  hash],stddt);.  
19480 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72    }.  }..  /* Pr
19490 69 6e 74 20 6f 75 74 20 74 68 65 20 64 65 66 69  int out the defi
194a0 6e 69 74 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45  nition of YYTOKE
194b0 4e 54 59 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f  NTYPE and YYMINO
194c0 52 54 59 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20  RTYPE */.  name 
194d0 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c  = lemp->name ? l
194e0 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72  emp->name : "Par
194f0 73 65 22 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20  se";.  lineno = 
19500 2a 70 6c 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20  *plineno;.  if( 
19510 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74  mhflag ){ fprint
19520 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52  f(out,"#if INTER
19530 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  FACE\n"); lineno
19540 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  ++; }.  fprintf(
19550 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 54  out,"#define %sT
19560 4f 4b 45 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e  OKENTYPE %s\n",n
19570 61 6d 65 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74  ame,.    lemp->t
19580 6f 6b 65 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74  okentype?lemp->t
19590 6f 6b 65 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22  okentype:"void*"
195a0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
195b0 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70  if( mhflag ){ fp
195c0 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69  rintf(out,"#endi
195d0 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  f\n"); lineno++;
195e0 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
195f0 2c 22 74 79 70 65 64 65 66 20 75 6e 69 6f 6e 20  ,"typedef union 
19600 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  {\n"); lineno++;
19610 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
19620 20 20 69 6e 74 20 79 79 69 6e 69 74 3b 5c 6e 22    int yyinit;\n"
19630 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
19640 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25 73  printf(out,"  %s
19650 54 4f 4b 45 4e 54 59 50 45 20 79 79 30 3b 5c 6e  TOKENTYPE yy0;\n
19660 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  ",name); lineno+
19670 2b 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  +;.  for(i=0; i<
19680 61 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b 29 7b  arraysize; i++){
19690 0a 20 20 20 20 69 66 28 20 74 79 70 65 73 5b 69  .    if( types[i
196a0 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
196b0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
196c0 2c 22 20 20 25 73 20 79 79 25 64 3b 5c 6e 22 2c  ,"  %s yy%d;\n",
196d0 74 79 70 65 73 5b 69 5d 2c 69 2b 31 29 3b 20 6c  types[i],i+1); l
196e0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65  ineno++;.    fre
196f0 65 28 74 79 70 65 73 5b 69 5d 29 3b 0a 20 20 7d  e(types[i]);.  }
19700 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72  .  if( lemp->err
19710 73 79 6d 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20  sym->useCnt ){. 
19720 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
19730 20 20 69 6e 74 20 79 79 25 64 3b 5c 6e 22 2c 6c    int yy%d;\n",l
19740 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e  emp->errsym->dtn
19750 75 6d 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  um); lineno++;. 
19760 20 7d 0a 20 20 66 72 65 65 28 73 74 64 64 74 29   }.  free(stddt)
19770 3b 0a 20 20 66 72 65 65 28 74 79 70 65 73 29 3b  ;.  free(types);
19780 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
19790 7d 20 59 59 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e  } YYMINORTYPE;\n
197a0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
197b0 2a 70 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e  *plineno = linen
197c0 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  o;.}../*.** Retu
197d0 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  rn the name of a
197e0 20 43 20 64 61 74 61 74 79 70 65 20 61 62 6c 65   C datatype able
197f0 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 76 61   to represent va
19800 6c 75 65 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20  lues between.** 
19810 6c 77 72 20 61 6e 64 20 75 70 72 2c 20 69 6e 63  lwr and upr, inc
19820 6c 75 73 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  lusive..*/.stati
19830 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69  c const char *mi
19840 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28  nimum_size_type(
19850 69 6e 74 20 6c 77 72 2c 20 69 6e 74 20 75 70 72  int lwr, int upr
19860 29 7b 0a 20 20 69 66 28 20 6c 77 72 3e 3d 30 20  ){.  if( lwr>=0 
19870 29 7b 0a 20 20 20 20 69 66 28 20 75 70 72 3c 3d  ){.    if( upr<=
19880 32 35 35 20 29 7b 0a 20 20 20 20 20 20 72 65 74  255 ){.      ret
19890 75 72 6e 20 22 75 6e 73 69 67 6e 65 64 20 63 68  urn "unsigned ch
198a0 61 72 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ar";.    }else i
198b0 66 28 20 75 70 72 3c 36 35 35 33 35 20 29 7b 0a  f( upr<65535 ){.
198c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e        return "un
198d0 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74  signed short int
198e0 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ";.    }else{.  
198f0 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69      return "unsi
19900 67 6e 65 64 20 69 6e 74 22 3b 0a 20 20 20 20 7d  gned int";.    }
19910 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72  .  }else if( lwr
19920 3e 3d 2d 31 32 37 20 26 26 20 75 70 72 3c 3d 31  >=-127 && upr<=1
19930 32 37 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  27 ){.    return
19940 20 22 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a   "signed char";.
19950 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e    }else if( lwr>
19960 3d 2d 33 32 37 36 37 20 26 26 20 75 70 72 3c 33  =-32767 && upr<3
19970 32 37 36 37 20 29 7b 0a 20 20 20 20 72 65 74 75  2767 ){.    retu
19980 72 6e 20 22 73 68 6f 72 74 22 3b 0a 20 20 7d 65  rn "short";.  }e
19990 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
199a0 22 69 6e 74 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  "int";.  }.}../*
199b0 0a 2a 2a 20 45 61 63 68 20 73 74 61 74 65 20 63  .** Each state c
199c0 6f 6e 74 61 69 6e 73 20 61 20 73 65 74 20 6f 66  ontains a set of
199d0 20 74 6f 6b 65 6e 20 74 72 61 6e 73 61 63 74 69   token transacti
199e0 6f 6e 20 61 6e 64 20 61 20 73 65 74 20 6f 66 0a  on and a set of.
199f0 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 74  ** nonterminal t
19a00 72 61 6e 73 61 63 74 69 6f 6e 73 2e 20 20 45 61  ransactions.  Ea
19a10 63 68 20 6f 66 20 74 68 65 73 65 20 73 65 74 73  ch of these sets
19a20 20 6d 61 6b 65 73 20 61 6e 20 69 6e 73 74 61 6e   makes an instan
19a30 63 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ce.** of the fol
19a40 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
19a50 2e 20 20 41 6e 20 61 72 72 61 79 20 6f 66 20 74  .  An array of t
19a60 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20  hese structures 
19a70 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6f 72  is used.** to or
19a80 64 65 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e  der the creation
19a90 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
19aa0 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74  he yy_action[] t
19ab0 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  able..*/.struct 
19ac0 61 78 73 65 74 20 7b 0a 20 20 73 74 72 75 63 74  axset {.  struct
19ad0 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20 2f   state *stp;   /
19ae0 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * A pointer to a
19af0 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20   state */.  int 
19b00 69 73 54 6b 6e 3b 20 20 20 20 20 20 20 20 20 20  isTkn;          
19b10 20 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20   /* True to use 
19b20 74 6f 6b 65 6e 73 2e 20 20 46 61 6c 73 65 20 66  tokens.  False f
19b30 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73  or non-terminals
19b40 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f   */.  int nActio
19b50 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  n;         /* Nu
19b60 6d 62 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20  mber of actions 
19b70 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  */.};../*.** Com
19b80 70 61 72 65 20 74 6f 20 61 78 73 65 74 20 73 74  pare to axset st
19b90 72 75 63 74 75 72 65 73 20 66 6f 72 20 73 6f 72  ructures for sor
19ba0 74 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f  ting purposes.*/
19bb0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 78 73 65  .static int axse
19bc0 74 5f 63 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  t_compare(const 
19bd0 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76  void *a, const v
19be0 6f 69 64 20 2a 62 29 7b 0a 20 20 73 74 72 75 63  oid *b){.  struc
19bf0 74 20 61 78 73 65 74 20 2a 70 31 20 3d 20 28 73  t axset *p1 = (s
19c00 74 72 75 63 74 20 61 78 73 65 74 2a 29 61 3b 0a  truct axset*)a;.
19c10 20 20 73 74 72 75 63 74 20 61 78 73 65 74 20 2a    struct axset *
19c20 70 32 20 3d 20 28 73 74 72 75 63 74 20 61 78 73  p2 = (struct axs
19c30 65 74 2a 29 62 3b 0a 20 20 72 65 74 75 72 6e 20  et*)b;.  return 
19c40 70 32 2d 3e 6e 41 63 74 69 6f 6e 20 2d 20 70 31  p2->nAction - p1
19c50 2d 3e 6e 41 63 74 69 6f 6e 3b 0a 7d 0a 0a 2f 2a  ->nAction;.}../*
19c60 0a 2a 2a 20 57 72 69 74 65 20 74 65 78 74 20 6f  .** Write text o
19c70 6e 20 22 6f 75 74 22 20 74 68 61 74 20 64 65 73  n "out" that des
19c80 63 72 69 62 65 73 20 74 68 65 20 72 75 6c 65 20  cribes the rule 
19c90 22 72 70 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  "rp"..*/.static 
19ca0 76 6f 69 64 20 77 72 69 74 65 52 75 6c 65 54 65  void writeRuleTe
19cb0 78 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73 74  xt(FILE *out, st
19cc0 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a  ruct rule *rp){.
19cd0 20 20 69 6e 74 20 6a 3b 0a 20 20 66 70 72 69 6e    int j;.  fprin
19ce0 74 66 28 6f 75 74 2c 22 25 73 20 3a 3a 3d 22 2c  tf(out,"%s ::=",
19cf0 20 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b   rp->lhs->name);
19d00 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 72 70  .  for(j=0; j<rp
19d10 2d 3e 6e 72 68 73 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nrhs; j++){.  
19d20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
19d30 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 6a 5d  *sp = rp->rhs[j]
19d40 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
19d50 74 2c 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d  t," %s", sp->nam
19d60 65 29 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e  e);.    if( sp->
19d70 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
19d80 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  NAL ){.      int
19d90 20 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d   k;.      for(k=
19da0 31 3b 20 6b 3c 73 70 2d 3e 6e 73 75 62 73 79 6d  1; k<sp->nsubsym
19db0 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
19dc0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7c 25 73  fprintf(out,"|%s
19dd0 22 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d 2d  ",sp->subsym[k]-
19de0 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  >name);.      }.
19df0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a      }.  }.}.../*
19e00 20 47 65 6e 65 72 61 74 65 20 43 20 73 6f 75 72   Generate C sour
19e10 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ce code for the 
19e20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52  parser */.void R
19e30 65 70 6f 72 74 54 61 62 6c 65 28 6c 65 6d 70 2c  eportTable(lemp,
19e40 20 6d 68 66 6c 61 67 29 0a 73 74 72 75 63 74 20   mhflag).struct 
19e50 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74  lemon *lemp;.int
19e60 20 6d 68 66 6c 61 67 3b 20 20 20 20 20 2f 2a 20   mhflag;     /* 
19e70 4f 75 74 70 75 74 20 69 6e 20 6d 61 6b 65 68 65  Output in makehe
19e80 61 64 65 72 73 20 66 6f 72 6d 61 74 20 69 66 20  aders format if 
19e90 74 72 75 65 20 2a 2f 0a 7b 0a 20 20 46 49 4c 45  true */.{.  FILE
19ea0 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68   *out, *in;.  ch
19eb0 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45  ar line[LINESIZE
19ec0 5d 3b 0a 20 20 69 6e 74 20 20 6c 69 6e 65 6e 6f  ];.  int  lineno
19ed0 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
19ee0 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
19ef0 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 73 74  action *ap;.  st
19f00 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20  ruct rule *rp;. 
19f10 20 73 74 72 75 63 74 20 61 63 74 74 61 62 20 2a   struct acttab *
19f20 70 41 63 74 74 61 62 3b 0a 20 20 69 6e 74 20 69  pActtab;.  int i
19f30 2c 20 6a 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a  , j, n;.  char *
19f40 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6d 6e 54 6b  name;.  int mnTk
19f50 6e 4f 66 73 74 2c 20 6d 78 54 6b 6e 4f 66 73 74  nOfst, mxTknOfst
19f60 3b 0a 20 20 69 6e 74 20 6d 6e 4e 74 4f 66 73 74  ;.  int mnNtOfst
19f70 2c 20 6d 78 4e 74 4f 66 73 74 3b 0a 20 20 73 74  , mxNtOfst;.  st
19f80 72 75 63 74 20 61 78 73 65 74 20 2a 61 78 3b 0a  ruct axset *ax;.
19f90 0a 20 20 69 6e 20 3d 20 74 70 6c 74 5f 6f 70 65  .  in = tplt_ope
19fa0 6e 28 6c 65 6d 70 29 3b 0a 20 20 69 66 28 20 69  n(lemp);.  if( i
19fb0 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
19fc0 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e   out = file_open
19fd0 28 6c 65 6d 70 2c 22 2e 63 22 2c 22 77 62 22 29  (lemp,".c","wb")
19fe0 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29  ;.  if( out==0 )
19ff0 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  {.    fclose(in)
1a000 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1a010 7d 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a  }.  lineno = 1;.
1a020 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1a030 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1a040 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
1a050 6e 65 72 61 74 65 20 74 68 65 20 69 6e 63 6c 75  nerate the inclu
1a060 64 65 20 63 6f 64 65 2c 20 69 66 20 61 6e 79 20  de code, if any 
1a070 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
1a080 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 69  out,lemp,lemp->i
1a090 6e 63 6c 75 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b  nclude,&lineno);
1a0a0 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b  .  if( mhflag ){
1a0b0 0a 20 20 20 20 63 68 61 72 20 2a 6e 61 6d 65 20  .    char *name 
1a0c0 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28  = file_makename(
1a0d0 6c 65 6d 70 2c 20 22 2e 68 22 29 3b 0a 20 20 20  lemp, ".h");.   
1a0e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69   fprintf(out,"#i
1a0f0 6e 63 6c 75 64 65 20 5c 22 25 73 5c 22 5c 6e 22  nclude \"%s\"\n"
1a100 2c 20 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  , name); lineno+
1a110 2b 3b 0a 20 20 20 20 66 72 65 65 28 6e 61 6d 65  +;.    free(name
1a120 29 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  );.  }.  tplt_xf
1a130 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1a140 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1a150 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 23 64    /* Generate #d
1a160 65 66 69 6e 65 73 20 66 6f 72 20 61 6c 6c 20 74  efines for all t
1a170 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69 66 28 20 6d  okens */.  if( m
1a180 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 63 68 61  hflag ){.    cha
1a190 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 20 20 66  r *prefix;.    f
1a1a0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20  printf(out,"#if 
1a1b0 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c  INTERFACE\n"); l
1a1c0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28  ineno++;.    if(
1a1d0 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66   lemp->tokenpref
1a1e0 69 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c 65  ix ) prefix = le
1a1f0 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b  mp->tokenprefix;
1a200 0a 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20  .    else       
1a210 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65               pre
1a220 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f  fix = "";.    fo
1a230 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=1; i<lemp->n
1a240 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a  terminal; i++){.
1a250 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1a260 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33  t,"#define %s%-3
1a270 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78  0s %2d\n",prefix
1a280 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
1a290 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20  ]->name,i);.    
1a2a0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
1a2b0 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  }.    fprintf(ou
1a2c0 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c  t,"#endif\n"); l
1a2d0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74  ineno++;.  }.  t
1a2e0 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1a2f0 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1a300 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1a310 61 74 65 20 74 68 65 20 64 65 66 69 6e 65 73 20  ate the defines 
1a320 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
1a330 2c 22 23 64 65 66 69 6e 65 20 59 59 43 4f 44 45  ,"#define YYCODE
1a340 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20  TYPE %s\n",.    
1a350 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
1a360 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62  e(0, lemp->nsymb
1a370 6f 6c 2b 31 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ol+1)); lineno++
1a380 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1a390 22 23 64 65 66 69 6e 65 20 59 59 4e 4f 43 4f 44  "#define YYNOCOD
1a3a0 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73  E %d\n",lemp->ns
1a3b0 79 6d 62 6f 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e  ymbol+1);  linen
1a3c0 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1a3d0 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 41 43  ut,"#define YYAC
1a3e0 54 49 4f 4e 54 59 50 45 20 25 73 5c 6e 22 2c 0a  TIONTYPE %s\n",.
1a3f0 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65      minimum_size
1a400 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e  _type(0, lemp->n
1a410 73 74 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c  state+lemp->nrul
1a420 65 2b 35 29 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  e+5));  lineno++
1a430 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 77 69  ;.  if( lemp->wi
1a440 6c 64 63 61 72 64 20 29 7b 0a 20 20 20 20 66 70  ldcard ){.    fp
1a450 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1a460 6e 65 20 59 59 57 49 4c 44 43 41 52 44 20 25 64  ne YYWILDCARD %d
1a470 5c 6e 22 2c 0a 20 20 20 20 20 20 20 6c 65 6d 70  \n",.       lemp
1a480 2d 3e 77 69 6c 64 63 61 72 64 2d 3e 69 6e 64 65  ->wildcard->inde
1a490 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  x); lineno++;.  
1a4a0 7d 0a 20 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f  }.  print_stack_
1a4b0 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26  union(out,lemp,&
1a4c0 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a  lineno,mhflag);.
1a4d0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1a4e0 23 69 66 6e 64 65 66 20 59 59 53 54 41 43 4b 44  #ifndef YYSTACKD
1a4f0 45 50 54 48 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  EPTH\n"); lineno
1a500 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  ++;.  if( lemp->
1a510 73 74 61 63 6b 73 69 7a 65 20 29 7b 0a 20 20 20  stacksize ){.   
1a520 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1a530 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50  efine YYSTACKDEP
1a540 54 48 20 25 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73  TH %s\n",lemp->s
1a550 74 61 63 6b 73 69 7a 65 29 3b 20 20 6c 69 6e 65  tacksize);  line
1a560 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  no++;.  }else{. 
1a570 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1a580 23 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44  #define YYSTACKD
1a590 45 50 54 48 20 31 30 30 5c 6e 22 29 3b 20 20 6c  EPTH 100\n");  l
1a5a0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66  ineno++;.  }.  f
1a5b0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 65 6e  printf(out, "#en
1a5c0 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  dif\n"); lineno+
1a5d0 2b 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20  +;.  if( mhflag 
1a5e0 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
1a5f0 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43  ut,"#if INTERFAC
1a600 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  E\n"); lineno++;
1a610 0a 20 20 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c 65  .  }.  name = le
1a620 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d  mp->name ? lemp-
1a630 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b  >name : "Parse";
1a640 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 61 72 67  .  if( lemp->arg
1a650 20 26 26 20 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d   && lemp->arg[0]
1a660 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
1a670 20 20 20 69 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c     i = lemonStrl
1a680 65 6e 28 6c 65 6d 70 2d 3e 61 72 67 29 3b 0a 20  en(lemp->arg);. 
1a690 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26     while( i>=1 &
1a6a0 26 20 69 73 73 70 61 63 65 28 6c 65 6d 70 2d 3e  & isspace(lemp->
1a6b0 61 72 67 5b 69 2d 31 5d 29 20 29 20 69 2d 2d 3b  arg[i-1]) ) i--;
1a6c0 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31  .    while( i>=1
1a6d0 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 6c 65 6d   && (isalnum(lem
1a6e0 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 7c 7c 20  p->arg[i-1]) || 
1a6f0 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 3d 3d  lemp->arg[i-1]==
1a700 27 5f 27 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20  '_') ) i--;.    
1a710 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1a720 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45 43 4c  fine %sARG_SDECL
1a730 20 25 73 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d   %s;\n",name,lem
1a740 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f  p->arg);  lineno
1a750 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
1a760 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
1a770 52 47 5f 50 44 45 43 4c 20 2c 25 73 5c 6e 22 2c  RG_PDECL ,%s\n",
1a780 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b  name,lemp->arg);
1a790 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
1a7a0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1a7b0 66 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43 48  fine %sARG_FETCH
1a7c0 20 25 73 20 3d 20 79 79 70 50 61 72 73 65 72 2d   %s = yypParser-
1a7d0 3e 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  >%s\n",.        
1a7e0 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c 6c 65           name,le
1a7f0 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d 3e 61  mp->arg,&lemp->a
1a800 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b  rg[i]);  lineno+
1a810 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
1a820 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
1a830 47 5f 53 54 4f 52 45 20 79 79 70 50 61 72 73 65  G_STORE yypParse
1a840 72 2d 3e 25 73 20 3d 20 25 73 5c 6e 22 2c 0a 20  r->%s = %s\n",. 
1a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a860 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b  name,&lemp->arg[
1a870 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d  i],&lemp->arg[i]
1a880 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1a890 7d 65 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e  }else{.    fprin
1a8a0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1a8b0 25 73 41 52 47 5f 53 44 45 43 4c 5c 6e 22 2c 6e  %sARG_SDECL\n",n
1a8c0 61 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  ame);  lineno++;
1a8d0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1a8e0 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
1a8f0 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20  PDECL\n",name); 
1a900 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
1a910 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1a920 69 6e 65 20 25 73 41 52 47 5f 46 45 54 43 48 5c  ine %sARG_FETCH\
1a930 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  n",name); lineno
1a940 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
1a950 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
1a960 52 47 5f 53 54 4f 52 45 5c 6e 22 2c 6e 61 6d 65  RG_STORE\n",name
1a970 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1a980 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b  .  if( mhflag ){
1a990 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1a9a0 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69  ,"#endif\n"); li
1a9b0 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70  neno++;.  }.  fp
1a9c0 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1a9d0 6e 65 20 59 59 4e 53 54 41 54 45 20 25 64 5c 6e  ne YYNSTATE %d\n
1a9e0 22 2c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 29 3b  ",lemp->nstate);
1a9f0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70    lineno++;.  fp
1aa00 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1aa10 6e 65 20 59 59 4e 52 55 4c 45 20 25 64 5c 6e 22  ne YYNRULE %d\n"
1aa20 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b 20 20  ,lemp->nrule);  
1aa30 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20  lineno++;.  if( 
1aa40 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 75 73  lemp->errsym->us
1aa50 65 43 6e 74 20 29 7b 0a 20 20 20 20 66 70 72 69  eCnt ){.    fpri
1aa60 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1aa70 20 59 59 45 52 52 4f 52 53 59 4d 42 4f 4c 20 25   YYERRORSYMBOL %
1aa80 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79  d\n",lemp->errsy
1aa90 6d 2d 3e 69 6e 64 65 78 29 3b 20 20 6c 69 6e 65  m->index);  line
1aaa0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
1aab0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1aac0 59 45 52 52 53 59 4d 44 54 20 79 79 25 64 5c 6e  YERRSYMDT yy%d\n
1aad0 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e  ",lemp->errsym->
1aae0 64 74 6e 75 6d 29 3b 20 20 6c 69 6e 65 6e 6f 2b  dtnum);  lineno+
1aaf0 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d  +;.  }.  if( lem
1ab00 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20  p->has_fallback 
1ab10 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
1ab20 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 46 41  ut,"#define YYFA
1ab30 4c 4c 42 41 43 4b 20 31 5c 6e 22 29 3b 20 20 6c  LLBACK 1\n");  l
1ab40 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74  ineno++;.  }.  t
1ab50 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1ab60 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1ab70 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1ab80 61 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74  ate the action t
1ab90 61 62 6c 65 20 61 6e 64 20 69 74 73 20 61 73 73  able and its ass
1aba0 6f 63 69 61 74 65 73 3a 0a 20 20 2a 2a 0a 20 20  ociates:.  **.  
1abb0 2a 2a 20 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20  **  yy_action[] 
1abc0 20 20 20 20 20 20 20 41 20 73 69 6e 67 6c 65 20         A single 
1abd0 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1abe0 20 61 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a 20 20   all actions..  
1abf0 2a 2a 20 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64  **  yy_lookahead
1ac00 5b 5d 20 20 20 20 20 41 20 74 61 62 6c 65 20 63  []     A table c
1ac10 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f  ontaining the lo
1ac20 6f 6b 61 68 65 61 64 20 66 6f 72 20 65 61 63 68  okahead for each
1ac30 20 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 20   entry in.  **  
1ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac50 20 20 20 79 79 5f 61 63 74 69 6f 6e 2e 20 20 55     yy_action.  U
1ac60 73 65 64 20 74 6f 20 64 65 74 65 63 74 20 68 61  sed to detect ha
1ac70 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20  sh collisions.. 
1ac80 20 2a 2a 20 20 79 79 5f 73 68 69 66 74 5f 6f 66   **  yy_shift_of
1ac90 73 74 5b 5d 20 20 20 20 46 6f 72 20 65 61 63 68  st[]    For each
1aca0 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73   state, the offs
1acb0 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f  et into yy_actio
1acc0 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20  n for.  **      
1acd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1ace0 68 69 66 74 69 6e 67 20 74 65 72 6d 69 6e 61 6c  hifting terminal
1acf0 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 72 65 64 75  s..  **  yy_redu
1ad00 63 65 5f 6f 66 73 74 5b 5d 20 20 20 46 6f 72 20  ce_ofst[]   For 
1ad10 65 61 63 68 20 73 74 61 74 65 2c 20 74 68 65 20  each state, the 
1ad20 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61  offset into yy_a
1ad30 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20  ction for.  **  
1ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad50 20 20 20 73 68 69 66 74 69 6e 67 20 6e 6f 6e 2d     shifting non-
1ad60 74 65 72 6d 69 6e 61 6c 73 20 61 66 74 65 72 20  terminals after 
1ad70 61 20 72 65 64 75 63 65 2e 0a 20 20 2a 2a 20 20  a reduce..  **  
1ad80 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 20 20 20  yy_default[]    
1ad90 20 20 20 44 65 66 61 75 6c 74 20 61 63 74 69 6f     Default actio
1ada0 6e 20 66 6f 72 20 65 61 63 68 20 73 74 61 74 65  n for each state
1adb0 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  ..  */..  /* Com
1adc0 70 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e 73  pute the actions
1add0 20 6f 6e 20 61 6c 6c 20 73 74 61 74 65 73 20 61   on all states a
1ade0 6e 64 20 63 6f 75 6e 74 20 74 68 65 6d 20 75 70  nd count them up
1adf0 20 2a 2f 0a 20 20 61 78 20 3d 20 63 61 6c 6c 6f   */.  ax = callo
1ae00 63 28 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32  c(lemp->nstate*2
1ae10 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29 29  , sizeof(ax[0]))
1ae20 3b 0a 20 20 69 66 28 20 61 78 3d 3d 30 20 29 7b  ;.  if( ax==0 ){
1ae30 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
1ae40 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  err,"malloc fail
1ae50 65 64 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  ed\n");.    exit
1ae60 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  (1);.  }.  for(i
1ae70 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
1ae80 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
1ae90 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
1aea0 5b 69 5d 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d  [i];.    ax[i*2]
1aeb0 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20  .stp = stp;.    
1aec0 61 78 5b 69 2a 32 5d 2e 69 73 54 6b 6e 20 3d 20  ax[i*2].isTkn = 
1aed0 31 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 6e  1;.    ax[i*2].n
1aee0 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 54  Action = stp->nT
1aef0 6b 6e 41 63 74 3b 0a 20 20 20 20 61 78 5b 69 2a  knAct;.    ax[i*
1af00 32 2b 31 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a  2+1].stp = stp;.
1af10 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 69 73      ax[i*2+1].is
1af20 54 6b 6e 20 3d 20 30 3b 0a 20 20 20 20 61 78 5b  Tkn = 0;.    ax[
1af30 69 2a 32 2b 31 5d 2e 6e 41 63 74 69 6f 6e 20 3d  i*2+1].nAction =
1af40 20 73 74 70 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20   stp->nNtAct;.  
1af50 7d 0a 20 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20  }.  mxTknOfst = 
1af60 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 30 3b 0a 20  mnTknOfst = 0;. 
1af70 20 6d 78 4e 74 4f 66 73 74 20 3d 20 6d 6e 4e 74   mxNtOfst = mnNt
1af80 4f 66 73 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Ofst = 0;..  /* 
1af90 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63 74 69  Compute the acti
1afa0 6f 6e 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 72  on table.  In or
1afb0 64 65 72 20 74 6f 20 74 72 79 20 74 6f 20 6b 65  der to try to ke
1afc0 65 70 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ep the size of t
1afd0 68 65 0a 20 20 2a 2a 20 61 63 74 69 6f 6e 20 74  he.  ** action t
1afe0 61 62 6c 65 20 74 6f 20 61 20 6d 69 6e 69 6d 75  able to a minimu
1aff0 6d 2c 20 74 68 65 20 68 65 75 72 69 73 74 69 63  m, the heuristic
1b000 20 6f 66 20 70 6c 61 63 69 6e 67 20 74 68 65 20   of placing the 
1b010 6c 61 72 67 65 73 74 20 61 63 74 69 6f 6e 0a 20  largest action. 
1b020 20 2a 2a 20 73 65 74 73 20 66 69 72 73 74 20 69   ** sets first i
1b030 73 20 75 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 71  s used..  */.  q
1b040 73 6f 72 74 28 61 78 2c 20 6c 65 6d 70 2d 3e 6e  sort(ax, lemp->n
1b050 73 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66 28  state*2, sizeof(
1b060 61 78 5b 30 5d 29 2c 20 61 78 73 65 74 5f 63 6f  ax[0]), axset_co
1b070 6d 70 61 72 65 29 3b 0a 20 20 70 41 63 74 74 61  mpare);.  pActta
1b080 62 20 3d 20 61 63 74 74 61 62 5f 61 6c 6c 6f 63  b = acttab_alloc
1b090 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ();.  for(i=0; i
1b0a0 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 20  <lemp->nstate*2 
1b0b0 26 26 20 61 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e  && ax[i].nAction
1b0c0 3e 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  >0; i++){.    st
1b0d0 70 20 3d 20 61 78 5b 69 5d 2e 73 74 70 3b 0a 20  p = ax[i].stp;. 
1b0e0 20 20 20 69 66 28 20 61 78 5b 69 5d 2e 69 73 54     if( ax[i].isT
1b0f0 6b 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  kn ){.      for(
1b100 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
1b110 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
1b120 20 20 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e        int action
1b130 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  ;.        if( ap
1b140 2d 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d 6c 65 6d  ->sp->index>=lem
1b150 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63  p->nterminal ) c
1b160 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1b170 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74   action = comput
1b180 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61  e_action(lemp, a
1b190 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
1b1a0 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69  action<0 ) conti
1b1b0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74  nue;.        act
1b1c0 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74  tab_action(pActt
1b1d0 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  ab, ap->sp->inde
1b1e0 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20  x, action);.    
1b1f0 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69    }.      stp->i
1b200 54 6b 6e 4f 66 73 74 20 3d 20 61 63 74 74 61 62  TknOfst = acttab
1b210 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61 62 29  _insert(pActtab)
1b220 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d  ;.      if( stp-
1b230 3e 69 54 6b 6e 4f 66 73 74 3c 6d 6e 54 6b 6e 4f  >iTknOfst<mnTknO
1b240 66 73 74 20 29 20 6d 6e 54 6b 6e 4f 66 73 74 20  fst ) mnTknOfst 
1b250 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b  = stp->iTknOfst;
1b260 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e  .      if( stp->
1b270 69 54 6b 6e 4f 66 73 74 3e 6d 78 54 6b 6e 4f 66  iTknOfst>mxTknOf
1b280 73 74 20 29 20 6d 78 54 6b 6e 4f 66 73 74 20 3d  st ) mxTknOfst =
1b290 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a   stp->iTknOfst;.
1b2a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b2b0 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
1b2c0 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
1b2d0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
1b2e0 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69  ction;.        i
1b2f0 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  f( ap->sp->index
1b300 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
1b310 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1b320 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d       if( ap->sp-
1b330 3e 69 6e 64 65 78 3d 3d 6c 65 6d 70 2d 3e 6e 73  >index==lemp->ns
1b340 79 6d 62 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65  ymbol ) continue
1b350 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69 6f 6e  ;.        action
1b360 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f   = compute_actio
1b370 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20  n(lemp, ap);.   
1b380 20 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c       if( action<
1b390 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1b3a0 20 20 20 20 20 20 61 63 74 74 61 62 5f 61 63 74        acttab_act
1b3b0 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61 70 2d  ion(pActtab, ap-
1b3c0 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69  >sp->index, acti
1b3d0 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  on);.      }.   
1b3e0 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 20     stp->iNtOfst 
1b3f0 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28  = acttab_insert(
1b400 70 41 63 74 74 61 62 29 3b 0a 20 20 20 20 20 20  pActtab);.      
1b410 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  if( stp->iNtOfst
1b420 3c 6d 6e 4e 74 4f 66 73 74 20 29 20 6d 6e 4e 74  <mnNtOfst ) mnNt
1b430 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f  Ofst = stp->iNtO
1b440 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  fst;.      if( s
1b450 74 70 2d 3e 69 4e 74 4f 66 73 74 3e 6d 78 4e 74  tp->iNtOfst>mxNt
1b460 4f 66 73 74 20 29 20 6d 78 4e 74 4f 66 73 74 20  Ofst ) mxNtOfst 
1b470 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a  = stp->iNtOfst;.
1b480 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 72 65 65      }.  }.  free
1b490 28 61 78 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  (ax);..  /* Outp
1b4a0 75 74 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  ut the yy_action
1b4b0 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69   table */.  fpri
1b4c0 6e 74 66 28 6f 75 74 2c 22 73 74 61 74 69 63 20  ntf(out,"static 
1b4d0 63 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e 54 59  const YYACTIONTY
1b4e0 50 45 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 3d  PE yy_action[] =
1b4f0 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   {\n"); lineno++
1b500 3b 0a 20 20 6e 20 3d 20 61 63 74 74 61 62 5f 73  ;.  n = acttab_s
1b510 69 7a 65 28 70 41 63 74 74 61 62 29 3b 0a 20 20  ize(pActtab);.  
1b520 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
1b530 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 63  i++){.    int ac
1b540 74 69 6f 6e 20 3d 20 61 63 74 74 61 62 5f 79 79  tion = acttab_yy
1b550 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20  action(pActtab, 
1b560 69 29 3b 0a 20 20 20 20 69 66 28 20 61 63 74 69  i);.    if( acti
1b570 6f 6e 3c 30 20 29 20 61 63 74 69 6f 6e 20 3d 20  on<0 ) action = 
1b580 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c  lemp->nstate + l
1b590 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20 32 3b 0a  emp->nrule + 2;.
1b5a0 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66      if( j==0 ) f
1b5b0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
1b5c0 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20  %5d */ ", i);.  
1b5d0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1b5e0 20 25 34 64 2c 22 2c 20 61 63 74 69 6f 6e 29 3b   %4d,", action);
1b5f0 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
1b600 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
1b610 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
1b620 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1b630 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
1b640 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
1b650 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
1b660 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
1b670 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20  "); lineno++;.. 
1b680 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79   /* Output the y
1b690 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 74 61 62 6c  y_lookahead tabl
1b6a0 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  e */.  fprintf(o
1b6b0 75 74 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74  ut,"static const
1b6c0 20 59 59 43 4f 44 45 54 59 50 45 20 79 79 5f 6c   YYCODETYPE yy_l
1b6d0 6f 6f 6b 61 68 65 61 64 5b 5d 20 3d 20 7b 5c 6e  ookahead[] = {\n
1b6e0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1b6f0 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
1b700 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 61  i++){.    int la
1b710 20 3d 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b   = acttab_yylook
1b720 61 68 65 61 64 28 70 41 63 74 74 61 62 2c 20 69  ahead(pActtab, i
1b730 29 3b 0a 20 20 20 20 69 66 28 20 6c 61 3c 30 20  );.    if( la<0 
1b740 29 20 6c 61 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79  ) la = lemp->nsy
1b750 6d 62 6f 6c 3b 0a 20 20 20 20 69 66 28 20 6a 3d  mbol;.    if( j=
1b760 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  =0 ) fprintf(out
1b770 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20  ," /* %5d */ ", 
1b780 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i);.    fprintf(
1b790 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6c 61  out, " %4d,", la
1b7a0 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20  );.    if( j==9 
1b7b0 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20  || i==n-1 ){.   
1b7c0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1b7d0 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
1b7e0 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  .      j = 0;.  
1b7f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a    }else{.      j
1b800 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1b810 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b  fprintf(out, "};
1b820 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1b830 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
1b840 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d   yy_shift_ofst[]
1b850 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69   table */.  fpri
1b860 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
1b870 65 20 59 59 5f 53 48 49 46 54 5f 55 53 45 5f 44  e YY_SHIFT_USE_D
1b880 46 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54  FLT (%d)\n", mnT
1b890 6b 6e 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e  knOfst-1); linen
1b8a0 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d  o++;.  n = lemp-
1b8b0 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65  >nstate;.  while
1b8c0 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73  ( n>0 && lemp->s
1b8d0 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 54 6b 6e  orted[n-1]->iTkn
1b8e0 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20  Ofst==NO_OFFSET 
1b8f0 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66  ) n--;.  fprintf
1b900 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
1b910 59 5f 53 48 49 46 54 5f 4d 41 58 20 25 64 5c 6e  Y_SHIFT_MAX %d\n
1b920 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b  ", n-1); lineno+
1b930 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
1b940 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20  , "static const 
1b950 25 73 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74  %s yy_shift_ofst
1b960 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20 20  [] = {\n", .    
1b970 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69        minimum_si
1b980 7a 65 5f 74 79 70 65 28 6d 6e 54 6b 6e 4f 66 73  ze_type(mnTknOfs
1b990 74 2d 31 2c 20 6d 78 54 6b 6e 4f 66 73 74 29 29  t-1, mxTknOfst))
1b9a0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f  ; lineno++;.  fo
1b9b0 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
1b9c0 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74  +){.    int ofst
1b9d0 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  ;.    stp = lemp
1b9e0 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
1b9f0 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b   ofst = stp->iTk
1ba00 6e 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f  nOfst;.    if( o
1ba10 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29  fst==NO_OFFSET )
1ba20 20 6f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73   ofst = mnTknOfs
1ba30 74 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a  t - 1;.    if( j
1ba40 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75  ==0 ) fprintf(ou
1ba50 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c  t," /* %5d */ ",
1ba60 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66   i);.    fprintf
1ba70 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f  (out, " %4d,", o
1ba80 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d  fst);.    if( j=
1ba90 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
1baa0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1bab0 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
1bac0 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
1bad0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bae0 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
1baf0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1bb00 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
1bb10 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  +;..  /* Output 
1bb20 74 68 65 20 79 79 5f 72 65 64 75 63 65 5f 6f 66  the yy_reduce_of
1bb30 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20  st[] table */.  
1bb40 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64  fprintf(out, "#d
1bb50 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f  efine YY_REDUCE_
1bb60 55 53 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22  USE_DFLT (%d)\n"
1bb70 2c 20 6d 6e 4e 74 4f 66 73 74 2d 31 29 3b 20 6c  , mnNtOfst-1); l
1bb80 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c  ineno++;.  n = l
1bb90 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77  emp->nstate;.  w
1bba0 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d  hile( n>0 && lem
1bbb0 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e  p->sorted[n-1]->
1bbc0 69 4e 74 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53  iNtOfst==NO_OFFS
1bbd0 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69  ET ) n--;.  fpri
1bbe0 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
1bbf0 65 20 59 59 5f 52 45 44 55 43 45 5f 4d 41 58 20  e YY_REDUCE_MAX 
1bc00 25 64 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e  %d\n", n-1); lin
1bc10 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1bc20 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f  (out, "static co
1bc30 6e 73 74 20 25 73 20 79 79 5f 72 65 64 75 63 65  nst %s yy_reduce
1bc40 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20  _ofst[] = {\n", 
1bc50 0a 20 20 20 20 20 20 20 20 20 20 6d 69 6e 69 6d  .          minim
1bc60 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 4e  um_size_type(mnN
1bc70 74 4f 66 73 74 2d 31 2c 20 6d 78 4e 74 4f 66 73  tOfst-1, mxNtOfs
1bc80 74 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  t)); lineno++;. 
1bc90 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
1bca0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f   i++){.    int o
1bcb0 66 73 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c  fst;.    stp = l
1bcc0 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
1bcd0 20 20 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e      ofst = stp->
1bce0 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 69 66 28  iNtOfst;.    if(
1bcf0 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54   ofst==NO_OFFSET
1bd00 20 29 20 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66   ) ofst = mnNtOf
1bd10 73 74 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20  st - 1;.    if( 
1bd20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f  j==0 ) fprintf(o
1bd30 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22  ut," /* %5d */ "
1bd40 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , i);.    fprint
1bd50 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20  f(out, " %4d,", 
1bd60 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a  ofst);.    if( j
1bd70 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b  ==9 || i==n-1 ){
1bd80 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1bd90 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ut, "\n"); linen
1bda0 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30  o++;.      j = 0
1bdb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1bdc0 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     j++;.    }.  
1bdd0 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
1bde0 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   "};\n"); lineno
1bdf0 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  ++;..  /* Output
1be00 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 63 74   the default act
1be10 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  ion table */.  f
1be20 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61  printf(out, "sta
1be30 74 69 63 20 63 6f 6e 73 74 20 59 59 41 43 54 49  tic const YYACTI
1be40 4f 4e 54 59 50 45 20 79 79 5f 64 65 66 61 75 6c  ONTYPE yy_defaul
1be50 74 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e  t[] = {\n"); lin
1be60 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d  eno++;.  n = lem
1be70 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 66 6f 72  p->nstate;.  for
1be80 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
1be90 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  ){.    stp = lem
1bea0 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
1beb0 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72    if( j==0 ) fpr
1bec0 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35  intf(out," /* %5
1bed0 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20  d */ ", i);.    
1bee0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25  fprintf(out, " %
1bef0 34 64 2c 22 2c 20 73 74 70 2d 3e 69 44 66 6c 74  4d,", stp->iDflt
1bf00 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20  );.    if( j==9 
1bf10 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20  || i==n-1 ){.   
1bf20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1bf30 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
1bf40 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  .      j = 0;.  
1bf50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a    }else{.      j
1bf60 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1bf70 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b  fprintf(out, "};
1bf80 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1bf90 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1bfa0 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1bfb0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
1bfc0 6e 65 72 61 74 65 20 74 68 65 20 74 61 62 6c 65  nerate the table
1bfd0 20 6f 66 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b   of fallback tok
1bfe0 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ens..  */.  if( 
1bff0 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61  lemp->has_fallba
1c000 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 78  ck ){.    int mx
1c010 20 3d 20 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e   = lemp->ntermin
1c020 61 6c 20 2d 20 31 3b 0a 20 20 20 20 77 68 69 6c  al - 1;.    whil
1c030 65 28 20 6d 78 3e 30 20 26 26 20 6c 65 6d 70 2d  e( mx>0 && lemp-
1c040 3e 73 79 6d 62 6f 6c 73 5b 6d 78 5d 2d 3e 66 61  >symbols[mx]->fa
1c050 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 20 6d 78 2d  llback==0 ){ mx-
1c060 2d 3b 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30  -; }.    for(i=0
1c070 3b 20 69 3c 3d 6d 78 3b 20 69 2b 2b 29 7b 0a 20  ; i<=mx; i++){. 
1c080 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
1c090 6f 6c 20 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73 79  ol *p = lemp->sy
1c0a0 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20  mbols[i];.      
1c0b0 69 66 28 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d  if( p->fallback=
1c0c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  =0 ){.        fp
1c0d0 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20  rintf(out, "    
1c0e0 30 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 6e  0,  /* %10s => n
1c0f0 6f 74 68 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70 2d  othing */\n", p-
1c100 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  >name);.      }e
1c110 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72  lse{.        fpr
1c120 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 25 33 64  intf(out, "  %3d
1c130 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 25 73  ,  /* %10s => %s
1c140 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c 62   */\n", p->fallb
1c150 61 63 6b 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20  ack->index,.    
1c160 20 20 20 20 20 20 70 2d 3e 6e 61 6d 65 2c 20 70        p->name, p
1c170 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d 65  ->fallback->name
1c180 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c190 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d   lineno++;.    }
1c1a0 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
1c1b0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e 2c  (lemp->name, in,
1c1c0 20 6f 75 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a   out, &lineno);.
1c1d0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1c1e0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
1c1f0 67 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e  g the symbolic n
1c200 61 6d 65 20 6f 66 20 65 76 65 72 79 20 73 79 6d  ame of every sym
1c210 62 6f 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  bol.  */.  for(i
1c220 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
1c230 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  bol; i++){.    s
1c240 70 72 69 6e 74 66 28 6c 69 6e 65 2c 22 5c 22 25  printf(line,"\"%
1c250 73 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d 62  s\",",lemp->symb
1c260 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  ols[i]->name);. 
1c270 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1c280 20 20 25 2d 31 35 73 22 2c 6c 69 6e 65 29 3b 0a    %-15s",line);.
1c290 20 20 20 20 69 66 28 20 28 69 26 33 29 3d 3d 33      if( (i&3)==3
1c2a0 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c   ){ fprintf(out,
1c2b0 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
1c2c0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 26   }.  }.  if( (i&
1c2d0 33 29 21 3d 30 20 29 7b 20 66 70 72 69 6e 74 66  3)!=0 ){ fprintf
1c2e0 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65  (out,"\n"); line
1c2f0 6e 6f 2b 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f 78  no++; }.  tplt_x
1c300 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1c310 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1c320 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1c330 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
1c340 67 20 61 20 74 65 78 74 20 73 74 72 69 6e 67 20  g a text string 
1c350 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 65  that describes e
1c360 76 65 72 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69  very.  ** rule i
1c370 6e 20 74 68 65 20 72 75 6c 65 20 73 65 74 20 6f  n the rule set o
1c380 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20  f the grammar.  
1c390 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
1c3a0 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 77 68   is used.  ** wh
1c3b0 65 6e 20 74 72 61 63 69 6e 67 20 52 45 44 55 43  en tracing REDUC
1c3c0 45 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  E actions..  */.
1c3d0 20 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65    for(i=0, rp=le
1c3e0 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
1c3f0 3d 72 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b  =rp->next, i++){
1c400 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 70 2d  .    assert( rp-
1c410 3e 69 6e 64 65 78 3d 3d 69 20 29 3b 0a 20 20 20  >index==i );.   
1c420 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f   fprintf(out," /
1c430 2a 20 25 33 64 20 2a 2f 20 5c 22 22 2c 20 69 29  * %3d */ \"", i)
1c440 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54  ;.    writeRuleT
1c450 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20  ext(out, rp);.  
1c460 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c    fprintf(out,"\
1c470 22 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ",\n"); lineno++
1c480 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ;.  }.  tplt_xfe
1c490 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1c4a0 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1c4b0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1c4c0 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
1c4d0 20 65 76 65 72 79 20 74 69 6d 65 20 61 20 73 79   every time a sy
1c4e0 6d 62 6f 6c 20 69 73 20 70 6f 70 70 65 64 20 66  mbol is popped f
1c4f0 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 73 74 61  rom.  ** the sta
1c500 63 6b 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73  ck while process
1c510 69 6e 67 20 65 72 72 6f 72 73 20 6f 72 20 77 68  ing errors or wh
1c520 69 6c 65 20 64 65 73 74 72 6f 79 69 6e 67 20 74  ile destroying t
1c530 68 65 20 70 61 72 73 65 72 2e 20 0a 20 20 2a 2a  he parser. .  **
1c540 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
1c550 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 25  , generate the %
1c560 64 65 73 74 72 75 63 74 6f 72 20 61 63 74 69 6f  destructor actio
1c570 6e 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ns).  */.  if( l
1c580 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29  emp->tokendest )
1c590 7b 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d  {.    int once =
1c5a0 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   1;.    for(i=0;
1c5b0 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
1c5c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
1c5d0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
1c5e0 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
1c5f0 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70  i];.      if( sp
1c600 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21  ==0 || sp->type!
1c610 3d 54 45 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74  =TERMINAL ) cont
1c620 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
1c630 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  once ){.        
1c640 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20  fprintf(out, "  
1c650 20 20 20 20 2f 2a 20 54 45 52 4d 49 4e 41 4c 20      /* TERMINAL 
1c660 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22  Destructor */\n"
1c670 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1c680 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20       once = 0;. 
1c690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
1c6a0 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61  intf(out,"    ca
1c6b0 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c  se %d: /* %s */\
1c6c0 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73  n", sp->index, s
1c6d0 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  p->name); lineno
1c6e0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ++;.    }.    fo
1c6f0 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1c700 73 79 6d 62 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e  symbol && lemp->
1c710 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65  symbols[i]->type
1c720 21 3d 54 45 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29  !=TERMINAL; i++)
1c730 3b 0a 20 20 20 20 69 66 28 20 69 3c 6c 65 6d 70  ;.    if( i<lemp
1c740 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20  ->nsymbol ){.   
1c750 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74     emit_destruct
1c760 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70  or_code(out,lemp
1c770 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d  ->symbols[i],lem
1c780 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  p,&lineno);.    
1c790 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1c7a0 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b       break;\n");
1c7b0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d   lineno++;.    }
1c7c0 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d  .  }.  if( lemp-
1c7d0 3e 76 61 72 64 65 73 74 20 29 7b 0a 20 20 20 20  >vardest ){.    
1c7e0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64  struct symbol *d
1c7f0 66 6c 74 5f 73 70 20 3d 20 30 3b 0a 20 20 20 20  flt_sp = 0;.    
1c800 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20  int once = 1;.  
1c810 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1c820 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
1c830 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
1c840 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
1c850 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
1c860 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c      if( sp==0 ||
1c870 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49   sp->type==TERMI
1c880 4e 41 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  NAL ||.         
1c890 20 73 70 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c   sp->index<=0 ||
1c8a0 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21   sp->destructor!
1c8b0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1c8c0 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20 29 7b       if( once ){
1c8d0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
1c8e0 28 6f 75 74 2c 20 22 20 20 20 20 20 20 2f 2a 20  (out, "      /* 
1c8f0 44 65 66 61 75 6c 74 20 4e 4f 4e 2d 54 45 52 4d  Default NON-TERM
1c900 49 4e 41 4c 20 44 65 73 74 72 75 63 74 6f 72 20  INAL Destructor 
1c910 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  */\n"); lineno++
1c920 3b 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d  ;.        once =
1c930 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1c940 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1c950 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25     case %d: /* %
1c960 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64  s */\n", sp->ind
1c970 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c  ex, sp->name); l
1c980 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 64  ineno++;.      d
1c990 66 6c 74 5f 73 70 20 3d 20 73 70 3b 0a 20 20 20  flt_sp = sp;.   
1c9a0 20 7d 0a 20 20 20 20 69 66 28 20 64 66 6c 74 5f   }.    if( dflt_
1c9b0 73 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 65  sp!=0 ){.      e
1c9c0 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63  mit_destructor_c
1c9d0 6f 64 65 28 6f 75 74 2c 64 66 6c 74 5f 73 70 2c  ode(out,dflt_sp,
1c9e0 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lemp,&lineno);. 
1c9f0 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
1ca00 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65 61  (out,"      brea
1ca10 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  k;\n"); lineno++
1ca20 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1ca30 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
1ca40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
1ca50 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
1ca60 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
1ca70 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20  ;.    if( sp==0 
1ca80 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52  || sp->type==TER
1ca90 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 64 65 73  MINAL || sp->des
1caa0 74 72 75 63 74 6f 72 3d 3d 30 20 29 20 63 6f 6e  tructor==0 ) con
1cab0 74 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e  tinue;.    fprin
1cac0 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65  tf(out,"    case
1cad0 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22   %d: /* %s */\n"
1cae0 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d  , sp->index, sp-
1caf0 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  >name); lineno++
1cb00 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e  ;..    /* Combin
1cb10 65 20 64 75 70 6c 69 63 61 74 65 20 64 65 73 74  e duplicate dest
1cb20 72 75 63 74 6f 72 73 20 69 6e 74 6f 20 61 20 73  ructors into a s
1cb30 69 6e 67 6c 65 20 63 61 73 65 20 2a 2f 0a 20 20  ingle case */.  
1cb40 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6c    for(j=i+1; j<l
1cb50 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b  emp->nsymbol; j+
1cb60 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
1cb70 20 73 79 6d 62 6f 6c 20 2a 73 70 32 20 3d 20 6c   symbol *sp2 = l
1cb80 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b  emp->symbols[j];
1cb90 0a 20 20 20 20 20 20 69 66 28 20 73 70 32 20 26  .      if( sp2 &
1cba0 26 20 73 70 32 2d 3e 74 79 70 65 21 3d 54 45 52  & sp2->type!=TER
1cbb0 4d 49 4e 41 4c 20 26 26 20 73 70 32 2d 3e 64 65  MINAL && sp2->de
1cbc0 73 74 72 75 63 74 6f 72 0a 20 20 20 20 20 20 20  structor.       
1cbd0 20 20 20 26 26 20 73 70 32 2d 3e 64 74 6e 75 6d     && sp2->dtnum
1cbe0 3d 3d 73 70 2d 3e 64 74 6e 75 6d 0a 20 20 20 20  ==sp->dtnum.    
1cbf0 20 20 20 20 20 20 26 26 20 73 74 72 63 6d 70 28        && strcmp(
1cc00 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 2c 73  sp->destructor,s
1cc10 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 29 3d  p2->destructor)=
1cc20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 66  =0 ){.         f
1cc30 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
1cc40 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a  case %d: /* %s *
1cc50 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  /\n",.          
1cc60 20 20 20 20 20 20 20 73 70 32 2d 3e 69 6e 64 65         sp2->inde
1cc70 78 2c 20 73 70 32 2d 3e 6e 61 6d 65 29 3b 20 6c  x, sp2->name); l
1cc80 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
1cc90 20 20 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f    sp2->destructo
1cca0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  r = 0;.      }. 
1ccb0 20 20 20 7d 0a 0a 20 20 20 20 65 6d 69 74 5f 64     }..    emit_d
1ccc0 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f  estructor_code(o
1ccd0 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ut,lemp->symbols
1cce0 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f  [i],lemp,&lineno
1ccf0 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1cd00 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b  ut,"      break;
1cd10 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1cd20 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
1cd30 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1cd40 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1cd50 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1cd60 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
1cd70 68 65 6e 65 76 65 72 20 74 68 65 20 70 61 72 73  henever the pars
1cd80 65 72 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f  er stack overflo
1cd90 77 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  ws */.  tplt_pri
1cda0 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
1cdb0 2d 3e 6f 76 65 72 66 6c 6f 77 2c 26 6c 69 6e 65  ->overflow,&line
1cdc0 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  no);.  tplt_xfer
1cdd0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1cde0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1cdf0 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
1ce00 74 61 62 6c 65 20 6f 66 20 72 75 6c 65 20 69 6e  table of rule in
1ce10 66 6f 72 6d 61 74 69 6f 6e 20 0a 20 20 2a 2a 0a  formation .  **.
1ce20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20    ** Note: This 
1ce30 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
1ce40 74 68 65 20 66 61 63 74 20 74 68 61 74 20 72 75  the fact that ru
1ce50 6c 65 73 20 61 72 65 20 6e 75 6d 62 65 72 0a 20  les are number. 
1ce60 20 2a 2a 20 73 65 71 75 65 6e 74 75 61 6c 6c 79   ** sequentually
1ce70 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
1ce80 30 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 72 70  0..  */.  for(rp
1ce90 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
1cea0 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
1ceb0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1cec0 20 20 7b 20 25 64 2c 20 25 64 20 7d 2c 5c 6e 22    { %d, %d },\n"
1ced0 2c 72 70 2d 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c  ,rp->lhs->index,
1cee0 72 70 2d 3e 6e 72 68 73 29 3b 20 6c 69 6e 65 6e  rp->nrhs); linen
1cef0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
1cf00 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1cf10 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1cf20 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1cf30 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
1cf40 74 69 6f 6e 20 64 75 72 69 6e 67 20 65 61 63 68  tion during each
1cf50 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20 2a   REDUCE action *
1cf60 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  /.  for(rp=lemp-
1cf70 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
1cf80 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 74 72 61  ->next){.    tra
1cf90 6e 73 6c 61 74 65 5f 63 6f 64 65 28 6c 65 6d 70  nslate_code(lemp
1cfa0 2c 20 72 70 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  , rp);.  }.  /* 
1cfb0 46 69 72 73 74 20 6f 75 74 70 75 74 20 72 75 6c  First output rul
1cfc0 65 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  es other than th
1cfd0 65 20 64 65 66 61 75 6c 74 3a 20 72 75 6c 65 20  e default: rule 
1cfe0 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  */.  for(rp=lemp
1cff0 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
1d000 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 73 74  p->next){.    st
1d010 72 75 63 74 20 72 75 6c 65 20 2a 72 70 32 3b 20  ruct rule *rp2; 
1d020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d030 20 4f 74 68 65 72 20 72 75 6c 65 73 20 77 69 74   Other rules wit
1d040 68 20 74 68 65 20 73 61 6d 65 20 61 63 74 69 6f  h the same actio
1d050 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 70 2d  n */.    if( rp-
1d060 3e 63 6f 64 65 3d 3d 30 20 29 20 63 6f 6e 74 69  >code==0 ) conti
1d070 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 72 70 2d  nue;.    if( rp-
1d080 3e 63 6f 64 65 5b 30 5d 3d 3d 27 5c 6e 27 20 26  >code[0]=='\n' &
1d090 26 20 72 70 2d 3e 63 6f 64 65 5b 31 5d 3d 3d 30  & rp->code[1]==0
1d0a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20   ) continue; /* 
1d0b0 57 69 6c 6c 20 62 65 20 64 65 66 61 75 6c 74 3a  Will be default:
1d0c0 20 2a 2f 0a 20 20 20 20 66 70 72 69 6e 74 66 28   */.    fprintf(
1d0d0 6f 75 74 2c 22 20 20 20 20 20 20 63 61 73 65 20  out,"      case 
1d0e0 25 64 3a 20 2f 2a 20 22 2c 20 72 70 2d 3e 69 6e  %d: /* ", rp->in
1d0f0 64 65 78 29 3b 0a 20 20 20 20 77 72 69 74 65 52  dex);.    writeR
1d100 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 29  uleText(out, rp)
1d110 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1d120 74 2c 20 22 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e  t, " */\n"); lin
1d130 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 72  eno++;.    for(r
1d140 70 32 3d 72 70 2d 3e 6e 65 78 74 3b 20 72 70 32  p2=rp->next; rp2
1d150 3b 20 72 70 32 3d 72 70 32 2d 3e 6e 65 78 74 29  ; rp2=rp2->next)
1d160 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70 32 2d  {.      if( rp2-
1d170 3e 63 6f 64 65 3d 3d 72 70 2d 3e 63 6f 64 65 20  >code==rp->code 
1d180 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
1d190 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63 61  tf(out,"      ca
1d1a0 73 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72 70 32  se %d: /* ", rp2
1d1b0 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
1d1c0 20 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28    writeRuleText(
1d1d0 6f 75 74 2c 20 72 70 32 29 3b 0a 20 20 20 20 20  out, rp2);.     
1d1e0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1d1f0 20 2a 2f 20 79 79 74 65 73 74 63 61 73 65 28 79   */ yytestcase(y
1d200 79 72 75 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22  yruleno==%d);\n"
1d210 2c 20 72 70 32 2d 3e 69 6e 64 65 78 29 3b 20 6c  , rp2->index); l
1d220 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
1d230 20 72 70 32 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a   rp2->code = 0;.
1d240 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d250 20 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c    emit_code(out,
1d260 72 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  rp,lemp,&lineno)
1d270 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1d280 74 2c 22 20 20 20 20 20 20 20 20 62 72 65 61 6b  t,"        break
1d290 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1d2a0 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20  .    rp->code = 
1d2b0 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 69 6e 61  0;.  }.  /* Fina
1d2c0 6c 6c 79 2c 20 6f 75 74 70 75 74 20 74 68 65 20  lly, output the 
1d2d0 64 65 66 61 75 6c 74 3a 20 72 75 6c 65 2e 20 20  default: rule.  
1d2e0 57 65 20 63 68 6f 6f 73 65 20 61 73 20 74 68 65  We choose as the
1d2f0 20 64 65 66 61 75 6c 74 3a 20 61 6c 6c 0a 20 20   default: all.  
1d300 2a 2a 20 65 6d 70 74 79 20 61 63 74 69 6f 6e 73  ** empty actions
1d310 2e 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  . */.  fprintf(o
1d320 75 74 2c 22 20 20 20 20 20 20 64 65 66 61 75 6c  ut,"      defaul
1d330 74 3a 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  t:\n"); lineno++
1d340 3b 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  ;.  for(rp=lemp-
1d350 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
1d360 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  ->next){.    if(
1d370 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 20 63   rp->code==0 ) c
1d380 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
1d390 65 72 74 28 20 72 70 2d 3e 63 6f 64 65 5b 30 5d  ert( rp->code[0]
1d3a0 3d 3d 27 5c 6e 27 20 26 26 20 72 70 2d 3e 63 6f  =='\n' && rp->co
1d3b0 64 65 5b 31 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  de[1]==0 );.    
1d3c0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1d3d0 20 20 20 2f 2a 20 28 25 64 29 20 22 2c 20 72 70     /* (%d) ", rp
1d3e0 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 77 72  ->index);.    wr
1d3f0 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c  iteRuleText(out,
1d400 20 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74   rp);.    fprint
1d410 66 28 6f 75 74 2c 20 22 20 2a 2f 20 79 79 74 65  f(out, " */ yyte
1d420 73 74 63 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d  stcase(yyruleno=
1d430 3d 25 64 29 3b 5c 6e 22 2c 20 72 70 2d 3e 69 6e  =%d);\n", rp->in
1d440 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  dex); lineno++;.
1d450 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
1d460 74 2c 22 20 20 20 20 20 20 20 20 62 72 65 61 6b  t,"        break
1d470 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1d480 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1d490 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1d4a0 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1d4b0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
1d4c0 63 68 20 65 78 65 63 75 74 65 73 20 69 66 20 61  ch executes if a
1d4d0 20 70 61 72 73 65 20 66 61 69 6c 73 20 2a 2f 0a   parse fails */.
1d4e0 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
1d4f0 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 66 61 69 6c  ,lemp,lemp->fail
1d500 75 72 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  ure,&lineno);.  
1d510 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1d520 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1d530 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1d540 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20  rate code which 
1d550 65 78 65 63 75 74 65 73 20 77 68 65 6e 20 61 20  executes when a 
1d560 73 79 6e 74 61 78 20 65 72 72 6f 72 20 6f 63 63  syntax error occ
1d570 75 72 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72  urs */.  tplt_pr
1d580 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d  int(out,lemp,lem
1d590 70 2d 3e 65 72 72 6f 72 2c 26 6c 69 6e 65 6e 6f  p->error,&lineno
1d5a0 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  );.  tplt_xfer(l
1d5b0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1d5c0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1d5d0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
1d5e0 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68  hich executes wh
1d5f0 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 63  en the parser ac
1d600 63 65 70 74 73 20 69 74 73 20 69 6e 70 75 74 20  cepts its input 
1d610 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
1d620 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 61  out,lemp,lemp->a
1d630 63 63 65 70 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  ccept,&lineno);.
1d640 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1d650 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1d660 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 41 70  ineno);..  /* Ap
1d670 70 65 6e 64 20 61 6e 79 20 61 64 64 69 74 69 6f  pend any additio
1d680 6e 20 63 6f 64 65 20 74 68 65 20 75 73 65 72 20  n code the user 
1d690 64 65 73 69 72 65 73 20 2a 2f 0a 20 20 74 70 6c  desires */.  tpl
1d6a0 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70  t_print(out,lemp
1d6b0 2c 6c 65 6d 70 2d 3e 65 78 74 72 61 63 6f 64 65  ,lemp->extracode
1d6c0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 66 63  ,&lineno);..  fc
1d6d0 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 66 63 6c 6f  lose(in);.  fclo
1d6e0 73 65 28 6f 75 74 29 3b 0a 20 20 72 65 74 75 72  se(out);.  retur
1d6f0 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74  n;.}../* Generat
1d700 65 20 61 20 68 65 61 64 65 72 20 66 69 6c 65 20  e a header file 
1d710 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 2a  for the parser *
1d720 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 48 65 61  /.void ReportHea
1d730 64 65 72 28 6c 65 6d 70 29 0a 73 74 72 75 63 74  der(lemp).struct
1d740 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a   lemon *lemp;.{.
1d750 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e    FILE *out, *in
1d760 3b 0a 20 20 63 68 61 72 20 2a 70 72 65 66 69 78  ;.  char *prefix
1d770 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49  ;.  char line[LI
1d780 4e 45 53 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20  NESIZE];.  char 
1d790 70 61 74 74 65 72 6e 5b 4c 49 4e 45 53 49 5a 45  pattern[LINESIZE
1d7a0 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  ];.  int i;..  i
1d7b0 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72  f( lemp->tokenpr
1d7c0 65 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20  efix ) prefix = 
1d7d0 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
1d7e0 78 3b 0a 20 20 65 6c 73 65 20 20 20 20 20 20 20  x;.  else       
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65               pre
1d800 66 69 78 20 3d 20 22 22 3b 0a 20 20 69 6e 20 3d  fix = "";.  in =
1d810 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c   file_open(lemp,
1d820 22 2e 68 22 2c 22 72 62 22 29 3b 0a 20 20 69 66  ".h","rb");.  if
1d830 28 20 69 6e 20 29 7b 0a 20 20 20 20 66 6f 72 28  ( in ){.    for(
1d840 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65  i=1; i<lemp->nte
1d850 72 6d 69 6e 61 6c 20 26 26 20 66 67 65 74 73 28  rminal && fgets(
1d860 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e  line,LINESIZE,in
1d870 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  ); i++){.      s
1d880 70 72 69 6e 74 66 28 70 61 74 74 65 72 6e 2c 22  printf(pattern,"
1d890 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20  #define %s%-30s 
1d8a0 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65  %2d\n",prefix,le
1d8b0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
1d8c0 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 69  name,i);.      i
1d8d0 66 28 20 73 74 72 63 6d 70 28 6c 69 6e 65 2c 70  f( strcmp(line,p
1d8e0 61 74 74 65 72 6e 29 20 29 20 62 72 65 61 6b 3b  attern) ) break;
1d8f0 0a 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73  .    }.    fclos
1d900 65 28 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 69  e(in);.    if( i
1d910 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  ==lemp->ntermina
1d920 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  l ){.      /* No
1d930 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20 66   change in the f
1d940 69 6c 65 2e 20 20 44 6f 6e 27 74 20 72 65 77 72  ile.  Don't rewr
1d950 69 74 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20  ite it. */.     
1d960 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
1d970 20 7d 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f   }.  out = file_
1d980 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22  open(lemp,".h","
1d990 77 62 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 20  wb");.  if( out 
1d9a0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
1d9b0 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  i<lemp->ntermina
1d9c0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  l; i++){.      f
1d9d0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1d9e0 69 6e 65 20 25 73 25 2d 33 30 73 20 25 32 64 5c  ine %s%-30s %2d\
1d9f0 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e  n",prefix,lemp->
1da00 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65  symbols[i]->name
1da10 2c 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ,i);.    }.    f
1da20 63 6c 6f 73 65 28 6f 75 74 29 3b 20 20 0a 20 20  close(out);  .  
1da30 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.  return;.}../
1da40 2a 20 52 65 64 75 63 65 20 74 68 65 20 73 69 7a  * Reduce the siz
1da50 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20  e of the action 
1da60 74 61 62 6c 65 73 2c 20 69 66 20 70 6f 73 73 69  tables, if possi
1da70 62 6c 65 2c 20 62 79 20 6d 61 6b 69 6e 67 20 75  ble, by making u
1da80 73 65 0a 2a 2a 20 6f 66 20 64 65 66 61 75 6c 74  se.** of default
1da90 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  s..**.** In this
1daa0 20 76 65 72 73 69 6f 6e 2c 20 77 65 20 74 61 6b   version, we tak
1dab0 65 20 74 68 65 20 6d 6f 73 74 20 66 72 65 71 75  e the most frequ
1dac0 65 6e 74 20 52 45 44 55 43 45 20 61 63 74 69 6f  ent REDUCE actio
1dad0 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a 20 69 74  n and make.** it
1dae0 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 45   the default.  E
1daf0 78 63 65 70 74 2c 20 74 68 65 72 65 20 69 73 20  xcept, there is 
1db00 6e 6f 20 64 65 66 61 75 6c 74 20 69 66 20 74 68  no default if th
1db10 65 20 77 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e  e wildcard token
1db20 0a 2a 2a 20 69 73 20 61 20 70 6f 73 73 69 62 6c  .** is a possibl
1db30 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 2e 0a 2a 2f  e look-ahead..*/
1db40 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73 73 54 61  .void CompressTa
1db50 62 6c 65 73 28 6c 65 6d 70 29 0a 73 74 72 75 63  bles(lemp).struc
1db60 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
1db70 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
1db80 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61  *stp;.  struct a
1db90 63 74 69 6f 6e 20 2a 61 70 2c 20 2a 61 70 32 3b  ction *ap, *ap2;
1dba0 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
1dbb0 72 70 2c 20 2a 72 70 32 2c 20 2a 72 62 65 73 74  rp, *rp2, *rbest
1dbc0 3b 0a 20 20 69 6e 74 20 6e 62 65 73 74 2c 20 6e  ;.  int nbest, n
1dbd0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
1dbe0 20 75 73 65 73 57 69 6c 64 63 61 72 64 3b 0a 0a   usesWildcard;..
1dbf0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1dc00 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
1dc10 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
1dc20 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
1dc30 6e 62 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 72  nbest = 0;.    r
1dc40 62 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 75 73  best = 0;.    us
1dc50 65 73 57 69 6c 64 63 61 72 64 20 3d 20 30 3b 0a  esWildcard = 0;.
1dc60 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
1dc70 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
1dc80 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
1dc90 20 61 70 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54   ap->type==SHIFT
1dca0 20 26 26 20 61 70 2d 3e 73 70 3d 3d 6c 65 6d 70   && ap->sp==lemp
1dcb0 2d 3e 77 69 6c 64 63 61 72 64 20 29 7b 0a 20 20  ->wildcard ){.  
1dcc0 20 20 20 20 20 20 75 73 65 73 57 69 6c 64 63 61        usesWildca
1dcd0 72 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rd = 1;.      }.
1dce0 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
1dcf0 70 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f 6e  pe!=REDUCE ) con
1dd00 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 72 70 20  tinue;.      rp 
1dd10 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20  = ap->x.rp;.    
1dd20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 53 74 61    if( rp->lhsSta
1dd30 72 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  rt ) continue;. 
1dd40 20 20 20 20 20 69 66 28 20 72 70 3d 3d 72 62 65       if( rp==rbe
1dd50 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  st ) continue;. 
1dd60 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20       n = 1;.    
1dd70 20 20 66 6f 72 28 61 70 32 3d 61 70 2d 3e 6e 65    for(ap2=ap->ne
1dd80 78 74 3b 20 61 70 32 3b 20 61 70 32 3d 61 70 32  xt; ap2; ap2=ap2
1dd90 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
1dda0 20 69 66 28 20 61 70 32 2d 3e 74 79 70 65 21 3d   if( ap2->type!=
1ddb0 52 45 44 55 43 45 20 29 20 63 6f 6e 74 69 6e 75  REDUCE ) continu
1ddc0 65 3b 0a 20 20 20 20 20 20 20 20 72 70 32 20 3d  e;.        rp2 =
1ddd0 20 61 70 32 2d 3e 78 2e 72 70 3b 0a 20 20 20 20   ap2->x.rp;.    
1dde0 20 20 20 20 69 66 28 20 72 70 32 3d 3d 72 62 65      if( rp2==rbe
1ddf0 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  st ) continue;. 
1de00 20 20 20 20 20 20 20 69 66 28 20 72 70 32 3d 3d         if( rp2==
1de10 72 70 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20  rp ) n++;.      
1de20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 62  }.      if( n>nb
1de30 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  est ){.        n
1de40 62 65 73 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20  best = n;.      
1de50 20 20 72 62 65 73 74 20 3d 20 72 70 3b 0a 20 20    rbest = rp;.  
1de60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 0a 20 20      }.    }. .  
1de70 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b 65    /* Do not make
1de80 20 61 20 64 65 66 61 75 6c 74 20 69 66 20 74 68   a default if th
1de90 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 75 6c 65  e number of rule
1dea0 73 20 74 6f 20 64 65 66 61 75 6c 74 0a 20 20 20  s to default.   
1deb0 20 2a 2a 20 69 73 20 6e 6f 74 20 61 74 20 6c 65   ** is not at le
1dec0 61 73 74 20 31 20 6f 72 20 69 66 20 74 68 65 20  ast 1 or if the 
1ded0 77 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e 20 69  wildcard token i
1dee0 73 20 61 20 70 6f 73 73 69 62 6c 65 0a 20 20 20  s a possible.   
1def0 20 2a 2a 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20   ** lookahead.. 
1df00 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 62     */.    if( nb
1df10 65 73 74 3c 31 20 7c 7c 20 75 73 65 73 57 69 6c  est<1 || usesWil
1df20 64 63 61 72 64 20 29 20 63 6f 6e 74 69 6e 75 65  dcard ) continue
1df30 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69  ;...    /* Combi
1df40 6e 65 20 6d 61 74 63 68 69 6e 67 20 52 45 44 55  ne matching REDU
1df50 43 45 20 61 63 74 69 6f 6e 73 20 69 6e 74 6f 20  CE actions into 
1df60 61 20 73 69 6e 67 6c 65 20 64 65 66 61 75 6c 74  a single default
1df70 20 2a 2f 0a 20 20 20 20 66 6f 72 28 61 70 3d 73   */.    for(ap=s
1df80 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  tp->ap; ap; ap=a
1df90 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
1dfa0 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45  if( ap->type==RE
1dfb0 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72 70  DUCE && ap->x.rp
1dfc0 3d 3d 72 62 65 73 74 20 29 20 62 72 65 61 6b 3b  ==rbest ) break;
1dfd0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1dfe0 74 28 20 61 70 20 29 3b 0a 20 20 20 20 61 70 2d  t( ap );.    ap-
1dff0 3e 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  >sp = Symbol_new
1e000 28 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20  ("{default}");. 
1e010 20 20 20 66 6f 72 28 61 70 3d 61 70 2d 3e 6e 65     for(ap=ap->ne
1e020 78 74 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  xt; ap; ap=ap->n
1e030 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
1e040 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45  ap->type==REDUCE
1e050 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62   && ap->x.rp==rb
1e060 65 73 74 20 29 20 61 70 2d 3e 74 79 70 65 20 3d  est ) ap->type =
1e070 20 4e 4f 54 5f 55 53 45 44 3b 0a 20 20 20 20 7d   NOT_USED;.    }
1e080 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 41  .    stp->ap = A
1e090 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e  ction_sort(stp->
1e0a0 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  ap);.  }.}.../*.
1e0b0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73  ** Compare two s
1e0c0 74 61 74 65 73 20 66 6f 72 20 73 6f 72 74 69 6e  tates for sortin
1e0d0 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68 65  g purposes.  The
1e0e0 20 73 6d 61 6c 6c 65 72 20 73 74 61 74 65 20 69   smaller state i
1e0f0 73 20 74 68 65 0a 2a 2a 20 6f 6e 65 20 77 69 74  s the.** one wit
1e100 68 20 74 68 65 20 6d 6f 73 74 20 6e 6f 6e 2d 74  h the most non-t
1e110 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2e  erminal actions.
1e120 20 20 49 66 20 74 68 65 79 20 68 61 76 65 20 74    If they have t
1e130 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a  he same number.*
1e140 2a 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  * of non-termina
1e150 6c 20 61 63 74 69 6f 6e 73 2c 20 74 68 65 6e 20  l actions, then 
1e160 74 68 65 20 73 6d 61 6c 6c 65 72 20 69 73 20 74  the smaller is t
1e170 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
1e180 6d 6f 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 61 63  most.** token ac
1e190 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tions..*/.static
1e1a0 20 69 6e 74 20 73 74 61 74 65 52 65 73 6f 72 74   int stateResort
1e1b0 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76 6f  Compare(const vo
1e1c0 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69  id *a, const voi
1e1d0 64 20 2a 62 29 7b 0a 20 20 63 6f 6e 73 74 20 73  d *b){.  const s
1e1e0 74 72 75 63 74 20 73 74 61 74 65 20 2a 70 41 20  truct state *pA 
1e1f0 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74  = *(const struct
1e200 20 73 74 61 74 65 2a 2a 29 61 3b 0a 20 20 63 6f   state**)a;.  co
1e210 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65  nst struct state
1e220 20 2a 70 42 20 3d 20 2a 28 63 6f 6e 73 74 20 73   *pB = *(const s
1e230 74 72 75 63 74 20 73 74 61 74 65 2a 2a 29 62 3b  truct state**)b;
1e240 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d  .  int n;..  n =
1e250 20 70 42 2d 3e 6e 4e 74 41 63 74 20 2d 20 70 41   pB->nNtAct - pA
1e260 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20 69 66 28 20  ->nNtAct;.  if( 
1e270 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20  n==0 ){.    n = 
1e280 70 42 2d 3e 6e 54 6b 6e 41 63 74 20 2d 20 70 41  pB->nTknAct - pA
1e290 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 7d 0a 20  ->nTknAct;.  }. 
1e2a0 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f   return n;.}.../
1e2b0 2a 0a 2a 2a 20 52 65 6e 75 6d 62 65 72 20 61 6e  *.** Renumber an
1e2c0 64 20 72 65 73 6f 72 74 20 73 74 61 74 65 73 20  d resort states 
1e2d0 73 6f 20 74 68 61 74 20 73 74 61 74 65 73 20 77  so that states w
1e2e0 69 74 68 20 66 65 77 65 72 20 63 68 6f 69 63 65  ith fewer choice
1e2f0 73 0a 2a 2a 20 6f 63 63 75 72 20 61 74 20 74 68  s.** occur at th
1e300 65 20 65 6e 64 2e 20 20 45 78 63 65 70 74 2c 20  e end.  Except, 
1e310 6b 65 65 70 20 73 74 61 74 65 20 30 20 61 73 20  keep state 0 as 
1e320 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65 2e  the first state.
1e330 0a 2a 2f 0a 76 6f 69 64 20 52 65 73 6f 72 74 53  .*/.void ResortS
1e340 74 61 74 65 73 28 6c 65 6d 70 29 0a 73 74 72 75  tates(lemp).stru
1e350 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
1e360 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
1e370 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a  uct state *stp;.
1e380 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
1e390 2a 61 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  *ap;..  for(i=0;
1e3a0 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
1e3b0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
1e3c0 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
1e3d0 3b 0a 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41  ;.    stp->nTknA
1e3e0 63 74 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74  ct = stp->nNtAct
1e3f0 20 3d 20 30 3b 0a 20 20 20 20 73 74 70 2d 3e 69   = 0;.    stp->i
1e400 44 66 6c 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74  Dflt = lemp->nst
1e410 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c  ate + lemp->nrul
1e420 65 3b 0a 20 20 20 20 73 74 70 2d 3e 69 54 6b 6e  e;.    stp->iTkn
1e430 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54  Ofst = NO_OFFSET
1e440 3b 0a 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66  ;.    stp->iNtOf
1e450 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a  st = NO_OFFSET;.
1e460 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e      for(ap=stp->
1e470 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  ap; ap; ap=ap->n
1e480 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
1e490 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c  compute_action(l
1e4a0 65 6d 70 2c 61 70 29 3e 3d 30 20 29 7b 0a 20 20  emp,ap)>=0 ){.  
1e4b0 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70        if( ap->sp
1e4c0 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74  ->index<lemp->nt
1e4d0 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20  erminal ){.     
1e4e0 20 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63       stp->nTknAc
1e4f0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  t++;.        }el
1e500 73 65 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69  se if( ap->sp->i
1e510 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  ndex<lemp->nsymb
1e520 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
1e530 73 74 70 2d 3e 6e 4e 74 41 63 74 2b 2b 3b 0a 20  stp->nNtAct++;. 
1e540 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1e550 20 20 20 20 20 20 20 20 73 74 70 2d 3e 69 44 66          stp->iDf
1e560 6c 74 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74  lt = compute_act
1e570 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20  ion(lemp, ap);. 
1e580 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e590 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 71 73 6f  .    }.  }.  qso
1e5a0 72 74 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  rt(&lemp->sorted
1e5b0 5b 31 5d 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  [1], lemp->nstat
1e5c0 65 2d 31 2c 20 73 69 7a 65 6f 66 28 6c 65 6d 70  e-1, sizeof(lemp
1e5d0 2d 3e 73 6f 72 74 65 64 5b 30 5d 29 2c 0a 20 20  ->sorted[0]),.  
1e5e0 20 20 20 20 20 20 73 74 61 74 65 52 65 73 6f 72        stateResor
1e5f0 74 43 6f 6d 70 61 72 65 29 3b 0a 20 20 66 6f 72  tCompare);.  for
1e600 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1e610 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
1e620 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d  lemp->sorted[i]-
1e630 3e 73 74 61 74 65 6e 75 6d 20 3d 20 69 3b 0a 20  >statenum = i;. 
1e640 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   }.}.../********
1e650 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
1e660 68 65 20 66 69 6c 65 20 22 73 65 74 2e 63 22 20  he file "set.c" 
1e670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e690 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ****/./*.** Set 
1e6a0 6d 61 6e 69 70 75 6c 61 74 69 6f 6e 20 72 6f 75  manipulation rou
1e6b0 74 69 6e 65 73 20 66 6f 72 20 74 68 65 20 4c 45  tines for the LE
1e6c0 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
1e6d0 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  ator..*/..static
1e6e0 20 69 6e 74 20 73 69 7a 65 20 3d 20 30 3b 0a 0a   int size = 0;..
1e6f0 2f 2a 20 53 65 74 20 74 68 65 20 73 65 74 20 73  /* Set the set s
1e700 69 7a 65 20 2a 2f 0a 76 6f 69 64 20 53 65 74 53  ize */.void SetS
1e710 69 7a 65 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a  ize(n).int n;.{.
1e720 20 20 73 69 7a 65 20 3d 20 6e 2b 31 3b 0a 7d 0a    size = n+1;.}.
1e730 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
1e740 65 77 20 73 65 74 20 2a 2f 0a 63 68 61 72 20 2a  ew set */.char *
1e750 53 65 74 4e 65 77 28 29 7b 0a 20 20 63 68 61 72  SetNew(){.  char
1e760 20 2a 73 3b 0a 20 20 73 20 3d 20 28 63 68 61 72   *s;.  s = (char
1e770 2a 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65 2c 20  *)calloc( size, 
1e780 31 29 3b 0a 20 20 69 66 28 20 73 3d 3d 30 20 29  1);.  if( s==0 )
1e790 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69  {.    extern voi
1e7a0 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29  d memory_error()
1e7b0 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65 72 72  ;.    memory_err
1e7c0 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  or();.  }.  retu
1e7d0 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20 44 65 61 6c  rn s;.}../* Deal
1e7e0 6c 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f 0a  locate a set */.
1e7f0 76 6f 69 64 20 53 65 74 46 72 65 65 28 73 29 0a  void SetFree(s).
1e800 63 68 61 72 20 2a 73 3b 0a 7b 0a 20 20 66 72 65  char *s;.{.  fre
1e810 65 28 73 29 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20  e(s);.}../* Add 
1e820 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
1e830 20 74 68 65 20 73 65 74 2e 20 20 52 65 74 75 72   the set.  Retur
1e840 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 65 6c  n TRUE if the el
1e850 65 6d 65 6e 74 20 77 61 73 20 61 64 64 65 64 0a  ement was added.
1e860 2a 2a 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20  ** and FALSE if 
1e870 69 74 20 77 61 73 20 61 6c 72 65 61 64 79 20 74  it was already t
1e880 68 65 72 65 2e 20 2a 2f 0a 69 6e 74 20 53 65 74  here. */.int Set
1e890 41 64 64 28 73 2c 65 29 0a 63 68 61 72 20 2a 73  Add(s,e).char *s
1e8a0 3b 0a 69 6e 74 20 65 3b 0a 7b 0a 20 20 69 6e 74  ;.int e;.{.  int
1e8b0 20 72 76 3b 0a 20 20 61 73 73 65 72 74 28 20 65   rv;.  assert( e
1e8c0 3e 3d 30 20 26 26 20 65 3c 73 69 7a 65 20 29 3b  >=0 && e<size );
1e8d0 0a 20 20 72 76 20 3d 20 73 5b 65 5d 3b 0a 20 20  .  rv = s[e];.  
1e8e0 73 5b 65 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75  s[e] = 1;.  retu
1e8f0 72 6e 20 21 72 76 3b 0a 7d 0a 0a 2f 2a 20 41 64  rn !rv;.}../* Ad
1e900 64 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  d every element 
1e910 6f 66 20 73 32 20 74 6f 20 73 31 2e 20 20 52 65  of s2 to s1.  Re
1e920 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 31 20  turn TRUE if s1 
1e930 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 69 6e 74 20  changes. */.int 
1e940 53 65 74 55 6e 69 6f 6e 28 73 31 2c 73 32 29 0a  SetUnion(s1,s2).
1e950 63 68 61 72 20 2a 73 31 3b 0a 63 68 61 72 20 2a  char *s1;.char *
1e960 73 32 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 70  s2;.{.  int i, p
1e970 72 6f 67 72 65 73 73 3b 0a 20 20 70 72 6f 67 72  rogress;.  progr
1e980 65 73 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  ess = 0;.  for(i
1e990 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29  =0; i<size; i++)
1e9a0 7b 0a 20 20 20 20 69 66 28 20 73 32 5b 69 5d 3d  {.    if( s2[i]=
1e9b0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1e9c0 20 20 20 69 66 28 20 73 31 5b 69 5d 3d 3d 30 20     if( s1[i]==0 
1e9d0 29 7b 0a 20 20 20 20 20 20 70 72 6f 67 72 65 73  ){.      progres
1e9e0 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 31 5b  s = 1;.      s1[
1e9f0 69 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  i] = 1;.    }.  
1ea00 7d 0a 20 20 72 65 74 75 72 6e 20 70 72 6f 67 72  }.  return progr
1ea10 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ess;.}./********
1ea20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
1ea30 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74 61  rom the file "ta
1ea40 62 6c 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ble.c" *********
1ea50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ea60 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63  ***/./*.** All c
1ea70 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ode in this file
1ea80 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61   has been automa
1ea90 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  tically generate
1eaa0 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65 63  d.** from a spec
1eab0 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68 65  ification in the
1eac0 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20   file.**        
1ead0 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22 0a        "table.q".
1eae0 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63 69  ** by the associ
1eaf0 61 74 69 76 65 20 61 72 72 61 79 20 63 6f 64 65  ative array code
1eb00 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72 61   building progra
1eb10 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f  m "aagen"..** Do
1eb20 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20 66   not edit this f
1eb30 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20 65  ile!  Instead, e
1eb40 64 69 74 20 74 68 65 20 73 70 65 63 69 66 69 63  dit the specific
1eb50 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74  ation.** file, t
1eb60 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e 2e  hen rerun aagen.
1eb70 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66  .*/./*.** Code f
1eb80 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74 61  or processing ta
1eb90 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f  bles in the LEMO
1eba0 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
1ebb0 6f 72 2e 0a 2a 2f 0a 0a 50 52 49 56 41 54 45 20  or..*/..PRIVATE 
1ebc0 69 6e 74 20 73 74 72 68 61 73 68 28 78 29 0a 63  int strhash(x).c
1ebd0 68 61 72 20 2a 78 3b 0a 7b 0a 20 20 69 6e 74 20  har *x;.{.  int 
1ebe0 68 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  h = 0;.  while( 
1ebf0 2a 78 29 20 68 20 3d 20 68 2a 31 33 20 2b 20 2a  *x) h = h*13 + *
1ec00 28 78 2b 2b 29 3b 0a 20 20 72 65 74 75 72 6e 20  (x++);.  return 
1ec10 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72 6b 73 20 6c  h;.}../* Works l
1ec20 69 6b 65 20 73 74 72 64 75 70 2c 20 73 6f 72 74  ike strdup, sort
1ec30 20 6f 66 2e 20 20 53 61 76 65 20 61 20 73 74 72   of.  Save a str
1ec40 69 6e 67 20 69 6e 20 6d 61 6c 6c 6f 63 65 64 20  ing in malloced 
1ec50 6d 65 6d 6f 72 79 2c 20 62 75 74 0a 2a 2a 20 6b  memory, but.** k
1ec60 65 65 70 20 73 74 72 69 6e 67 73 20 69 6e 20 61  eep strings in a
1ec70 20 74 61 62 6c 65 20 73 6f 20 74 68 61 74 20 74   table so that t
1ec80 68 65 20 73 61 6d 65 20 73 74 72 69 6e 67 20 69  he same string i
1ec90 73 20 6e 6f 74 20 69 6e 20 6d 6f 72 65 0a 2a 2a  s not in more.**
1eca0 20 74 68 61 6e 20 6f 6e 65 20 70 6c 61 63 65 2e   than one place.
1ecb0 0a 2a 2f 0a 63 68 61 72 20 2a 53 74 72 73 61 66  .*/.char *Strsaf
1ecc0 65 28 79 29 0a 63 68 61 72 20 2a 79 3b 0a 7b 0a  e(y).char *y;.{.
1ecd0 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66    char *z;..  if
1ece0 28 20 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( y==0 ) return 
1ecf0 30 3b 0a 20 20 7a 20 3d 20 53 74 72 73 61 66 65  0;.  z = Strsafe
1ed00 5f 66 69 6e 64 28 79 29 3b 0a 20 20 69 66 28 20  _find(y);.  if( 
1ed10 7a 3d 3d 30 20 26 26 20 28 7a 3d 6d 61 6c 6c 6f  z==0 && (z=mallo
1ed20 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 79  c( lemonStrlen(y
1ed30 29 2b 31 20 29 29 21 3d 30 20 29 7b 0a 20 20 20  )+1 ))!=0 ){.   
1ed40 20 73 74 72 63 70 79 28 7a 2c 79 29 3b 0a 20 20   strcpy(z,y);.  
1ed50 20 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74    Strsafe_insert
1ed60 28 7a 29 3b 0a 20 20 7d 0a 20 20 4d 65 6d 6f 72  (z);.  }.  Memor
1ed70 79 43 68 65 63 6b 28 7a 29 3b 0a 20 20 72 65 74  yCheck(z);.  ret
1ed80 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  urn z;.}../* The
1ed90 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
1eda0 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
1edb0 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f  ing structure fo
1edc0 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69  r each.** associ
1edd0 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
1ede0 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 73 74 72  ype "x1"..*/.str
1edf0 75 63 74 20 73 5f 78 31 20 7b 0a 20 20 69 6e 74  uct s_x1 {.  int
1ee00 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
1ee10 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
1ee20 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
1ee30 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20  slots. */.      
1ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee50 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65      /*   Must be
1ee60 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72   a power of 2 gr
1ee70 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f  eater than or */
1ee80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ee90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
1eea0 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20  equal to 1 */.  
1eeb0 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20  int count;      
1eec0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1eed0 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73  r of currently s
1eee0 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20  lots filled */. 
1eef0 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
1ef00 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64   *tbl;  /* The d
1ef10 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20  ata stored here 
1ef20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31  */.  struct s_x1
1ef30 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48  node **ht;  /* H
1ef40 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f  ash table for lo
1ef50 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  okups */.};../* 
1ef60 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
1ef70 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
1ef80 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72  ructure for ever
1ef90 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a  y data element.*
1efa0 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74  * in an associat
1efb0 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
1efc0 65 20 22 78 31 22 2e 0a 2a 2f 0a 74 79 70 65 64  e "x1"..*/.typed
1efd0 65 66 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f  ef struct s_x1no
1efe0 64 65 20 7b 0a 20 20 63 68 61 72 20 2a 64 61 74  de {.  char *dat
1eff0 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
1f000 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20      /* The data 
1f010 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31  */.  struct s_x1
1f020 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a  node *next;   /*
1f030 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68   Next entry with
1f040 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a   the same hash *
1f050 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e  /.  struct s_x1n
1f060 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20  ode **from;  /* 
1f070 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f  Previous link */
1f080 0a 7d 20 78 31 6e 6f 64 65 3b 0a 0a 2f 2a 20 54  .} x1node;../* T
1f090 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65  here is only one
1f0a0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1f0b0 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73   array, which is
1f0c0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a   the following *
1f0d0 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
1f0e0 73 5f 78 31 20 2a 78 31 61 3b 0a 0a 2f 2a 20 41  s_x1 *x1a;../* A
1f0f0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73  llocate a new as
1f100 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
1f110 2a 2f 0a 76 6f 69 64 20 53 74 72 73 61 66 65 5f  */.void Strsafe_
1f120 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78 31  init(){.  if( x1
1f130 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 31  a ) return;.  x1
1f140 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 31  a = (struct s_x1
1f150 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)malloc( sizeof
1f160 28 73 74 72 75 63 74 20 73 5f 78 31 29 20 29 3b  (struct s_x1) );
1f170 0a 20 20 69 66 28 20 78 31 61 20 29 7b 0a 20 20  .  if( x1a ){.  
1f180 20 20 78 31 61 2d 3e 73 69 7a 65 20 3d 20 31 30    x1a->size = 10
1f190 32 34 3b 0a 20 20 20 20 78 31 61 2d 3e 63 6f 75  24;.    x1a->cou
1f1a0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 31 61 2d  nt = 0;.    x1a-
1f1b0 3e 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29  >tbl = (x1node*)
1f1c0 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28  malloc( .      (
1f1d0 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b  sizeof(x1node) +
1f1e0 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29   sizeof(x1node*)
1f1f0 29 2a 31 30 32 34 20 29 3b 0a 20 20 20 20 69 66  )*1024 );.    if
1f200 28 20 78 31 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b  ( x1a->tbl==0 ){
1f210 0a 20 20 20 20 20 20 66 72 65 65 28 78 31 61 29  .      free(x1a)
1f220 3b 0a 20 20 20 20 20 20 78 31 61 20 3d 20 30 3b  ;.      x1a = 0;
1f230 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f240 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78    int i;.      x
1f250 31 61 2d 3e 68 74 20 3d 20 28 78 31 6e 6f 64 65  1a->ht = (x1node
1f260 2a 2a 29 26 28 78 31 61 2d 3e 74 62 6c 5b 31 30  **)&(x1a->tbl[10
1f270 32 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  24]);.      for(
1f280 69 3d 30 3b 20 69 3c 31 30 32 34 3b 20 69 2b 2b  i=0; i<1024; i++
1f290 29 20 78 31 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x1a->ht[i] = 0
1f2a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
1f2b0 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
1f2c0 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72  cord into the ar
1f2d0 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ray.  Return TRU
1f2e0 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  E if successful.
1f2f0 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77  .** Prior data w
1f300 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
1f310 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74   is NOT overwrit
1f320 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 72 73 61  ten */.int Strsa
1f330 66 65 5f 69 6e 73 65 72 74 28 64 61 74 61 29 0a  fe_insert(data).
1f340 63 68 61 72 20 2a 64 61 74 61 3b 0a 7b 0a 20 20  char *data;.{.  
1f350 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e  x1node *np;.  in
1f360 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a  t h;.  int ph;..
1f370 20 20 69 66 28 20 78 31 61 3d 3d 30 20 29 20 72    if( x1a==0 ) r
1f380 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20  eturn 0;.  ph = 
1f390 73 74 72 68 61 73 68 28 64 61 74 61 29 3b 0a 20  strhash(data);. 
1f3a0 20 68 20 3d 20 70 68 20 26 20 28 78 31 61 2d 3e   h = ph & (x1a->
1f3b0 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
1f3c0 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x1a->ht[h];.  wh
1f3d0 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
1f3e0 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61  f( strcmp(np->da
1f3f0 74 61 2c 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20  ta,data)==0 ){. 
1f400 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
1f410 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74  ing entry with t
1f420 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66  he same key is f
1f430 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  ound. */.      /
1f440 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f  * Fail because o
1f450 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20  verwrite is not 
1f460 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20  allows. */.     
1f470 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1f480 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
1f490 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 31  xt;.  }.  if( x1
1f4a0 61 2d 3e 63 6f 75 6e 74 3e 3d 78 31 61 2d 3e 73  a->count>=x1a->s
1f4b0 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ize ){.    /* Ne
1f4c0 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68  ed to make the h
1f4d0 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72  ash table bigger
1f4e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69   */.    int i,si
1f4f0 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  ze;.    struct s
1f500 5f 78 31 20 61 72 72 61 79 3b 0a 20 20 20 20 61  _x1 array;.    a
1f510 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65  rray.size = size
1f520 20 3d 20 78 31 61 2d 3e 73 69 7a 65 2a 32 3b 0a   = x1a->size*2;.
1f530 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20      array.count 
1f540 3d 20 78 31 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x1a->count;.  
1f550 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78    array.tbl = (x
1f560 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20  1node*)malloc(. 
1f570 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 31 6e       (sizeof(x1n
1f580 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 31  ode) + sizeof(x1
1f590 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a  node*))*size );.
1f5a0 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62      if( array.tb
1f5b0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
1f5c0 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f    /* Fail due to
1f5d0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
1f5e0 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20  */.    array.ht 
1f5f0 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28 61 72  = (x1node**)&(ar
1f600 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a  ray.tbl[size]);.
1f610 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
1f620 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e  ize; i++) array.
1f630 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66  ht[i] = 0;.    f
1f640 6f 72 28 69 3d 30 3b 20 69 3c 78 31 61 2d 3e 63  or(i=0; i<x1a->c
1f650 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ount; i++){.    
1f660 20 20 78 31 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c    x1node *oldnp,
1f670 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f   *newnp;.      o
1f680 6c 64 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74 62  ldnp = &(x1a->tb
1f690 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d  l[i]);.      h =
1f6a0 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e   strhash(oldnp->
1f6b0 64 61 74 61 29 20 26 20 28 73 69 7a 65 2d 31 29  data) & (size-1)
1f6c0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20  ;.      newnp = 
1f6d0 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b  &(array.tbl[i]);
1f6e0 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79  .      if( array
1f6f0 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68  .ht[h] ) array.h
1f700 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
1f710 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20  ewnp->next);.   
1f720 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d     newnp->next =
1f730 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20   array.ht[h];.  
1f740 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20      newnp->data 
1f750 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20  = oldnp->data;. 
1f760 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d       newnp->from
1f770 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d   = &(array.ht[h]
1f780 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68  );.      array.h
1f790 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20  t[h] = newnp;.  
1f7a0 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 31 61    }.    free(x1a
1f7b0 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 31 61  ->tbl);.    *x1a
1f7c0 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20   = array;.  }.  
1f7d0 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
1f7e0 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20  w data */.  h = 
1f7f0 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d  ph & (x1a->size-
1f800 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 31 61  1);.  np = &(x1a
1f810 2d 3e 74 62 6c 5b 78 31 61 2d 3e 63 6f 75 6e 74  ->tbl[x1a->count
1f820 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61  ++]);.  np->data
1f830 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78   = data;.  if( x
1f840 31 61 2d 3e 68 74 5b 68 5d 20 29 20 78 31 61 2d  1a->ht[h] ) x1a-
1f850 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  >ht[h]->from = &
1f860 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70  (np->next);.  np
1f870 2d 3e 6e 65 78 74 20 3d 20 78 31 61 2d 3e 68 74  ->next = x1a->ht
1f880 5b 68 5d 3b 0a 20 20 78 31 61 2d 3e 68 74 5b 68  [h];.  x1a->ht[h
1f890 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72  ] = np;.  np->fr
1f8a0 6f 6d 20 3d 20 26 28 78 31 61 2d 3e 68 74 5b 68  om = &(x1a->ht[h
1f8b0 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ]);.  return 1;.
1f8c0 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
1f8d0 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61  ointer to data a
1f8e0 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67  ssigned to the g
1f8f0 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72  iven key.  Retur
1f900 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20  n NULL.** if no 
1f910 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 63 68 61  such key. */.cha
1f920 72 20 2a 53 74 72 73 61 66 65 5f 66 69 6e 64 28  r *Strsafe_find(
1f930 6b 65 79 29 0a 63 68 61 72 20 2a 6b 65 79 3b 0a  key).char *key;.
1f940 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 31 6e  {.  int h;.  x1n
1f950 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20  ode *np;..  if( 
1f960 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x1a==0 ) return 
1f970 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73 68  0;.  h = strhash
1f980 28 6b 65 79 29 20 26 20 28 78 31 61 2d 3e 73 69  (key) & (x1a->si
1f990 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31  ze-1);.  np = x1
1f9a0 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c  a->ht[h];.  whil
1f9b0 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28  e( np ){.    if(
1f9c0 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61   strcmp(np->data
1f9d0 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b  ,key)==0 ) break
1f9e0 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  ;.    np = np->n
1f9f0 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
1fa00 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20  n np ? np->data 
1fa10 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  : 0;.}../* Retur
1fa20 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
1fa30 68 65 20 28 74 65 72 6d 69 6e 61 6c 20 6f 72 20  he (terminal or 
1fa40 6e 6f 6e 74 65 72 6d 69 6e 61 6c 29 20 73 79 6d  nonterminal) sym
1fa50 62 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43 72 65 61  bol "x"..** Crea
1fa60 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 20  te a new symbol 
1fa70 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
1fa80 69 72 73 74 20 74 69 6d 65 20 22 78 22 20 68 61  irst time "x" ha
1fa90 73 20 62 65 65 6e 20 73 65 65 6e 2e 0a 2a 2f 0a  s been seen..*/.
1faa0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
1fab0 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 0a 63 68 61  ymbol_new(x).cha
1fac0 72 20 2a 78 3b 0a 7b 0a 20 20 73 74 72 75 63 74  r *x;.{.  struct
1fad0 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20   symbol *sp;..  
1fae0 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64  sp = Symbol_find
1faf0 28 78 29 3b 0a 20 20 69 66 28 20 73 70 3d 3d 30  (x);.  if( sp==0
1fb00 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 28 73 74   ){.    sp = (st
1fb10 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 63 61  ruct symbol *)ca
1fb20 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f 66 28 73  lloc(1, sizeof(s
1fb30 74 72 75 63 74 20 73 79 6d 62 6f 6c 29 20 29 3b  truct symbol) );
1fb40 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b  .    MemoryCheck
1fb50 28 73 70 29 3b 0a 20 20 20 20 73 70 2d 3e 6e 61  (sp);.    sp->na
1fb60 6d 65 20 3d 20 53 74 72 73 61 66 65 28 78 29 3b  me = Strsafe(x);
1fb70 0a 20 20 20 20 73 70 2d 3e 74 79 70 65 20 3d 20  .    sp->type = 
1fb80 69 73 75 70 70 65 72 28 2a 78 29 20 3f 20 54 45  isupper(*x) ? TE
1fb90 52 4d 49 4e 41 4c 20 3a 20 4e 4f 4e 54 45 52 4d  RMINAL : NONTERM
1fba0 49 4e 41 4c 3b 0a 20 20 20 20 73 70 2d 3e 72 75  INAL;.    sp->ru
1fbb0 6c 65 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  le = 0;.    sp->
1fbc0 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  fallback = 0;.  
1fbd0 20 20 73 70 2d 3e 70 72 65 63 20 3d 20 2d 31 3b    sp->prec = -1;
1fbe0 0a 20 20 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d  .    sp->assoc =
1fbf0 20 55 4e 4b 3b 0a 20 20 20 20 73 70 2d 3e 66 69   UNK;.    sp->fi
1fc00 72 73 74 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  rstset = 0;.    
1fc10 73 70 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d  sp->lambda = LEM
1fc20 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 20 20 73 70  ON_FALSE;.    sp
1fc30 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 3d 20 30  ->destructor = 0
1fc40 3b 0a 20 20 20 20 73 70 2d 3e 64 65 73 74 4c 69  ;.    sp->destLi
1fc50 6e 65 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 73 70  neno = 0;.    sp
1fc60 2d 3e 64 61 74 61 74 79 70 65 20 3d 20 30 3b 0a  ->datatype = 0;.
1fc70 20 20 20 20 73 70 2d 3e 75 73 65 43 6e 74 20 3d      sp->useCnt =
1fc80 20 30 3b 0a 20 20 20 20 53 79 6d 62 6f 6c 5f 69   0;.    Symbol_i
1fc90 6e 73 65 72 74 28 73 70 2c 73 70 2d 3e 6e 61 6d  nsert(sp,sp->nam
1fca0 65 29 3b 0a 20 20 7d 0a 20 20 73 70 2d 3e 75 73  e);.  }.  sp->us
1fcb0 65 43 6e 74 2b 2b 3b 0a 20 20 72 65 74 75 72 6e  eCnt++;.  return
1fcc0 20 73 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61   sp;.}../* Compa
1fcd0 72 65 20 74 77 6f 20 73 79 6d 62 6f 6c 73 20 66  re two symbols f
1fce0 6f 72 20 77 6f 72 6b 69 6e 67 20 70 75 72 70 6f  or working purpo
1fcf0 73 65 73 0a 2a 2a 0a 2a 2a 20 53 79 6d 62 6f 6c  ses.**.** Symbol
1fd00 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74  s that begin wit
1fd10 68 20 75 70 70 65 72 20 63 61 73 65 20 6c 65 74  h upper case let
1fd20 74 65 72 73 20 28 74 65 72 6d 69 6e 61 6c 73 20  ters (terminals 
1fd30 6f 72 20 74 6f 6b 65 6e 73 29 0a 2a 2a 20 6d 75  or tokens).** mu
1fd40 73 74 20 73 6f 72 74 20 62 65 66 6f 72 65 20 73  st sort before s
1fd50 79 6d 62 6f 6c 73 20 74 68 61 74 20 62 65 67 69  ymbols that begi
1fd60 6e 20 77 69 74 68 20 6c 6f 77 65 72 20 63 61 73  n with lower cas
1fd70 65 20 6c 65 74 74 65 72 73 0a 2a 2a 20 28 6e 6f  e letters.** (no
1fd80 6e 2d 74 65 72 6d 69 6e 61 6c 73 29 2e 20 20 4f  n-terminals).  O
1fd90 74 68 65 72 20 74 68 61 6e 20 74 68 61 74 2c 20  ther than that, 
1fda0 74 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6e  the order does n
1fdb0 6f 74 20 6d 61 74 74 65 72 2e 0a 2a 2a 0a 2a 2a  ot matter..**.**
1fdc0 20 57 65 20 66 69 6e 64 20 65 78 70 65 72 69 6d   We find experim
1fdd0 65 6e 74 61 6c 6c 79 20 74 68 61 74 20 6c 65 61  entally that lea
1fde0 76 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c 73  ving the symbols
1fdf0 20 69 6e 20 74 68 65 69 72 20 6f 72 69 67 69 6e   in their origin
1fe00 61 6c 0a 2a 2a 20 6f 72 64 65 72 20 28 74 68 65  al.** order (the
1fe10 20 6f 72 64 65 72 20 74 68 65 79 20 61 70 70 65   order they appe
1fe20 61 72 65 64 20 69 6e 20 74 68 65 20 67 72 61 6d  ared in the gram
1fe30 6d 61 72 20 66 69 6c 65 29 20 67 69 76 65 73 20  mar file) gives 
1fe40 74 68 65 0a 2a 2a 20 73 6d 61 6c 6c 65 73 74 20  the.** smallest 
1fe50 70 61 72 73 65 72 20 74 61 62 6c 65 73 20 69 6e  parser tables in
1fe60 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 69 6e 74 20   SQLite..*/.int 
1fe70 53 79 6d 62 6f 6c 63 6d 70 70 28 73 74 72 75 63  Symbolcmpp(struc
1fe80 74 20 73 79 6d 62 6f 6c 20 2a 2a 61 2c 20 73 74  t symbol **a, st
1fe90 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 62 29  ruct symbol **b)
1fea0 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 28 2a 2a  {.  int i1 = (**
1feb0 61 29 2e 69 6e 64 65 78 20 2b 20 31 30 30 30 30  a).index + 10000
1fec0 30 30 30 2a 28 28 2a 2a 61 29 2e 6e 61 6d 65 5b  000*((**a).name[
1fed0 30 5d 3e 27 5a 27 29 3b 0a 20 20 69 6e 74 20 69  0]>'Z');.  int i
1fee0 32 20 3d 20 28 2a 2a 62 29 2e 69 6e 64 65 78 20  2 = (**b).index 
1fef0 2b 20 31 30 30 30 30 30 30 30 2a 28 28 2a 2a 62  + 10000000*((**b
1ff00 29 2e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 29 3b 0a  ).name[0]>'Z');.
1ff10 20 20 72 65 74 75 72 6e 20 69 31 2d 69 32 3b 0a    return i1-i2;.
1ff20 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  }../* There is o
1ff30 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
1ff40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
1ff50 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a  ucture for each.
1ff60 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ** associative a
1ff70 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 32  rray of type "x2
1ff80 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78  "..*/.struct s_x
1ff90 32 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20  2 {.  int size; 
1ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ffb0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   The number of a
1ffc0 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20  vailable slots. 
1ffd0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fff0 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65    Must be a powe
20000 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74  r of 2 greater t
20010 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20  han or */.      
20020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20030 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74      /*   equal t
20040 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75  o 1 */.  int cou
20050 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
20060 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
20070 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69  rrently slots fi
20080 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  lled */.  struct
20090 20 73 5f 78 32 6e 6f 64 65 20 2a 74 62 6c 3b 20   s_x2node *tbl; 
200a0 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f   /* The data sto
200b0 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  red here */.  st
200c0 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a  ruct s_x2node **
200d0 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62  ht;  /* Hash tab
200e0 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a  le for lookups *
200f0 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  /.};../* There i
20100 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
20110 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
20120 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20   for every data 
20130 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e  element.** in an
20140 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
20150 61 79 20 6f 66 20 74 79 70 65 20 22 78 32 22 2e  ay of type "x2".
20160 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
20170 63 74 20 73 5f 78 32 6e 6f 64 65 20 7b 0a 20 20  ct s_x2node {.  
20180 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64  struct symbol *d
20190 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
201a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
201b0 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6b 65 79  a */.  char *key
201c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
201d0 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
201e0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e  /.  struct s_x2n
201f0 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20  ode *next;   /* 
20200 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20  Next entry with 
20210 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f  the same hash */
20220 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f  .  struct s_x2no
20230 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50  de **from;  /* P
20240 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a  revious link */.
20250 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68  } x2node;../* Th
20260 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
20270 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
20280 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20  array, which is 
20290 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
202a0 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73  .static struct s
202b0 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f 2a 20 41 6c  _x2 *x2a;../* Al
202c0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73  locate a new ass
202d0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a  ociative array *
202e0 2f 0a 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e  /.void Symbol_in
202f0 69 74 28 29 7b 0a 20 20 69 66 28 20 78 32 61 20  it(){.  if( x2a 
20300 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 32 61 20  ) return;.  x2a 
20310 3d 20 28 73 74 72 75 63 74 20 73 5f 78 32 2a 29  = (struct s_x2*)
20320 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
20330 74 72 75 63 74 20 73 5f 78 32 29 20 29 3b 0a 20  truct s_x2) );. 
20340 20 69 66 28 20 78 32 61 20 29 7b 0a 20 20 20 20   if( x2a ){.    
20350 78 32 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b  x2a->size = 128;
20360 0a 20 20 20 20 78 32 61 2d 3e 63 6f 75 6e 74 20  .    x2a->count 
20370 3d 20 30 3b 0a 20 20 20 20 78 32 61 2d 3e 74 62  = 0;.    x2a->tb
20380 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29 6d 61 6c  l = (x2node*)mal
20390 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a  loc( .      (siz
203a0 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69  eof(x2node) + si
203b0 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29 29 2a 31  zeof(x2node*))*1
203c0 32 38 20 29 3b 0a 20 20 20 20 69 66 28 20 78 32  28 );.    if( x2
203d0 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
203e0 20 20 20 66 72 65 65 28 78 32 61 29 3b 0a 20 20     free(x2a);.  
203f0 20 20 20 20 78 32 61 20 3d 20 30 3b 0a 20 20 20      x2a = 0;.   
20400 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
20410 74 20 69 3b 0a 20 20 20 20 20 20 78 32 61 2d 3e  t i;.      x2a->
20420 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26  ht = (x2node**)&
20430 28 78 32 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b  (x2a->tbl[128]);
20440 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
20450 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78 32 61 2d  i<128; i++) x2a-
20460 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  >ht[i] = 0;.    
20470 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72  }.  }.}./* Inser
20480 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
20490 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20  nto the array.  
204a0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73  Return TRUE if s
204b0 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72  uccessful..** Pr
204c0 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68  ior data with th
204d0 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f  e same key is NO
204e0 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f  T overwritten */
204f0 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65  .int Symbol_inse
20500 72 74 28 64 61 74 61 2c 6b 65 79 29 0a 73 74 72  rt(data,key).str
20510 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61  uct symbol *data
20520 3b 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20  ;.char *key;.{. 
20530 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69   x2node *np;.  i
20540 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a  nt h;.  int ph;.
20550 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20  .  if( x2a==0 ) 
20560 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
20570 20 73 74 72 68 61 73 68 28 6b 65 79 29 3b 0a 20   strhash(key);. 
20580 20 68 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e   h = ph & (x2a->
20590 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
205a0 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x2a->ht[h];.  wh
205b0 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
205c0 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65  f( strcmp(np->ke
205d0 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20  y,key)==0 ){.   
205e0 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
205f0 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  g entry with the
20600 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75   same key is fou
20610 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  nd. */.      /* 
20620 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65  Fail because ove
20630 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c  rwrite is not al
20640 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72  lows. */.      r
20650 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
20660 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
20670 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 32 61 2d  ;.  }.  if( x2a-
20680 3e 63 6f 75 6e 74 3e 3d 78 32 61 2d 3e 73 69 7a  >count>=x2a->siz
20690 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64  e ){.    /* Need
206a0 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73   to make the has
206b0 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a  h table bigger *
206c0 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65  /.    int i,size
206d0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78  ;.    struct s_x
206e0 32 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72  2 array;.    arr
206f0 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d  ay.size = size =
20700 20 78 32 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20   x2a->size*2;.  
20710 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20    array.count = 
20720 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20  x2a->count;.    
20730 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 32 6e  array.tbl = (x2n
20740 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20  ode*)malloc(.   
20750 20 20 20 28 73 69 7a 65 6f 66 28 78 32 6e 6f 64     (sizeof(x2nod
20760 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f  e) + sizeof(x2no
20770 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20  de*))*size );.  
20780 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d    if( array.tbl=
20790 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
207a0 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d  /* Fail due to m
207b0 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f  alloc failure */
207c0 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20  .    array.ht = 
207d0 28 78 32 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61  (x2node**)&(arra
207e0 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20  y.tbl[size]);.  
207f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
20800 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74  e; i++) array.ht
20810 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  [i] = 0;.    for
20820 28 69 3d 30 3b 20 69 3c 78 32 61 2d 3e 63 6f 75  (i=0; i<x2a->cou
20830 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; i++){.      
20840 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a  x2node *oldnp, *
20850 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64  newnp;.      old
20860 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b  np = &(x2a->tbl[
20870 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73  i]);.      h = s
20880 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65  trhash(oldnp->ke
20890 79 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20  y) & (size-1);. 
208a0 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61       newnp = &(a
208b0 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20  rray.tbl[i]);.  
208c0 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74      if( array.ht
208d0 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68  [h] ) array.ht[h
208e0 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e  ]->from = &(newn
208f0 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20  p->next);.      
20900 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72  newnp->next = ar
20910 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20  ray.ht[h];.     
20920 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c   newnp->key = ol
20930 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20  dnp->key;.      
20940 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c  newnp->data = ol
20950 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20  dnp->data;.     
20960 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26   newnp->from = &
20970 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20  (array.ht[h]);. 
20980 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d       array.ht[h]
20990 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a   = newnp;.    }.
209a0 20 20 20 20 66 72 65 65 28 78 32 61 2d 3e 74 62      free(x2a->tb
209b0 6c 29 3b 0a 20 20 20 20 2a 78 32 61 20 3d 20 61  l);.    *x2a = a
209c0 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  rray;.  }.  /* I
209d0 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61  nsert the new da
209e0 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26  ta */.  h = ph &
209f0 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x2a->size-1);.
20a00 20 20 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62    np = &(x2a->tb
20a10 6c 5b 78 32 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29  l[x2a->count++])
20a20 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65  ;.  np->key = ke
20a30 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20  y;.  np->data = 
20a40 64 61 74 61 3b 0a 20 20 69 66 28 20 78 32 61 2d  data;.  if( x2a-
20a50 3e 68 74 5b 68 5d 20 29 20 78 32 61 2d 3e 68 74  >ht[h] ) x2a->ht
20a60 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70  [h]->from = &(np
20a70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e  ->next);.  np->n
20a80 65 78 74 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d  ext = x2a->ht[h]
20a90 3b 0a 20 20 78 32 61 2d 3e 68 74 5b 68 5d 20 3d  ;.  x2a->ht[h] =
20aa0 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20   np;.  np->from 
20ab0 3d 20 26 28 78 32 61 2d 3e 68 74 5b 68 5d 29 3b  = &(x2a->ht[h]);
20ac0 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
20ad0 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
20ae0 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69  ter to data assi
20af0 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65  gned to the give
20b00 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e  n key.  Return N
20b10 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63  ULL.** if no suc
20b20 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74  h key. */.struct
20b30 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
20b40 66 69 6e 64 28 6b 65 79 29 0a 63 68 61 72 20 2a  find(key).char *
20b50 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a  key;.{.  int h;.
20b60 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20    x2node *np;.. 
20b70 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65   if( x2a==0 ) re
20b80 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74  turn 0;.  h = st
20b90 72 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 32  rhash(key) & (x2
20ba0 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
20bb0 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x2a->ht[h];. 
20bc0 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
20bd0 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d    if( strcmp(np-
20be0 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62  >key,key)==0 ) b
20bf0 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e  reak;.    np = n
20c00 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  p->next;.  }.  r
20c10 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64  eturn np ? np->d
20c20 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52  ata : 0;.}../* R
20c30 65 74 75 72 6e 20 74 68 65 20 6e 2d 74 68 20 64  eturn the n-th d
20c40 61 74 61 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  ata.  Return NUL
20c50 4c 20 69 66 20 6e 20 69 73 20 6f 75 74 20 6f 66  L if n is out of
20c60 20 72 61 6e 67 65 2e 20 2a 2f 0a 73 74 72 75 63   range. */.struc
20c70 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c  t symbol *Symbol
20c80 5f 4e 74 68 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b  _Nth(n).int n;.{
20c90 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
20ca0 20 2a 64 61 74 61 3b 0a 20 20 69 66 28 20 78 32   *data;.  if( x2
20cb0 61 20 26 26 20 6e 3e 30 20 26 26 20 6e 3c 3d 78  a && n>0 && n<=x
20cc0 32 61 2d 3e 63 6f 75 6e 74 20 29 7b 0a 20 20 20  2a->count ){.   
20cd0 20 64 61 74 61 20 3d 20 78 32 61 2d 3e 74 62 6c   data = x2a->tbl
20ce0 5b 6e 2d 31 5d 2e 64 61 74 61 3b 0a 20 20 7d 65  [n-1].data;.  }e
20cf0 6c 73 65 7b 0a 20 20 20 20 64 61 74 61 20 3d 20  lse{.    data = 
20d00 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
20d10 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  data;.}../* Retu
20d20 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
20d30 68 65 20 61 72 72 61 79 20 2a 2f 0a 69 6e 74 20  he array */.int 
20d40 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 0a 7b  Symbol_count().{
20d50 0a 20 20 72 65 74 75 72 6e 20 78 32 61 20 3f 20  .  return x2a ? 
20d60 78 32 61 2d 3e 63 6f 75 6e 74 20 3a 20 30 3b 0a  x2a->count : 0;.
20d70 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20  }../* Return an 
20d80 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
20d90 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e  s to all data in
20da0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54   the table..** T
20db0 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61  he array is obta
20dc0 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
20dd0 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
20de0 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  f memory allocat
20df0 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c  ion.** problems,
20e00 20 6f 72 20 69 66 20 74 68 65 20 61 72 72 61 79   or if the array
20e10 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74   is empty. */.st
20e20 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 53 79  ruct symbol **Sy
20e30 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29 0a 7b  mbol_arrayof().{
20e40 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
20e50 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74 20   **array;.  int 
20e60 69 2c 73 69 7a 65 3b 0a 20 20 69 66 28 20 78 32  i,size;.  if( x2
20e70 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
20e80 0a 20 20 73 69 7a 65 20 3d 20 78 32 61 2d 3e 63  .  size = x2a->c
20e90 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20  ount;.  array = 
20ea0 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
20eb0 2a 29 63 61 6c 6c 6f 63 28 73 69 7a 65 2c 20 73  *)calloc(size, s
20ec0 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d  izeof(struct sym
20ed0 62 6f 6c 20 2a 29 29 3b 0a 20 20 69 66 28 20 61  bol *));.  if( a
20ee0 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72 28  rray ){.    for(
20ef0 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b  i=0; i<size; i++
20f00 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78 32 61  ) array[i] = x2a
20f10 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20  ->tbl[i].data;. 
20f20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 72 61   }.  return arra
20f30 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65  y;.}../* Compare
20f40 20 74 77 6f 20 63 6f 6e 66 69 67 75 72 61 74 69   two configurati
20f50 6f 6e 73 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69  ons */.int Confi
20f60 67 63 6d 70 28 61 2c 62 29 0a 73 74 72 75 63 74  gcmp(a,b).struct
20f70 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 73 74 72 75   config *a;.stru
20f80 63 74 20 63 6f 6e 66 69 67 20 2a 62 3b 0a 7b 0a  ct config *b;.{.
20f90 20 20 69 6e 74 20 78 3b 0a 20 20 78 20 3d 20 61    int x;.  x = a
20fa0 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d  ->rp->index - b-
20fb0 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66  >rp->index;.  if
20fc0 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 61 2d 3e  ( x==0 ) x = a->
20fd0 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20  dot - b->dot;.  
20fe0 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a 20  return x;.}../* 
20ff0 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 74 61 74  Compare two stat
21000 65 73 20 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e  es */.PRIVATE in
21010 74 20 73 74 61 74 65 63 6d 70 28 61 2c 62 29 0a  t statecmp(a,b).
21020 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61  struct config *a
21030 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
21040 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *b;.{.  int rc;.
21050 20 20 66 6f 72 28 72 63 3d 30 3b 20 72 63 3d 3d    for(rc=0; rc==
21060 30 20 26 26 20 61 20 26 26 20 62 3b 20 20 61 3d  0 && a && b;  a=
21070 61 2d 3e 62 70 2c 20 62 3d 62 2d 3e 62 70 29 7b  a->bp, b=b->bp){
21080 0a 20 20 20 20 72 63 20 3d 20 61 2d 3e 72 70 2d  .    rc = a->rp-
21090 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e  >index - b->rp->
210a0 69 6e 64 65 78 3b 0a 20 20 20 20 69 66 28 20 72  index;.    if( r
210b0 63 3d 3d 30 20 29 20 72 63 20 3d 20 61 2d 3e 64  c==0 ) rc = a->d
210c0 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 7d  ot - b->dot;.  }
210d0 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
210e0 20 20 20 20 69 66 28 20 61 20 29 20 72 63 20 3d      if( a ) rc =
210f0 20 31 3b 0a 20 20 20 20 69 66 28 20 62 20 29 20   1;.    if( b ) 
21100 72 63 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72  rc = -1;.  }.  r
21110 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
21120 48 61 73 68 20 61 20 73 74 61 74 65 20 2a 2f 0a  Hash a state */.
21130 50 52 49 56 41 54 45 20 69 6e 74 20 73 74 61 74  PRIVATE int stat
21140 65 68 61 73 68 28 61 29 0a 73 74 72 75 63 74 20  ehash(a).struct 
21150 63 6f 6e 66 69 67 20 2a 61 3b 0a 7b 0a 20 20 69  config *a;.{.  i
21160 6e 74 20 68 3d 30 3b 0a 20 20 77 68 69 6c 65 28  nt h=0;.  while(
21170 20 61 20 29 7b 0a 20 20 20 20 68 20 3d 20 68 2a   a ){.    h = h*
21180 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64  571 + a->rp->ind
21190 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a  ex*37 + a->dot;.
211a0 20 20 20 20 61 20 3d 20 61 2d 3e 62 70 3b 0a 20      a = a->bp;. 
211b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d   }.  return h;.}
211c0 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
211d0 6e 65 77 20 73 74 61 74 65 20 73 74 72 75 63 74  new state struct
211e0 75 72 65 20 2a 2f 0a 73 74 72 75 63 74 20 73 74  ure */.struct st
211f0 61 74 65 20 2a 53 74 61 74 65 5f 6e 65 77 28 29  ate *State_new()
21200 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  .{.  struct stat
21210 65 20 2a 6e 65 77 3b 0a 20 20 6e 65 77 20 3d 20  e *new;.  new = 
21220 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29  (struct state *)
21230 63 61 6c 6c 6f 63 28 31 2c 20 73 69 7a 65 6f 66  calloc(1, sizeof
21240 28 73 74 72 75 63 74 20 73 74 61 74 65 29 20 29  (struct state) )
21250 3b 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28  ;.  MemoryCheck(
21260 6e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  new);.  return n
21270 65 77 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20  ew;.}../* There 
21280 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
21290 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
212a0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
212b0 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69  ach.** associati
212c0 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
212d0 20 22 78 33 22 2e 0a 2a 2f 0a 73 74 72 75 63 74   "x3"..*/.struct
212e0 20 73 5f 78 33 20 7b 0a 20 20 69 6e 74 20 73 69   s_x3 {.  int si
212f0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
21300 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
21310 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  of available slo
21320 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ts. */.         
21330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21340 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20   /*   Must be a 
21350 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74  power of 2 great
21360 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20  er than or */.  
21370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21380 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75          /*   equ
21390 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74  al to 1 */.  int
213a0 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20   count;         
213b0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
213c0 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74  f currently slot
213d0 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74  s filled */.  st
213e0 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 74  ruct s_x3node *t
213f0 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  bl;  /* The data
21400 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a   stored here */.
21410 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64    struct s_x3nod
21420 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68  e **ht;  /* Hash
21430 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75   table for looku
21440 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  ps */.};../* The
21450 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
21460 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
21470 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64  ture for every d
21480 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69  ata element.** i
21490 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65  n an associative
214a0 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
214b0 78 33 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  x3"..*/.typedef 
214c0 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20  struct s_x3node 
214d0 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  {.  struct state
214e0 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
214f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
21500 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74  data */.  struct
21510 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 20 20 20   config *key;   
21520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21530 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
21540 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20  struct s_x3node 
21550 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74  *next;   /* Next
21560 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
21570 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73  same hash */.  s
21580 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a  truct s_x3node *
21590 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69  *from;  /* Previ
215a0 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 33  ous link */.} x3
215b0 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  node;../* There 
215c0 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74  is only one inst
215d0 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61  ance of the arra
215e0 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  y, which is the 
215f0 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61  following */.sta
21600 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 33 20  tic struct s_x3 
21610 2a 78 33 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61  *x3a;../* Alloca
21620 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61  te a new associa
21630 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f  tive array */.vo
21640 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28 29 7b  id State_init(){
21650 0a 20 20 69 66 28 20 78 33 61 20 29 20 72 65 74  .  if( x3a ) ret
21660 75 72 6e 3b 0a 20 20 78 33 61 20 3d 20 28 73 74  urn;.  x3a = (st
21670 72 75 63 74 20 73 5f 78 33 2a 29 6d 61 6c 6c 6f  ruct s_x3*)mallo
21680 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  c( sizeof(struct
21690 20 73 5f 78 33 29 20 29 3b 0a 20 20 69 66 28 20   s_x3) );.  if( 
216a0 78 33 61 20 29 7b 0a 20 20 20 20 78 33 61 2d 3e  x3a ){.    x3a->
216b0 73 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20  size = 128;.    
216c0 78 33 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a  x3a->count = 0;.
216d0 20 20 20 20 78 33 61 2d 3e 74 62 6c 20 3d 20 28      x3a->tbl = (
216e0 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20  x3node*)malloc( 
216f0 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
21700 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  3node) + sizeof(
21710 78 33 6e 6f 64 65 2a 29 29 2a 31 32 38 20 29 3b  x3node*))*128 );
21720 0a 20 20 20 20 69 66 28 20 78 33 61 2d 3e 74 62  .    if( x3a->tb
21730 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  l==0 ){.      fr
21740 65 65 28 78 33 61 29 3b 0a 20 20 20 20 20 20 78  ee(x3a);.      x
21750 33 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  3a = 0;.    }els
21760 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
21770 20 20 20 20 20 20 78 33 61 2d 3e 68 74 20 3d 20        x3a->ht = 
21780 28 78 33 6e 6f 64 65 2a 2a 29 26 28 78 33 61 2d  (x3node**)&(x3a-
21790 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20  >tbl[128]);.    
217a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38    for(i=0; i<128
217b0 3b 20 69 2b 2b 29 20 78 33 61 2d 3e 68 74 5b 69  ; i++) x3a->ht[i
217c0 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
217d0 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e  .}./* Insert a n
217e0 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  ew record into t
217f0 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  he array.  Retur
21800 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73  n TRUE if succes
21810 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64  sful..** Prior d
21820 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d  ata with the sam
21830 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65  e key is NOT ove
21840 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20  rwritten */.int 
21850 53 74 61 74 65 5f 69 6e 73 65 72 74 28 64 61 74  State_insert(dat
21860 61 2c 6b 65 79 29 0a 73 74 72 75 63 74 20 73 74  a,key).struct st
21870 61 74 65 20 2a 64 61 74 61 3b 0a 73 74 72 75 63  ate *data;.struc
21880 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b  t config *key;.{
21890 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 20  .  x3node *np;. 
218a0 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68   int h;.  int ph
218b0 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20  ;..  if( x3a==0 
218c0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68  ) return 0;.  ph
218d0 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65 79   = statehash(key
218e0 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  );.  h = ph & (x
218f0 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  3a->size-1);.  n
21900 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x3a->ht[h];.
21910 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
21920 20 20 20 69 66 28 20 73 74 61 74 65 63 6d 70 28     if( statecmp(
21930 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20  np->key,key)==0 
21940 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  ){.      /* An e
21950 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69  xisting entry wi
21960 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
21970 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20  is found. */.   
21980 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75     /* Fail becau
21990 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20  se overwrite is 
219a0 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20  not allows. */. 
219b0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
219c0 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70     }.    np = np
219d0 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  ->next;.  }.  if
219e0 28 20 78 33 61 2d 3e 63 6f 75 6e 74 3e 3d 78 33  ( x3a->count>=x3
219f0 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f  a->size ){.    /
21a00 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74  * Need to make t
21a10 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69  he hash table bi
21a20 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  gger */.    int 
21a30 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75  i,size;.    stru
21a40 63 74 20 73 5f 78 33 20 61 72 72 61 79 3b 0a 20  ct s_x3 array;. 
21a50 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20     array.size = 
21a60 73 69 7a 65 20 3d 20 78 33 61 2d 3e 73 69 7a 65  size = x3a->size
21a70 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f  *2;.    array.co
21a80 75 6e 74 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74  unt = x3a->count
21a90 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20  ;.    array.tbl 
21aa0 3d 20 28 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f  = (x3node*)mallo
21ab0 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66  c(.      (sizeof
21ac0 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x3node) + sizeo
21ad0 66 28 78 33 6e 6f 64 65 2a 29 29 2a 73 69 7a 65  f(x3node*))*size
21ae0 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61   );.    if( arra
21af0 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72  y.tbl==0 ) retur
21b00 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75  n 0;  /* Fail du
21b10 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e to malloc fail
21b20 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79  ure */.    array
21b30 2e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29  .ht = (x3node**)
21b40 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65  &(array.tbl[size
21b50 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ]);.    for(i=0;
21b60 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72   i<size; i++) ar
21b70 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  ray.ht[i] = 0;. 
21b80 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 33     for(i=0; i<x3
21b90 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a  a->count; i++){.
21ba0 20 20 20 20 20 20 78 33 6e 6f 64 65 20 2a 6f 6c        x3node *ol
21bb0 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20  dnp, *newnp;.   
21bc0 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 33 61     oldnp = &(x3a
21bd0 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  ->tbl[i]);.     
21be0 20 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6f   h = statehash(o
21bf0 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 73 69  ldnp->key) & (si
21c00 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77  ze-1);.      new
21c10 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c  np = &(array.tbl
21c20 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
21c30 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72  array.ht[h] ) ar
21c40 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  ray.ht[h]->from 
21c50 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29  = &(newnp->next)
21c60 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e  ;.      newnp->n
21c70 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68  ext = array.ht[h
21c80 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  ];.      newnp->
21c90 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79  key = oldnp->key
21ca0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64  ;.      newnp->d
21cb0 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74  ata = oldnp->dat
21cc0 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  a;.      newnp->
21cd0 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68  from = &(array.h
21ce0 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72  t[h]);.      arr
21cf0 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70  ay.ht[h] = newnp
21d00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
21d10 28 78 33 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20  (x3a->tbl);.    
21d20 2a 78 33 61 20 3d 20 61 72 72 61 79 3b 0a 20 20  *x3a = array;.  
21d30 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  }.  /* Insert th
21d40 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20  e new data */.  
21d50 68 20 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73  h = ph & (x3a->s
21d60 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26  ize-1);.  np = &
21d70 28 78 33 61 2d 3e 74 62 6c 5b 78 33 61 2d 3e 63  (x3a->tbl[x3a->c
21d80 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e  ount++]);.  np->
21d90 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d  key = key;.  np-
21da0 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20  >data = data;.  
21db0 69 66 28 20 78 33 61 2d 3e 68 74 5b 68 5d 20 29  if( x3a->ht[h] )
21dc0 20 78 33 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f   x3a->ht[h]->fro
21dd0 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b  m = &(np->next);
21de0 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 33  .  np->next = x3
21df0 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 33 61 2d  a->ht[h];.  x3a-
21e00 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e  >ht[h] = np;.  n
21e10 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 33 61 2d  p->from = &(x3a-
21e20 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72  >ht[h]);.  retur
21e30 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  n 1;.}../* Retur
21e40 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  n a pointer to d
21e50 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20  ata assigned to 
21e60 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20  the given key.  
21e70 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69  Return NULL.** i
21e80 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a  f no such key. *
21e90 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  /.struct state *
21ea0 53 74 61 74 65 5f 66 69 6e 64 28 6b 65 79 29 0a  State_find(key).
21eb0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b  struct config *k
21ec0 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20  ey;.{.  int h;. 
21ed0 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20   x3node *np;..  
21ee0 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74  if( x3a==0 ) ret
21ef0 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 61  urn 0;.  h = sta
21f00 74 65 68 61 73 68 28 6b 65 79 29 20 26 20 28 78  tehash(key) & (x
21f10 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  3a->size-1);.  n
21f20 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x3a->ht[h];.
21f30 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
21f40 20 20 20 69 66 28 20 73 74 61 74 65 63 6d 70 28     if( statecmp(
21f50 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20  np->key,key)==0 
21f60 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20  ) break;.    np 
21f70 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
21f80 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70    return np ? np
21f90 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->data : 0;.}../
21fa0 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61  * Return an arra
21fb0 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  y of pointers to
21fc0 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65   all data in the
21fd0 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61   table..** The a
21fe0 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64  rray is obtained
21ff0 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52   from malloc.  R
22000 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65  eturn NULL if me
22010 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
22020 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20  ** problems, or 
22030 69 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  if the array is 
22040 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74  empty. */.struct
22050 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65 5f 61   state **State_a
22060 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72  rrayof().{.  str
22070 75 63 74 20 73 74 61 74 65 20 2a 2a 61 72 72 61  uct state **arra
22080 79 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b  y;.  int i,size;
22090 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20  .  if( x3a==0 ) 
220a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65  return 0;.  size
220b0 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20   = x3a->count;. 
220c0 20 61 72 72 61 79 20 3d 20 28 73 74 72 75 63 74   array = (struct
220d0 20 73 74 61 74 65 20 2a 2a 29 6d 61 6c 6c 6f 63   state **)malloc
220e0 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
220f0 73 74 61 74 65 20 2a 29 2a 73 69 7a 65 20 29 3b  state *)*size );
22100 0a 20 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a  .  if( array ){.
22110 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
22120 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b  ize; i++) array[
22130 69 5d 20 3d 20 78 33 61 2d 3e 74 62 6c 5b 69 5d  i] = x3a->tbl[i]
22140 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74  .data;.  }.  ret
22150 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a  urn array;.}../*
22160 20 48 61 73 68 20 61 20 63 6f 6e 66 69 67 75 72   Hash a configur
22170 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45  ation */.PRIVATE
22180 20 69 6e 74 20 63 6f 6e 66 69 67 68 61 73 68 28   int confighash(
22190 61 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  a).struct config
221a0 20 2a 61 3b 0a 7b 0a 20 20 69 6e 74 20 68 3d 30   *a;.{.  int h=0
221b0 3b 0a 20 20 68 20 3d 20 68 2a 35 37 31 20 2b 20  ;.  h = h*571 + 
221c0 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20  a->rp->index*37 
221d0 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75  + a->dot;.  retu
221e0 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72  rn h;.}../* Ther
221f0 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
22200 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
22210 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  ng structure for
22220 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61   each.** associa
22230 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
22240 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 73 74 72 75  pe "x4"..*/.stru
22250 63 74 20 73 5f 78 34 20 7b 0a 20 20 69 6e 74 20  ct s_x4 {.  int 
22260 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
22270 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
22280 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73  r of available s
22290 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lots. */.       
222a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222b0 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20     /*   Must be 
222c0 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65  a power of 2 gre
222d0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a  ater than or */.
222e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65            /*   e
22300 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69  qual to 1 */.  i
22310 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20  nt count;       
22320 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
22330 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c   of currently sl
22340 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ots filled */.  
22350 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20  struct s_x4node 
22360 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61  *tbl;  /* The da
22370 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a  ta stored here *
22380 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e  /.  struct s_x4n
22390 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61  ode **ht;  /* Ha
223a0 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f  sh table for loo
223b0 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54  kups */.};../* T
223c0 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
223d0 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
223e0 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79  ucture for every
223f0 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a   data element.**
22400 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69   in an associati
22410 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
22420 20 22 78 34 22 2e 0a 2a 2f 0a 74 79 70 65 64 65   "x4"..*/.typede
22430 66 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64  f struct s_x4nod
22440 65 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  e {.  struct con
22450 66 69 67 20 2a 64 61 74 61 3b 20 20 20 20 20 20  fig *data;      
22460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
22470 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72  he data */.  str
22480 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 6e 65  uct s_x4node *ne
22490 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e  xt;   /* Next en
224a0 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
224b0 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75  e hash */.  stru
224c0 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 66 72  ct s_x4node **fr
224d0 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  om;  /* Previous
224e0 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 34 6e 6f 64   link */.} x4nod
224f0 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  e;../* There is 
22500 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63  only one instanc
22510 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20  e of the array, 
22520 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c  which is the fol
22530 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63  lowing */.static
22540 20 73 74 72 75 63 74 20 73 5f 78 34 20 2a 78 34   struct s_x4 *x4
22550 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  a;../* Allocate 
22560 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76  a new associativ
22570 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20  e array */.void 
22580 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74  Configtable_init
22590 28 29 7b 0a 20 20 69 66 28 20 78 34 61 20 29 20  (){.  if( x4a ) 
225a0 72 65 74 75 72 6e 3b 0a 20 20 78 34 61 20 3d 20  return;.  x4a = 
225b0 28 73 74 72 75 63 74 20 73 5f 78 34 2a 29 6d 61  (struct s_x4*)ma
225c0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
225d0 75 63 74 20 73 5f 78 34 29 20 29 3b 0a 20 20 69  uct s_x4) );.  i
225e0 66 28 20 78 34 61 20 29 7b 0a 20 20 20 20 78 34  f( x4a ){.    x4
225f0 61 2d 3e 73 69 7a 65 20 3d 20 36 34 3b 0a 20 20  a->size = 64;.  
22600 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30    x4a->count = 0
22610 3b 0a 20 20 20 20 78 34 61 2d 3e 74 62 6c 20 3d  ;.    x4a->tbl =
22620 20 28 78 34 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63   (x4node*)malloc
22630 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66  ( .      (sizeof
22640 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x4node) + sizeo
22650 66 28 78 34 6e 6f 64 65 2a 29 29 2a 36 34 20 29  f(x4node*))*64 )
22660 3b 0a 20 20 20 20 69 66 28 20 78 34 61 2d 3e 74  ;.    if( x4a->t
22670 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  bl==0 ){.      f
22680 72 65 65 28 78 34 61 29 3b 0a 20 20 20 20 20 20  ree(x4a);.      
22690 78 34 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  x4a = 0;.    }el
226a0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
226b0 0a 20 20 20 20 20 20 78 34 61 2d 3e 68 74 20 3d  .      x4a->ht =
226c0 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 78 34 61   (x4node**)&(x4a
226d0 2d 3e 74 62 6c 5b 36 34 5d 29 3b 0a 20 20 20 20  ->tbl[64]);.    
226e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 36 34 3b    for(i=0; i<64;
226f0 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d   i++) x4a->ht[i]
22700 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
22710 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  }./* Insert a ne
22720 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
22730 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  e array.  Return
22740 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73   TRUE if success
22750 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61  ful..** Prior da
22760 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ta with the same
22770 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72   key is NOT over
22780 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 43  written */.int C
22790 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72  onfigtable_inser
227a0 74 28 64 61 74 61 29 0a 73 74 72 75 63 74 20 63  t(data).struct c
227b0 6f 6e 66 69 67 20 2a 64 61 74 61 3b 0a 7b 0a 20  onfig *data;.{. 
227c0 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69   x4node *np;.  i
227d0 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a  nt h;.  int ph;.
227e0 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20  .  if( x4a==0 ) 
227f0 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d  return 0;.  ph =
22800 20 63 6f 6e 66 69 67 68 61 73 68 28 64 61 74 61   confighash(data
22810 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  );.  h = ph & (x
22820 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  4a->size-1);.  n
22830 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x4a->ht[h];.
22840 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
22850 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70     if( Configcmp
22860 28 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61 29 3d  (np->data,data)=
22870 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
22880 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79  n existing entry
22890 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b   with the same k
228a0 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a  ey is found. */.
228b0 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65        /* Fail be
228c0 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20  cause overwrite 
228d0 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a  is not allows. *
228e0 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  /.      return 0
228f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d  ;.    }.    np =
22900 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
22910 20 69 66 28 20 78 34 61 2d 3e 63 6f 75 6e 74 3e   if( x4a->count>
22920 3d 78 34 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20  =x4a->size ){.  
22930 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b    /* Need to mak
22940 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
22950 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69   bigger */.    i
22960 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73  nt i,size;.    s
22970 74 72 75 63 74 20 73 5f 78 34 20 61 72 72 61 79  truct s_x4 array
22980 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65  ;.    array.size
22990 20 3d 20 73 69 7a 65 20 3d 20 78 34 61 2d 3e 73   = size = x4a->s
229a0 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79  ize*2;.    array
229b0 2e 63 6f 75 6e 74 20 3d 20 78 34 61 2d 3e 63 6f  .count = x4a->co
229c0 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74  unt;.    array.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 0a 20 20 20 20 20 20 28 73 69 7a  lloc(.      (siz
229f0 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69  eof(x4node) + si
22a00 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 2a 73  zeof(x4node*))*s
22a10 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61  ize );.    if( a
22a20 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65  rray.tbl==0 ) re
22a30 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c  turn 0;  /* Fail
22a40 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66   due to malloc f
22a50 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72  ailure */.    ar
22a60 72 61 79 2e 68 74 20 3d 20 28 78 34 6e 6f 64 65  ray.ht = (x4node
22a70 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73  **)&(array.tbl[s
22a80 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  ize]);.    for(i
22a90 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29  =0; i<size; i++)
22aa0 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30   array.ht[i] = 0
22ab0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
22ac0 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b  <x4a->count; i++
22ad0 29 7b 0a 20 20 20 20 20 20 78 34 6e 6f 64 65 20  ){.      x4node 
22ae0 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a  *oldnp, *newnp;.
22af0 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28        oldnp = &(
22b00 78 34 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20  x4a->tbl[i]);.  
22b10 20 20 20 20 68 20 3d 20 63 6f 6e 66 69 67 68 61      h = configha
22b20 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20  sh(oldnp->data) 
22b30 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20  & (size-1);.    
22b40 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61    newnp = &(arra
22b50 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  y.tbl[i]);.     
22b60 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d   if( array.ht[h]
22b70 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e   ) array.ht[h]->
22b80 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e  from = &(newnp->
22b90 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77  next);.      new
22ba0 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79  np->next = array
22bb0 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65  .ht[h];.      ne
22bc0 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e  wnp->data = oldn
22bd0 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e  p->data;.      n
22be0 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61  ewnp->from = &(a
22bf0 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20  rray.ht[h]);.   
22c00 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d     array.ht[h] =
22c10 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20   newnp;.    }.  
22c20 20 20 66 72 65 65 28 78 34 61 2d 3e 74 62 6c 29    free(x4a->tbl)
22c30 3b 0a 20 20 20 20 2a 78 34 61 20 3d 20 61 72 72  ;.    *x4a = arr
22c40 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73  ay;.  }.  /* Ins
22c50 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61  ert the new data
22c60 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28   */.  h = ph & (
22c70 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x4a->size-1);.  
22c80 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b  np = &(x4a->tbl[
22c90 78 34 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a  x4a->count++]);.
22ca0 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74    np->data = dat
22cb0 61 3b 0a 20 20 69 66 28 20 78 34 61 2d 3e 68 74  a;.  if( x4a->ht
22cc0 5b 68 5d 20 29 20 78 34 61 2d 3e 68 74 5b 68 5d  [h] ) x4a->ht[h]
22cd0 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e  ->from = &(np->n
22ce0 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74  ext);.  np->next
22cf0 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x4a->ht[h];. 
22d00 20 78 34 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70   x4a->ht[h] = np
22d10 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26  ;.  np->from = &
22d20 28 78 34 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20  (x4a->ht[h]);.  
22d30 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20  return 1;.}../* 
22d40 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
22d50 20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65   to data assigne
22d60 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b  d to the given k
22d70 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ey.  Return NULL
22d80 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b  .** if no such k
22d90 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f  ey. */.struct co
22da0 6e 66 69 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c  nfig *Configtabl
22db0 65 5f 66 69 6e 64 28 6b 65 79 29 0a 73 74 72 75  e_find(key).stru
22dc0 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a  ct config *key;.
22dd0 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 34 6e  {.  int h;.  x4n
22de0 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20  ode *np;..  if( 
22df0 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x4a==0 ) return 
22e00 30 3b 0a 20 20 68 20 3d 20 63 6f 6e 66 69 67 68  0;.  h = configh
22e10 61 73 68 28 6b 65 79 29 20 26 20 28 78 34 61 2d  ash(key) & (x4a-
22e20 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
22e30 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77   x4a->ht[h];.  w
22e40 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20  hile( np ){.    
22e50 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28 6e 70  if( Configcmp(np
22e60 2d 3e 64 61 74 61 2c 6b 65 79 29 3d 3d 30 20 29  ->data,key)==0 )
22e70 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d   break;.    np =
22e80 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20   np->next;.  }. 
22e90 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d   return np ? np-
22ea0 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a  >data : 0;.}../*
22eb0 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61 74 61   Remove all data
22ec0 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c 65 2e   from the table.
22ed0 20 20 50 61 73 73 20 65 61 63 68 20 64 61 74 61    Pass each data
22ee0 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
22ef0 20 22 66 22 0a 2a 2a 20 61 73 20 69 74 20 69 73   "f".** as it is
22f00 20 72 65 6d 6f 76 65 64 2e 20 20 28 22 66 22 20   removed.  ("f" 
22f10 6d 61 79 20 62 65 20 6e 75 6c 6c 20 74 6f 20 61  may be null to a
22f20 76 6f 69 64 20 74 68 69 73 20 73 74 65 70 2e 29  void this step.)
22f30 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74   */.void Configt
22f40 61 62 6c 65 5f 63 6c 65 61 72 28 66 29 0a 69 6e  able_clear(f).in
22f50 74 28 2a 66 29 28 2f 2a 20 73 74 72 75 63 74 20  t(*f)(/* struct 
22f60 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 7b 0a  config * */);.{.
22f70 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 78    int i;.  if( x
22f80 34 61 3d 3d 30 20 7c 7c 20 78 34 61 2d 3e 63 6f  4a==0 || x4a->co
22f90 75 6e 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  unt==0 ) return;
22fa0 0a 20 20 69 66 28 20 66 20 29 20 66 6f 72 28 69  .  if( f ) for(i
22fb0 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74  =0; i<x4a->count
22fc0 3b 20 69 2b 2b 29 20 28 2a 66 29 28 78 34 61 2d  ; i++) (*f)(x4a-
22fd0 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 29 3b 0a 20  >tbl[i].data);. 
22fe0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d   for(i=0; i<x4a-
22ff0 3e 73 69 7a 65 3b 20 69 2b 2b 29 20 78 34 61 2d  >size; i++) x4a-
23000 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 78 34  >ht[i] = 0;.  x4
23010 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  a->count = 0;.  
23020 72 65 74 75 72 6e 3b 0a 7d 0a                    return;.}.