/ Hex Artifact Content
Login

Artifact 415104859db0e4badd3571dee4a60582297ebaaa:


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: 6e 65 78 70 65 63 74 65 64 3b 20 20 20 20 20 20  nexpected;      
2d20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2d30: 66 20 65 78 70 65 63 74 65 64 20 70 61 72 73 69  f expected parsi
2d40: 6e 67 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a  ng conflicts */.
2d50: 20 20 69 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b    int tablesize;
2d60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2d70: 7a 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 20  ze of the parse 
2d80: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20  tables */.  int 
2d90: 62 61 73 69 73 66 6c 61 67 3b 20 20 20 20 20 20  basisflag;      
2da0: 20 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 6f 6e       /* Print on
2db0: 6c 79 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75  ly basis configu
2dc0: 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  rations */.  int
2dd0: 20 68 61 73 5f 66 61 6c 6c 62 61 63 6b 3b 20 20   has_fallback;  
2de0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2df0: 20 61 6e 79 20 25 66 61 6c 6c 62 61 63 6b 20 69   any %fallback i
2e00: 73 20 73 65 65 6e 20 69 6e 20 74 68 65 20 67 72  s seen in the gr
2e10: 61 6d 6d 61 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  ammar */.  int n
2e20: 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 3b 20 20 20  olinenosflag;   
2e30: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 23      /* True if #
2e40: 6c 69 6e 65 20 73 74 61 74 65 6d 65 6e 74 73 20  line statements 
2e50: 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 70 72  should not be pr
2e60: 69 6e 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20  inted */.  char 
2e70: 2a 61 72 67 76 30 3b 20 20 20 20 20 20 20 20 20  *argv0;         
2e80: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2e90: 68 65 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 7d 3b  he program */.};
2ea0: 0a 0a 23 64 65 66 69 6e 65 20 4d 65 6d 6f 72 79  ..#define Memory
2eb0: 43 68 65 63 6b 28 58 29 20 69 66 28 28 58 29 3d  Check(X) if((X)=
2ec0: 3d 30 29 7b 20 5c 0a 20 20 65 78 74 65 72 6e 20  =0){ \.  extern 
2ed0: 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f  void memory_erro
2ee0: 72 28 29 3b 20 5c 0a 20 20 6d 65 6d 6f 72 79 5f  r(); \.  memory_
2ef0: 65 72 72 6f 72 28 29 3b 20 5c 0a 7d 0a 0a 2f 2a  error(); \.}../*
2f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
2f10: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74  From the file "t
2f20: 61 62 6c 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  able.h" ********
2f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
2f50: 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69   All code in thi
2f60: 73 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  s file has been 
2f70: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
2f80: 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  nerated.** from 
2f90: 61 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20  a specification 
2fa0: 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20  in the file.**  
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 22 74 61 62              "tab
2fc0: 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20  le.q".** by the 
2fd0: 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
2fe0: 79 20 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20  y code building 
2ff0: 70 72 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e  program "aagen".
3000: 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20  .** Do not edit 
3010: 74 68 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74  this file!  Inst
3020: 65 61 64 2c 20 65 64 69 74 20 74 68 65 20 73 70  ead, edit the sp
3030: 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66  ecification.** f
3040: 69 6c 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20  ile, then rerun 
3050: 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  aagen..*/./*.** 
3060: 43 6f 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73  Code for process
3070: 69 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68  ing tables in th
3080: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
3090: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
30a0: 20 52 6f 75 74 69 6e 65 73 20 66 6f 72 20 68 61   Routines for ha
30b0: 6e 64 6c 69 6e 67 20 61 20 73 74 72 69 6e 67 73  ndling a strings
30c0: 20 2a 2f 0a 0a 63 68 61 72 20 2a 53 74 72 73 61   */..char *Strsa
30d0: 66 65 28 29 3b 0a 0a 76 6f 69 64 20 53 74 72 73  fe();..void Strs
30e0: 61 66 65 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64  afe_init(/* void
30f0: 20 2a 2f 29 3b 0a 69 6e 74 20 53 74 72 73 61 66   */);.int Strsaf
3100: 65 5f 69 6e 73 65 72 74 28 2f 2a 20 63 68 61 72  e_insert(/* char
3110: 20 2a 20 2a 2f 29 3b 0a 63 68 61 72 20 2a 53 74   * */);.char *St
3120: 72 73 61 66 65 5f 66 69 6e 64 28 2f 2a 20 63 68  rsafe_find(/* ch
3130: 61 72 20 2a 20 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f  ar * */);../* Ro
3140: 75 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c  utines for handl
3150: 69 6e 67 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74  ing symbols of t
3160: 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 0a 73  he grammar */..s
3170: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
3180: 6d 62 6f 6c 5f 6e 65 77 28 29 3b 0a 69 6e 74 20  mbol_new();.int 
3190: 53 79 6d 62 6f 6c 63 6d 70 70 28 2f 2a 20 73 74  Symbolcmpp(/* st
31a0: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 2c 20  ruct symbol **, 
31b0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
31c0: 20 2a 2f 29 3b 0a 76 6f 69 64 20 53 79 6d 62 6f   */);.void Symbo
31d0: 6c 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a  l_init(/* void *
31e0: 2f 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69  /);.int Symbol_i
31f0: 6e 73 65 72 74 28 2f 2a 20 73 74 72 75 63 74 20  nsert(/* struct 
3200: 73 79 6d 62 6f 6c 20 2a 2c 20 63 68 61 72 20 2a  symbol *, char *
3210: 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 79 6d   */);.struct sym
3220: 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64  bol *Symbol_find
3230: 28 2f 2a 20 63 68 61 72 20 2a 20 2a 2f 29 3b 0a  (/* char * */);.
3240: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
3250: 79 6d 62 6f 6c 5f 4e 74 68 28 2f 2a 20 69 6e 74  ymbol_Nth(/* int
3260: 20 2a 2f 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c   */);.int Symbol
3270: 5f 63 6f 75 6e 74 28 2f 2a 20 20 2a 2f 29 3b 0a  _count(/*  */);.
3280: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
3290: 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 2f  Symbol_arrayof(/
32a0: 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74  *  */);../* Rout
32b0: 69 6e 65 73 20 74 6f 20 6d 61 6e 61 67 65 20 74  ines to manage t
32c0: 68 65 20 73 74 61 74 65 20 74 61 62 6c 65 20 2a  he state table *
32d0: 2f 0a 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70  /..int Configcmp
32e0: 28 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e 66 69  (/* struct confi
32f0: 67 20 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e 66  g *, struct conf
3300: 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74  ig * */);.struct
3310: 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e 65   state *State_ne
3320: 77 28 29 3b 0a 76 6f 69 64 20 53 74 61 74 65 5f  w();.void State_
3330: 69 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29  init(/* void */)
3340: 3b 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65  ;.int State_inse
3350: 72 74 28 2f 2a 20 73 74 72 75 63 74 20 73 74 61  rt(/* struct sta
3360: 74 65 20 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e  te *, struct con
3370: 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63  fig * */);.struc
3380: 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 66  t state *State_f
3390: 69 6e 64 28 2f 2a 20 73 74 72 75 63 74 20 63 6f  ind(/* struct co
33a0: 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75  nfig * */);.stru
33b0: 63 74 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65  ct state **State
33c0: 5f 61 72 72 61 79 6f 66 28 2f 2a 20 20 2a 2f 29  _arrayof(/*  */)
33d0: 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 75  ;../* Routines u
33e0: 73 65 64 20 66 6f 72 20 65 66 66 69 63 69 65 6e  sed for efficien
33f0: 63 79 20 69 6e 20 43 6f 6e 66 69 67 6c 69 73 74  cy in Configlist
3400: 5f 61 64 64 20 2a 2f 0a 0a 76 6f 69 64 20 43 6f  _add */..void Co
3410: 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 2f  nfigtable_init(/
3420: 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e 74 20  * void */);.int 
3430: 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65  Configtable_inse
3440: 72 74 28 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e  rt(/* struct con
3450: 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63  fig * */);.struc
3460: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
3470: 74 61 62 6c 65 5f 66 69 6e 64 28 2f 2a 20 73 74  table_find(/* st
3480: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f  ruct config * */
3490: 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  );.void Configta
34a0: 62 6c 65 5f 63 6c 65 61 72 28 2f 2a 20 69 6e 74  ble_clear(/* int
34b0: 28 2a 29 28 73 74 72 75 63 74 20 63 6f 6e 66 69  (*)(struct confi
34c0: 67 20 2a 29 20 2a 2f 29 3b 0a 2f 2a 2a 2a 2a 2a  g *) */);./*****
34d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
34e0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 61 63 74  om the file "act
34f0: 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion.c" *********
3500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3510: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f  ******/./*.** Ro
3520: 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73 69 6e  utines processin
3530: 67 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 73  g parser actions
3540: 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
3550: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
3560: 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  */../* Allocate 
3570: 61 20 6e 65 77 20 70 61 72 73 65 72 20 61 63 74  a new parser act
3580: 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ion */.static st
3590: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41 63 74  ruct action *Act
35a0: 69 6f 6e 5f 6e 65 77 28 76 6f 69 64 29 7b 0a 20  ion_new(void){. 
35b0: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61   static struct a
35c0: 63 74 69 6f 6e 20 2a 66 72 65 65 6c 69 73 74 20  ction *freelist 
35d0: 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 61 63  = 0;.  struct ac
35e0: 74 69 6f 6e 20 2a 6e 65 77 3b 0a 0a 20 20 69 66  tion *new;..  if
35f0: 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b  ( freelist==0 ){
3600: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
3610: 69 6e 74 20 61 6d 74 20 3d 20 31 30 30 3b 0a 20  int amt = 100;. 
3620: 20 20 20 66 72 65 65 6c 69 73 74 20 3d 20 28 73     freelist = (s
3630: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 63  truct action *)c
3640: 61 6c 6c 6f 63 28 61 6d 74 2c 20 73 69 7a 65 6f  alloc(amt, sizeo
3650: 66 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 29  f(struct action)
3660: 29 3b 0a 20 20 20 20 69 66 28 20 66 72 65 65 6c  );.    if( freel
3670: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
3680: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
3690: 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  Unable to alloca
36a0: 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20  te memory for a 
36b0: 6e 65 77 20 70 61 72 73 65 72 20 61 63 74 69 6f  new parser actio
36c0: 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74  n.");.      exit
36d0: 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  (1);.    }.    f
36e0: 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b  or(i=0; i<amt-1;
36f0: 20 69 2b 2b 29 20 66 72 65 65 6c 69 73 74 5b 69   i++) freelist[i
3700: 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65 65 6c 69  ].next = &freeli
3710: 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65  st[i+1];.    fre
3720: 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78  elist[amt-1].nex
3730: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77  t = 0;.  }.  new
3740: 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66   = freelist;.  f
3750: 72 65 65 6c 69 73 74 20 3d 20 66 72 65 65 6c 69  reelist = freeli
3760: 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75  st->next;.  retu
3770: 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 43 6f  rn new;.}../* Co
3780: 6d 70 61 72 65 20 74 77 6f 20 61 63 74 69 6f 6e  mpare two action
3790: 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75  s for sorting pu
37a0: 72 70 6f 73 65 73 2e 20 20 52 65 74 75 72 6e 20  rposes.  Return 
37b0: 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
37c0: 6f 72 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 69  or.** positive i
37d0: 66 20 74 68 65 20 66 69 72 73 74 20 61 63 74 69  f the first acti
37e0: 6f 6e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  on is less than,
37f0: 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72   equal to, or gr
3800: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  eater than.** th
3810: 65 20 66 69 72 73 74 0a 2a 2f 0a 73 74 61 74 69  e first.*/.stati
3820: 63 20 69 6e 74 20 61 63 74 69 6f 6e 63 6d 70 28  c int actioncmp(
3830: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
3840: 20 2a 61 70 31 2c 0a 20 20 73 74 72 75 63 74 20   *ap1,.  struct 
3850: 61 63 74 69 6f 6e 20 2a 61 70 32 0a 29 7b 0a 20  action *ap2.){. 
3860: 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
3870: 61 70 31 2d 3e 73 70 2d 3e 69 6e 64 65 78 20 2d  ap1->sp->index -
3880: 20 61 70 32 2d 3e 73 70 2d 3e 69 6e 64 65 78 3b   ap2->sp->index;
3890: 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
38a0: 20 20 20 20 72 63 20 3d 20 28 69 6e 74 29 61 70      rc = (int)ap
38b0: 31 2d 3e 74 79 70 65 20 2d 20 28 69 6e 74 29 61  1->type - (int)a
38c0: 70 32 2d 3e 74 79 70 65 3b 0a 20 20 7d 0a 20 20  p2->type;.  }.  
38d0: 69 66 28 20 72 63 3d 3d 30 20 26 26 20 61 70 31  if( rc==0 && ap1
38e0: 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29  ->type==REDUCE )
38f0: 7b 0a 20 20 20 20 72 63 20 3d 20 61 70 31 2d 3e  {.    rc = ap1->
3900: 78 2e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 61 70  x.rp->index - ap
3910: 32 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 3b 0a  2->x.rp->index;.
3920: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20    }.  if( rc==0 
3930: 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 70 32 20  ){.    rc = ap2 
3940: 2d 20 61 70 31 3b 0a 20 20 7d 0a 20 20 72 65 74  - ap1;.  }.  ret
3950: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 6f  urn rc;.}../* So
3960: 72 74 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e  rt parser action
3970: 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  s */.static stru
3980: 63 74 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f  ct action *Actio
3990: 6e 5f 73 6f 72 74 28 0a 20 20 73 74 72 75 63 74  n_sort(.  struct
39a0: 20 61 63 74 69 6f 6e 20 2a 61 70 0a 29 7b 0a 20   action *ap.){. 
39b0: 20 61 70 20 3d 20 28 73 74 72 75 63 74 20 61 63   ap = (struct ac
39c0: 74 69 6f 6e 20 2a 29 6d 73 6f 72 74 28 28 63 68  tion *)msort((ch
39d0: 61 72 20 2a 29 61 70 2c 28 63 68 61 72 20 2a 2a  ar *)ap,(char **
39e0: 29 26 61 70 2d 3e 6e 65 78 74 2c 0a 20 20 20 20  )&ap->next,.    
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a00: 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 28 2a            (int(*
3a10: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f  )(const char*,co
3a20: 6e 73 74 20 63 68 61 72 2a 29 29 61 63 74 69 6f  nst char*))actio
3a30: 6e 63 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ncmp);.  return 
3a40: 61 70 3b 0a 7d 0a 0a 76 6f 69 64 20 41 63 74 69  ap;.}..void Acti
3a50: 6f 6e 5f 61 64 64 28 61 70 70 2c 74 79 70 65 2c  on_add(app,type,
3a60: 73 70 2c 61 72 67 29 0a 73 74 72 75 63 74 20 61  sp,arg).struct a
3a70: 63 74 69 6f 6e 20 2a 2a 61 70 70 3b 0a 65 6e 75  ction **app;.enu
3a80: 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79 70 65 3b  m e_action type;
3a90: 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
3aa0: 73 70 3b 0a 63 68 61 72 20 2a 61 72 67 3b 0a 7b  sp;.char *arg;.{
3ab0: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
3ac0: 20 2a 6e 65 77 3b 0a 20 20 6e 65 77 20 3d 20 41   *new;.  new = A
3ad0: 63 74 69 6f 6e 5f 6e 65 77 28 29 3b 0a 20 20 6e  ction_new();.  n
3ae0: 65 77 2d 3e 6e 65 78 74 20 3d 20 2a 61 70 70 3b  ew->next = *app;
3af0: 0a 20 20 2a 61 70 70 20 3d 20 6e 65 77 3b 0a 20  .  *app = new;. 
3b00: 20 6e 65 77 2d 3e 74 79 70 65 20 3d 20 74 79 70   new->type = typ
3b10: 65 3b 0a 20 20 6e 65 77 2d 3e 73 70 20 3d 20 73  e;.  new->sp = s
3b20: 70 3b 0a 20 20 69 66 28 20 74 79 70 65 3d 3d 53  p;.  if( type==S
3b30: 48 49 46 54 20 29 7b 0a 20 20 20 20 6e 65 77 2d  HIFT ){.    new-
3b40: 3e 78 2e 73 74 70 20 3d 20 28 73 74 72 75 63 74  >x.stp = (struct
3b50: 20 73 74 61 74 65 20 2a 29 61 72 67 3b 0a 20 20   state *)arg;.  
3b60: 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 65 77 2d 3e  }else{.    new->
3b70: 78 2e 72 70 20 3d 20 28 73 74 72 75 63 74 20 72  x.rp = (struct r
3b80: 75 6c 65 20 2a 29 61 72 67 3b 0a 20 20 7d 0a 7d  ule *)arg;.  }.}
3b90: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
3ba0: 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 65 77 20 63 6f 64  ******** New cod
3bb0: 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74  e to implement t
3bc0: 68 65 20 22 61 63 74 74 61 62 22 20 6d 6f 64 75  he "acttab" modu
3bd0: 6c 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  le ***********/.
3be0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 6f 64 75 6c  /*.** This modul
3bf0: 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 72 6f 75  e implements rou
3c00: 74 69 6e 65 73 20 75 73 65 20 74 6f 20 63 6f 6e  tines use to con
3c10: 73 74 72 75 63 74 20 74 68 65 20 79 79 5f 61 63  struct the yy_ac
3c20: 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f  tion[] table..*/
3c30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 74  ../*.** The stat
3c40: 65 20 6f 66 20 74 68 65 20 79 79 5f 61 63 74 69  e of the yy_acti
3c50: 6f 6e 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63  on table under c
3c60: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 61  onstruction is a
3c70: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 0a 2a 2a  n instance of.**
3c80: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
3c90: 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20  tructure..**.** 
3ca0: 54 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61  The yy_action ta
3cb0: 62 6c 65 20 6d 61 70 73 20 74 68 65 20 70 61 69  ble maps the pai
3cc0: 72 20 28 73 74 61 74 65 5f 6e 75 6d 62 65 72 2c  r (state_number,
3cd0: 20 6c 6f 6f 6b 61 68 65 61 64 29 20 69 6e 74 6f   lookahead) into
3ce0: 20 61 6e 0a 2a 2a 20 61 63 74 69 6f 6e 5f 6e 75   an.** action_nu
3cf0: 6d 62 65 72 2e 20 20 54 68 65 20 74 61 62 6c 65  mber.  The table
3d00: 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20   is an array of 
3d10: 69 6e 74 65 67 65 72 73 20 70 61 69 72 73 2e 20  integers pairs. 
3d20: 20 54 68 65 20 73 74 61 74 65 5f 6e 75 6d 62 65   The state_numbe
3d30: 72 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 73 20  r.** determines 
3d40: 61 6e 20 69 6e 69 74 69 61 6c 20 6f 66 66 73 65  an initial offse
3d50: 74 20 69 6e 74 6f 20 74 68 65 20 79 79 5f 61 63  t into the yy_ac
3d60: 74 69 6f 6e 20 61 72 72 61 79 2e 20 20 54 68 65  tion array.  The
3d70: 20 6c 6f 6f 6b 61 68 65 61 64 0a 2a 2a 20 76 61   lookahead.** va
3d80: 6c 75 65 20 69 73 20 74 68 65 6e 20 61 64 64 65  lue is then adde
3d90: 64 20 74 6f 20 74 68 69 73 20 69 6e 69 74 69 61  d to this initia
3da0: 6c 20 6f 66 66 73 65 74 20 74 6f 20 67 65 74 20  l offset to get 
3db0: 61 6e 20 69 6e 64 65 78 20 58 20 69 6e 74 6f 20  an index X into 
3dc0: 74 68 65 0a 2a 2a 20 79 79 5f 61 63 74 69 6f 6e  the.** yy_action
3dd0: 20 61 72 72 61 79 2e 20 49 66 20 74 68 65 20 61   array. If the a
3de0: 41 63 74 69 6f 6e 5b 58 5d 2e 6c 6f 6f 6b 61 68  Action[X].lookah
3df0: 65 61 64 20 65 71 75 61 6c 73 20 74 68 65 20 76  ead equals the v
3e00: 61 6c 75 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f  alue of the.** o
3e10: 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20  f the lookahead 
3e20: 69 6e 70 75 74 2c 20 74 68 65 6e 20 74 68 65 20  input, then the 
3e30: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 61 63 74  value of the act
3e40: 69 6f 6e 5f 6e 75 6d 62 65 72 20 6f 75 74 70 75  ion_number outpu
3e50: 74 20 69 73 0a 2a 2a 20 61 41 63 74 69 6f 6e 5b  t is.** aAction[
3e60: 58 5d 2e 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  X].action.  If t
3e70: 68 65 20 6c 6f 6f 6b 61 68 65 61 64 73 20 64 6f  he lookaheads do
3e80: 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 6e 20   not match then 
3e90: 74 68 65 0a 2a 2a 20 64 65 66 61 75 6c 74 20 61  the.** default a
3ea0: 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 73 74  ction for the st
3eb0: 61 74 65 5f 6e 75 6d 62 65 72 20 69 73 20 72 65  ate_number is re
3ec0: 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6c  turned..**.** Al
3ed0: 6c 20 61 63 74 69 6f 6e 73 20 61 73 73 6f 63 69  l actions associ
3ee0: 61 74 65 64 20 77 69 74 68 20 61 20 73 69 6e 67  ated with a sing
3ef0: 6c 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20  le state_number 
3f00: 61 72 65 20 66 69 72 73 74 20 65 6e 74 65 72 65  are first entere
3f10: 64 0a 2a 2a 20 69 6e 74 6f 20 61 4c 6f 6f 6b 61  d.** into aLooka
3f20: 68 65 61 64 5b 5d 20 75 73 69 6e 67 20 6d 75 6c  head[] using mul
3f30: 74 69 70 6c 65 20 63 61 6c 6c 73 20 74 6f 20 61  tiple calls to a
3f40: 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 29 2e 20  cttab_action(). 
3f50: 20 54 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 63   Then the .** ac
3f60: 74 69 6f 6e 73 20 66 6f 72 20 74 68 61 74 20 73  tions for that s
3f70: 69 6e 67 6c 65 20 73 74 61 74 65 5f 6e 75 6d 62  ingle state_numb
3f80: 65 72 20 61 72 65 20 70 6c 61 63 65 64 20 69 6e  er are placed in
3f90: 74 6f 20 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d  to the aAction[]
3fa0: 20 0a 2a 2a 20 61 72 72 61 79 20 77 69 74 68 20   .** array with 
3fb0: 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 20 74 6f  a single call to
3fc0: 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28 29   acttab_insert()
3fd0: 2e 20 20 54 68 65 20 61 63 74 74 61 62 5f 69 6e  .  The acttab_in
3fe0: 73 65 72 74 28 29 20 63 61 6c 6c 0a 2a 2a 20 61  sert() call.** a
3ff0: 6c 73 6f 20 72 65 73 65 74 73 20 74 68 65 20 61  lso resets the a
4000: 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 61 72 72 61  Lookahead[] arra
4010: 79 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e  y in preparation
4020: 20 66 6f 72 20 74 68 65 20 6e 65 78 74 0a 2a 2a   for the next.**
4030: 20 73 74 61 74 65 20 6e 75 6d 62 65 72 2e 0a 2a   state number..*
4040: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
4050: 20 61 63 74 74 61 62 20 61 63 74 74 61 62 3b 0a   acttab acttab;.
4060: 73 74 72 75 63 74 20 61 63 74 74 61 62 20 7b 0a  struct acttab {.
4070: 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b 20 20    int nAction;  
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4090: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 64  * Number of used
40a0: 20 73 6c 6f 74 73 20 69 6e 20 61 41 63 74 69 6f   slots in aActio
40b0: 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63  n[] */.  int nAc
40c0: 74 69 6f 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20  tionAlloc;      
40d0: 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61        /* Slots a
40e0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 41 63  llocated for aAc
40f0: 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 73 74 72 75  tion[] */.  stru
4100: 63 74 20 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 6f  ct {.    int loo
4110: 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20  kahead;         
4120: 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
4130: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 74 6f  the lookahead to
4140: 6b 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61  ken */.    int a
4150: 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ction;          
4160: 20 20 20 20 20 20 2f 2a 20 41 63 74 69 6f 6e 20        /* Action 
4170: 74 6f 20 74 61 6b 65 20 6f 6e 20 74 68 65 20 67  to take on the g
4180: 69 76 65 6e 20 6c 6f 6f 6b 61 68 65 61 64 20 2a  iven lookahead *
4190: 2f 0a 20 20 7d 20 2a 61 41 63 74 69 6f 6e 2c 20  /.  } *aAction, 
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41b0: 20 2f 2a 20 54 68 65 20 79 79 5f 61 63 74 69 6f   /* The yy_actio
41c0: 6e 5b 5d 20 74 61 62 6c 65 20 75 6e 64 65 72 20  n[] table under 
41d0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a  construction */.
41e0: 20 20 20 20 2a 61 4c 6f 6f 6b 61 68 65 61 64 3b      *aLookahead;
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4200: 2a 20 41 20 73 69 6e 67 6c 65 20 6e 65 77 20 74  * A single new t
4210: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 2a  ransaction set *
4220: 2f 0a 20 20 69 6e 74 20 6d 6e 4c 6f 6f 6b 61 68  /.  int mnLookah
4230: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
4240: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61 4c 6f 6f   /* Minimum aLoo
4250: 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65  kahead[].lookahe
4260: 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e 41 63  ad */.  int mnAc
4270: 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tion;           
4280: 20 20 20 20 20 2f 2a 20 41 63 74 69 6f 6e 20 61       /* Action a
4290: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6d  ssociated with m
42a0: 6e 4c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20  nLookahead */.  
42b0: 69 6e 74 20 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b  int mxLookahead;
42c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
42d0: 4d 61 78 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65  Maximum aLookahe
42e0: 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a  ad[].lookahead *
42f0: 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65  /.  int nLookahe
4300: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
4310: 20 2f 2a 20 55 73 65 64 20 73 6c 6f 74 73 20 69   /* Used slots i
4320: 6e 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 2a  n aLookahead[] *
4330: 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65  /.  int nLookahe
4340: 61 64 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20  adAlloc;        
4350: 20 2f 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f 63 61   /* Slots alloca
4360: 74 65 64 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61  ted in aLookahea
4370: 64 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52 65  d[] */.};../* Re
4380: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
4390: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
43a0: 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c  e yy_action tabl
43b0: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74  e */.#define act
43c0: 74 61 62 5f 73 69 7a 65 28 58 29 20 28 28 58 29  tab_size(X) ((X)
43d0: 2d 3e 6e 41 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54  ->nAction)../* T
43e0: 68 65 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  he value for the
43f0: 20 4e 2d 74 68 20 65 6e 74 72 79 20 69 6e 20 79   N-th entry in y
4400: 79 5f 61 63 74 69 6f 6e 20 2a 2f 0a 23 64 65 66  y_action */.#def
4410: 69 6e 65 20 61 63 74 74 61 62 5f 79 79 61 63 74  ine acttab_yyact
4420: 69 6f 6e 28 58 2c 4e 29 20 20 28 28 58 29 2d 3e  ion(X,N)  ((X)->
4430: 61 41 63 74 69 6f 6e 5b 4e 5d 2e 61 63 74 69 6f  aAction[N].actio
4440: 6e 29 0a 0a 2f 2a 20 54 68 65 20 76 61 6c 75 65  n)../* The value
4450: 20 66 6f 72 20 74 68 65 20 4e 2d 74 68 20 65 6e   for the N-th en
4460: 74 72 79 20 69 6e 20 79 79 5f 6c 6f 6f 6b 61 68  try in yy_lookah
4470: 65 61 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61  ead */.#define a
4480: 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61 68 65 61  cttab_yylookahea
4490: 64 28 58 2c 4e 29 20 20 28 28 58 29 2d 3e 61 41  d(X,N)  ((X)->aA
44a0: 63 74 69 6f 6e 5b 4e 5d 2e 6c 6f 6f 6b 61 68 65  ction[N].lookahe
44b0: 61 64 29 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c  ad)../* Free all
44c0: 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
44d0: 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
44e0: 6e 20 61 63 74 74 61 62 20 2a 2f 0a 76 6f 69 64  n acttab */.void
44f0: 20 61 63 74 74 61 62 5f 66 72 65 65 28 61 63 74   acttab_free(act
4500: 74 61 62 20 2a 70 29 7b 0a 20 20 66 72 65 65 28  tab *p){.  free(
4510: 20 70 2d 3e 61 41 63 74 69 6f 6e 20 29 3b 0a 20   p->aAction );. 
4520: 20 66 72 65 65 28 20 70 2d 3e 61 4c 6f 6f 6b 61   free( p->aLooka
4530: 68 65 61 64 20 29 3b 0a 20 20 66 72 65 65 28 20  head );.  free( 
4540: 70 20 29 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63  p );.}../* Alloc
4550: 61 74 65 20 61 20 6e 65 77 20 61 63 74 74 61 62  ate a new acttab
4560: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 61 63   structure */.ac
4570: 74 74 61 62 20 2a 61 63 74 74 61 62 5f 61 6c 6c  ttab *acttab_all
4580: 6f 63 28 76 6f 69 64 29 7b 0a 20 20 61 63 74 74  oc(void){.  actt
4590: 61 62 20 2a 70 20 3d 20 63 61 6c 6c 6f 63 28 20  ab *p = calloc( 
45a0: 31 2c 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  1, sizeof(*p) );
45b0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
45c0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
45d0: 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c  r,"Unable to all
45e0: 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72  ocate memory for
45f0: 20 61 20 6e 65 77 20 61 63 74 74 61 62 2e 22 29   a new acttab.")
4600: 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
4610: 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30   }.  memset(p, 0
4620: 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
4630: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
4640: 20 41 64 64 20 61 20 6e 65 77 20 61 63 74 69 6f   Add a new actio
4650: 6e 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  n to the current
4660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74   transaction set
4670: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  .  .**.** This r
4680: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
4690: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 6c   once for each l
46a0: 6f 6f 6b 61 68 65 61 64 20 66 6f 72 20 61 20 70  ookahead for a p
46b0: 61 72 74 69 63 75 6c 61 72 0a 2a 2a 20 73 74 61  articular.** sta
46c0: 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 61 63 74 74  te..*/.void actt
46d0: 61 62 5f 61 63 74 69 6f 6e 28 61 63 74 74 61 62  ab_action(acttab
46e0: 20 2a 70 2c 20 69 6e 74 20 6c 6f 6f 6b 61 68 65   *p, int lookahe
46f0: 61 64 2c 20 69 6e 74 20 61 63 74 69 6f 6e 29 7b  ad, int action){
4700: 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61  .  if( p->nLooka
4710: 68 65 61 64 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68  head>=p->nLookah
4720: 65 61 64 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  eadAlloc ){.    
4730: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c  p->nLookaheadAll
4740: 6f 63 20 2b 3d 20 32 35 3b 0a 20 20 20 20 70 2d  oc += 25;.    p-
4750: 3e 61 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 72 65  >aLookahead = re
4760: 61 6c 6c 6f 63 28 20 70 2d 3e 61 4c 6f 6f 6b 61  alloc( p->aLooka
4770: 68 65 61 64 2c 0a 20 20 20 20 20 20 20 20 20 20  head,.          
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4790: 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 6f     sizeof(p->aLo
47a0: 6f 6b 61 68 65 61 64 5b 30 5d 29 2a 70 2d 3e 6e  okahead[0])*p->n
47b0: 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 29  LookaheadAlloc )
47c0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f  ;.    if( p->aLo
47d0: 6f 6b 61 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20  okahead==0 ){.  
47e0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
47f0: 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65  rr,"malloc faile
4800: 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69  d\n");.      exi
4810: 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t(1);.    }.  }.
4820: 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68    if( p->nLookah
4830: 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  ead==0 ){.    p-
4840: 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c  >mxLookahead = l
4850: 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 70 2d  ookahead;.    p-
4860: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c  >mnLookahead = l
4870: 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 70 2d  ookahead;.    p-
4880: 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20 61 63 74 69  >mnAction = acti
4890: 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  on;.  }else{.   
48a0: 20 69 66 28 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68   if( p->mxLookah
48b0: 65 61 64 3c 6c 6f 6f 6b 61 68 65 61 64 20 29 20  ead<lookahead ) 
48c0: 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d  p->mxLookahead =
48d0: 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20   lookahead;.    
48e0: 69 66 28 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  if( p->mnLookahe
48f0: 61 64 3e 6c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a  ad>lookahead ){.
4900: 20 20 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61        p->mnLooka
4910: 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64  head = lookahead
4920: 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 41 63 74  ;.      p->mnAct
4930: 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20  ion = action;.  
4940: 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c 6f    }.  }.  p->aLo
4950: 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b  okahead[p->nLook
4960: 61 68 65 61 64 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ahead].lookahead
4970: 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20   = lookahead;.  
4980: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d  p->aLookahead[p-
4990: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e 61 63 74  >nLookahead].act
49a0: 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20  ion = action;.  
49b0: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 2b 2b 3b  p->nLookahead++;
49c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68  .}../*.** Add th
49d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  e transaction se
49e0: 74 20 62 75 69 6c 74 20 75 70 20 77 69 74 68 20  t built up with 
49f0: 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 61  prior calls to a
4a00: 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 29 0a 2a  cttab_action().*
4a10: 2a 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65  * into the curre
4a20: 6e 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e  nt action table.
4a30: 20 20 54 68 65 6e 20 72 65 73 65 74 20 74 68 65    Then reset the
4a40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74   transaction set
4a50: 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 61 6e 20 65   back.** to an e
4a60: 6d 70 74 79 20 73 65 74 20 69 6e 20 70 72 65 70  mpty set in prep
4a70: 61 72 61 74 69 6f 6e 20 66 6f 72 20 61 20 6e 65  aration for a ne
4a80: 77 20 72 6f 75 6e 64 20 6f 66 20 61 63 74 74 61  w round of actta
4a90: 62 5f 61 63 74 69 6f 6e 28 29 20 63 61 6c 6c 73  b_action() calls
4aa0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
4ab0: 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74  he offset into t
4ac0: 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  he action table 
4ad0: 6f 66 20 74 68 65 20 6e 65 77 20 74 72 61 6e 73  of the new trans
4ae0: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 61  action..*/.int a
4af0: 63 74 74 61 62 5f 69 6e 73 65 72 74 28 61 63 74  cttab_insert(act
4b00: 74 61 62 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  tab *p){.  int i
4b10: 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 61 73 73  , j, k, n;.  ass
4b20: 65 72 74 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  ert( p->nLookahe
4b30: 61 64 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  ad>0 );..  /* Ma
4b40: 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
4b50: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
4b60: 68 6f 6c 64 20 74 68 65 20 65 78 70 61 6e 64 65  hold the expande
4b70: 64 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 0a 20  d action table. 
4b80: 20 2a 2a 20 69 6e 20 74 68 65 20 77 6f 72 73 74   ** in the worst
4b90: 20 63 61 73 65 2e 20 20 54 68 65 20 77 6f 72 73   case.  The wors
4ba0: 74 20 63 61 73 65 20 6f 63 63 75 72 73 20 69 66  t case occurs if
4bb0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
4bc0: 20 73 65 74 0a 20 20 2a 2a 20 6d 75 73 74 20 62   set.  ** must b
4bd0: 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
4be0: 65 20 63 75 72 72 65 6e 74 20 61 63 74 69 6f 6e  e current action
4bf0: 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 6e 20   table.  */.  n 
4c00: 3d 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64  = p->mxLookahead
4c10: 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 2d 3e 6e   + 1;.  if( p->n
4c20: 41 63 74 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70 2d  Action + n >= p-
4c30: 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 29 7b  >nActionAlloc ){
4c40: 0a 20 20 20 20 69 6e 74 20 6f 6c 64 41 6c 6c 6f  .    int oldAllo
4c50: 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c  c = p->nActionAl
4c60: 6c 6f 63 3b 0a 20 20 20 20 70 2d 3e 6e 41 63 74  loc;.    p->nAct
4c70: 69 6f 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41  ionAlloc = p->nA
4c80: 63 74 69 6f 6e 20 2b 20 6e 20 2b 20 70 2d 3e 6e  ction + n + p->n
4c90: 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 2b 20 32 30  ActionAlloc + 20
4ca0: 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e  ;.    p->aAction
4cb0: 20 3d 20 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61   = realloc( p->a
4cc0: 41 63 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  Action,.        
4cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ce0: 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61 41 63 74    sizeof(p->aAct
4cf0: 69 6f 6e 5b 30 5d 29 2a 70 2d 3e 6e 41 63 74 69  ion[0])*p->nActi
4d00: 6f 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66  onAlloc);.    if
4d10: 28 20 70 2d 3e 61 41 63 74 69 6f 6e 3d 3d 30 20  ( p->aAction==0 
4d20: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
4d30: 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20  (stderr,"malloc 
4d40: 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20  failed\n");.    
4d50: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d    exit(1);.    }
4d60: 0a 20 20 20 20 66 6f 72 28 69 3d 6f 6c 64 41 6c  .    for(i=oldAl
4d70: 6c 6f 63 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f  loc; i<p->nActio
4d80: 6e 41 6c 6c 6f 63 3b 20 69 2b 2b 29 7b 0a 20 20  nAlloc; i++){.  
4d90: 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69      p->aAction[i
4da0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 2d 31  ].lookahead = -1
4db0: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 41 63 74 69  ;.      p->aActi
4dc0: 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e 20 3d 20 2d  on[i].action = -
4dd0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
4de0: 2f 2a 20 53 63 61 6e 20 74 68 65 20 65 78 69 73  /* Scan the exis
4df0: 74 69 6e 67 20 61 63 74 69 6f 6e 20 74 61 62 6c  ting action tabl
4e00: 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 6e  e looking for an
4e10: 20 6f 66 66 73 65 74 20 74 68 61 74 20 69 73 20   offset that is 
4e20: 61 20 0a 20 20 2a 2a 20 64 75 70 6c 69 63 61 74  a .  ** duplicat
4e30: 65 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  e of the current
4e40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74   transaction set
4e50: 2e 20 20 46 61 6c 6c 20 6f 75 74 20 6f 66 20 74  .  Fall out of t
4e60: 68 65 20 6c 6f 6f 70 0a 20 20 2a 2a 20 69 66 20  he loop.  ** if 
4e70: 61 6e 64 20 77 68 65 6e 20 74 68 65 20 64 75 70  and when the dup
4e80: 6c 69 63 61 74 65 20 69 73 20 66 6f 75 6e 64 2e  licate is found.
4e90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 20 69 73 20  .  **.  ** i is 
4ea0: 74 68 65 20 69 6e 64 65 78 20 69 6e 20 70 2d 3e  the index in p->
4eb0: 61 41 63 74 69 6f 6e 5b 5d 20 77 68 65 72 65 20  aAction[] where 
4ec0: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 69  p->mnLookahead i
4ed0: 73 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f  s inserted..  */
4ee0: 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 41 63 74  .  for(i=p->nAct
4ef0: 69 6f 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  ion-1; i>=0; i--
4f00: 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41  ){.    if( p->aA
4f10: 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65  ction[i].lookahe
4f20: 61 64 3d 3d 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  ad==p->mnLookahe
4f30: 61 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  ad ){.      /* A
4f40: 6c 6c 20 6c 6f 6f 6b 61 68 65 61 64 73 20 61 6e  ll lookaheads an
4f50: 64 20 61 63 74 69 6f 6e 73 20 69 6e 20 74 68 65  d actions in the
4f60: 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72   aLookahead[] tr
4f70: 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20  ansaction.      
4f80: 2a 2a 20 6d 75 73 74 20 6d 61 74 63 68 20 61 67  ** must match ag
4f90: 61 69 6e 73 74 20 74 68 65 20 63 61 6e 64 69 64  ainst the candid
4fa0: 61 74 65 20 61 41 63 74 69 6f 6e 5b 69 5d 20 65  ate aAction[i] e
4fb0: 6e 74 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ntry. */.      i
4fc0: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d  f( p->aAction[i]
4fd0: 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 6d 6e 41 63  .action!=p->mnAc
4fe0: 74 69 6f 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b  tion ) continue;
4ff0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
5000: 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b  j<p->nLookahead;
5010: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b   j++){.        k
5020: 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64   = p->aLookahead
5030: 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20  [j].lookahead - 
5040: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b  p->mnLookahead +
5050: 20 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   i;.        if( 
5060: 6b 3c 30 20 7c 7c 20 6b 3e 3d 70 2d 3e 6e 41 63  k<0 || k>=p->nAc
5070: 74 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20  tion ) break;.  
5080: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f        if( p->aLo
5090: 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61  okahead[j].looka
50a0: 68 65 61 64 21 3d 70 2d 3e 61 41 63 74 69 6f 6e  head!=p->aAction
50b0: 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 29 20  [k].lookahead ) 
50c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69  break;.        i
50d0: 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  f( p->aLookahead
50e0: 5b 6a 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 61  [j].action!=p->a
50f0: 41 63 74 69 6f 6e 5b 6b 5d 2e 61 63 74 69 6f 6e  Action[k].action
5100: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
5110: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d  }.      if( j<p-
5120: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f  >nLookahead ) co
5130: 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 2f  ntinue;..      /
5140: 2a 20 4e 6f 20 70 6f 73 73 69 62 6c 65 20 6c 6f  * No possible lo
5150: 6f 6b 61 68 65 61 64 20 76 61 6c 75 65 20 74 68  okahead value th
5160: 61 74 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  at is not in the
5170: 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 0a 20 20   aLookahead[].  
5180: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
5190: 6f 6e 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f  on is allowed to
51a0: 20 6d 61 74 63 68 20 61 41 63 74 69 6f 6e 5b 69   match aAction[i
51b0: 5d 20 2a 2f 0a 20 20 20 20 20 20 6e 20 3d 20 30  ] */.      n = 0
51c0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
51d0: 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a   j<p->nAction; j
51e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
51f0: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c   p->aAction[j].l
5200: 6f 6f 6b 61 68 65 61 64 3c 30 20 29 20 63 6f 6e  ookahead<0 ) con
5210: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
5220: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d  f( p->aAction[j]
5230: 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d  .lookahead==j+p-
5240: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d 69 20 29  >mnLookahead-i )
5250: 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   n++;.      }.  
5260: 20 20 20 20 69 66 28 20 6e 3d 3d 70 2d 3e 6e 4c      if( n==p->nL
5270: 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20  ookahead ){.    
5280: 20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 41      break;  /* A
5290: 6e 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73  n exact match is
52a0: 20 66 6f 75 6e 64 20 61 74 20 6f 66 66 73 65 74   found at offset
52b0: 20 69 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20   i */.      }.  
52c0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
52d0: 20 6e 6f 20 65 78 69 73 74 69 6e 67 20 6f 66 66   no existing off
52e0: 73 65 74 73 20 65 78 61 63 74 6c 79 20 6d 61 74  sets exactly mat
52f0: 63 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ch the current t
5300: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 66 69 6e 64  ransaction, find
5310: 20 61 6e 0a 20 20 2a 2a 20 61 6e 20 65 6d 70 74   an.  ** an empt
5320: 79 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  y offset in the 
5330: 61 41 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20  aAction[] table 
5340: 69 6e 20 77 68 69 63 68 20 77 65 20 63 61 6e 20  in which we can 
5350: 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 61 4c 6f  add the.  ** aLo
5360: 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61 6e 73 61  okahead[] transa
5370: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  ction..  */.  if
5380: 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ( i<0 ){.    /* 
5390: 4c 6f 6f 6b 20 66 6f 72 20 68 6f 6c 65 73 20 69  Look for holes i
53a0: 6e 20 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20  n the aAction[] 
53b0: 74 61 62 6c 65 20 74 68 61 74 20 66 69 74 20 74  table that fit t
53c0: 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a  he current.    *
53d0: 2a 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74  * aLookahead[] t
53e0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 4c 65 61  ransaction.  Lea
53f0: 76 65 20 69 20 73 65 74 20 74 6f 20 74 68 65 20  ve i set to the 
5400: 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 68 6f  offset of the ho
5410: 6c 65 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f  le..    ** If no
5420: 20 68 6f 6c 65 73 20 61 72 65 20 66 6f 75 6e 64   holes are found
5430: 2c 20 69 20 69 73 20 6c 65 66 74 20 61 74 20 70  , i is left at p
5440: 2d 3e 6e 41 63 74 69 6f 6e 2c 20 77 68 69 63 68  ->nAction, which
5450: 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 20 20 2a   means the.    *
5460: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
5470: 6c 6c 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20  ll be appended. 
5480: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
5490: 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f  i<p->nActionAllo
54a0: 63 20 2d 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65  c - p->mxLookahe
54b0: 61 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ad; i++){.      
54c0: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69  if( p->aAction[i
54d0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29 7b  ].lookahead<0 ){
54e0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
54f0: 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  ; j<p->nLookahea
5500: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  d; j++){.       
5510: 20 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61     k = p->aLooka
5520: 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61  head[j].lookahea
5530: 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  d - p->mnLookahe
5540: 61 64 20 2b 20 69 3b 0a 20 20 20 20 20 20 20 20  ad + i;.        
5550: 20 20 69 66 28 20 6b 3c 30 20 29 20 62 72 65 61    if( k<0 ) brea
5560: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  k;.          if(
5570: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 6c   p->aAction[k].l
5580: 6f 6f 6b 61 68 65 61 64 3e 3d 30 20 29 20 62 72  ookahead>=0 ) br
5590: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
55a0: 20 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e         if( j<p->
55b0: 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e  nLookahead ) con
55c0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66  tinue;.        f
55d0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63  or(j=0; j<p->nAc
55e0: 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  tion; j++){.    
55f0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63        if( p->aAc
5600: 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[j].lookahea
5610: 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68  d==j+p->mnLookah
5620: 65 61 64 2d 69 20 29 20 62 72 65 61 6b 3b 0a 20  ead-i ) break;. 
5630: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5640: 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 41 63 74 69   if( j==p->nActi
5650: 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  on ){.          
5660: 62 72 65 61 6b 3b 20 20 2f 2a 20 46 69 74 73 20  break;  /* Fits 
5670: 69 6e 20 65 6d 70 74 79 20 73 6c 6f 74 73 20 2a  in empty slots *
5680: 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
5690: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
56a0: 2f 2a 20 49 6e 73 65 72 74 20 74 72 61 6e 73 61  /* Insert transa
56b0: 63 74 69 6f 6e 20 73 65 74 20 61 74 20 69 6e 64  ction set at ind
56c0: 65 78 20 69 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a  ex i. */.  for(j
56d0: 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68  =0; j<p->nLookah
56e0: 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6b  ead; j++){.    k
56f0: 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64   = p->aLookahead
5700: 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20  [j].lookahead - 
5710: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b  p->mnLookahead +
5720: 20 69 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74 69   i;.    p->aActi
5730: 6f 6e 5b 6b 5d 20 3d 20 70 2d 3e 61 4c 6f 6f 6b  on[k] = p->aLook
5740: 61 68 65 61 64 5b 6a 5d 3b 0a 20 20 20 20 69 66  ahead[j];.    if
5750: 28 20 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20  ( k>=p->nAction 
5760: 29 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 3d 20 6b  ) p->nAction = k
5770: 2b 31 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c 6f  +1;.  }.  p->nLo
5780: 6f 6b 61 68 65 61 64 20 3d 20 30 3b 0a 0a 20 20  okahead = 0;..  
5790: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66  /* Return the of
57a0: 66 73 65 74 20 74 68 61 74 20 69 73 20 61 64 64  fset that is add
57b0: 65 64 20 74 6f 20 74 68 65 20 6c 6f 6f 6b 61 68  ed to the lookah
57c0: 65 61 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ead in order to 
57d0: 67 65 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64  get the.  ** ind
57e0: 65 78 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f  ex into yy_actio
57f0: 6e 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20  n of the action 
5800: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 69 20 2d 20  */.  return i - 
5810: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b 0a  p->mnLookahead;.
5820: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
5830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
5840: 74 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e  the file "build.
5850: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
5860: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5870: 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  /./*.** Routines
5880: 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e   to construction
5890: 20 74 68 65 20 66 69 6e 69 74 65 20 73 74 61 74   the finite stat
58a0: 65 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 74 68  e machine for th
58b0: 65 20 4c 45 4d 4f 4e 0a 2a 2a 20 70 61 72 73 65  e LEMON.** parse
58c0: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
58d0: 0a 2f 2a 20 46 69 6e 64 20 61 20 70 72 65 63 65  ./* Find a prece
58e0: 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6f 66 20  dence symbol of 
58f0: 65 76 65 72 79 20 72 75 6c 65 20 69 6e 20 74 68  every rule in th
5900: 65 20 67 72 61 6d 6d 61 72 2e 0a 2a 2a 20 0a 2a  e grammar..** .*
5910: 2a 20 54 68 6f 73 65 20 72 75 6c 65 73 20 77 68  * Those rules wh
5920: 69 63 68 20 68 61 76 65 20 61 20 70 72 65 63 65  ich have a prece
5930: 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20 63 6f 64  dence symbol cod
5940: 65 64 20 69 6e 20 74 68 65 20 69 6e 70 75 74 0a  ed in the input.
5950: 2a 2a 20 67 72 61 6d 6d 61 72 20 75 73 69 6e 67  ** grammar using
5960: 20 74 68 65 20 22 5b 73 79 6d 62 6f 6c 5d 22 20   the "[symbol]" 
5970: 63 6f 6e 73 74 72 75 63 74 20 77 69 6c 6c 20 61  construct will a
5980: 6c 72 65 61 64 79 20 68 61 76 65 20 74 68 65 0a  lready have the.
5990: 2a 2a 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 66  ** rp->precsym f
59a0: 69 65 6c 64 20 66 69 6c 6c 65 64 2e 20 20 4f 74  ield filled.  Ot
59b0: 68 65 72 20 72 75 6c 65 73 20 74 61 6b 65 20 61  her rules take a
59c0: 73 20 74 68 65 69 72 20 70 72 65 63 65 64 65 6e  s their preceden
59d0: 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 74 68 65  ce.** symbol the
59e0: 20 66 69 72 73 74 20 52 48 53 20 73 79 6d 62 6f   first RHS symbo
59f0: 6c 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64  l with a defined
5a00: 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20 49 66   precedence.  If
5a10: 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f   there.** are no
5a20: 74 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 77 69  t RHS symbols wi
5a30: 74 68 20 61 20 64 65 66 69 6e 65 64 20 70 72 65  th a defined pre
5a40: 63 65 64 65 6e 63 65 2c 20 74 68 65 20 70 72 65  cedence, the pre
5a50: 63 65 64 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f  cedence.** symbo
5a60: 6c 20 66 69 65 6c 64 20 69 73 20 6c 65 66 74 20  l field is left 
5a70: 62 6c 61 6e 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 46  blank..*/.void F
5a80: 69 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63  indRulePrecedenc
5a90: 65 73 28 78 70 29 0a 73 74 72 75 63 74 20 6c 65  es(xp).struct le
5aa0: 6d 6f 6e 20 2a 78 70 3b 0a 7b 0a 20 20 73 74 72  mon *xp;.{.  str
5ab0: 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
5ac0: 66 6f 72 28 72 70 3d 78 70 2d 3e 72 75 6c 65 3b  for(rp=xp->rule;
5ad0: 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
5ae0: 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 70  ){.    if( rp->p
5af0: 72 65 63 73 79 6d 3d 3d 30 20 29 7b 0a 20 20 20  recsym==0 ){.   
5b00: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
5b10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
5b20: 2d 3e 6e 72 68 73 20 26 26 20 72 70 2d 3e 70 72  ->nrhs && rp->pr
5b30: 65 63 73 79 6d 3d 3d 30 3b 20 69 2b 2b 29 7b 0a  ecsym==0; i++){.
5b40: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
5b50: 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e  ymbol *sp = rp->
5b60: 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  rhs[i];.        
5b70: 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55  if( sp->type==MU
5b80: 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
5b90: 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30           for(j=0
5ba0: 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b  ; j<sp->nsubsym;
5bb0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
5bc0: 20 20 20 69 66 28 20 73 70 2d 3e 73 75 62 73 79     if( sp->subsy
5bd0: 6d 5b 6a 5d 2d 3e 70 72 65 63 3e 3d 30 20 29 7b  m[j]->prec>=0 ){
5be0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
5bf0: 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 73 70 2d  p->precsym = sp-
5c00: 3e 73 75 62 73 79 6d 5b 6a 5d 3b 0a 20 20 20 20  >subsym[j];.    
5c10: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5c20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
5c30: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5c40: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d     }else if( sp-
5c50: 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20  >prec>=0 ){.    
5c60: 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79        rp->precsy
5c70: 6d 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a  m = rp->rhs[i];.
5c80: 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .}.      }.    }
5c90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
5ca0: 0a 0a 2f 2a 20 46 69 6e 64 20 61 6c 6c 20 6e 6f  ../* Find all no
5cb0: 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68 69 63 68  nterminals which
5cc0: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 74   will generate t
5cd0: 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  he empty string.
5ce0: 0a 2a 2a 20 54 68 65 6e 20 67 6f 20 62 61 63 6b  .** Then go back
5cf0: 20 61 6e 64 20 63 6f 6d 70 75 74 65 20 74 68 65   and compute the
5d00: 20 66 69 72 73 74 20 73 65 74 73 20 6f 66 20 65   first sets of e
5d10: 76 65 72 79 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  very nonterminal
5d20: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 73  ..** The first s
5d30: 65 74 20 69 73 20 74 68 65 20 73 65 74 20 6f 66  et is the set of
5d40: 20 61 6c 6c 20 74 65 72 6d 69 6e 61 6c 20 73 79   all terminal sy
5d50: 6d 62 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20  mbols which can 
5d60: 62 65 67 69 6e 0a 2a 2a 20 61 20 73 74 72 69 6e  begin.** a strin
5d70: 67 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  g generated by t
5d80: 68 61 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e  hat nonterminal.
5d90: 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46 69 72  .*/.void FindFir
5da0: 73 74 53 65 74 73 28 6c 65 6d 70 29 0a 73 74 72  stSets(lemp).str
5db0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
5dc0: 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .{.  int i, j;. 
5dd0: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
5de0: 3b 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73  ;.  int progress
5df0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
5e00: 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
5e10: 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73  ++){.    lemp->s
5e20: 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6c 61 6d 62 64  ymbols[i]->lambd
5e30: 61 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b  a = LEMON_FALSE;
5e40: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 6c 65 6d  .  }.  for(i=lem
5e50: 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 3c  p->nterminal; i<
5e60: 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
5e70: 2b 2b 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73  ++){.    lemp->s
5e80: 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 66 69 72 73 74  ymbols[i]->first
5e90: 73 65 74 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a  set = SetNew();.
5ea0: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20    }..  /* First 
5eb0: 63 6f 6d 70 75 74 65 20 61 6c 6c 20 6c 61 6d 62  compute all lamb
5ec0: 64 61 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20  das */.  do{.   
5ed0: 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20   progress = 0;. 
5ee0: 20 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e     for(rp=lemp->
5ef0: 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
5f00: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
5f10: 28 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64  ( rp->lhs->lambd
5f20: 61 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  a ) continue;.  
5f30: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
5f40: 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
5f50: 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
5f60: 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e  ymbol *sp = rp->
5f70: 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  rhs[i];.        
5f80: 20 69 66 28 20 73 70 2d 3e 74 79 70 65 21 3d 54   if( sp->type!=T
5f90: 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 6c  ERMINAL || sp->l
5fa0: 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c  ambda==LEMON_FAL
5fb0: 53 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  SE ) break;.    
5fc0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d    }.      if( i=
5fd0: 3d 72 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20  =rp->nrhs ){.   
5fe0: 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61       rp->lhs->la
5ff0: 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55  mbda = LEMON_TRU
6000: 45 3b 0a 20 20 20 20 20 20 20 20 70 72 6f 67 72  E;.        progr
6010: 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ess = 1;.      }
6020: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
6030: 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 0a 20 20   progress );..  
6040: 2f 2a 20 4e 6f 77 20 63 6f 6d 70 75 74 65 20 61  /* Now compute a
6050: 6c 6c 20 66 69 72 73 74 20 73 65 74 73 20 2a 2f  ll first sets */
6060: 0a 20 20 64 6f 7b 0a 20 20 20 20 73 74 72 75 63  .  do{.    struc
6070: 74 20 73 79 6d 62 6f 6c 20 2a 73 31 2c 20 2a 73  t symbol *s1, *s
6080: 32 3b 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20  2;.    progress 
6090: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 72 70 3d  = 0;.    for(rp=
60a0: 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
60b0: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
60c0: 20 20 20 20 73 31 20 3d 20 72 70 2d 3e 6c 68 73      s1 = rp->lhs
60d0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
60e0: 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
60f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 32 20 3d 20  ){.        s2 = 
6100: 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20  rp->rhs[i];.    
6110: 20 20 20 20 69 66 28 20 73 32 2d 3e 74 79 70 65      if( s2->type
6120: 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  ==TERMINAL ){.  
6130: 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73          progress
6140: 20 2b 3d 20 53 65 74 41 64 64 28 73 31 2d 3e 66   += SetAdd(s1->f
6150: 69 72 73 74 73 65 74 2c 73 32 2d 3e 69 6e 64 65  irstset,s2->inde
6160: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  x);.          br
6170: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
6180: 73 65 20 69 66 28 20 73 32 2d 3e 74 79 70 65 3d  se if( s2->type=
6190: 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
61a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
61b0: 6a 3d 30 3b 20 6a 3c 73 32 2d 3e 6e 73 75 62 73  j=0; j<s2->nsubs
61c0: 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ym; j++){.      
61d0: 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b        progress +
61e0: 3d 20 53 65 74 41 64 64 28 73 31 2d 3e 66 69 72  = SetAdd(s1->fir
61f0: 73 74 73 65 74 2c 73 32 2d 3e 73 75 62 73 79 6d  stset,s2->subsym
6200: 5b 6a 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  [j]->index);.   
6210: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6220: 20 20 20 62 72 65 61 6b 3b 0a 09 7d 65 6c 73 65     break;..}else
6230: 20 69 66 28 20 73 31 3d 3d 73 32 20 29 7b 0a 20   if( s1==s2 ){. 
6240: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 31 2d           if( s1-
6250: 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46  >lambda==LEMON_F
6260: 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 09 7d  ALSE ) break;..}
6270: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6280: 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 55  progress += SetU
6290: 6e 69 6f 6e 28 73 31 2d 3e 66 69 72 73 74 73 65  nion(s1->firstse
62a0: 74 2c 73 32 2d 3e 66 69 72 73 74 73 65 74 29 3b  t,s2->firstset);
62b0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
62c0: 32 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e  2->lambda==LEMON
62d0: 5f 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a  _FALSE ) break;.
62e0: 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .}.      }.    }
62f0: 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72  .  }while( progr
6300: 65 73 73 20 29 3b 0a 20 20 72 65 74 75 72 6e 3b  ess );.  return;
6310: 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61  .}../* Compute a
6320: 6c 6c 20 4c 52 28 30 29 20 73 74 61 74 65 73 20  ll LR(0) states 
6330: 66 6f 72 20 74 68 65 20 67 72 61 6d 6d 61 72 2e  for the grammar.
6340: 20 20 4c 69 6e 6b 73 0a 2a 2a 20 61 72 65 20 61    Links.** are a
6350: 64 64 65 64 20 74 6f 20 62 65 74 77 65 65 6e 20  dded to between 
6360: 73 6f 6d 65 20 73 74 61 74 65 73 20 73 6f 20 74  some states so t
6370: 68 61 74 20 74 68 65 20 4c 52 28 31 29 20 66 6f  hat the LR(1) fo
6380: 6c 6c 6f 77 20 73 65 74 73 0a 2a 2a 20 63 61 6e  llow sets.** can
6390: 20 62 65 20 63 6f 6d 70 75 74 65 64 20 6c 61 74   be computed lat
63a0: 65 72 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 73  er..*/.PRIVATE s
63b0: 74 72 75 63 74 20 73 74 61 74 65 20 2a 67 65 74  truct state *get
63c0: 73 74 61 74 65 28 2f 2a 20 73 74 72 75 63 74 20  state(/* struct 
63d0: 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 20 20 2f 2a  lemon * */);  /*
63e0: 20 66 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   forward referen
63f0: 63 65 20 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 53  ce */.void FindS
6400: 74 61 74 65 73 28 6c 65 6d 70 29 0a 73 74 72 75  tates(lemp).stru
6410: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
6420: 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
6430: 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63 74 20  l *sp;.  struct 
6440: 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 43 6f 6e  rule *rp;..  Con
6450: 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 29 3b 0a  figlist_init();.
6460: 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73  .  /* Find the s
6470: 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20  tart symbol */. 
6480: 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74   if( lemp->start
6490: 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79 6d   ){.    sp = Sym
64a0: 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73  bol_find(lemp->s
64b0: 74 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20 73  tart);.    if( s
64c0: 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 72  p==0 ){.      Er
64d0: 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
64e0: 65 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73 70  ename,0,."The sp
64f0: 65 63 69 66 69 65 64 20 73 74 61 72 74 20 73 79  ecified start sy
6500: 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 69 73 20 6e  mbol \"%s\" is n
6510: 6f 74 20 5c 0a 69 6e 20 61 20 6e 6f 6e 74 65 72  ot \.in a nonter
6520: 6d 69 6e 61 6c 20 6f 66 20 74 68 65 20 67 72 61  minal of the gra
6530: 6d 6d 61 72 2e 20 20 5c 22 25 73 5c 22 20 77 69  mmar.  \"%s\" wi
6540: 6c 6c 20 62 65 20 75 73 65 64 20 61 73 20 74 68  ll be used as th
6550: 65 20 73 74 61 72 74 20 5c 0a 73 79 6d 62 6f 6c  e start \.symbol
6560: 20 69 6e 73 74 65 61 64 2e 22 2c 6c 65 6d 70 2d   instead.",lemp-
6570: 3e 73 74 61 72 74 2c 6c 65 6d 70 2d 3e 72 75 6c  >start,lemp->rul
6580: 65 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20  e->lhs->name);. 
6590: 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72       lemp->error
65a0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 70 20  cnt++;.      sp 
65b0: 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68  = lemp->rule->lh
65c0: 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  s;.    }.  }else
65d0: 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d  {.    sp = lemp-
65e0: 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a  >rule->lhs;.  }.
65f0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
6600: 74 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c  the start symbol
6610: 20 64 6f 65 73 6e 27 74 20 6f 63 63 75 72 20 6f   doesn't occur o
6620: 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64  n the right-hand
6630: 20 73 69 64 65 20 6f 66 0a 20 20 2a 2a 20 61 6e   side of.  ** an
6640: 79 20 72 75 6c 65 2e 20 20 52 65 70 6f 72 74 20  y rule.  Report 
6650: 61 6e 20 65 72 72 6f 72 20 69 66 20 69 74 20 64  an error if it d
6660: 6f 65 73 2e 20 20 28 59 41 43 43 20 77 6f 75 6c  oes.  (YACC woul
6670: 64 20 67 65 6e 65 72 61 74 65 20 61 20 6e 65 77  d generate a new
6680: 0a 20 20 2a 2a 20 73 74 61 72 74 20 73 79 6d 62  .  ** start symb
6690: 6f 6c 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ol in this case.
66a0: 29 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65  ) */.  for(rp=le
66b0: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
66c0: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
66d0: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
66e0: 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
66f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
6700: 72 70 2d 3e 72 68 73 5b 69 5d 3d 3d 73 70 20 29  rp->rhs[i]==sp )
6710: 7b 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20  {   /* FIX ME:  
6720: 44 65 61 6c 20 77 69 74 68 20 6d 75 6c 74 69 74  Deal with multit
6730: 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 20 20  erminals */.    
6740: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
6750: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22  p->filename,0,."
6760: 54 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c  The start symbol
6770: 20 5c 22 25 73 5c 22 20 6f 63 63 75 72 73 20 6f   \"%s\" occurs o
6780: 6e 20 74 68 65 20 5c 0a 72 69 67 68 74 2d 68 61  n the \.right-ha
6790: 6e 64 20 73 69 64 65 20 6f 66 20 61 20 72 75 6c  nd side of a rul
67a0: 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 72 65 73  e. This will res
67b0: 75 6c 74 20 69 6e 20 61 20 70 61 72 73 65 72 20  ult in a parser 
67c0: 77 68 69 63 68 20 5c 0a 64 6f 65 73 20 6e 6f 74  which \.does not
67d0: 20 77 6f 72 6b 20 70 72 6f 70 65 72 6c 79 2e 22   work properly."
67e0: 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  ,sp->name);.    
67f0: 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
6800: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nt++;.      }.  
6810: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
6820: 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  e basis configur
6830: 61 74 69 6f 6e 20 73 65 74 20 66 6f 72 20 74 68  ation set for th
6840: 65 20 66 69 72 73 74 20 73 74 61 74 65 0a 20 20  e first state.  
6850: 2a 2a 20 69 73 20 61 6c 6c 20 72 75 6c 65 73 20  ** is all rules 
6860: 77 68 69 63 68 20 68 61 76 65 20 74 68 65 20 73  which have the s
6870: 74 61 72 74 20 73 79 6d 62 6f 6c 20 61 73 20 74  tart symbol as t
6880: 68 65 69 72 0a 20 20 2a 2a 20 6c 65 66 74 2d 68  heir.  ** left-h
6890: 61 6e 64 20 73 69 64 65 20 2a 2f 0a 20 20 66 6f  and side */.  fo
68a0: 72 28 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 72  r(rp=sp->rule; r
68b0: 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 6c 68  p; rp=rp->nextlh
68c0: 73 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 63  s){.    struct c
68d0: 6f 6e 66 69 67 20 2a 6e 65 77 63 66 70 3b 0a 20  onfig *newcfp;. 
68e0: 20 20 20 72 70 2d 3e 6c 68 73 53 74 61 72 74 20     rp->lhsStart 
68f0: 3d 20 31 3b 0a 20 20 20 20 6e 65 77 63 66 70 20  = 1;.    newcfp 
6900: 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64  = Configlist_add
6910: 62 61 73 69 73 28 72 70 2c 30 29 3b 0a 20 20 20  basis(rp,0);.   
6920: 20 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e   SetAdd(newcfp->
6930: 66 77 73 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  fws,0);.  }..  /
6940: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66 69  * Compute the fi
6950: 72 73 74 20 73 74 61 74 65 2e 20 20 41 6c 6c 20  rst state.  All 
6960: 6f 74 68 65 72 20 73 74 61 74 65 73 20 77 69 6c  other states wil
6970: 6c 20 62 65 0a 20 20 2a 2a 20 63 6f 6d 70 75 74  l be.  ** comput
6980: 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
6990: 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 70   during the comp
69a0: 75 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  utation of the f
69b0: 69 72 73 74 20 6f 6e 65 2e 0a 20 20 2a 2a 20 54  irst one..  ** T
69c0: 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e  he returned poin
69d0: 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  ter to the first
69e0: 20 73 74 61 74 65 20 69 73 20 6e 6f 74 20 75 73   state is not us
69f0: 65 64 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67  ed. */.  (void)g
6a00: 65 74 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 20  etstate(lemp);. 
6a10: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52   return;.}../* R
6a20: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
6a30: 74 6f 20 61 20 73 74 61 74 65 20 77 68 69 63 68  to a state which
6a40: 20 69 73 20 64 65 73 63 72 69 62 65 64 20 62 79   is described by
6a50: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
6a60: 6f 6e 0a 2a 2a 20 6c 69 73 74 20 77 68 69 63 68  on.** list which
6a70: 20 68 61 73 20 62 65 65 6e 20 62 75 69 6c 74 20   has been built 
6a80: 66 72 6f 6d 20 63 61 6c 6c 73 20 74 6f 20 43 6f  from calls to Co
6a90: 6e 66 69 67 6c 69 73 74 5f 61 64 64 2e 0a 2a 2f  nfiglist_add..*/
6aa0: 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 62 75  .PRIVATE void bu
6ab0: 69 6c 64 73 68 69 66 74 73 28 2f 2a 20 73 74 72  ildshifts(/* str
6ac0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20 73 74 72  uct lemon *, str
6ad0: 75 63 74 20 73 74 61 74 65 20 2a 20 2a 2f 29 3b  uct state * */);
6ae0: 20 2f 2a 20 46 6f 72 77 64 20 72 65 66 20 2a 2f   /* Forwd ref */
6af0: 0a 50 52 49 56 41 54 45 20 73 74 72 75 63 74 20  .PRIVATE struct 
6b00: 73 74 61 74 65 20 2a 67 65 74 73 74 61 74 65 28  state *getstate(
6b10: 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
6b20: 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74  on *lemp;.{.  st
6b30: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
6b40: 2c 20 2a 62 70 3b 0a 20 20 73 74 72 75 63 74 20  , *bp;.  struct 
6b50: 73 74 61 74 65 20 2a 73 74 70 3b 0a 0a 20 20 2f  state *stp;..  /
6b60: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 73 6f  * Extract the so
6b70: 72 74 65 64 20 62 61 73 69 73 20 6f 66 20 74 68  rted basis of th
6b80: 65 20 6e 65 77 20 73 74 61 74 65 2e 20 20 54 68  e new state.  Th
6b90: 65 20 62 61 73 69 73 20 77 61 73 20 63 6f 6e 73  e basis was cons
6ba0: 74 72 75 63 74 65 64 0a 20 20 2a 2a 20 62 79 20  tructed.  ** by 
6bb0: 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 22  prior calls to "
6bc0: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61  Configlist_addba
6bd0: 73 69 73 28 29 22 2e 20 2a 2f 0a 20 20 43 6f 6e  sis()". */.  Con
6be0: 66 69 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69  figlist_sortbasi
6bf0: 73 28 29 3b 0a 20 20 62 70 20 3d 20 43 6f 6e 66  s();.  bp = Conf
6c00: 69 67 6c 69 73 74 5f 62 61 73 69 73 28 29 3b 0a  iglist_basis();.
6c10: 0a 20 20 2f 2a 20 47 65 74 20 61 20 73 74 61 74  .  /* Get a stat
6c20: 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
6c30: 62 61 73 69 73 20 2a 2f 0a 20 20 73 74 70 20 3d  basis */.  stp =
6c40: 20 53 74 61 74 65 5f 66 69 6e 64 28 62 70 29 3b   State_find(bp);
6c50: 0a 20 20 69 66 28 20 73 74 70 20 29 7b 0a 20 20  .  if( stp ){.  
6c60: 20 20 2f 2a 20 41 20 73 74 61 74 65 20 77 69 74    /* A state wit
6c70: 68 20 74 68 65 20 73 61 6d 65 20 62 61 73 69 73  h the same basis
6c80: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 21   already exists!
6c90: 20 20 43 6f 70 79 20 61 6c 6c 20 74 68 65 20 66    Copy all the f
6ca0: 6f 6c 6c 6f 77 2d 73 65 74 0a 20 20 20 20 2a 2a  ollow-set.    **
6cb0: 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e   propagation lin
6cc0: 6b 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74  ks from the stat
6cd0: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
6ce0: 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 0a 20 20  tion into the.  
6cf0: 20 20 2a 2a 20 70 72 65 65 78 69 73 74 69 6e 67    ** preexisting
6d00: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 72 65 74   state, then ret
6d10: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
6d20: 20 74 68 65 20 70 72 65 65 78 69 73 74 69 6e 67   the preexisting
6d30: 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74   state */.    st
6d40: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 78 2c 20  ruct config *x, 
6d50: 2a 79 3b 0a 20 20 20 20 66 6f 72 28 78 3d 62 70  *y;.    for(x=bp
6d60: 2c 20 79 3d 73 74 70 2d 3e 62 70 3b 20 78 20 26  , y=stp->bp; x &
6d70: 26 20 79 3b 20 78 3d 78 2d 3e 62 70 2c 20 79 3d  & y; x=x->bp, y=
6d80: 79 2d 3e 62 70 29 7b 0a 20 20 20 20 20 20 50 6c  y->bp){.      Pl
6d90: 69 6e 6b 5f 63 6f 70 79 28 26 79 2d 3e 62 70 6c  ink_copy(&y->bpl
6da0: 70 2c 78 2d 3e 62 70 6c 70 29 3b 0a 20 20 20 20  p,x->bplp);.    
6db0: 20 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 78    Plink_delete(x
6dc0: 2d 3e 66 70 6c 70 29 3b 0a 20 20 20 20 20 20 78  ->fplp);.      x
6dd0: 2d 3e 66 70 6c 70 20 3d 20 78 2d 3e 62 70 6c 70  ->fplp = x->bplp
6de0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
6df0: 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74  cfp = Configlist
6e00: 5f 72 65 74 75 72 6e 28 29 3b 0a 20 20 20 20 43  _return();.    C
6e10: 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28 63 66  onfiglist_eat(cf
6e20: 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
6e30: 20 2f 2a 20 54 68 69 73 20 72 65 61 6c 6c 79 20   /* This really 
6e40: 69 73 20 61 20 6e 65 77 20 73 74 61 74 65 2e 20  is a new state. 
6e50: 20 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c 20 74   Construct all t
6e60: 68 65 20 64 65 74 61 69 6c 73 20 2a 2f 0a 20 20  he details */.  
6e70: 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f    Configlist_clo
6e80: 73 75 72 65 28 6c 65 6d 70 29 3b 20 20 20 20 2f  sure(lemp);    /
6e90: 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f  * Compute the co
6ea0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73  nfiguration clos
6eb0: 75 72 65 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69  ure */.    Confi
6ec0: 67 6c 69 73 74 5f 73 6f 72 74 28 29 3b 20 20 20  glist_sort();   
6ed0: 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 20          /* Sort 
6ee0: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
6ef0: 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20  n closure */.   
6f00: 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73   cfp = Configlis
6f10: 74 5f 72 65 74 75 72 6e 28 29 3b 20 20 20 2f 2a  t_return();   /*
6f20: 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74   Get a pointer t
6f30: 6f 20 74 68 65 20 63 6f 6e 66 69 67 20 6c 69 73  o the config lis
6f40: 74 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20 53  t */.    stp = S
6f50: 74 61 74 65 5f 6e 65 77 28 29 3b 20 20 20 20 20  tate_new();     
6f60: 20 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73        /* A new s
6f70: 74 61 74 65 20 73 74 72 75 63 74 75 72 65 20 2a  tate structure *
6f80: 2f 0a 20 20 20 20 4d 65 6d 6f 72 79 43 68 65 63  /.    MemoryChec
6f90: 6b 28 73 74 70 29 3b 0a 20 20 20 20 73 74 70 2d  k(stp);.    stp-
6fa0: 3e 62 70 20 3d 20 62 70 3b 20 20 20 20 20 20 20  >bp = bp;       
6fb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65           /* Reme
6fc0: 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69 67 75  mber the configu
6fd0: 72 61 74 69 6f 6e 20 62 61 73 69 73 20 2a 2f 0a  ration basis */.
6fe0: 20 20 20 20 73 74 70 2d 3e 63 66 70 20 3d 20 63      stp->cfp = c
6ff0: 66 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fp;             
7000: 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65   /* Remember the
7010: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   configuration c
7020: 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 73 74  losure */.    st
7030: 70 2d 3e 73 74 61 74 65 6e 75 6d 20 3d 20 6c 65  p->statenum = le
7040: 6d 70 2d 3e 6e 73 74 61 74 65 2b 2b 3b 20 2f 2a  mp->nstate++; /*
7050: 20 45 76 65 72 79 20 73 74 61 74 65 20 67 65 74   Every state get
7060: 73 20 61 20 73 65 71 75 65 6e 63 65 20 6e 75 6d  s a sequence num
7070: 62 65 72 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e  ber */.    stp->
7080: 61 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ap = 0;         
7090: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 61 63          /* No ac
70a0: 74 69 6f 6e 73 2c 20 79 65 74 2e 20 2a 2f 0a 20  tions, yet. */. 
70b0: 20 20 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28     State_insert(
70c0: 73 74 70 2c 73 74 70 2d 3e 62 70 29 3b 20 20 20  stp,stp->bp);   
70d0: 2f 2a 20 41 64 64 20 74 6f 20 74 68 65 20 73 74  /* Add to the st
70e0: 61 74 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ate table */.   
70f0: 20 62 75 69 6c 64 73 68 69 66 74 73 28 6c 65 6d   buildshifts(lem
7100: 70 2c 73 74 70 29 3b 20 20 20 20 20 20 20 2f 2a  p,stp);       /*
7110: 20 52 65 63 75 72 73 69 76 65 6c 79 20 63 6f 6d   Recursively com
7120: 70 75 74 65 20 73 75 63 63 65 73 73 6f 72 20 73  pute successor s
7130: 74 61 74 65 73 20 2a 2f 0a 20 20 7d 0a 20 20 72  tates */.  }.  r
7140: 65 74 75 72 6e 20 73 74 70 3b 0a 7d 0a 0a 2f 2a  eturn stp;.}../*
7150: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
7160: 69 66 20 74 77 6f 20 73 79 6d 62 6f 6c 73 20 61  if two symbols a
7170: 72 65 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a  re the same..*/.
7180: 69 6e 74 20 73 61 6d 65 5f 73 79 6d 62 6f 6c 28  int same_symbol(
7190: 61 2c 62 29 0a 73 74 72 75 63 74 20 73 79 6d 62  a,b).struct symb
71a0: 6f 6c 20 2a 61 3b 0a 73 74 72 75 63 74 20 73 79  ol *a;.struct sy
71b0: 6d 62 6f 6c 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74  mbol *b;.{.  int
71c0: 20 69 3b 0a 20 20 69 66 28 20 61 3d 3d 62 20 29   i;.  if( a==b )
71d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
71e0: 20 61 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54   a->type!=MULTIT
71f0: 45 52 4d 49 4e 41 4c 20 29 20 72 65 74 75 72 6e  ERMINAL ) return
7200: 20 30 3b 0a 20 20 69 66 28 20 62 2d 3e 74 79 70   0;.  if( b->typ
7210: 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e!=MULTITERMINAL
7220: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
7230: 66 28 20 61 2d 3e 6e 73 75 62 73 79 6d 21 3d 62  f( a->nsubsym!=b
7240: 2d 3e 6e 73 75 62 73 79 6d 20 29 20 72 65 74 75  ->nsubsym ) retu
7250: 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rn 0;.  for(i=0;
7260: 20 69 3c 61 2d 3e 6e 73 75 62 73 79 6d 3b 20 69   i<a->nsubsym; i
7270: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e  ++){.    if( a->
7280: 73 75 62 73 79 6d 5b 69 5d 21 3d 62 2d 3e 73 75  subsym[i]!=b->su
7290: 62 73 79 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e  bsym[i] ) return
72a0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
72b0: 20 31 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73 74 72   1;.}../* Constr
72c0: 75 63 74 20 61 6c 6c 20 73 75 63 63 65 73 73 6f  uct all successo
72d0: 72 20 73 74 61 74 65 73 20 74 6f 20 74 68 65 20  r states to the 
72e0: 67 69 76 65 6e 20 73 74 61 74 65 2e 20 20 41 20  given state.  A 
72f0: 22 73 75 63 63 65 73 73 6f 72 22 0a 2a 2a 20 73  "successor".** s
7300: 74 61 74 65 20 69 73 20 61 6e 79 20 73 74 61 74  tate is any stat
7310: 65 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 72  e which can be r
7320: 65 61 63 68 65 64 20 62 79 20 61 20 73 68 69 66  eached by a shif
7330: 74 20 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49  t action..*/.PRI
7340: 56 41 54 45 20 76 6f 69 64 20 62 75 69 6c 64 73  VATE void builds
7350: 68 69 66 74 73 28 6c 65 6d 70 2c 73 74 70 29 0a  hifts(lemp,stp).
7360: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
7370: 6d 70 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65  mp;.struct state
7380: 20 2a 73 74 70 3b 20 20 20 20 20 2f 2a 20 54 68   *stp;     /* Th
7390: 65 20 73 74 61 74 65 20 66 72 6f 6d 20 77 68 69  e state from whi
73a0: 63 68 20 73 75 63 63 65 73 73 6f 72 73 20 61 72  ch successors ar
73b0: 65 20 63 6f 6d 70 75 74 65 64 20 2a 2f 0a 7b 0a  e computed */.{.
73c0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
73d0: 2a 63 66 70 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f  *cfp;  /* For lo
73e0: 6f 70 69 6e 67 20 74 68 72 75 20 74 68 65 20 63  oping thru the c
73f0: 6f 6e 66 69 67 20 63 6c 6f 73 75 72 65 20 6f 66  onfig closure of
7400: 20 22 73 74 70 22 20 2a 2f 0a 20 20 73 74 72 75   "stp" */.  stru
7410: 63 74 20 63 6f 6e 66 69 67 20 2a 62 63 66 70 3b  ct config *bcfp;
7420: 20 2f 2a 20 46 6f 72 20 74 68 65 20 69 6e 6e 65   /* For the inne
7430: 72 20 6c 6f 6f 70 20 6f 6e 20 63 6f 6e 66 69 67  r loop on config
7440: 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74 70   closure of "stp
7450: 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f  " */.  struct co
7460: 6e 66 69 67 20 2a 6e 65 77 3b 20 20 2f 2a 20 2a  nfig *new;  /* *
7470: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
7480: 6c 20 2a 73 70 3b 20 20 20 2f 2a 20 53 79 6d 62  l *sp;   /* Symb
7490: 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ol following the
74a0: 20 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72   dot in configur
74b0: 61 74 69 6f 6e 20 22 63 66 70 22 20 2a 2f 0a 20  ation "cfp" */. 
74c0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
74d0: 62 73 70 3b 20 20 2f 2a 20 53 79 6d 62 6f 6c 20  bsp;  /* Symbol 
74e0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f  following the do
74f0: 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69  t in configurati
7500: 6f 6e 20 22 62 63 66 70 22 20 2a 2f 0a 20 20 73  on "bcfp" */.  s
7510: 74 72 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77  truct state *new
7520: 73 74 70 3b 20 2f 2a 20 41 20 70 6f 69 6e 74 65  stp; /* A pointe
7530: 72 20 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72  r to a successor
7540: 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20   state */..  /* 
7550: 45 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69  Each configurati
7560: 6f 6e 20 62 65 63 6f 6d 65 73 20 63 6f 6d 70 6c  on becomes compl
7570: 65 74 65 20 61 66 74 65 72 20 69 74 20 63 6f 6e  ete after it con
7580: 74 69 62 75 74 65 73 20 74 6f 20 61 20 73 75 63  tibutes to a suc
7590: 63 65 73 73 6f 72 0a 20 20 2a 2a 20 73 74 61 74  cessor.  ** stat
75a0: 65 2e 20 20 49 6e 69 74 69 61 6c 6c 79 2c 20 61  e.  Initially, a
75b0: 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ll configuration
75c0: 73 20 61 72 65 20 69 6e 63 6f 6d 70 6c 65 74 65  s are incomplete
75d0: 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74   */.  for(cfp=st
75e0: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
75f0: 3d 63 66 70 2d 3e 6e 65 78 74 29 20 63 66 70 2d  =cfp->next) cfp-
7600: 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50  >status = INCOMP
7610: 4c 45 54 45 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70  LETE;..  /* Loop
7620: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6e   through all con
7630: 66 69 67 75 72 61 74 69 6f 6e 73 20 6f 66 20 74  figurations of t
7640: 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20 2a  he state "stp" *
7650: 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d  /.  for(cfp=stp-
7660: 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63  >cfp; cfp; cfp=c
7670: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69  fp->next){.    i
7680: 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d  f( cfp->status==
7690: 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69  COMPLETE ) conti
76a0: 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61  nue;    /* Alrea
76b0: 64 79 20 75 73 65 64 20 62 79 20 69 6e 6e 65 72  dy used by inner
76c0: 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28   loop */.    if(
76d0: 20 63 66 70 2d 3e 64 6f 74 3e 3d 63 66 70 2d 3e   cfp->dot>=cfp->
76e0: 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69  rp->nrhs ) conti
76f0: 6e 75 65 3b 20 20 2f 2a 20 43 61 6e 27 74 20 73  nue;  /* Can't s
7700: 68 69 66 74 20 74 68 69 73 20 63 6f 6e 66 69 67  hift this config
7710: 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69   */.    Configli
7720: 73 74 5f 72 65 73 65 74 28 29 3b 20 20 20 20 20  st_reset();     
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7740: 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 6e 65   /* Reset the ne
7750: 77 20 63 6f 6e 66 69 67 20 73 65 74 20 2a 2f 0a  w config set */.
7760: 20 20 20 20 73 70 20 3d 20 63 66 70 2d 3e 72 70      sp = cfp->rp
7770: 2d 3e 72 68 73 5b 63 66 70 2d 3e 64 6f 74 5d 3b  ->rhs[cfp->dot];
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7790: 53 79 6d 62 6f 6c 20 61 66 74 65 72 20 74 68 65  Symbol after the
77a0: 20 64 6f 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   dot */..    /* 
77b0: 46 6f 72 20 65 76 65 72 79 20 63 6f 6e 66 69 67  For every config
77c0: 75 72 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  uration in the s
77d0: 74 61 74 65 20 22 73 74 70 22 20 77 68 69 63 68  tate "stp" which
77e0: 20 68 61 73 20 74 68 65 20 73 79 6d 62 6f 6c 20   has the symbol 
77f0: 22 73 70 22 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c  "sp".    ** foll
7800: 6f 77 69 6e 67 20 69 74 73 20 64 6f 74 2c 20 61  owing its dot, a
7810: 64 64 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 66  dd the same conf
7820: 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65  iguration to the
7830: 20 62 61 73 69 73 20 73 65 74 20 75 6e 64 65 72   basis set under
7840: 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63  .    ** construc
7850: 74 69 6f 6e 20 62 75 74 20 77 69 74 68 20 74 68  tion but with th
7860: 65 20 64 6f 74 20 73 68 69 66 74 65 64 20 6f 6e  e dot shifted on
7870: 65 20 73 79 6d 62 6f 6c 20 74 6f 20 74 68 65 20  e symbol to the 
7880: 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 66 6f  right. */.    fo
7890: 72 28 62 63 66 70 3d 63 66 70 3b 20 62 63 66 70  r(bcfp=cfp; bcfp
78a0: 3b 20 62 63 66 70 3d 62 63 66 70 2d 3e 6e 65 78  ; bcfp=bcfp->nex
78b0: 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 63  t){.      if( bc
78c0: 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50  fp->status==COMP
78d0: 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LETE ) continue;
78e0: 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 75      /* Already u
78f0: 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  sed */.      if(
7900: 20 62 63 66 70 2d 3e 64 6f 74 3e 3d 62 63 66 70   bcfp->dot>=bcfp
7910: 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e  ->rp->nrhs ) con
7920: 74 69 6e 75 65 3b 20 2f 2a 20 43 61 6e 27 74 20  tinue; /* Can't 
7930: 73 68 69 66 74 20 74 68 69 73 20 6f 6e 65 20 2a  shift this one *
7940: 2f 0a 20 20 20 20 20 20 62 73 70 20 3d 20 62 63  /.      bsp = bc
7950: 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 62 63 66 70  fp->rp->rhs[bcfp
7960: 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20 20  ->dot];         
7970: 20 20 2f 2a 20 47 65 74 20 73 79 6d 62 6f 6c 20    /* Get symbol 
7980: 61 66 74 65 72 20 64 6f 74 20 2a 2f 0a 20 20 20  after dot */.   
7990: 20 20 20 69 66 28 20 21 73 61 6d 65 5f 73 79 6d     if( !same_sym
79a0: 62 6f 6c 28 62 73 70 2c 73 70 29 20 29 20 63 6f  bol(bsp,sp) ) co
79b0: 6e 74 69 6e 75 65 3b 20 20 20 20 20 20 2f 2a 20  ntinue;      /* 
79c0: 4d 75 73 74 20 62 65 20 73 61 6d 65 20 61 73 20  Must be same as 
79d0: 66 6f 72 20 22 63 66 70 22 20 2a 2f 0a 20 20 20  for "cfp" */.   
79e0: 20 20 20 62 63 66 70 2d 3e 73 74 61 74 75 73 20     bcfp->status 
79f0: 3d 20 43 4f 4d 50 4c 45 54 45 3b 20 20 20 20 20  = COMPLETE;     
7a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7a10: 4d 61 72 6b 20 74 68 69 73 20 63 6f 6e 66 69 67  Mark this config
7a20: 20 61 73 20 75 73 65 64 20 2a 2f 0a 20 20 20 20   as used */.    
7a30: 20 20 6e 65 77 20 3d 20 43 6f 6e 66 69 67 6c 69    new = Configli
7a40: 73 74 5f 61 64 64 62 61 73 69 73 28 62 63 66 70  st_addbasis(bcfp
7a50: 2d 3e 72 70 2c 62 63 66 70 2d 3e 64 6f 74 2b 31  ->rp,bcfp->dot+1
7a60: 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 61  );.      Plink_a
7a70: 64 64 28 26 6e 65 77 2d 3e 62 70 6c 70 2c 62 63  dd(&new->bplp,bc
7a80: 66 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  fp);.    }..    
7a90: 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72  /* Get a pointer
7aa0: 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 64 65   to the state de
7ab0: 73 63 72 69 62 65 64 20 62 79 20 74 68 65 20 62  scribed by the b
7ac0: 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  asis configurati
7ad0: 6f 6e 20 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f  on set.    ** co
7ae0: 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 65  nstructed in the
7af0: 20 70 72 65 63 65 64 69 6e 67 20 6c 6f 6f 70 20   preceding loop 
7b00: 2a 2f 0a 20 20 20 20 6e 65 77 73 74 70 20 3d 20  */.    newstp = 
7b10: 67 65 74 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a  getstate(lemp);.
7b20: 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74  .    /* The stat
7b30: 65 20 22 6e 65 77 73 74 70 22 20 69 73 20 72 65  e "newstp" is re
7b40: 61 63 68 65 64 20 66 72 6f 6d 20 74 68 65 20 73  ached from the s
7b50: 74 61 74 65 20 22 73 74 70 22 20 62 79 20 61 20  tate "stp" by a 
7b60: 73 68 69 66 74 20 61 63 74 69 6f 6e 0a 20 20 20  shift action.   
7b70: 20 2a 2a 20 6f 6e 20 74 68 65 20 73 79 6d 62 6f   ** on the symbo
7b80: 6c 20 22 73 70 22 20 2a 2f 0a 20 20 20 20 69 66  l "sp" */.    if
7b90: 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54  ( sp->type==MULT
7ba0: 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  ITERMINAL ){.   
7bb0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
7bc0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 70 2d 3e 6e  for(i=0; i<sp->n
7bd0: 73 75 62 73 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20  subsym; i++){.  
7be0: 20 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64        Action_add
7bf0: 28 26 73 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c  (&stp->ap,SHIFT,
7c00: 73 70 2d 3e 73 75 62 73 79 6d 5b 69 5d 2c 28 63  sp->subsym[i],(c
7c10: 68 61 72 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20  har*)newstp);.  
7c20: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
7c30: 0a 20 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64  .      Action_ad
7c40: 64 28 26 73 74 70 2d 3e 61 70 2c 53 48 49 46 54  d(&stp->ap,SHIFT
7c50: 2c 73 70 2c 28 63 68 61 72 20 2a 29 6e 65 77 73  ,sp,(char *)news
7c60: 74 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  tp);.    }.  }.}
7c70: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
7c80: 74 20 74 68 65 20 70 72 6f 70 61 67 61 74 69 6f  t the propagatio
7c90: 6e 20 6c 69 6e 6b 73 0a 2a 2f 0a 76 6f 69 64 20  n links.*/.void 
7ca0: 46 69 6e 64 4c 69 6e 6b 73 28 6c 65 6d 70 29 0a  FindLinks(lemp).
7cb0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
7cc0: 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  mp;.{.  int i;. 
7cd0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
7ce0: 63 66 70 2c 20 2a 6f 74 68 65 72 3b 0a 20 20 73  cfp, *other;.  s
7cf0: 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
7d00: 3b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  ;.  struct plink
7d10: 20 2a 70 6c 70 3b 0a 0a 20 20 2f 2a 20 48 6f 75   *plp;..  /* Hou
7d20: 73 65 6b 65 65 70 69 6e 67 20 64 65 74 61 69 6c  sekeeping detail
7d30: 3a 0a 20 20 2a 2a 20 41 64 64 20 74 6f 20 65 76  :.  ** Add to ev
7d40: 65 72 79 20 70 72 6f 70 61 67 61 74 65 20 6c 69  ery propagate li
7d50: 6e 6b 20 61 20 70 6f 69 6e 74 65 72 20 62 61 63  nk a pointer bac
7d60: 6b 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74  k to the state t
7d70: 6f 0a 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65  o.  ** which the
7d80: 20 6c 69 6e 6b 20 69 73 20 61 74 74 61 63 68 65   link is attache
7d90: 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  d. */.  for(i=0;
7da0: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
7db0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
7dc0: 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
7dd0: 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74  ;.    for(cfp=st
7de0: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
7df0: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
7e00: 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 73 74     cfp->stp = st
7e10: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  p;.    }.  }..  
7e20: 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c 20 62  /* Convert all b
7e30: 61 63 6b 6c 69 6e 6b 73 20 69 6e 74 6f 20 66 6f  acklinks into fo
7e40: 72 77 61 72 64 20 6c 69 6e 6b 73 2e 20 20 4f 6e  rward links.  On
7e50: 6c 79 20 74 68 65 20 66 6f 72 77 61 72 64 0a 20  ly the forward. 
7e60: 20 2a 2a 20 6c 69 6e 6b 73 20 61 72 65 20 75 73   ** links are us
7e70: 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77  ed in the follow
7e80: 2d 73 65 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e  -set computation
7e90: 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  . */.  for(i=0; 
7ea0: 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
7eb0: 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
7ec0: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
7ed0: 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70  .    for(cfp=stp
7ee0: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
7ef0: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
7f00: 20 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 62    for(plp=cfp->b
7f10: 70 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c  plp; plp; plp=pl
7f20: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
7f30: 20 20 6f 74 68 65 72 20 3d 20 70 6c 70 2d 3e 63    other = plp->c
7f40: 66 70 3b 0a 20 20 20 20 20 20 20 20 50 6c 69 6e  fp;.        Plin
7f50: 6b 5f 61 64 64 28 26 6f 74 68 65 72 2d 3e 66 70  k_add(&other->fp
7f60: 6c 70 2c 63 66 70 29 3b 0a 20 20 20 20 20 20 7d  lp,cfp);.      }
7f70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
7f80: 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 66 6f 6c   Compute all fol
7f90: 6c 6f 77 73 65 74 73 2e 0a 2a 2a 0a 2a 2a 20 41  lowsets..**.** A
7fa0: 20 66 6f 6c 6c 6f 77 73 65 74 20 69 73 20 74 68   followset is th
7fb0: 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 73 79 6d  e set of all sym
7fc0: 62 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20 63  bols which can c
7fd0: 6f 6d 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  ome immediately.
7fe0: 2a 2a 20 61 66 74 65 72 20 61 20 63 6f 6e 66 69  ** after a confi
7ff0: 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  guration..*/.voi
8000: 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73  d FindFollowSets
8010: 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65  (lemp).struct le
8020: 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69  mon *lemp;.{.  i
8030: 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63  nt i;.  struct c
8040: 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74  onfig *cfp;.  st
8050: 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b  ruct plink *plp;
8060: 0a 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b  .  int progress;
8070: 0a 20 20 69 6e 74 20 63 68 61 6e 67 65 3b 0a 0a  .  int change;..
8080: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
8090: 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
80a0: 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d  .    for(cfp=lem
80b0: 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66  p->sorted[i]->cf
80c0: 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  p; cfp; cfp=cfp-
80d0: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 63 66  >next){.      cf
80e0: 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f  p->status = INCO
80f0: 4d 50 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20  MPLETE;.    }.  
8100: 7d 0a 20 20 0a 20 20 64 6f 7b 0a 20 20 20 20 70  }.  .  do{.    p
8110: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
8120: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
8130: 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
8140: 20 20 20 20 20 20 66 6f 72 28 63 66 70 3d 6c 65        for(cfp=le
8150: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63  mp->sorted[i]->c
8160: 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  fp; cfp; cfp=cfp
8170: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
8180: 20 69 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73   if( cfp->status
8190: 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e  ==COMPLETE ) con
81a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66  tinue;.        f
81b0: 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 66 70 6c 70  or(plp=cfp->fplp
81c0: 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e  ; plp; plp=plp->
81d0: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  next){.         
81e0: 20 63 68 61 6e 67 65 20 3d 20 53 65 74 55 6e 69   change = SetUni
81f0: 6f 6e 28 70 6c 70 2d 3e 63 66 70 2d 3e 66 77 73  on(plp->cfp->fws
8200: 2c 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20  ,cfp->fws);.    
8210: 20 20 20 20 20 20 69 66 28 20 63 68 61 6e 67 65        if( change
8220: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8230: 70 6c 70 2d 3e 63 66 70 2d 3e 73 74 61 74 75 73  plp->cfp->status
8240: 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20   = INCOMPLETE;. 
8250: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 67 72             progr
8260: 65 73 73 20 3d 20 31 3b 0a 09 20 20 7d 0a 09 7d  ess = 1;..  }..}
8270: 0a 20 20 20 20 20 20 20 20 63 66 70 2d 3e 73 74  .        cfp->st
8280: 61 74 75 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b  atus = COMPLETE;
8290: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
82a0: 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73   }while( progres
82b0: 73 20 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  s );.}..static i
82c0: 6e 74 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c  nt resolve_confl
82d0: 69 63 74 28 29 3b 0a 0a 2f 2a 20 43 6f 6d 70 75  ict();../* Compu
82e0: 74 65 20 74 68 65 20 72 65 64 75 63 65 20 61 63  te the reduce ac
82f0: 74 69 6f 6e 73 2c 20 61 6e 64 20 72 65 73 6f 6c  tions, and resol
8300: 76 65 20 63 6f 6e 66 6c 69 63 74 73 2e 0a 2a 2f  ve conflicts..*/
8310: 0a 76 6f 69 64 20 46 69 6e 64 41 63 74 69 6f 6e  .void FindAction
8320: 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  s(lemp).struct l
8330: 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
8340: 69 6e 74 20 69 2c 6a 3b 0a 20 20 73 74 72 75 63  int i,j;.  struc
8350: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20  t config *cfp;. 
8360: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
8370: 74 70 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  tp;.  struct sym
8380: 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63  bol *sp;.  struc
8390: 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 2f  t rule *rp;..  /
83a0: 2a 20 41 64 64 20 61 6c 6c 20 6f 66 20 74 68 65  * Add all of the
83b0: 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 20   reduce actions 
83c0: 0a 20 20 2a 2a 20 41 20 72 65 64 75 63 65 20 61  .  ** A reduce a
83d0: 63 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20 66  ction is added f
83e0: 6f 72 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20  or each element 
83f0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 73 65 74  of the followset
8400: 20 6f 66 0a 20 20 2a 2a 20 61 20 63 6f 6e 66 69   of.  ** a confi
8410: 67 75 72 61 74 69 6f 6e 20 77 68 69 63 68 20 68  guration which h
8420: 61 73 20 69 74 73 20 64 6f 74 20 61 74 20 74 68  as its dot at th
8430: 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2e  e extreme right.
8440: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
8450: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
8460: 20 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c 6f 6f 70   i++){   /* Loop
8470: 20 6f 76 65 72 20 61 6c 6c 20 73 74 61 74 65 73   over all states
8480: 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20 6c 65   */.    stp = le
8490: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
84a0: 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e     for(cfp=stp->
84b0: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
84c0: 70 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a 20 4c 6f  p->next){  /* Lo
84d0: 6f 70 20 6f 76 65 72 20 61 6c 6c 20 63 6f 6e 66  op over all conf
84e0: 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  igurations */.  
84f0: 20 20 20 20 69 66 28 20 63 66 70 2d 3e 72 70 2d      if( cfp->rp-
8500: 3e 6e 72 68 73 3d 3d 63 66 70 2d 3e 64 6f 74 20  >nrhs==cfp->dot 
8510: 29 7b 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20  ){        /* Is 
8520: 64 6f 74 20 61 74 20 65 78 74 72 65 6d 65 20 72  dot at extreme r
8530: 69 67 68 74 3f 20 2a 2f 0a 20 20 20 20 20 20 20  ight? */.       
8540: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70   for(j=0; j<lemp
8550: 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b  ->nterminal; j++
8560: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
8570: 20 53 65 74 46 69 6e 64 28 63 66 70 2d 3e 66 77   SetFind(cfp->fw
8580: 73 2c 6a 29 20 29 7b 0a 20 20 20 20 20 20 20 20  s,j) ){.        
8590: 20 20 20 20 2f 2a 20 41 64 64 20 61 20 72 65 64      /* Add a red
85a0: 75 63 65 20 61 63 74 69 6f 6e 20 74 6f 20 74 68  uce action to th
85b0: 65 20 73 74 61 74 65 20 22 73 74 70 22 20 77 68  e state "stp" wh
85c0: 69 63 68 20 77 69 6c 6c 20 72 65 64 75 63 65 20  ich will reduce 
85d0: 62 79 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  by the.         
85e0: 20 20 20 2a 2a 20 72 75 6c 65 20 22 63 66 70 2d     ** rule "cfp-
85f0: 3e 72 70 22 20 69 66 20 74 68 65 20 6c 6f 6f 6b  >rp" if the look
8600: 61 68 65 61 64 20 73 79 6d 62 6f 6c 20 69 73 20  ahead symbol is 
8610: 22 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a  "lemp->symbols[j
8620: 5d 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ]" */.          
8630: 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74    Action_add(&st
8640: 70 2d 3e 61 70 2c 52 45 44 55 43 45 2c 6c 65 6d  p->ap,REDUCE,lem
8650: 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2c 28 63  p->symbols[j],(c
8660: 68 61 72 20 2a 29 63 66 70 2d 3e 72 70 29 3b 0a  har *)cfp->rp);.
8670: 20 20 20 20 20 20 20 20 20 20 7d 0a 09 7d 0a 20            }..}. 
8680: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8690: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 61  ..  /* Add the a
86a0: 63 63 65 70 74 69 6e 67 20 74 6f 6b 65 6e 20 2a  ccepting token *
86b0: 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74  /.  if( lemp->st
86c0: 61 72 74 20 29 7b 0a 20 20 20 20 73 70 20 3d 20  art ){.    sp = 
86d0: 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70  Symbol_find(lemp
86e0: 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 69 66  ->start);.    if
86f0: 28 20 73 70 3d 3d 30 20 29 20 73 70 20 3d 20 6c  ( sp==0 ) sp = l
8700: 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a  emp->rule->lhs;.
8710: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 20    }else{.    sp 
8720: 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68  = lemp->rule->lh
8730: 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 64 64 20  s;.  }.  /* Add 
8740: 74 6f 20 74 68 65 20 66 69 72 73 74 20 73 74 61  to the first sta
8750: 74 65 20 28 77 68 69 63 68 20 69 73 20 61 6c 77  te (which is alw
8760: 61 79 73 20 74 68 65 20 73 74 61 72 74 69 6e 67  ays the starting
8770: 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 20 20   state of the.  
8780: 2a 2a 20 66 69 6e 69 74 65 20 73 74 61 74 65 20  ** finite state 
8790: 6d 61 63 68 69 6e 65 29 20 61 6e 20 61 63 74 69  machine) an acti
87a0: 6f 6e 20 74 6f 20 41 43 43 45 50 54 20 69 66 20  on to ACCEPT if 
87b0: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 73  the lookahead is
87c0: 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20   the.  ** start 
87d0: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 20 20 2a 2f  nonterminal.  */
87e0: 0a 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 6c  .  Action_add(&l
87f0: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d 2d 3e  emp->sorted[0]->
8800: 61 70 2c 41 43 43 45 50 54 2c 73 70 2c 30 29 3b  ap,ACCEPT,sp,0);
8810: 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 63  ..  /* Resolve c
8820: 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20 66 6f  onflicts */.  fo
8830: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
8840: 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
8850: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
8860: 61 70 2c 20 2a 6e 61 70 3b 0a 20 20 20 20 73 74  ap, *nap;.    st
8870: 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
8880: 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
8890: 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
88a0: 2f 2a 20 61 73 73 65 72 74 28 20 73 74 70 2d 3e  /* assert( stp->
88b0: 61 70 20 29 3b 20 2a 2f 0a 20 20 20 20 73 74 70  ap ); */.    stp
88c0: 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f  ->ap = Action_so
88d0: 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20 20 20  rt(stp->ap);.   
88e0: 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
88f0: 20 61 70 20 26 26 20 61 70 2d 3e 6e 65 78 74 3b   ap && ap->next;
8900: 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
8910: 20 20 20 20 20 66 6f 72 28 6e 61 70 3d 61 70 2d       for(nap=ap-
8920: 3e 6e 65 78 74 3b 20 6e 61 70 20 26 26 20 6e 61  >next; nap && na
8930: 70 2d 3e 73 70 3d 3d 61 70 2d 3e 73 70 3b 20 6e  p->sp==ap->sp; n
8940: 61 70 3d 6e 61 70 2d 3e 6e 65 78 74 29 7b 0a 20  ap=nap->next){. 
8950: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
8960: 77 6f 20 61 63 74 69 6f 6e 73 20 22 61 70 22 20  wo actions "ap" 
8970: 61 6e 64 20 22 6e 61 70 22 20 68 61 76 65 20 74  and "nap" have t
8980: 68 65 20 73 61 6d 65 20 6c 6f 6f 6b 61 68 65 61  he same lookahea
8990: 64 2e 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 46  d..         ** F
89a0: 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20  igure out which 
89b0: 6f 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73  one should be us
89c0: 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 6c  ed */.         l
89d0: 65 6d 70 2d 3e 6e 63 6f 6e 66 6c 69 63 74 20 2b  emp->nconflict +
89e0: 3d 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69  = resolve_confli
89f0: 63 74 28 61 70 2c 6e 61 70 2c 6c 65 6d 70 2d 3e  ct(ap,nap,lemp->
8a00: 65 72 72 73 79 6d 29 3b 0a 20 20 20 20 20 20 7d  errsym);.      }
8a10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
8a20: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
8a30: 20 66 6f 72 20 65 61 63 68 20 72 75 6c 65 20 74   for each rule t
8a40: 68 61 74 20 63 61 6e 20 6e 65 76 65 72 20 62 65  hat can never be
8a50: 20 72 65 64 75 63 65 64 2e 20 2a 2f 0a 20 20 66   reduced. */.  f
8a60: 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
8a70: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
8a80: 74 29 20 72 70 2d 3e 63 61 6e 52 65 64 75 63 65  t) rp->canReduce
8a90: 20 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a   = LEMON_FALSE;.
8aa0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
8ab0: 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
8ac0: 0a 20 20 20 20 73 74 72 75 63 74 20 61 63 74 69  .    struct acti
8ad0: 6f 6e 20 2a 61 70 3b 0a 20 20 20 20 66 6f 72 28  on *ap;.    for(
8ae0: 61 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b  ap=lemp->sorted[
8af0: 69 5d 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  i]->ap; ap; ap=a
8b00: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
8b10: 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45  if( ap->type==RE
8b20: 44 55 43 45 20 29 20 61 70 2d 3e 78 2e 72 70 2d  DUCE ) ap->x.rp-
8b30: 3e 63 61 6e 52 65 64 75 63 65 20 3d 20 4c 45 4d  >canReduce = LEM
8b40: 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20  ON_TRUE;.    }. 
8b50: 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70   }.  for(rp=lemp
8b60: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
8b70: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66  p->next){.    if
8b80: 28 20 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20  ( rp->canReduce 
8b90: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
8ba0: 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66  ErrorMsg(lemp->f
8bb0: 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65  ilename,rp->rule
8bc0: 6c 69 6e 65 2c 22 54 68 69 73 20 72 75 6c 65 20  line,"This rule 
8bd0: 63 61 6e 20 6e 6f 74 20 62 65 20 72 65 64 75 63  can not be reduc
8be0: 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c 65 6d  ed.\n");.    lem
8bf0: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
8c00: 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65   }.}../* Resolve
8c10: 20 61 20 63 6f 6e 66 6c 69 63 74 20 62 65 74 77   a conflict betw
8c20: 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76 65  een the two give
8c30: 6e 20 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74  n actions.  If t
8c40: 68 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 20 63  he.** conflict c
8c50: 61 6e 27 74 20 62 65 20 72 65 73 6f 6c 76 65 64  an't be resolved
8c60: 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  , return non-zer
8c70: 6f 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e 47  o..**.** NO LONG
8c80: 45 52 20 54 52 55 45 3a 0a 2a 2a 20 20 20 54 6f  ER TRUE:.**   To
8c90: 20 72 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c   resolve a confl
8ca0: 69 63 74 2c 20 66 69 72 73 74 20 6c 6f 6f 6b 20  ict, first look 
8cb0: 74 6f 20 73 65 65 20 69 66 20 65 69 74 68 65 72  to see if either
8cc0: 20 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 69 73 20   action.**   is 
8cd0: 6f 6e 20 61 6e 20 65 72 72 6f 72 20 72 75 6c 65  on an error rule
8ce0: 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  .  In that case,
8cf0: 20 74 61 6b 65 20 74 68 65 20 61 63 74 69 6f 6e   take the action
8d00: 20 77 68 69 63 68 0a 2a 2a 20 20 20 69 73 20 6e   which.**   is n
8d10: 6f 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ot associated wi
8d20: 74 68 20 74 68 65 20 65 72 72 6f 72 20 72 75 6c  th the error rul
8d30: 65 2e 20 20 49 66 20 6e 65 69 74 68 65 72 20 6f  e.  If neither o
8d40: 72 20 62 6f 74 68 0a 2a 2a 20 20 20 61 63 74 69  r both.**   acti
8d50: 6f 6e 73 20 61 72 65 20 61 73 73 6f 63 69 61 74  ons are associat
8d60: 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
8d70: 20 72 75 6c 65 2c 20 74 68 65 6e 20 74 72 79 20   rule, then try 
8d80: 74 6f 0a 2a 2a 20 20 20 75 73 65 20 70 72 65 63  to.**   use prec
8d90: 65 64 65 6e 63 65 20 74 6f 20 72 65 73 6f 6c 76  edence to resolv
8da0: 65 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2e 0a  e the conflict..
8db0: 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
8dc0: 61 63 74 69 6f 6e 20 69 73 20 61 20 53 48 49 46  action is a SHIF
8dd0: 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74 20  T, then it must 
8de0: 62 65 20 61 70 78 2e 20 20 54 68 69 73 0a 2a 2a  be apx.  This.**
8df0: 20 66 75 6e 63 74 69 6f 6e 20 77 6f 6e 27 74 20   function won't 
8e00: 77 6f 72 6b 20 69 66 20 61 70 78 2d 3e 74 79 70  work if apx->typ
8e10: 65 3d 3d 52 45 44 55 43 45 20 61 6e 64 20 61 70  e==REDUCE and ap
8e20: 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 2e 0a  y->type==SHIFT..
8e30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
8e40: 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61  solve_conflict(a
8e50: 70 78 2c 61 70 79 2c 65 72 72 73 79 6d 29 0a 73  px,apy,errsym).s
8e60: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
8e70: 78 3b 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e  x;.struct action
8e80: 20 2a 61 70 79 3b 0a 73 74 72 75 63 74 20 73 79   *apy;.struct sy
8e90: 6d 62 6f 6c 20 2a 65 72 72 73 79 6d 3b 20 20 20  mbol *errsym;   
8ea0: 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 73 79 6d  /* The error sym
8eb0: 62 6f 6c 20 28 69 66 20 64 65 66 69 6e 65 64 2e  bol (if defined.
8ec0: 20 20 4e 55 4c 4c 20 6f 74 68 65 72 77 69 73 65    NULL otherwise
8ed0: 29 20 2a 2f 0a 7b 0a 20 20 73 74 72 75 63 74 20  ) */.{.  struct 
8ee0: 73 79 6d 62 6f 6c 20 2a 73 70 78 2c 20 2a 73 70  symbol *spx, *sp
8ef0: 79 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20  y;.  int errcnt 
8f00: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61  = 0;.  assert( a
8f10: 70 78 2d 3e 73 70 3d 3d 61 70 79 2d 3e 73 70 20  px->sp==apy->sp 
8f20: 29 3b 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65  );  /* Otherwise
8f30: 20 74 68 65 72 65 20 77 6f 75 6c 64 20 62 65 20   there would be 
8f40: 6e 6f 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20  no conflict */. 
8f50: 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d   if( apx->type==
8f60: 53 48 49 46 54 20 26 26 20 61 70 79 2d 3e 74 79  SHIFT && apy->ty
8f70: 70 65 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20 20  pe==SHIFT ){.   
8f80: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 53 53 43   apy->type = SSC
8f90: 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 65 72 72  ONFLICT;.    err
8fa0: 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  cnt++;.  }.  if(
8fb0: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 49 46   apx->type==SHIF
8fc0: 54 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d  T && apy->type==
8fd0: 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 73 70  REDUCE ){.    sp
8fe0: 78 20 3d 20 61 70 78 2d 3e 73 70 3b 0a 20 20 20  x = apx->sp;.   
8ff0: 20 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70   spy = apy->x.rp
9000: 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 69  ->precsym;.    i
9010: 66 28 20 73 70 79 3d 3d 30 20 7c 7c 20 73 70 78  f( spy==0 || spx
9020: 2d 3e 70 72 65 63 3c 30 20 7c 7c 20 73 70 79 2d  ->prec<0 || spy-
9030: 3e 70 72 65 63 3c 30 20 29 7b 0a 20 20 20 20 20  >prec<0 ){.     
9040: 20 2f 2a 20 4e 6f 74 20 65 6e 6f 75 67 68 20 70   /* Not enough p
9050: 72 65 63 65 64 65 6e 63 65 20 69 6e 66 6f 72 6d  recedence inform
9060: 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20  ation. */.      
9070: 61 70 79 2d 3e 74 79 70 65 20 3d 20 53 52 43 4f  apy->type = SRCO
9080: 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72  NFLICT;.      er
9090: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  rcnt++;.    }els
90a0: 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e  e if( spx->prec>
90b0: 73 70 79 2d 3e 70 72 65 63 20 29 7b 20 20 20 20  spy->prec ){    
90c0: 2f 2a 20 4c 6f 77 65 72 20 70 72 65 63 65 64 65  /* Lower precede
90d0: 6e 63 65 20 77 69 6e 73 20 2a 2f 0a 20 20 20 20  nce wins */.    
90e0: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44    apy->type = RD
90f0: 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d  _RESOLVED;.    }
9100: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
9110: 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a  ec<spy->prec ){.
9120: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20        apx->type 
9130: 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20  = SH_RESOLVED;. 
9140: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78     }else if( spx
9150: 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65  ->prec==spy->pre
9160: 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d  c && spx->assoc=
9170: 3d 52 49 47 48 54 20 29 7b 20 2f 2a 20 55 73 65  =RIGHT ){ /* Use
9180: 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   operator */.   
9190: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52     apy->type = R
91a0: 44 5f 52 45 53 4f 4c 56 45 44 3b 20 20 20 20 20  D_RESOLVED;     
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91c0: 20 20 20 20 20 20 20 20 2f 2a 20 61 73 73 6f 63          /* assoc
91d0: 69 61 74 69 76 69 74 79 20 2a 2f 0a 20 20 20 20  iativity */.    
91e0: 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70  }else if( spx->p
91f0: 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26  rec==spy->prec &
9200: 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4c 45  & spx->assoc==LE
9210: 46 54 20 29 7b 20 20 2f 2a 20 74 6f 20 62 72 65  FT ){  /* to bre
9220: 61 6b 20 74 69 65 20 2a 2f 0a 20 20 20 20 20 20  ak tie */.      
9230: 61 70 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52  apx->type = SH_R
9240: 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c  ESOLVED;.    }el
9250: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
9260: 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79  ( spx->prec==spy
9270: 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61  ->prec && spx->a
9280: 73 73 6f 63 3d 3d 4e 4f 4e 45 20 29 3b 0a 20 20  ssoc==NONE );.  
9290: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20      apy->type = 
92a0: 53 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20  SRCONFLICT;.    
92b0: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20    errcnt++;.    
92c0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61 70  }.  }else if( ap
92d0: 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20  x->type==REDUCE 
92e0: 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45  && apy->type==RE
92f0: 44 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20  DUCE ){.    spx 
9300: 3d 20 61 70 78 2d 3e 78 2e 72 70 2d 3e 70 72 65  = apx->x.rp->pre
9310: 63 73 79 6d 3b 0a 20 20 20 20 73 70 79 20 3d 20  csym;.    spy = 
9320: 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73  apy->x.rp->precs
9330: 79 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 78 3d  ym;.    if( spx=
9340: 3d 30 20 7c 7c 20 73 70 79 3d 3d 30 20 7c 7c 20  =0 || spy==0 || 
9350: 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 0a 20  spx->prec<0 ||. 
9360: 20 20 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 7c     spy->prec<0 |
9370: 7c 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79  | spx->prec==spy
9380: 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20  ->prec ){.      
9390: 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 52 43 4f  apy->type = RRCO
93a0: 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72  NFLICT;.      er
93b0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  rcnt++;.    }els
93c0: 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e  e if( spx->prec>
93d0: 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20  spy->prec ){.   
93e0: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52     apy->type = R
93f0: 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20  D_RESOLVED;.    
9400: 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70  }else if( spx->p
9410: 72 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b  rec<spy->prec ){
9420: 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65  .      apx->type
9430: 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a   = RD_RESOLVED;.
9440: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
9450: 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20     assert( .    
9460: 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 5f    apx->type==SH_
9470: 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20  RESOLVED ||.    
9480: 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 44 5f    apx->type==RD_
9490: 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20  RESOLVED ||.    
94a0: 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 53 43    apx->type==SSC
94b0: 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20  ONFLICT ||.     
94c0: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 52 43 4f   apx->type==SRCO
94d0: 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20  NFLICT ||.      
94e0: 61 70 78 2d 3e 74 79 70 65 3d 3d 52 52 43 4f 4e  apx->type==RRCON
94f0: 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61  FLICT ||.      a
9500: 70 79 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53  py->type==SH_RES
9510: 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61  OLVED ||.      a
9520: 70 79 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53  py->type==RD_RES
9530: 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61  OLVED ||.      a
9540: 70 79 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e 46  py->type==SSCONF
9550: 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70  LICT ||.      ap
9560: 79 2d 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46 4c  y->type==SRCONFL
9570: 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79  ICT ||.      apy
9580: 2d 3e 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c 49  ->type==RRCONFLI
9590: 43 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 2f 2a  CT.    );.    /*
95a0: 20 54 68 65 20 52 45 44 55 43 45 2f 53 48 49 46   The REDUCE/SHIF
95b0: 54 20 63 61 73 65 20 63 61 6e 6e 6f 74 20 68 61  T case cannot ha
95c0: 70 70 65 6e 20 62 65 63 61 75 73 65 20 53 48 49  ppen because SHI
95d0: 46 54 73 20 63 6f 6d 65 20 62 65 66 6f 72 65 0a  FTs come before.
95e0: 20 20 20 20 2a 2a 20 52 45 44 55 43 45 73 20 6f      ** REDUCEs o
95f0: 6e 20 74 68 65 20 6c 69 73 74 2e 20 20 49 66 20  n the list.  If 
9600: 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f  we reach this po
9610: 69 6e 74 20 69 74 20 6d 75 73 74 20 62 65 20 62  int it must be b
9620: 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68  ecause.    ** th
9630: 65 20 70 61 72 73 65 72 20 63 6f 6e 66 6c 69 63  e parser conflic
9640: 74 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  t had already be
9650: 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a  en resolved. */.
9660: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72    }.  return err
9670: 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  cnt;.}./********
9680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
9690: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 63 6f 6e  om the file "con
96a0: 66 69 67 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a 2a  figlist.c" *****
96b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
96c0: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  ****/./*.** Rout
96d0: 69 6e 65 73 20 74 6f 20 70 72 6f 63 65 73 73 69  ines to processi
96e0: 6e 67 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69  ng a configurati
96f0: 6f 6e 20 6c 69 73 74 20 61 6e 64 20 62 75 69 6c  on list and buil
9700: 64 69 6e 67 20 61 20 73 74 61 74 65 0a 2a 2a 20  ding a state.** 
9710: 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  in the LEMON par
9720: 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
9730: 2f 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  /..static struct
9740: 20 63 6f 6e 66 69 67 20 2a 66 72 65 65 6c 69 73   config *freelis
9750: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c  t = 0;      /* L
9760: 69 73 74 20 6f 66 20 66 72 65 65 20 63 6f 6e 66  ist of free conf
9770: 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74  igurations */.st
9780: 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66  atic struct conf
9790: 69 67 20 2a 63 75 72 72 65 6e 74 20 3d 20 30 3b  ig *current = 0;
97a0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66         /* Top of
97b0: 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75   list of configu
97c0: 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  rations */.stati
97d0: 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  c struct config 
97e0: 2a 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30  **currentend = 0
97f0: 3b 20 20 20 2f 2a 20 4c 61 73 74 20 6f 6e 20 6c  ;   /* Last on l
9800: 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 73 20 2a  ist of configs *
9810: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
9820: 63 6f 6e 66 69 67 20 2a 62 61 73 69 73 20 3d 20  config *basis = 
9830: 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  0;         /* To
9840: 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73  p of list of bas
9850: 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74  is configs */.st
9860: 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66  atic struct conf
9870: 69 67 20 2a 2a 62 61 73 69 73 65 6e 64 20 3d 20  ig **basisend = 
9880: 30 3b 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66  0;     /* End of
9890: 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73 20 63   list of basis c
98a0: 6f 6e 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52 65  onfigs */../* Re
98b0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
98c0: 6f 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72  o a new configur
98d0: 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45  ation */.PRIVATE
98e0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
98f0: 6e 65 77 63 6f 6e 66 69 67 28 29 7b 0a 20 20 73  newconfig(){.  s
9900: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
9910: 77 3b 0a 20 20 69 66 28 20 66 72 65 65 6c 69 73  w;.  if( freelis
9920: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  t==0 ){.    int 
9930: 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d  i;.    int amt =
9940: 20 33 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74   3;.    freelist
9950: 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69   = (struct confi
9960: 67 20 2a 29 63 61 6c 6c 6f 63 28 20 61 6d 74 2c  g *)calloc( amt,
9970: 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 63   sizeof(struct c
9980: 6f 6e 66 69 67 29 20 29 3b 0a 20 20 20 20 69 66  onfig) );.    if
9990: 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b  ( freelist==0 ){
99a0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
99b0: 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f  tderr,"Unable to
99c0: 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
99d0: 20 66 6f 72 20 61 20 6e 65 77 20 63 6f 6e 66 69   for a new confi
99e0: 67 75 72 61 74 69 6f 6e 2e 22 29 3b 0a 20 20 20  guration.");.   
99f0: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
9a00: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
9a10: 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65  <amt-1; i++) fre
9a20: 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20  elist[i].next = 
9a30: 26 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a  &freelist[i+1];.
9a40: 20 20 20 20 66 72 65 65 6c 69 73 74 5b 61 6d 74      freelist[amt
9a50: 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  -1].next = 0;.  
9a60: 7d 0a 20 20 6e 65 77 20 3d 20 66 72 65 65 6c 69  }.  new = freeli
9a70: 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d  st;.  freelist =
9a80: 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b   freelist->next;
9a90: 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d  .  return new;.}
9aa0: 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67 75  ../* The configu
9ab0: 72 61 74 69 6f 6e 20 22 6f 6c 64 22 20 69 73 20  ration "old" is 
9ac0: 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 64 20 2a  no longer used *
9ad0: 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 64  /.PRIVATE void d
9ae0: 65 6c 65 74 65 63 6f 6e 66 69 67 28 6f 6c 64 29  eleteconfig(old)
9af0: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
9b00: 6f 6c 64 3b 0a 7b 0a 20 20 6f 6c 64 2d 3e 6e 65  old;.{.  old->ne
9b10: 78 74 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20  xt = freelist;. 
9b20: 20 66 72 65 65 6c 69 73 74 20 3d 20 6f 6c 64 3b   freelist = old;
9b30: 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  .}../* Initializ
9b40: 65 64 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  ed the configura
9b50: 74 69 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65  tion list builde
9b60: 72 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  r */.void Config
9b70: 6c 69 73 74 5f 69 6e 69 74 28 29 7b 0a 20 20 63  list_init(){.  c
9b80: 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75  urrent = 0;.  cu
9b90: 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72  rrentend = &curr
9ba0: 65 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30  ent;.  basis = 0
9bb0: 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26  ;.  basisend = &
9bc0: 62 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74  basis;.  Configt
9bd0: 61 62 6c 65 5f 69 6e 69 74 28 29 3b 0a 20 20 72  able_init();.  r
9be0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69  eturn;.}../* Ini
9bf0: 74 69 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e  tialized the con
9c00: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
9c10: 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20  builder */.void 
9c20: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74  Configlist_reset
9c30: 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20  (){.  current = 
9c40: 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20  0;.  currentend 
9c50: 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20 20 62 61  = &current;.  ba
9c60: 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73  sis = 0;.  basis
9c70: 65 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a 20 20  end = &basis;.  
9c80: 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61  Configtable_clea
9c90: 72 28 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  r(0);.  return;.
9ca0: 7d 0a 0a 2f 2a 20 41 64 64 20 61 6e 6f 74 68 65  }../* Add anothe
9cb0: 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  r configuration 
9cc0: 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  to the configura
9cd0: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72  tion list */.str
9ce0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
9cf0: 69 67 6c 69 73 74 5f 61 64 64 28 72 70 2c 64 6f  iglist_add(rp,do
9d00: 74 29 0a 73 74 72 75 63 74 20 72 75 6c 65 20 2a  t).struct rule *
9d10: 72 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 75  rp;    /* The ru
9d20: 6c 65 20 2a 2f 0a 69 6e 74 20 64 6f 74 3b 20 20  le */.int dot;  
9d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
9d40: 65 78 20 69 6e 74 6f 20 74 68 65 20 52 48 53 20  ex into the RHS 
9d50: 6f 66 20 74 68 65 20 72 75 6c 65 20 77 68 65 72  of the rule wher
9d60: 65 20 74 68 65 20 64 6f 74 20 67 6f 65 73 20 2a  e the dot goes *
9d70: 2f 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  /.{.  struct con
9d80: 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b  fig *cfp, model;
9d90: 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 72  ..  assert( curr
9da0: 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d  entend!=0 );.  m
9db0: 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20  odel.rp = rp;.  
9dc0: 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b  model.dot = dot;
9dd0: 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 74  .  cfp = Configt
9de0: 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c  able_find(&model
9df0: 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d 30 20  );.  if( cfp==0 
9e00: 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e 65 77  ){.    cfp = new
9e10: 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20 63 66  config();.    cf
9e20: 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20 20  p->rp = rp;.    
9e30: 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a  cfp->dot = dot;.
9e40: 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d 20 53      cfp->fws = S
9e50: 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63 66 70  etNew();.    cfp
9e60: 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20 20 63  ->stp = 0;.    c
9e70: 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e  fp->fplp = cfp->
9e80: 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63 66  bplp = 0;.    cf
9e90: 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20  p->next = 0;.   
9ea0: 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20   cfp->bp = 0;.  
9eb0: 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20    *currentend = 
9ec0: 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65 6e 74  cfp;.    current
9ed0: 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74  end = &cfp->next
9ee0: 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c  ;.    Configtabl
9ef0: 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20  e_insert(cfp);. 
9f00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b   }.  return cfp;
9f10: 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 62 61 73  .}../* Add a bas
9f20: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
9f30: 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72   to the configur
9f40: 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74  ation list */.st
9f50: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
9f60: 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73  figlist_addbasis
9f70: 28 72 70 2c 64 6f 74 29 0a 73 74 72 75 63 74 20  (rp,dot).struct 
9f80: 72 75 6c 65 20 2a 72 70 3b 0a 69 6e 74 20 64 6f  rule *rp;.int do
9f90: 74 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  t;.{.  struct co
9fa0: 6e 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c  nfig *cfp, model
9fb0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 62 61 73  ;..  assert( bas
9fc0: 69 73 65 6e 64 21 3d 30 20 29 3b 0a 20 20 61 73  isend!=0 );.  as
9fd0: 73 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64  sert( currentend
9fe0: 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72  !=0 );.  model.r
9ff0: 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e  p = rp;.  model.
a000: 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70  dot = dot;.  cfp
a010: 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66   = Configtable_f
a020: 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69  ind(&model);.  i
a030: 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20  f( cfp==0 ){.   
a040: 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67   cfp = newconfig
a050: 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 72 70 20  ();.    cfp->rp 
a060: 3d 20 72 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64  = rp;.    cfp->d
a070: 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66  ot = dot;.    cf
a080: 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e 65 77 28  p->fws = SetNew(
a090: 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73 74 70 20  );.    cfp->stp 
a0a0: 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70  = 0;.    cfp->fp
a0b0: 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d  lp = cfp->bplp =
a0c0: 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78   0;.    cfp->nex
a0d0: 74 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e  t = 0;.    cfp->
a0e0: 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72  bp = 0;.    *cur
a0f0: 72 65 6e 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20  rentend = cfp;. 
a100: 20 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20     currentend = 
a110: 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20  &cfp->next;.    
a120: 2a 62 61 73 69 73 65 6e 64 20 3d 20 63 66 70 3b  *basisend = cfp;
a130: 0a 20 20 20 20 62 61 73 69 73 65 6e 64 20 3d 20  .    basisend = 
a140: 26 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20 43 6f  &cfp->bp;.    Co
a150: 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74  nfigtable_insert
a160: 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (cfp);.  }.  ret
a170: 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 43  urn cfp;.}../* C
a180: 6f 6d 70 75 74 65 20 74 68 65 20 63 6c 6f 73 75  ompute the closu
a190: 72 65 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67  re of the config
a1a0: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  uration list */.
a1b0: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
a1c0: 63 6c 6f 73 75 72 65 28 6c 65 6d 70 29 0a 73 74  closure(lemp).st
a1d0: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
a1e0: 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  ;.{.  struct con
a1f0: 66 69 67 20 2a 63 66 70 2c 20 2a 6e 65 77 63 66  fig *cfp, *newcf
a200: 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  p;.  struct rule
a210: 20 2a 72 70 2c 20 2a 6e 65 77 72 70 3b 0a 20 20   *rp, *newrp;.  
a220: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
a230: 70 2c 20 2a 78 73 70 3b 0a 20 20 69 6e 74 20 69  p, *xsp;.  int i
a240: 2c 20 64 6f 74 3b 0a 0a 20 20 61 73 73 65 72 74  , dot;..  assert
a250: 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20  ( currentend!=0 
a260: 29 3b 0a 20 20 66 6f 72 28 63 66 70 3d 63 75 72  );.  for(cfp=cur
a270: 72 65 6e 74 3b 20 63 66 70 3b 20 63 66 70 3d 63  rent; cfp; cfp=c
a280: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 72  fp->next){.    r
a290: 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20 20  p = cfp->rp;.   
a2a0: 20 64 6f 74 20 3d 20 63 66 70 2d 3e 64 6f 74 3b   dot = cfp->dot;
a2b0: 0a 20 20 20 20 69 66 28 20 64 6f 74 3e 3d 72 70  .    if( dot>=rp
a2c0: 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75  ->nrhs ) continu
a2d0: 65 3b 0a 20 20 20 20 73 70 20 3d 20 72 70 2d 3e  e;.    sp = rp->
a2e0: 72 68 73 5b 64 6f 74 5d 3b 0a 20 20 20 20 69 66  rhs[dot];.    if
a2f0: 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54  ( sp->type==NONT
a300: 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
a310: 20 69 66 28 20 73 70 2d 3e 72 75 6c 65 3d 3d 30   if( sp->rule==0
a320: 20 26 26 20 73 70 21 3d 6c 65 6d 70 2d 3e 65 72   && sp!=lemp->er
a330: 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  rsym ){.        
a340: 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66  ErrorMsg(lemp->f
a350: 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 6c 69 6e 65  ilename,rp->line
a360: 2c 22 4e 6f 6e 74 65 72 6d 69 6e 61 6c 20 5c 22  ,"Nonterminal \"
a370: 25 73 5c 22 20 68 61 73 20 6e 6f 20 72 75 6c 65  %s\" has no rule
a380: 73 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 73  s.",.          s
a390: 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p->name);.      
a3a0: 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
a3b0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
a3c0: 20 20 66 6f 72 28 6e 65 77 72 70 3d 73 70 2d 3e    for(newrp=sp->
a3d0: 72 75 6c 65 3b 20 6e 65 77 72 70 3b 20 6e 65 77  rule; newrp; new
a3e0: 72 70 3d 6e 65 77 72 70 2d 3e 6e 65 78 74 6c 68  rp=newrp->nextlh
a3f0: 73 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 63  s){.        newc
a400: 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f  fp = Configlist_
a410: 61 64 64 28 6e 65 77 72 70 2c 30 29 3b 0a 20 20  add(newrp,0);.  
a420: 20 20 20 20 20 20 66 6f 72 28 69 3d 64 6f 74 2b        for(i=dot+
a430: 31 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  1; i<rp->nrhs; i
a440: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78  ++){.          x
a450: 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
a460: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78  .          if( x
a470: 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  sp->type==TERMIN
a480: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
a490: 20 20 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d    SetAdd(newcfp-
a4a0: 3e 66 77 73 2c 78 73 70 2d 3e 69 6e 64 65 78 29  >fws,xsp->index)
a4b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
a4c0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
a4d0: 65 6c 73 65 20 69 66 28 20 78 73 70 2d 3e 74 79  else if( xsp->ty
a4e0: 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
a4f0: 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  L ){.           
a500: 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20 20 20 20   int k;.        
a510: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 78      for(k=0; k<x
a520: 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b  sp->nsubsym; k++
a530: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
a540: 20 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e   SetAdd(newcfp->
a550: 66 77 73 2c 20 78 73 70 2d 3e 73 75 62 73 79 6d  fws, xsp->subsym
a560: 5b 6b 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  [k]->index);.   
a570: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a580: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 20         break;.. 
a590: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a5a0: 20 20 20 20 53 65 74 55 6e 69 6f 6e 28 6e 65 77      SetUnion(new
a5b0: 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 66 69  cfp->fws,xsp->fi
a5c0: 72 73 74 73 65 74 29 3b 0a 20 20 20 20 20 20 20  rstset);.       
a5d0: 20 20 20 20 20 69 66 28 20 78 73 70 2d 3e 6c 61       if( xsp->la
a5e0: 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53  mbda==LEMON_FALS
a5f0: 45 20 29 20 62 72 65 61 6b 3b 0a 09 20 20 7d 0a  E ) break;..  }.
a600: 09 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  .}.        if( i
a610: 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 50 6c 69  ==rp->nrhs ) Pli
a620: 6e 6b 5f 61 64 64 28 26 63 66 70 2d 3e 66 70 6c  nk_add(&cfp->fpl
a630: 70 2c 6e 65 77 63 66 70 29 3b 0a 20 20 20 20 20  p,newcfp);.     
a640: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
a650: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72  eturn;.}../* Sor
a660: 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  t the configurat
a670: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64  ion list */.void
a680: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74   Configlist_sort
a690: 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20  (){.  current = 
a6a0: 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
a6b0: 29 6d 73 6f 72 74 28 28 63 68 61 72 20 2a 29 63  )msort((char *)c
a6c0: 75 72 72 65 6e 74 2c 28 63 68 61 72 20 2a 2a 29  urrent,(char **)
a6d0: 26 28 63 75 72 72 65 6e 74 2d 3e 6e 65 78 74 29  &(current->next)
a6e0: 2c 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20 63  ,Configcmp);.  c
a6f0: 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20  urrentend = 0;. 
a700: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53   return;.}../* S
a710: 6f 72 74 20 74 68 65 20 62 61 73 69 73 20 63 6f  ort the basis co
a720: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
a730: 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c   */.void Configl
a740: 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28 29 7b  ist_sortbasis(){
a750: 0a 20 20 62 61 73 69 73 20 3d 20 28 73 74 72 75  .  basis = (stru
a760: 63 74 20 63 6f 6e 66 69 67 20 2a 29 6d 73 6f 72  ct config *)msor
a770: 74 28 28 63 68 61 72 20 2a 29 63 75 72 72 65 6e  t((char *)curren
a780: 74 2c 28 63 68 61 72 20 2a 2a 29 26 28 63 75 72  t,(char **)&(cur
a790: 72 65 6e 74 2d 3e 62 70 29 2c 43 6f 6e 66 69 67  rent->bp),Config
a7a0: 63 6d 70 29 3b 0a 20 20 62 61 73 69 73 65 6e 64  cmp);.  basisend
a7b0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a   = 0;.  return;.
a7c0: 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
a7d0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
a7e0: 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67  ad of the config
a7f0: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64  uration list and
a800: 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c 69  .** reset the li
a810: 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e  st */.struct con
a820: 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f  fig *Configlist_
a830: 72 65 74 75 72 6e 28 29 7b 0a 20 20 73 74 72 75  return(){.  stru
a840: 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a  ct config *old;.
a850: 20 20 6f 6c 64 20 3d 20 63 75 72 72 65 6e 74 3b    old = current;
a860: 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a  .  current = 0;.
a870: 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30    currentend = 0
a880: 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a  ;.  return old;.
a890: 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
a8a0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
a8b0: 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67  ad of the config
a8c0: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64  uration list and
a8d0: 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c 69  .** reset the li
a8e0: 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e  st */.struct con
a8f0: 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f  fig *Configlist_
a900: 62 61 73 69 73 28 29 7b 0a 20 20 73 74 72 75 63  basis(){.  struc
a910: 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20  t config *old;. 
a920: 20 6f 6c 64 20 3d 20 62 61 73 69 73 3b 0a 20 20   old = basis;.  
a930: 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73  basis = 0;.  bas
a940: 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74  isend = 0;.  ret
a950: 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 46  urn old;.}../* F
a960: 72 65 65 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73  ree all elements
a970: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 6f   of the given co
a980: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
a990: 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c   */.void Configl
a9a0: 69 73 74 5f 65 61 74 28 63 66 70 29 0a 73 74 72  ist_eat(cfp).str
a9b0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
a9c0: 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .{.  struct conf
a9d0: 69 67 20 2a 6e 65 78 74 63 66 70 3b 0a 20 20 66  ig *nextcfp;.  f
a9e0: 6f 72 28 3b 20 63 66 70 3b 20 63 66 70 3d 6e 65  or(; cfp; cfp=ne
a9f0: 78 74 63 66 70 29 7b 0a 20 20 20 20 6e 65 78 74  xtcfp){.    next
aa00: 63 66 70 20 3d 20 63 66 70 2d 3e 6e 65 78 74 3b  cfp = cfp->next;
aa10: 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 66 70  .    assert( cfp
aa20: 2d 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20  ->fplp==0 );.   
aa30: 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e 62 70   assert( cfp->bp
aa40: 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  lp==0 );.    if(
aa50: 20 63 66 70 2d 3e 66 77 73 20 29 20 53 65 74 46   cfp->fws ) SetF
aa60: 72 65 65 28 63 66 70 2d 3e 66 77 73 29 3b 0a 20  ree(cfp->fws);. 
aa70: 20 20 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28     deleteconfig(
aa80: 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  cfp);.  }.  retu
aa90: 72 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  rn;.}./*********
aaa0: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
aab0: 65 20 66 69 6c 65 20 22 65 72 72 6f 72 2e 63 22  e file "error.c"
aac0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
aad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aae0: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66  **/./*.** Code f
aaf0: 6f 72 20 70 72 69 6e 74 69 6e 67 20 65 72 72 6f  or printing erro
ab00: 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 0a 2f  r message..*/../
ab10: 2a 20 46 69 6e 64 20 61 20 67 6f 6f 64 20 70 6c  * Find a good pl
ab20: 61 63 65 20 74 6f 20 62 72 65 61 6b 20 22 6d 73  ace to break "ms
ab30: 67 22 20 73 6f 20 74 68 61 74 20 69 74 73 20 6c  g" so that its l
ab40: 65 6e 67 74 68 20 69 73 20 61 74 20 6c 65 61 73  ength is at leas
ab50: 74 20 22 6d 69 6e 22 0a 2a 2a 20 62 75 74 20 6e  t "min".** but n
ab60: 6f 20 6d 6f 72 65 20 74 68 61 6e 20 22 6d 61 78  o more than "max
ab70: 22 2e 20 20 4d 61 6b 65 20 74 68 65 20 70 6f 69  ".  Make the poi
ab80: 6e 74 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 6d  nt as close to m
ab90: 61 78 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 0a  ax as possible..
aba0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
abb0: 6e 64 62 72 65 61 6b 28 6d 73 67 2c 6d 69 6e 2c  ndbreak(msg,min,
abc0: 6d 61 78 29 0a 63 68 61 72 20 2a 6d 73 67 3b 0a  max).char *msg;.
abd0: 69 6e 74 20 6d 69 6e 3b 0a 69 6e 74 20 6d 61 78  int min;.int max
abe0: 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 73 70 6f 74  ;.{.  int i,spot
abf0: 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 66 6f  ;.  char c;.  fo
ac00: 72 28 69 3d 73 70 6f 74 3d 6d 69 6e 3b 20 69 3c  r(i=spot=min; i<
ac10: 3d 6d 61 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  =max; i++){.    
ac20: 63 20 3d 20 6d 73 67 5b 69 5d 3b 0a 20 20 20 20  c = msg[i];.    
ac30: 69 66 28 20 63 3d 3d 27 5c 74 27 20 29 20 6d 73  if( c=='\t' ) ms
ac40: 67 5b 69 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  g[i] = ' ';.    
ac50: 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 20 6d  if( c=='\n' ){ m
ac60: 73 67 5b 69 5d 20 3d 20 27 20 27 3b 20 73 70 6f  sg[i] = ' '; spo
ac70: 74 20 3d 20 69 3b 20 62 72 65 61 6b 3b 20 7d 0a  t = i; break; }.
ac80: 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 20      if( c==0 ){ 
ac90: 73 70 6f 74 20 3d 20 69 3b 20 62 72 65 61 6b 3b  spot = i; break;
aca0: 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2d   }.    if( c=='-
acb0: 27 20 26 26 20 69 3c 6d 61 78 2d 31 20 29 20 73  ' && i<max-1 ) s
acc0: 70 6f 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 69  pot = i+1;.    i
acd0: 66 28 20 63 3d 3d 27 20 27 20 29 20 73 70 6f 74  f( c==' ' ) spot
ace0: 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = i;.  }.  retu
acf0: 72 6e 20 73 70 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn spot;.}../*.*
ad00: 2a 20 54 68 65 20 65 72 72 6f 72 20 6d 65 73 73  * The error mess
ad10: 61 67 65 20 69 73 20 73 70 6c 69 74 20 61 63 72  age is split acr
ad20: 6f 73 73 20 6d 75 6c 74 69 70 6c 65 20 6c 69 6e  oss multiple lin
ad30: 65 73 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  es if necessary.
ad40: 20 20 54 68 65 0a 2a 2a 20 73 70 6c 69 74 73 20    The.** splits 
ad50: 6f 63 63 75 72 20 61 74 20 61 20 73 70 61 63 65  occur at a space
ad60: 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  , if there is a 
ad70: 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
ad80: 6e 65 61 72 20 74 68 65 20 65 6e 64 0a 2a 2a 20  near the end.** 
ad90: 6f 66 20 74 68 65 20 6c 69 6e 65 2e 0a 2a 2f 0a  of the line..*/.
ada0: 23 64 65 66 69 6e 65 20 45 52 52 4d 53 47 53 49  #define ERRMSGSI
adb0: 5a 45 20 20 31 30 30 30 30 20 2f 2a 20 48 6f 70  ZE  10000 /* Hop
adc0: 65 20 74 68 69 73 20 69 73 20 62 69 67 20 65 6e  e this is big en
add0: 6f 75 67 68 2e 20 20 4e 6f 20 77 61 79 20 74 6f  ough.  No way to
ade0: 20 65 72 72 6f 72 20 63 68 65 63 6b 20 2a 2f 0a   error check */.
adf0: 23 64 65 66 69 6e 65 20 4c 49 4e 45 57 49 44 54  #define LINEWIDT
ae00: 48 20 20 20 20 20 20 37 39 20 2f 2a 20 4d 61 78  H      79 /* Max
ae10: 20 77 69 64 74 68 20 6f 66 20 61 6e 79 20 6f 75   width of any ou
ae20: 74 70 75 74 20 6c 69 6e 65 20 2a 2f 0a 23 64 65  tput line */.#de
ae30: 66 69 6e 65 20 50 52 45 46 49 58 4c 49 4d 49 54  fine PREFIXLIMIT
ae40: 20 20 20 20 33 30 20 2f 2a 20 4d 61 78 20 77 69      30 /* Max wi
ae50: 64 74 68 20 6f 66 20 74 68 65 20 70 72 65 66 69  dth of the prefi
ae60: 78 20 6f 6e 20 65 61 63 68 20 6c 69 6e 65 20 2a  x on each line *
ae70: 2f 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28  /.void ErrorMsg(
ae80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
ae90: 6e 61 6d 65 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f  name, int lineno
aea0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f  , const char *fo
aeb0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68  rmat, ...){.  ch
aec0: 61 72 20 65 72 72 6d 73 67 5b 45 52 52 4d 53 47  ar errmsg[ERRMSG
aed0: 53 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70 72  SIZE];.  char pr
aee0: 65 66 69 78 5b 50 52 45 46 49 58 4c 49 4d 49 54  efix[PREFIXLIMIT
aef0: 2b 31 30 5d 3b 0a 20 20 69 6e 74 20 65 72 72 6d  +10];.  int errm
af00: 73 67 73 69 7a 65 3b 0a 20 20 69 6e 74 20 70 72  sgsize;.  int pr
af10: 65 66 69 78 73 69 7a 65 3b 0a 20 20 69 6e 74 20  efixsize;.  int 
af20: 61 76 61 69 6c 61 62 6c 65 77 69 64 74 68 3b 0a  availablewidth;.
af30: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
af40: 69 6e 74 20 65 6e 64 2c 20 72 65 73 74 61 72 74  int end, restart
af50: 2c 20 62 61 73 65 3b 0a 0a 20 20 76 61 5f 73 74  , base;..  va_st
af60: 61 72 74 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b  art(ap, format);
af70: 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 61 20  .  /* Prepare a 
af80: 70 72 65 66 69 78 20 74 6f 20 62 65 20 70 72 65  prefix to be pre
af90: 70 65 6e 64 65 64 20 74 6f 20 65 76 65 72 79 20  pended to every 
afa0: 6f 75 74 70 75 74 20 6c 69 6e 65 20 2a 2f 0a 20  output line */. 
afb0: 20 69 66 28 20 6c 69 6e 65 6e 6f 3e 30 20 29 7b   if( lineno>0 ){
afc0: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 70 72 65  .    sprintf(pre
afd0: 66 69 78 2c 22 25 2e 2a 73 3a 25 64 3a 20 22 2c  fix,"%.*s:%d: ",
afe0: 50 52 45 46 49 58 4c 49 4d 49 54 2d 31 30 2c 66  PREFIXLIMIT-10,f
aff0: 69 6c 65 6e 61 6d 65 2c 6c 69 6e 65 6e 6f 29 3b  ilename,lineno);
b000: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70  .  }else{.    sp
b010: 72 69 6e 74 66 28 70 72 65 66 69 78 2c 22 25 2e  rintf(prefix,"%.
b020: 2a 73 3a 20 22 2c 50 52 45 46 49 58 4c 49 4d 49  *s: ",PREFIXLIMI
b030: 54 2d 31 30 2c 66 69 6c 65 6e 61 6d 65 29 3b 0a  T-10,filename);.
b040: 20 20 7d 0a 20 20 70 72 65 66 69 78 73 69 7a 65    }.  prefixsize
b050: 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70   = lemonStrlen(p
b060: 72 65 66 69 78 29 3b 0a 20 20 61 76 61 69 6c 61  refix);.  availa
b070: 62 6c 65 77 69 64 74 68 20 3d 20 4c 49 4e 45 57  blewidth = LINEW
b080: 49 44 54 48 20 2d 20 70 72 65 66 69 78 73 69 7a  IDTH - prefixsiz
b090: 65 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  e;..  /* Generat
b0a0: 65 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  e the error mess
b0b0: 61 67 65 20 2a 2f 0a 20 20 76 73 70 72 69 6e 74  age */.  vsprint
b0c0: 66 28 65 72 72 6d 73 67 2c 66 6f 72 6d 61 74 2c  f(errmsg,format,
b0d0: 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70  ap);.  va_end(ap
b0e0: 29 3b 0a 20 20 65 72 72 6d 73 67 73 69 7a 65 20  );.  errmsgsize 
b0f0: 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 65 72  = lemonStrlen(er
b100: 72 6d 73 67 29 3b 0a 20 20 2f 2a 20 52 65 6d 6f  rmsg);.  /* Remo
b110: 76 65 20 74 72 61 69 6c 69 6e 67 20 27 5c 6e 27  ve trailing '\n'
b120: 73 20 66 72 6f 6d 20 74 68 65 20 65 72 72 6f 72  s from the error
b130: 20 6d 65 73 73 61 67 65 2e 20 2a 2f 0a 20 20 77   message. */.  w
b140: 68 69 6c 65 28 20 65 72 72 6d 73 67 73 69 7a 65  hile( errmsgsize
b150: 3e 30 20 26 26 20 65 72 72 6d 73 67 5b 65 72 72  >0 && errmsg[err
b160: 6d 73 67 73 69 7a 65 2d 31 5d 3d 3d 27 5c 6e 27  msgsize-1]=='\n'
b170: 20 29 7b 0a 20 20 20 20 20 65 72 72 6d 73 67 5b   ){.     errmsg[
b180: 2d 2d 65 72 72 6d 73 67 73 69 7a 65 5d 20 3d 20  --errmsgsize] = 
b190: 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69  0;.  }..  /* Pri
b1a0: 6e 74 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  nt the error mes
b1b0: 73 61 67 65 20 2a 2f 0a 20 20 62 61 73 65 20 3d  sage */.  base =
b1c0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 65 72 72   0;.  while( err
b1d0: 6d 73 67 5b 62 61 73 65 5d 21 3d 30 20 29 7b 0a  msg[base]!=0 ){.
b1e0: 20 20 20 20 65 6e 64 20 3d 20 72 65 73 74 61 72      end = restar
b1f0: 74 20 3d 20 66 69 6e 64 62 72 65 61 6b 28 26 65  t = findbreak(&e
b200: 72 72 6d 73 67 5b 62 61 73 65 5d 2c 30 2c 61 76  rrmsg[base],0,av
b210: 61 69 6c 61 62 6c 65 77 69 64 74 68 29 3b 0a 20  ailablewidth);. 
b220: 20 20 20 72 65 73 74 61 72 74 20 2b 3d 20 62 61     restart += ba
b230: 73 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 65  se;.    while( e
b240: 72 72 6d 73 67 5b 72 65 73 74 61 72 74 5d 3d 3d  rrmsg[restart]==
b250: 27 20 27 20 29 20 72 65 73 74 61 72 74 2b 2b 3b  ' ' ) restart++;
b260: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
b270: 6f 75 74 2c 22 25 73 25 2e 2a 73 5c 6e 22 2c 70  out,"%s%.*s\n",p
b280: 72 65 66 69 78 2c 65 6e 64 2c 26 65 72 72 6d 73  refix,end,&errms
b290: 67 5b 62 61 73 65 5d 29 3b 0a 20 20 20 20 62 61  g[base]);.    ba
b2a0: 73 65 20 3d 20 72 65 73 74 61 72 74 3b 0a 20 20  se = restart;.  
b2b0: 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}./***********
b2c0: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
b2d0: 69 6c 65 20 22 6d 61 69 6e 2e 63 22 20 2a 2a 2a  ile "main.c" ***
b2e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b2f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b300: 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e 20 70 72  */./*.** Main pr
b310: 6f 67 72 61 6d 20 66 69 6c 65 20 66 6f 72 20 74  ogram file for t
b320: 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20  he LEMON parser 
b330: 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f  generator..*/../
b340: 2a 20 52 65 70 6f 72 74 20 61 6e 20 6f 75 74 2d  * Report an out-
b350: 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e 64 69 74  of-memory condit
b360: 69 6f 6e 20 61 6e 64 20 61 62 6f 72 74 2e 20 20  ion and abort.  
b370: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
b380: 20 69 73 20 75 73 65 64 20 6d 6f 73 74 6c 79 20   is used mostly 
b390: 62 79 20 74 68 65 20 22 4d 65 6d 6f 72 79 43 68  by the "MemoryCh
b3a0: 65 63 6b 22 20 6d 61 63 72 6f 20 69 6e 20 73 74  eck" macro in st
b3b0: 72 75 63 74 2e 68 0a 2a 2f 0a 76 6f 69 64 20 6d  ruct.h.*/.void m
b3c0: 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 7b 0a 20  emory_error(){. 
b3d0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
b3e0: 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20  "Out of memory. 
b3f0: 20 41 62 6f 72 74 69 6e 67 2e 2e 2e 5c 6e 22 29   Aborting...\n")
b400: 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a  ;.  exit(1);.}..
b410: 73 74 61 74 69 63 20 69 6e 74 20 6e 44 65 66 69  static int nDefi
b420: 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ne = 0;      /* 
b430: 4e 75 6d 62 65 72 20 6f 66 20 2d 44 20 6f 70 74  Number of -D opt
b440: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  ions on the comm
b450: 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a 73 74 61 74  and line */.stat
b460: 69 63 20 63 68 61 72 20 2a 2a 61 7a 44 65 66 69  ic char **azDefi
b470: 6e 65 20 3d 20 30 3b 20 20 2f 2a 20 4e 61 6d 65  ne = 0;  /* Name
b480: 20 6f 66 20 74 68 65 20 2d 44 20 6d 61 63 72 6f   of the -D macro
b490: 73 20 2a 2f 0a 0a 2f 2a 20 54 68 69 73 20 72 6f  s */../* This ro
b4a0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
b4b0: 77 69 74 68 20 74 68 65 20 61 72 67 75 6d 65 6e  with the argumen
b4c0: 74 20 74 6f 20 65 61 63 68 20 2d 44 20 63 6f 6d  t to each -D com
b4d0: 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand-line option
b4e0: 2e 0a 2a 2a 20 41 64 64 20 74 68 65 20 6d 61 63  ..** Add the mac
b4f0: 72 6f 20 64 65 66 69 6e 65 64 20 74 6f 20 74 68  ro defined to th
b500: 65 20 61 7a 44 65 66 69 6e 65 20 61 72 72 61 79  e azDefine array
b510: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b520: 20 68 61 6e 64 6c 65 5f 44 5f 6f 70 74 69 6f 6e   handle_D_option
b530: 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 68 61  (char *z){.  cha
b540: 72 20 2a 2a 70 61 7a 3b 0a 20 20 6e 44 65 66 69  r **paz;.  nDefi
b550: 6e 65 2b 2b 3b 0a 20 20 61 7a 44 65 66 69 6e 65  ne++;.  azDefine
b560: 20 3d 20 72 65 61 6c 6c 6f 63 28 61 7a 44 65 66   = realloc(azDef
b570: 69 6e 65 2c 20 73 69 7a 65 6f 66 28 61 7a 44 65  ine, sizeof(azDe
b580: 66 69 6e 65 5b 30 5d 29 2a 6e 44 65 66 69 6e 65  fine[0])*nDefine
b590: 29 3b 0a 20 20 69 66 28 20 61 7a 44 65 66 69 6e  );.  if( azDefin
b5a0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  e==0 ){.    fpri
b5b0: 6e 74 66 28 73 74 64 65 72 72 2c 22 6f 75 74 20  ntf(stderr,"out 
b5c0: 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20  of memory\n");. 
b5d0: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
b5e0: 20 20 70 61 7a 20 3d 20 26 61 7a 44 65 66 69 6e    paz = &azDefin
b5f0: 65 5b 6e 44 65 66 69 6e 65 2d 31 5d 3b 0a 20 20  e[nDefine-1];.  
b600: 2a 70 61 7a 20 3d 20 6d 61 6c 6c 6f 63 28 20 6c  *paz = malloc( l
b610: 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 29 2b 31 20  emonStrlen(z)+1 
b620: 29 3b 0a 20 20 69 66 28 20 2a 70 61 7a 3d 3d 30  );.  if( *paz==0
b630: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
b640: 73 74 64 65 72 72 2c 22 6f 75 74 20 6f 66 20 6d  stderr,"out of m
b650: 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65  emory\n");.    e
b660: 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 73 74  xit(1);.  }.  st
b670: 72 63 70 79 28 2a 70 61 7a 2c 20 7a 29 3b 0a 20  rcpy(*paz, z);. 
b680: 20 66 6f 72 28 7a 3d 2a 70 61 7a 3b 20 2a 7a 20   for(z=*paz; *z 
b690: 26 26 20 2a 7a 21 3d 27 3d 27 3b 20 7a 2b 2b 29  && *z!='='; z++)
b6a0: 7b 7d 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a  {}.  *z = 0;.}..
b6b0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 73 65  static char *use
b6c0: 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20 3d  r_templatename =
b6d0: 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 76 6f   NULL;.static vo
b6e0: 69 64 20 68 61 6e 64 6c 65 5f 54 5f 6f 70 74 69  id handle_T_opti
b6f0: 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75  on(char *z){.  u
b700: 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65  ser_templatename
b710: 20 3d 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e   = malloc( lemon
b720: 53 74 72 6c 65 6e 28 7a 29 2b 31 20 29 3b 0a 20  Strlen(z)+1 );. 
b730: 20 69 66 28 20 75 73 65 72 5f 74 65 6d 70 6c 61   if( user_templa
b740: 74 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  tename==0 ){.   
b750: 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b   memory_error();
b760: 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28 75 73  .  }.  strcpy(us
b770: 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c  er_templatename,
b780: 20 7a 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6d   z);.}../* The m
b790: 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 20 50 61  ain program.  Pa
b7a0: 72 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  rse the command 
b7b0: 6c 69 6e 65 20 61 6e 64 20 64 6f 20 69 74 2e 2e  line and do it..
b7c0: 2e 20 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28 61 72  . */.int main(ar
b7d0: 67 63 2c 61 72 67 76 29 0a 69 6e 74 20 61 72 67  gc,argv).int arg
b7e0: 63 3b 0a 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a  c;.char **argv;.
b7f0: 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 76  {.  static int v
b800: 65 72 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73 74  ersion = 0;.  st
b810: 61 74 69 63 20 69 6e 74 20 72 70 66 6c 61 67 20  atic int rpflag 
b820: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
b830: 74 20 62 61 73 69 73 66 6c 61 67 20 3d 20 30 3b  t basisflag = 0;
b840: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6f  .  static int co
b850: 6d 70 72 65 73 73 20 3d 20 30 3b 0a 20 20 73 74  mpress = 0;.  st
b860: 61 74 69 63 20 69 6e 74 20 71 75 69 65 74 20 3d  atic int quiet =
b870: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
b880: 20 73 74 61 74 69 73 74 69 63 73 20 3d 20 30 3b   statistics = 0;
b890: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6d 68  .  static int mh
b8a0: 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74  flag = 0;.  stat
b8b0: 69 63 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73  ic int nolinenos
b8c0: 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74  flag = 0;.  stat
b8d0: 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69  ic struct s_opti
b8e0: 6f 6e 73 20 6f 70 74 69 6f 6e 73 5b 5d 20 3d 20  ons options[] = 
b8f0: 7b 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  {.    {OPT_FLAG,
b900: 20 22 62 22 2c 20 28 63 68 61 72 2a 29 26 62 61   "b", (char*)&ba
b910: 73 69 73 66 6c 61 67 2c 20 22 50 72 69 6e 74 20  sisflag, "Print 
b920: 6f 6e 6c 79 20 74 68 65 20 62 61 73 69 73 20 69  only the basis i
b930: 6e 20 72 65 70 6f 72 74 2e 22 7d 2c 0a 20 20 20  n report."},.   
b940: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 63 22 2c   {OPT_FLAG, "c",
b950: 20 28 63 68 61 72 2a 29 26 63 6f 6d 70 72 65 73   (char*)&compres
b960: 73 2c 20 22 44 6f 6e 27 74 20 63 6f 6d 70 72 65  s, "Don't compre
b970: 73 73 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  ss the action ta
b980: 62 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ble."},.    {OPT
b990: 5f 46 53 54 52 2c 20 22 44 22 2c 20 28 63 68 61  _FSTR, "D", (cha
b9a0: 72 2a 29 68 61 6e 64 6c 65 5f 44 5f 6f 70 74 69  r*)handle_D_opti
b9b0: 6f 6e 2c 20 22 44 65 66 69 6e 65 20 61 6e 20 25  on, "Define an %
b9c0: 69 66 64 65 66 20 6d 61 63 72 6f 2e 22 7d 2c 0a  ifdef macro."},.
b9d0: 20 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22      {OPT_FSTR, "
b9e0: 54 22 2c 20 28 63 68 61 72 2a 29 68 61 6e 64 6c  T", (char*)handl
b9f0: 65 5f 54 5f 6f 70 74 69 6f 6e 2c 20 22 53 70 65  e_T_option, "Spe
ba00: 63 69 66 79 20 61 20 74 65 6d 70 6c 61 74 65 20  cify a template 
ba10: 66 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  file."},.    {OP
ba20: 54 5f 46 4c 41 47 2c 20 22 67 22 2c 20 28 63 68  T_FLAG, "g", (ch
ba30: 61 72 2a 29 26 72 70 66 6c 61 67 2c 20 22 50 72  ar*)&rpflag, "Pr
ba40: 69 6e 74 20 67 72 61 6d 6d 61 72 20 77 69 74 68  int grammar with
ba50: 6f 75 74 20 61 63 74 69 6f 6e 73 2e 22 7d 2c 0a  out actions."},.
ba60: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
ba70: 6d 22 2c 20 28 63 68 61 72 2a 29 26 6d 68 66 6c  m", (char*)&mhfl
ba80: 61 67 2c 20 22 4f 75 74 70 75 74 20 61 20 6d 61  ag, "Output a ma
ba90: 6b 65 68 65 61 64 65 72 73 20 63 6f 6d 70 61 74  keheaders compat
baa0: 69 62 6c 65 20 66 69 6c 65 2e 22 7d 2c 0a 20 20  ible file."},.  
bab0: 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 6c 22    {OPT_FLAG, "l"
bac0: 2c 20 28 63 68 61 72 2a 29 26 6e 6f 6c 69 6e 65  , (char*)&noline
bad0: 6e 6f 73 66 6c 61 67 2c 20 22 44 6f 20 6e 6f 74  nosflag, "Do not
bae0: 20 70 72 69 6e 74 20 23 6c 69 6e 65 20 73 74 61   print #line sta
baf0: 74 65 6d 65 6e 74 73 2e 22 7d 2c 0a 20 20 20 20  tements."},.    
bb00: 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 71 22 2c 20  {OPT_FLAG, "q", 
bb10: 28 63 68 61 72 2a 29 26 71 75 69 65 74 2c 20 22  (char*)&quiet, "
bb20: 28 51 75 69 65 74 29 20 44 6f 6e 27 74 20 70 72  (Quiet) Don't pr
bb30: 69 6e 74 20 74 68 65 20 72 65 70 6f 72 74 20 66  int the report f
bb40: 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ile."},.    {OPT
bb50: 5f 46 4c 41 47 2c 20 22 73 22 2c 20 28 63 68 61  _FLAG, "s", (cha
bb60: 72 2a 29 26 73 74 61 74 69 73 74 69 63 73 2c 0a  r*)&statistics,.
bb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 20 22 50 72 69 6e 74 20 70 61 72 73 65 72     "Print parser
bba0: 20 73 74 61 74 73 20 74 6f 20 73 74 61 6e 64 61   stats to standa
bbb0: 72 64 20 6f 75 74 70 75 74 2e 22 7d 2c 0a 20 20  rd output."},.  
bbc0: 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 78 22    {OPT_FLAG, "x"
bbd0: 2c 20 28 63 68 61 72 2a 29 26 76 65 72 73 69 6f  , (char*)&versio
bbe0: 6e 2c 20 22 50 72 69 6e 74 20 74 68 65 20 76 65  n, "Print the ve
bbf0: 72 73 69 6f 6e 20 6e 75 6d 62 65 72 2e 22 7d 2c  rsion number."},
bc00: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 30  .    {OPT_FLAG,0
bc10: 2c 30 2c 30 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74  ,0,0}.  };.  int
bc20: 20 69 3b 0a 20 20 69 6e 74 20 65 78 69 74 63 6f   i;.  int exitco
bc30: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 6c 65 6d  de;.  struct lem
bc40: 6f 6e 20 6c 65 6d 3b 0a 0a 20 20 4f 70 74 49 6e  on lem;..  OptIn
bc50: 69 74 28 61 72 67 76 2c 6f 70 74 69 6f 6e 73 2c  it(argv,options,
bc60: 73 74 64 65 72 72 29 3b 0a 20 20 69 66 28 20 76  stderr);.  if( v
bc70: 65 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 70  ersion ){.     p
bc80: 72 69 6e 74 66 28 22 4c 65 6d 6f 6e 20 76 65 72  rintf("Lemon ver
bc90: 73 69 6f 6e 20 31 2e 30 5c 6e 22 29 3b 0a 20 20  sion 1.0\n");.  
bca0: 20 20 20 65 78 69 74 28 30 29 3b 20 0a 20 20 7d     exit(0); .  }
bcb0: 0a 20 20 69 66 28 20 4f 70 74 4e 41 72 67 73 28  .  if( OptNArgs(
bcc0: 29 21 3d 31 20 29 7b 0a 20 20 20 20 66 70 72 69  )!=1 ){.    fpri
bcd0: 6e 74 66 28 73 74 64 65 72 72 2c 22 45 78 61 63  ntf(stderr,"Exac
bce0: 74 6c 79 20 6f 6e 65 20 66 69 6c 65 6e 61 6d 65  tly one filename
bcf0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 72 65 71   argument is req
bd00: 75 69 72 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20  uired.\n");.    
bd10: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6d  exit(1);.  }.  m
bd20: 65 6d 73 65 74 28 26 6c 65 6d 2c 20 30 2c 20 73  emset(&lem, 0, s
bd30: 69 7a 65 6f 66 28 6c 65 6d 29 29 3b 0a 20 20 6c  izeof(lem));.  l
bd40: 65 6d 2e 65 72 72 6f 72 63 6e 74 20 3d 20 30 3b  em.errorcnt = 0;
bd50: 0a 20 20 6c 65 6d 2e 6e 65 78 70 65 63 74 65 64  .  lem.nexpected
bd60: 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49 6e 69   = -1;..  /* Ini
bd70: 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 61 63 68  tialize the mach
bd80: 69 6e 65 20 2a 2f 0a 20 20 53 74 72 73 61 66 65  ine */.  Strsafe
bd90: 5f 69 6e 69 74 28 29 3b 0a 20 20 53 79 6d 62 6f  _init();.  Symbo
bda0: 6c 5f 69 6e 69 74 28 29 3b 0a 20 20 53 74 61 74  l_init();.  Stat
bdb0: 65 5f 69 6e 69 74 28 29 3b 0a 20 20 6c 65 6d 2e  e_init();.  lem.
bdc0: 61 72 67 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b  argv0 = argv[0];
bdd0: 0a 20 20 6c 65 6d 2e 66 69 6c 65 6e 61 6d 65 20  .  lem.filename 
bde0: 3d 20 4f 70 74 41 72 67 28 30 29 3b 0a 20 20 6c  = OptArg(0);.  l
bdf0: 65 6d 2e 62 61 73 69 73 66 6c 61 67 20 3d 20 62  em.basisflag = b
be00: 61 73 69 73 66 6c 61 67 3b 0a 20 20 6c 65 6d 2e  asisflag;.  lem.
be10: 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20 3d 20  nolinenosflag = 
be20: 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 3b 0a 20  nolinenosflag;. 
be30: 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 24 22 29   Symbol_new("$")
be40: 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d 20 3d  ;.  lem.errsym =
be50: 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 65 72 72   Symbol_new("err
be60: 6f 72 22 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 73  or");.  lem.errs
be70: 79 6d 2d 3e 75 73 65 43 6e 74 20 3d 20 30 3b 0a  ym->useCnt = 0;.
be80: 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20  .  /* Parse the 
be90: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
bea0: 50 61 72 73 65 28 26 6c 65 6d 29 3b 0a 20 20 69  Parse(&lem);.  i
beb0: 66 28 20 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20  f( lem.errorcnt 
bec0: 29 20 65 78 69 74 28 6c 65 6d 2e 65 72 72 6f 72  ) exit(lem.error
bed0: 63 6e 74 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e  cnt);.  if( lem.
bee0: 6e 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nrule==0 ){.    
bef0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
bf00: 45 6d 70 74 79 20 67 72 61 6d 6d 61 72 2e 5c 6e  Empty grammar.\n
bf10: 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
bf20: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 75 6e 74  .  }..  /* Count
bf30: 20 61 6e 64 20 69 6e 64 65 78 20 74 68 65 20 73   and index the s
bf40: 79 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20 67 72  ymbols of the gr
bf50: 61 6d 6d 61 72 20 2a 2f 0a 20 20 6c 65 6d 2e 6e  ammar */.  lem.n
bf60: 73 79 6d 62 6f 6c 20 3d 20 53 79 6d 62 6f 6c 5f  symbol = Symbol_
bf70: 63 6f 75 6e 74 28 29 3b 0a 20 20 53 79 6d 62 6f  count();.  Symbo
bf80: 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c 74 7d  l_new("{default}
bf90: 22 29 3b 0a 20 20 6c 65 6d 2e 73 79 6d 62 6f 6c  ");.  lem.symbol
bfa0: 73 20 3d 20 53 79 6d 62 6f 6c 5f 61 72 72 61 79  s = Symbol_array
bfb0: 6f 66 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  of();.  for(i=0;
bfc0: 20 69 3c 3d 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 3b   i<=lem.nsymbol;
bfd0: 20 69 2b 2b 29 20 6c 65 6d 2e 73 79 6d 62 6f 6c   i++) lem.symbol
bfe0: 73 5b 69 5d 2d 3e 69 6e 64 65 78 20 3d 20 69 3b  s[i]->index = i;
bff0: 0a 20 20 71 73 6f 72 74 28 6c 65 6d 2e 73 79 6d  .  qsort(lem.sym
c000: 62 6f 6c 73 2c 6c 65 6d 2e 6e 73 79 6d 62 6f 6c  bols,lem.nsymbol
c010: 2b 31 2c 73 69 7a 65 6f 66 28 73 74 72 75 63 74  +1,sizeof(struct
c020: 20 73 79 6d 62 6f 6c 2a 29 2c 0a 20 20 20 20 20   symbol*),.     
c030: 20 20 20 28 69 6e 74 28 2a 29 28 29 29 53 79 6d     (int(*)())Sym
c040: 62 6f 6c 63 6d 70 70 29 3b 0a 20 20 66 6f 72 28  bolcmpp);.  for(
c050: 69 3d 30 3b 20 69 3c 3d 6c 65 6d 2e 6e 73 79 6d  i=0; i<=lem.nsym
c060: 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e 73 79  bol; i++) lem.sy
c070: 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65 78 20  mbols[i]->index 
c080: 3d 20 69 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  = i;.  for(i=1; 
c090: 69 73 75 70 70 65 72 28 6c 65 6d 2e 73 79 6d 62  isupper(lem.symb
c0a0: 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 5b 30 5d 29  ols[i]->name[0])
c0b0: 3b 20 69 2b 2b 29 3b 0a 20 20 6c 65 6d 2e 6e 74  ; i++);.  lem.nt
c0c0: 65 72 6d 69 6e 61 6c 20 3d 20 69 3b 0a 0a 20 20  erminal = i;..  
c0d0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 72 65  /* Generate a re
c0e0: 70 72 69 6e 74 20 6f 66 20 74 68 65 20 67 72 61  print of the gra
c0f0: 6d 6d 61 72 2c 20 69 66 20 72 65 71 75 65 73 74  mmar, if request
c100: 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  ed on the comman
c110: 64 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20  d line */.  if( 
c120: 72 70 66 6c 61 67 20 29 7b 0a 20 20 20 20 52 65  rpflag ){.    Re
c130: 70 72 69 6e 74 28 26 6c 65 6d 29 3b 0a 20 20 7d  print(&lem);.  }
c140: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69  else{.    /* Ini
c150: 74 69 61 6c 69 7a 65 20 74 68 65 20 73 69 7a 65  tialize the size
c160: 20 66 6f 72 20 61 6c 6c 20 66 6f 6c 6c 6f 77 20   for all follow 
c170: 61 6e 64 20 66 69 72 73 74 20 73 65 74 73 20 2a  and first sets *
c180: 2f 0a 20 20 20 20 53 65 74 53 69 7a 65 28 6c 65  /.    SetSize(le
c190: 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2b 31 29 3b 0a  m.nterminal+1);.
c1a0: 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  .    /* Find the
c1b0: 20 70 72 65 63 65 64 65 6e 63 65 20 66 6f 72 20   precedence for 
c1c0: 65 76 65 72 79 20 70 72 6f 64 75 63 74 69 6f 6e  every production
c1d0: 20 72 75 6c 65 20 28 74 68 61 74 20 68 61 73 20   rule (that has 
c1e0: 6f 6e 65 29 20 2a 2f 0a 20 20 20 20 46 69 6e 64  one) */.    Find
c1f0: 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73 28  RulePrecedences(
c200: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  &lem);..    /* C
c210: 6f 6d 70 75 74 65 20 74 68 65 20 6c 61 6d 62 64  ompute the lambd
c220: 61 2d 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 61  a-nonterminals a
c230: 6e 64 20 74 68 65 20 66 69 72 73 74 2d 73 65 74  nd the first-set
c240: 73 20 66 6f 72 20 65 76 65 72 79 0a 20 20 20 20  s for every.    
c250: 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 2a  ** nonterminal *
c260: 2f 0a 20 20 20 20 46 69 6e 64 46 69 72 73 74 53  /.    FindFirstS
c270: 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  ets(&lem);..    
c280: 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c  /* Compute all L
c290: 52 28 30 29 20 73 74 61 74 65 73 2e 20 20 41 6c  R(0) states.  Al
c2a0: 73 6f 20 72 65 63 6f 72 64 20 66 6f 6c 6c 6f 77  so record follow
c2b0: 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e  -set propagation
c2c0: 0a 20 20 20 20 2a 2a 20 6c 69 6e 6b 73 20 73 6f  .    ** links so
c2d0: 20 74 68 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77   that the follow
c2e0: 2d 73 65 74 20 63 61 6e 20 62 65 20 63 6f 6d 70  -set can be comp
c2f0: 75 74 65 64 20 6c 61 74 65 72 20 2a 2f 0a 20 20  uted later */.  
c300: 20 20 6c 65 6d 2e 6e 73 74 61 74 65 20 3d 20 30    lem.nstate = 0
c310: 3b 0a 20 20 20 20 46 69 6e 64 53 74 61 74 65 73  ;.    FindStates
c320: 28 26 6c 65 6d 29 3b 0a 20 20 20 20 6c 65 6d 2e  (&lem);.    lem.
c330: 73 6f 72 74 65 64 20 3d 20 53 74 61 74 65 5f 61  sorted = State_a
c340: 72 72 61 79 6f 66 28 29 3b 0a 0a 20 20 20 20 2f  rrayof();..    /
c350: 2a 20 54 69 65 20 75 70 20 6c 6f 6f 73 65 20 65  * Tie up loose e
c360: 6e 64 73 20 6f 6e 20 74 68 65 20 70 72 6f 70 61  nds on the propa
c370: 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a  gation links */.
c380: 20 20 20 20 46 69 6e 64 4c 69 6e 6b 73 28 26 6c      FindLinks(&l
c390: 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  em);..    /* Com
c3a0: 70 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77 20  pute the follow 
c3b0: 73 65 74 20 6f 66 20 65 76 65 72 79 20 72 65 64  set of every red
c3c0: 75 63 69 62 6c 65 20 63 6f 6e 66 69 67 75 72 61  ucible configura
c3d0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 46 69 6e 64  tion */.    Find
c3e0: 46 6f 6c 6c 6f 77 53 65 74 73 28 26 6c 65 6d 29  FollowSets(&lem)
c3f0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  ;..    /* Comput
c400: 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  e the action tab
c410: 6c 65 73 20 2a 2f 0a 20 20 20 20 46 69 6e 64 41  les */.    FindA
c420: 63 74 69 6f 6e 73 28 26 6c 65 6d 29 3b 0a 0a 20  ctions(&lem);.. 
c430: 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 20 74     /* Compress t
c440: 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73  he action tables
c450: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f 6d 70   */.    if( comp
c460: 72 65 73 73 3d 3d 30 20 29 20 43 6f 6d 70 72 65  ress==0 ) Compre
c470: 73 73 54 61 62 6c 65 73 28 26 6c 65 6d 29 3b 0a  ssTables(&lem);.
c480: 0a 20 20 20 20 2f 2a 20 52 65 6f 72 64 65 72 20  .    /* Reorder 
c490: 61 6e 64 20 72 65 6e 75 6d 62 65 72 20 74 68 65  and renumber the
c4a0: 20 73 74 61 74 65 73 20 73 6f 20 74 68 61 74 20   states so that 
c4b0: 73 74 61 74 65 73 20 77 69 74 68 20 66 65 77 65  states with fewe
c4c0: 72 20 63 68 6f 69 63 65 73 0a 20 20 20 20 2a 2a  r choices.    **
c4d0: 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65 6e   occur at the en
c4e0: 64 2e 20 2a 2f 0a 20 20 20 20 52 65 73 6f 72 74  d. */.    Resort
c4f0: 53 74 61 74 65 73 28 26 6c 65 6d 29 3b 0a 0a 20  States(&lem);.. 
c500: 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61     /* Generate a
c510: 20 72 65 70 6f 72 74 20 6f 66 20 74 68 65 20 70   report of the p
c520: 61 72 73 65 72 20 67 65 6e 65 72 61 74 65 64 2e  arser generated.
c530: 20 20 28 74 68 65 20 22 79 2e 6f 75 74 70 75 74    (the "y.output
c540: 22 20 66 69 6c 65 29 20 2a 2f 0a 20 20 20 20 69  " file) */.    i
c550: 66 28 20 21 71 75 69 65 74 20 29 20 52 65 70 6f  f( !quiet ) Repo
c560: 72 74 4f 75 74 70 75 74 28 26 6c 65 6d 29 3b 0a  rtOutput(&lem);.
c570: 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
c580: 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65   the source code
c590: 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20   for the parser 
c5a0: 2a 2f 0a 20 20 20 20 52 65 70 6f 72 74 54 61 62  */.    ReportTab
c5b0: 6c 65 28 26 6c 65 6d 2c 20 6d 68 66 6c 61 67 29  le(&lem, mhflag)
c5c0: 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 64 75 63  ;..    /* Produc
c5d0: 65 20 61 20 68 65 61 64 65 72 20 66 69 6c 65 20  e a header file 
c5e0: 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 73  for use by the s
c5f0: 63 61 6e 6e 65 72 2e 20 20 28 54 68 69 73 20 73  canner.  (This s
c600: 74 65 70 20 69 73 0a 20 20 20 20 2a 2a 20 6f 6d  tep is.    ** om
c610: 69 74 74 65 64 20 69 66 20 74 68 65 20 22 2d 6d  itted if the "-m
c620: 22 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  " option is used
c630: 20 62 65 63 61 75 73 65 20 6d 61 6b 65 68 65 61   because makehea
c640: 64 65 72 73 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  ders will.    **
c650: 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 66 69   generate the fi
c660: 6c 65 20 66 6f 72 20 75 73 2e 29 20 2a 2f 0a 20  le for us.) */. 
c670: 20 20 20 69 66 28 20 21 6d 68 66 6c 61 67 20 29     if( !mhflag )
c680: 20 52 65 70 6f 72 74 48 65 61 64 65 72 28 26 6c   ReportHeader(&l
c690: 65 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  em);.  }.  if( s
c6a0: 74 61 74 69 73 74 69 63 73 20 29 7b 0a 20 20 20  tatistics ){.   
c6b0: 20 70 72 69 6e 74 66 28 22 50 61 72 73 65 72 20   printf("Parser 
c6c0: 73 74 61 74 69 73 74 69 63 73 3a 20 25 64 20 74  statistics: %d t
c6d0: 65 72 6d 69 6e 61 6c 73 2c 20 25 64 20 6e 6f 6e  erminals, %d non
c6e0: 74 65 72 6d 69 6e 61 6c 73 2c 20 25 64 20 72 75  terminals, %d ru
c6f0: 6c 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 6c 65  les\n",.      le
c700: 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2c 20 6c 65 6d  m.nterminal, lem
c710: 2e 6e 73 79 6d 62 6f 6c 20 2d 20 6c 65 6d 2e 6e  .nsymbol - lem.n
c720: 74 65 72 6d 69 6e 61 6c 2c 20 6c 65 6d 2e 6e 72  terminal, lem.nr
c730: 75 6c 65 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  ule);.    printf
c740: 28 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ("              
c750: 20 20 20 20 20 25 64 20 73 74 61 74 65 73 2c 20       %d states, 
c760: 25 64 20 70 61 72 73 65 72 20 74 61 62 6c 65 20  %d parser table 
c770: 65 6e 74 72 69 65 73 2c 20 25 64 20 63 6f 6e 66  entries, %d conf
c780: 6c 69 63 74 73 5c 6e 22 2c 0a 20 20 20 20 20 20  licts\n",.      
c790: 6c 65 6d 2e 6e 73 74 61 74 65 2c 20 6c 65 6d 2e  lem.nstate, lem.
c7a0: 74 61 62 6c 65 73 69 7a 65 2c 20 6c 65 6d 2e 6e  tablesize, lem.n
c7b0: 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20 7d 0a 20  conflict);.  }. 
c7c0: 20 69 66 28 20 6c 65 6d 2e 6e 65 78 70 65 63 74   if( lem.nexpect
c7d0: 65 64 20 3c 20 30 20 29 20 7b 0a 20 20 20 20 6c  ed < 0 ) {.    l
c7e0: 65 6d 2e 6e 65 78 70 65 63 74 65 64 20 3d 20 30  em.nexpected = 0
c7f0: 3b 20 20 2f 2a 20 67 72 61 6d 6d 61 72 20 64 69  ;  /* grammar di
c800: 64 6e 27 74 20 68 61 76 65 20 61 6e 20 25 65 78  dn't have an %ex
c810: 70 65 63 74 20 64 65 63 6c 61 72 61 74 69 6f 6e  pect declaration
c820: 2e 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 6c  . */.  }.  if( l
c830: 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 21 3d 20  em.nconflict != 
c840: 6c 65 6d 2e 6e 65 78 70 65 63 74 65 64 20 29 7b  lem.nexpected ){
c850: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
c860: 65 72 72 2c 22 25 64 20 70 61 72 73 69 6e 67 20  err,"%d parsing 
c870: 63 6f 6e 66 6c 69 63 74 73 20 28 25 64 20 65 78  conflicts (%d ex
c880: 70 65 63 74 65 64 29 2e 5c 6e 22 2c 6c 65 6d 2e  pected).\n",lem.
c890: 6e 63 6f 6e 66 6c 69 63 74 2c 6c 65 6d 2e 6e 65  nconflict,lem.ne
c8a0: 78 70 65 63 74 65 64 29 3b 0a 20 20 7d 0a 0a 20  xpected);.  }.. 
c8b0: 20 2f 2a 20 72 65 74 75 72 6e 20 30 20 6f 6e 20   /* return 0 on 
c8c0: 73 75 63 63 65 73 73 2c 20 31 20 6f 6e 20 66 61  success, 1 on fa
c8d0: 69 6c 75 72 65 2e 20 2a 2f 0a 20 20 65 78 69 74  ilure. */.  exit
c8e0: 63 6f 64 65 20 3d 20 28 28 6c 65 6d 2e 65 72 72  code = ((lem.err
c8f0: 6f 72 63 6e 74 20 3e 20 30 29 20 7c 7c 20 28 6c  orcnt > 0) || (l
c900: 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20 21 3d 20  em.nconflict != 
c910: 6c 65 6d 2e 6e 65 78 70 65 63 74 65 64 29 29 20  lem.nexpected)) 
c920: 3f 20 31 20 3a 20 30 3b 0a 20 20 65 78 69 74 28  ? 1 : 0;.  exit(
c930: 65 78 69 74 63 6f 64 65 29 3b 0a 20 20 72 65 74  exitcode);.  ret
c940: 75 72 6e 20 28 65 78 69 74 63 6f 64 65 29 3b 0a  urn (exitcode);.
c950: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
c960: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
c970: 20 66 69 6c 65 20 22 6d 73 6f 72 74 2e 63 22 20   file "msort.c" 
c980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
c9a0: 0a 2f 2a 0a 2a 2a 20 41 20 67 65 6e 65 72 69 63  ./*.** A generic
c9b0: 20 6d 65 72 67 65 2d 73 6f 72 74 20 70 72 6f 67   merge-sort prog
c9c0: 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 55 53 41 47 45  ram..**.** USAGE
c9d0: 3a 0a 2a 2a 20 4c 65 74 20 22 70 74 72 22 20 62  :.** Let "ptr" b
c9e0: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 73  e a pointer to s
c9f0: 6f 6d 65 20 73 74 72 75 63 74 75 72 65 20 77 68  ome structure wh
ca00: 69 63 68 20 69 73 20 61 74 20 74 68 65 20 68 65  ich is at the he
ca10: 61 64 20 6f 66 0a 2a 2a 20 61 20 6e 75 6c 6c 2d  ad of.** a null-
ca20: 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 73 74 2e  terminated list.
ca30: 20 20 54 68 65 6e 20 74 6f 20 73 6f 72 74 20 74    Then to sort t
ca40: 68 65 20 6c 69 73 74 20 63 61 6c 6c 3a 0a 2a 2a  he list call:.**
ca50: 0a 2a 2a 20 20 20 20 20 70 74 72 20 3d 20 6d 73  .**     ptr = ms
ca60: 6f 72 74 28 70 74 72 2c 26 28 70 74 72 2d 3e 6e  ort(ptr,&(ptr->n
ca70: 65 78 74 29 2c 63 6d 70 66 6e 63 29 3b 0a 2a 2a  ext),cmpfnc);.**
ca80: 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62 6f 76 65  .** In the above
ca90: 2c 20 22 63 6d 70 66 6e 63 22 20 69 73 20 61 20  , "cmpfnc" is a 
caa0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
cab0: 63 74 69 6f 6e 20 77 68 69 63 68 20 63 6f 6d 70  ction which comp
cac0: 61 72 65 73 0a 2a 2a 20 74 77 6f 20 69 6e 73 74  ares.** two inst
cad0: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 73 74 72  ances of the str
cae0: 75 63 74 75 72 65 20 61 6e 64 20 72 65 74 75 72  ucture and retur
caf0: 6e 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61  ns an integer, a
cb00: 73 20 69 6e 0a 2a 2a 20 73 74 72 63 6d 70 2e 20  s in.** strcmp. 
cb10: 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
cb20: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
cb30: 72 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  r to the pointer
cb40: 20 74 6f 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e   to the.** secon
cb50: 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  d element of the
cb60: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 54   linked list.  T
cb70: 68 69 73 20 61 64 64 72 65 73 73 20 69 73 20 75  his address is u
cb80: 73 65 64 20 74 6f 20 63 6f 6d 70 75 74 65 0a 2a  sed to compute.*
cb90: 2a 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  * the offset to 
cba0: 74 68 65 20 22 6e 65 78 74 22 20 66 69 65 6c 64  the "next" field
cbb0: 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 72 75   within the stru
cbc0: 63 74 75 72 65 2e 20 20 54 68 65 20 6f 66 66 73  cture.  The offs
cbd0: 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20 22 6e 65  et to.** the "ne
cbe0: 78 74 22 20 66 69 65 6c 64 20 6d 75 73 74 20 62  xt" field must b
cbf0: 65 20 63 6f 6e 73 74 61 6e 74 20 66 6f 72 20 61  e constant for a
cc00: 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
cc10: 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   the list..**.**
cc20: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65   The function re
cc30: 74 75 72 6e 73 20 61 20 6e 65 77 20 70 6f 69 6e  turns a new poin
cc40: 74 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ter which is the
cc50: 20 68 65 61 64 20 6f 66 20 74 68 65 20 6c 69 73   head of the lis
cc60: 74 0a 2a 2a 20 61 66 74 65 72 20 73 6f 72 74 69  t.** after sorti
cc70: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 4c 47 4f 52 49  ng..**.** ALGORI
cc80: 54 48 4d 3a 0a 2a 2a 20 4d 65 72 67 65 2d 73 6f  THM:.** Merge-so
cc90: 72 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  rt..*/../*.** Re
cca0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
ccb0: 6f 20 74 68 65 20 6e 65 78 74 20 73 74 72 75 63  o the next struc
ccc0: 74 75 72 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b  ture in the link
ccd0: 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 23 64 65 66  ed list..*/.#def
cce0: 69 6e 65 20 4e 45 58 54 28 41 29 20 28 2a 28 63  ine NEXT(A) (*(c
ccf0: 68 61 72 2a 2a 29 28 28 28 75 6e 73 69 67 6e 65  har**)(((unsigne
cd00: 64 20 6c 6f 6e 67 29 41 29 2b 6f 66 66 73 65 74  d long)A)+offset
cd10: 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73  ))../*.** Inputs
cd20: 3a 0a 2a 2a 20 20 20 61 3a 20 20 20 20 20 20 20  :.**   a:       
cd30: 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74  A sorted, null-t
cd40: 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64  erminated linked
cd50: 20 6c 69 73 74 2e 20 20 28 4d 61 79 20 62 65 20   list.  (May be 
cd60: 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a 20 20  null)..**   b:  
cd70: 20 20 20 20 20 41 20 73 6f 72 74 65 64 2c 20 6e       A sorted, n
cd80: 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c  ull-terminated l
cd90: 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d 61  inked list.  (Ma
cda0: 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20  y be null)..**  
cdb0: 20 63 6d 70 3a 20 20 20 20 20 41 20 70 6f 69 6e   cmp:     A poin
cdc0: 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6d 70 61  ter to the compa
cdd0: 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a  rison function..
cde0: 2a 2a 20 20 20 6f 66 66 73 65 74 3a 20 20 4f 66  **   offset:  Of
cdf0: 66 73 65 74 20 69 6e 20 74 68 65 20 73 74 72 75  fset in the stru
ce00: 63 74 75 72 65 20 74 6f 20 74 68 65 20 22 6e 65  cture to the "ne
ce10: 78 74 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a  xt" field..**.**
ce20: 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a   Return Value:.*
ce30: 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  *   A pointer to
ce40: 20 74 68 65 20 68 65 61 64 20 6f 66 20 61 20 73   the head of a s
ce50: 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e 74 61  orted list conta
ce60: 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e  ining the elemen
ce70: 74 73 0a 2a 2a 20 20 20 6f 66 20 62 6f 74 68 20  ts.**   of both 
ce80: 61 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a 20 53  a and b..**.** S
ce90: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20  ide effects:.** 
cea0: 20 20 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69    The "next" poi
ceb0: 6e 74 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e  nters for elemen
cec0: 74 73 20 69 6e 20 74 68 65 20 6c 69 73 74 73 20  ts in the lists 
ced0: 61 20 61 6e 64 20 62 20 61 72 65 0a 2a 2a 20 20  a and b are.**  
cee0: 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61   changed..*/.sta
cef0: 74 69 63 20 63 68 61 72 20 2a 6d 65 72 67 65 28  tic char *merge(
cf00: 0a 20 20 63 68 61 72 20 2a 61 2c 0a 20 20 63 68  .  char *a,.  ch
cf10: 61 72 20 2a 62 2c 0a 20 20 69 6e 74 20 28 2a 63  ar *b,.  int (*c
cf20: 6d 70 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  mp)(const char*,
cf30: 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 0a 20 20  const char*),.  
cf40: 69 6e 74 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20  int offset.){.  
cf50: 63 68 61 72 20 2a 70 74 72 2c 20 2a 68 65 61 64  char *ptr, *head
cf60: 3b 0a 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 7b  ;..  if( a==0 ){
cf70: 0a 20 20 20 20 68 65 61 64 20 3d 20 62 3b 0a 20  .    head = b;. 
cf80: 20 7d 65 6c 73 65 20 69 66 28 20 62 3d 3d 30 20   }else if( b==0 
cf90: 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 61 3b  ){.    head = a;
cfa0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
cfb0: 28 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c 3d 30  ( (*cmp)(a,b)<=0
cfc0: 20 29 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20   ){.      ptr = 
cfd0: 61 3b 0a 20 20 20 20 20 20 61 20 3d 20 4e 45 58  a;.      a = NEX
cfe0: 54 28 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  T(a);.    }else{
cff0: 0a 20 20 20 20 20 20 70 74 72 20 3d 20 62 3b 0a  .      ptr = b;.
d000: 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62        b = NEXT(b
d010: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 65 61  );.    }.    hea
d020: 64 20 3d 20 70 74 72 3b 0a 20 20 20 20 77 68 69  d = ptr;.    whi
d030: 6c 65 28 20 61 20 26 26 20 62 20 29 7b 0a 20 20  le( a && b ){.  
d040: 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29 28 61      if( (*cmp)(a
d050: 2c 62 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,b)<=0 ){.      
d060: 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 61 3b    NEXT(ptr) = a;
d070: 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d 20 61  .        ptr = a
d080: 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20 4e 45  ;.        a = NE
d090: 58 54 28 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  XT(a);.      }el
d0a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 4e 45 58 54  se{.        NEXT
d0b0: 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 20 20 20  (ptr) = b;.     
d0c0: 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20 20     ptr = b;.    
d0d0: 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b      b = NEXT(b);
d0e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d0f0: 20 20 20 69 66 28 20 61 20 29 20 4e 45 58 54 28     if( a ) NEXT(
d100: 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20 65 6c  ptr) = a;.    el
d110: 73 65 20 20 20 20 4e 45 58 54 28 70 74 72 29 20  se    NEXT(ptr) 
d120: 3d 20 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = b;.  }.  retur
d130: 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n head;.}../*.**
d140: 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 6c 69   Inputs:.**   li
d150: 73 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72  st:      Pointer
d160: 20 74 6f 20 61 20 73 69 6e 67 6c 79 2d 6c 69 6e   to a singly-lin
d170: 6b 65 64 20 6c 69 73 74 20 6f 66 20 73 74 72 75  ked list of stru
d180: 63 74 75 72 65 73 2e 0a 2a 2a 20 20 20 6e 65 78  ctures..**   nex
d190: 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20  t:      Pointer 
d1a0: 74 6f 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  to pointer to th
d1b0: 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74  e second element
d1c0: 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a   of the list..**
d1d0: 20 20 20 63 6d 70 3a 20 20 20 20 20 20 20 41 20     cmp:       A 
d1e0: 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
d1f0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ion..**.** Retur
d200: 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41 20  n Value:.**   A 
d210: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
d220: 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65 64 20  ead of a sorted 
d230: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
d240: 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20  the elements.** 
d250: 20 20 6f 72 67 69 6e 61 6c 6c 79 20 69 6e 20 6c    orginally in l
d260: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20  ist..**.** Side 
d270: 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68  effects:.**   Th
d280: 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72  e "next" pointer
d290: 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69  s for elements i
d2a0: 6e 20 6c 69 73 74 20 61 72 65 20 63 68 61 6e 67  n list are chang
d2b0: 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4c  ed..*/.#define L
d2c0: 49 53 54 53 49 5a 45 20 33 30 0a 73 74 61 74 69  ISTSIZE 30.stati
d2d0: 63 20 63 68 61 72 20 2a 6d 73 6f 72 74 28 0a 20  c char *msort(. 
d2e0: 20 63 68 61 72 20 2a 6c 69 73 74 2c 0a 20 20 63   char *list,.  c
d2f0: 68 61 72 20 2a 2a 6e 65 78 74 2c 0a 20 20 69 6e  har **next,.  in
d300: 74 20 28 2a 63 6d 70 29 28 63 6f 6e 73 74 20 63  t (*cmp)(const c
d310: 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  har*,const char*
d320: 29 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ).){.  unsigned 
d330: 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 0a 20 20 63  long offset;.  c
d340: 68 61 72 20 2a 65 70 3b 0a 20 20 63 68 61 72 20  har *ep;.  char 
d350: 2a 73 65 74 5b 4c 49 53 54 53 49 5a 45 5d 3b 0a  *set[LISTSIZE];.
d360: 20 20 69 6e 74 20 69 3b 0a 20 20 6f 66 66 73 65    int i;.  offse
d370: 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f  t = (unsigned lo
d380: 6e 67 29 6e 65 78 74 20 2d 20 28 75 6e 73 69 67  ng)next - (unsig
d390: 6e 65 64 20 6c 6f 6e 67 29 6c 69 73 74 3b 0a 20  ned long)list;. 
d3a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54   for(i=0; i<LIST
d3b0: 53 49 5a 45 3b 20 69 2b 2b 29 20 73 65 74 5b 69  SIZE; i++) set[i
d3c0: 5d 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  ] = 0;.  while( 
d3d0: 6c 69 73 74 20 29 7b 0a 20 20 20 20 65 70 20 3d  list ){.    ep =
d3e0: 20 6c 69 73 74 3b 0a 20 20 20 20 6c 69 73 74 20   list;.    list 
d3f0: 3d 20 4e 45 58 54 28 6c 69 73 74 29 3b 0a 20 20  = NEXT(list);.  
d400: 20 20 4e 45 58 54 28 65 70 29 20 3d 20 30 3b 0a    NEXT(ep) = 0;.
d410: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c      for(i=0; i<L
d420: 49 53 54 53 49 5a 45 2d 31 20 26 26 20 73 65 74  ISTSIZE-1 && set
d430: 5b 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  [i]!=0; i++){.  
d440: 20 20 20 20 65 70 20 3d 20 6d 65 72 67 65 28 65      ep = merge(e
d450: 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66  p,set[i],cmp,off
d460: 73 65 74 29 3b 0a 20 20 20 20 20 20 73 65 74 5b  set);.      set[
d470: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
d480: 20 20 73 65 74 5b 69 5d 20 3d 20 65 70 3b 0a 20    set[i] = ep;. 
d490: 20 7d 0a 20 20 65 70 20 3d 20 30 3b 0a 20 20 66   }.  ep = 0;.  f
d4a0: 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49  or(i=0; i<LISTSI
d4b0: 5a 45 3b 20 69 2b 2b 29 20 69 66 28 20 73 65 74  ZE; i++) if( set
d4c0: 5b 69 5d 20 29 20 65 70 20 3d 20 6d 65 72 67 65  [i] ) ep = merge
d4d0: 28 73 65 74 5b 69 5d 2c 65 70 2c 63 6d 70 2c 6f  (set[i],ep,cmp,o
d4e0: 66 66 73 65 74 29 3b 0a 20 20 72 65 74 75 72 6e  ffset);.  return
d4f0: 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   ep;.}./********
d500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d510: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
d520: 6f 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a  option.c" ******
d530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
d540: 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ****/.static cha
d550: 72 20 2a 2a 61 72 67 76 3b 0a 73 74 61 74 69 63  r **argv;.static
d560: 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e   struct s_option
d570: 73 20 2a 6f 70 3b 0a 73 74 61 74 69 63 20 46 49  s *op;.static FI
d580: 4c 45 20 2a 65 72 72 73 74 72 65 61 6d 3b 0a 0a  LE *errstream;..
d590: 23 64 65 66 69 6e 65 20 49 53 4f 50 54 28 58 29  #define ISOPT(X)
d5a0: 20 28 28 58 29 5b 30 5d 3d 3d 27 2d 27 7c 7c 28   ((X)[0]=='-'||(
d5b0: 58 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73 74 72 63  X)[0]=='+'||strc
d5c0: 68 72 28 28 58 29 2c 27 3d 27 29 21 3d 30 29 0a  hr((X),'=')!=0).
d5d0: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
d5e0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 69   command line wi
d5f0: 74 68 20 61 20 63 61 72 72 6f 74 20 70 6f 69 6e  th a carrot poin
d600: 74 69 6e 67 20 74 6f 20 74 68 65 20 6b 2d 74 68  ting to the k-th
d610: 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66   character.** of
d620: 20 74 68 65 20 6e 2d 74 68 20 66 69 65 6c 64 2e   the n-th field.
d630: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d640: 65 72 72 6c 69 6e 65 28 6e 2c 6b 2c 65 72 72 29  errline(n,k,err)
d650: 0a 69 6e 74 20 6e 3b 0a 69 6e 74 20 6b 3b 0a 46  .int n;.int k;.F
d660: 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e  ILE *err;.{.  in
d670: 74 20 73 70 63 6e 74 2c 20 69 3b 0a 20 20 69 66  t spcnt, i;.  if
d680: 28 20 61 72 67 76 5b 30 5d 20 29 20 66 70 72 69  ( argv[0] ) fpri
d690: 6e 74 66 28 65 72 72 2c 22 25 73 22 2c 61 72 67  ntf(err,"%s",arg
d6a0: 76 5b 30 5d 29 3b 0a 20 20 73 70 63 6e 74 20 3d  v[0]);.  spcnt =
d6b0: 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67   lemonStrlen(arg
d6c0: 76 5b 30 5d 29 20 2b 20 31 3b 0a 20 20 66 6f 72  v[0]) + 1;.  for
d6d0: 28 69 3d 31 3b 20 69 3c 6e 20 26 26 20 61 72 67  (i=1; i<n && arg
d6e0: 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  v[i]; i++){.    
d6f0: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 20 25 73  fprintf(err," %s
d700: 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  ",argv[i]);.    
d710: 73 70 63 6e 74 20 2b 3d 20 6c 65 6d 6f 6e 53 74  spcnt += lemonSt
d720: 72 6c 65 6e 28 61 72 67 76 5b 69 5d 29 2b 31 3b  rlen(argv[i])+1;
d730: 0a 20 20 7d 0a 20 20 73 70 63 6e 74 20 2b 3d 20  .  }.  spcnt += 
d740: 6b 3b 0a 20 20 66 6f 72 28 3b 20 61 72 67 76 5b  k;.  for(; argv[
d750: 69 5d 3b 20 69 2b 2b 29 20 66 70 72 69 6e 74 66  i]; i++) fprintf
d760: 28 65 72 72 2c 22 20 25 73 22 2c 61 72 67 76 5b  (err," %s",argv[
d770: 69 5d 29 3b 0a 20 20 69 66 28 20 73 70 63 6e 74  i]);.  if( spcnt
d780: 3c 32 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  <20 ){.    fprin
d790: 74 66 28 65 72 72 2c 22 5c 6e 25 2a 73 5e 2d 2d  tf(err,"\n%*s^--
d7a0: 20 68 65 72 65 5c 6e 22 2c 73 70 63 6e 74 2c 22   here\n",spcnt,"
d7b0: 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
d7c0: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e   fprintf(err,"\n
d7d0: 25 2a 73 68 65 72 65 20 2d 2d 5e 5c 6e 22 2c 73  %*shere --^\n",s
d7e0: 70 63 6e 74 2d 37 2c 22 22 29 3b 0a 20 20 7d 0a  pcnt-7,"");.  }.
d7f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
d800: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
d810: 20 4e 2d 74 68 20 6e 6f 6e 2d 73 77 69 74 63 68   N-th non-switch
d820: 20 61 72 67 75 6d 65 6e 74 2e 20 20 52 65 74 75   argument.  Retu
d830: 72 6e 20 2d 31 0a 2a 2a 20 69 66 20 4e 20 69 73  rn -1.** if N is
d840: 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 0a 2a   out of range..*
d850: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 67  /.static int arg
d860: 69 6e 64 65 78 28 6e 29 0a 69 6e 74 20 6e 3b 0a  index(n).int n;.
d870: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
d880: 20 64 61 73 68 64 61 73 68 20 3d 20 30 3b 0a 20   dashdash = 0;. 
d890: 20 69 66 28 20 61 72 67 76 21 3d 30 20 26 26 20   if( argv!=0 && 
d8a0: 2a 61 72 67 76 21 3d 30 20 29 7b 0a 20 20 20 20  *argv!=0 ){.    
d8b0: 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d  for(i=1; argv[i]
d8c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
d8d0: 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20 21 49  ( dashdash || !I
d8e0: 53 4f 50 54 28 61 72 67 76 5b 69 5d 29 20 29 7b  SOPT(argv[i]) ){
d8f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  .        if( n==
d900: 30 20 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20  0 ) return i;.  
d910: 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20        n--;.     
d920: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 74 72   }.      if( str
d930: 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d 22  cmp(argv[i],"--"
d940: 29 3d 3d 30 20 29 20 64 61 73 68 64 61 73 68 20  )==0 ) dashdash 
d950: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
d960: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 73   return -1;.}..s
d970: 74 61 74 69 63 20 63 68 61 72 20 65 6d 73 67 5b  tatic char emsg[
d980: 5d 20 3d 20 22 43 6f 6d 6d 61 6e 64 20 6c 69 6e  ] = "Command lin
d990: 65 20 73 79 6e 74 61 78 20 65 72 72 6f 72 3a 20  e syntax error: 
d9a0: 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73  ";../*.** Proces
d9b0: 73 20 61 20 66 6c 61 67 20 63 6f 6d 6d 61 6e 64  s a flag command
d9c0: 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 2e 0a   line argument..
d9d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
d9e0: 6e 64 6c 65 66 6c 61 67 73 28 69 2c 65 72 72 29  ndleflags(i,err)
d9f0: 0a 69 6e 74 20 69 3b 0a 46 49 4c 45 20 2a 65 72  .int i;.FILE *er
da00: 72 3b 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20  r;.{.  int v;.  
da10: 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a  int errcnt = 0;.
da20: 20 20 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a    int j;.  for(j
da30: 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b  =0; op[j].label;
da40: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   j++){.    if( s
da50: 74 72 6e 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b  trncmp(&argv[i][
da60: 31 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c  1],op[j].label,l
da70: 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 6a 5d  emonStrlen(op[j]
da80: 2e 6c 61 62 65 6c 29 29 3d 3d 30 20 29 20 62 72  .label))==0 ) br
da90: 65 61 6b 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 61  eak;.  }.  v = a
daa0: 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20 3f  rgv[i][0]=='-' ?
dab0: 20 31 20 3a 20 30 3b 0a 20 20 69 66 28 20 6f 70   1 : 0;.  if( op
dac0: 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a  [j].label==0 ){.
dad0: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
dae0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
daf0: 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70  ,"%sundefined op
db00: 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  tion.\n",emsg);.
db10: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
db20: 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  1,err);.    }.  
db30: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65    errcnt++;.  }e
db40: 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79  lse if( op[j].ty
db50: 70 65 3d 3d 4f 50 54 5f 46 4c 41 47 20 29 7b 0a  pe==OPT_FLAG ){.
db60: 20 20 20 20 2a 28 28 69 6e 74 2a 29 6f 70 5b 6a      *((int*)op[j
db70: 5d 2e 61 72 67 29 20 3d 20 76 3b 0a 20 20 7d 65  ].arg) = v;.  }e
db80: 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79  lse if( op[j].ty
db90: 70 65 3d 3d 4f 50 54 5f 46 46 4c 41 47 20 29 7b  pe==OPT_FFLAG ){
dba0: 0a 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28  .    (*(void(*)(
dbb0: 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 76  ))(op[j].arg))(v
dbc0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  );.  }else if( o
dbd0: 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46  p[j].type==OPT_F
dbe0: 53 54 52 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f  STR ){.    (*(vo
dbf0: 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61  id(*)())(op[j].a
dc00: 72 67 29 29 28 26 61 72 67 76 5b 69 5d 5b 32 5d  rg))(&argv[i][2]
dc10: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
dc20: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
dc30: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
dc40: 6d 69 73 73 69 6e 67 20 61 72 67 75 6d 65 6e 74  missing argument
dc50: 20 6f 6e 20 73 77 69 74 63 68 2e 5c 6e 22 2c 65   on switch.\n",e
dc60: 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c  msg);.      errl
dc70: 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a 20 20  ine(i,1,err);.  
dc80: 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b    }.    errcnt++
dc90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65  ;.  }.  return e
dca0: 72 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rrcnt;.}../*.** 
dcb0: 50 72 6f 63 65 73 73 20 61 20 63 6f 6d 6d 61 6e  Process a comman
dcc0: 64 20 6c 69 6e 65 20 73 77 69 74 63 68 20 77 68  d line switch wh
dcd0: 69 63 68 20 68 61 73 20 61 6e 20 61 72 67 75 6d  ich has an argum
dce0: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
dcf0: 6e 74 20 68 61 6e 64 6c 65 73 77 69 74 63 68 28  nt handleswitch(
dd00: 69 2c 65 72 72 29 0a 69 6e 74 20 69 3b 0a 46 49  i,err).int i;.FI
dd10: 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74  LE *err;.{.  int
dd20: 20 6c 76 20 3d 20 30 3b 0a 20 20 64 6f 75 62 6c   lv = 0;.  doubl
dd30: 65 20 64 76 20 3d 20 30 2e 30 3b 0a 20 20 63 68  e dv = 0.0;.  ch
dd40: 61 72 20 2a 73 76 20 3d 20 30 2c 20 2a 65 6e 64  ar *sv = 0, *end
dd50: 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 20 20  ;.  char *cp;.  
dd60: 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 65 72 72  int j;.  int err
dd70: 63 6e 74 20 3d 20 30 3b 0a 20 20 63 70 20 3d 20  cnt = 0;.  cp = 
dd80: 73 74 72 63 68 72 28 61 72 67 76 5b 69 5d 2c 27  strchr(argv[i],'
dd90: 3d 27 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  =');.  assert( c
dda0: 70 21 3d 30 20 29 3b 0a 20 20 2a 63 70 20 3d 20  p!=0 );.  *cp = 
ddb0: 30 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f 70  0;.  for(j=0; op
ddc0: 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29 7b  [j].label; j++){
ddd0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
dde0: 61 72 67 76 5b 69 5d 2c 6f 70 5b 6a 5d 2e 6c 61  argv[i],op[j].la
ddf0: 62 65 6c 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  bel)==0 ) break;
de00: 0a 20 20 7d 0a 20 20 2a 63 70 20 3d 20 27 3d 27  .  }.  *cp = '='
de10: 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61  ;.  if( op[j].la
de20: 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  bel==0 ){.    if
de30: 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66  ( err ){.      f
de40: 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 75 6e  printf(err,"%sun
de50: 64 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c  defined option.\
de60: 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20  n",emsg);.      
de70: 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 29  errline(i,0,err)
de80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63  ;.    }.    errc
de90: 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nt++;.  }else{. 
dea0: 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 73 77 69     cp++;.    swi
deb0: 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 20  tch( op[j].type 
dec0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  ){.      case OP
ded0: 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61  T_FLAG:.      ca
dee0: 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20  se OPT_FFLAG:.  
def0: 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b        if( err ){
df00: 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e  .          fprin
df10: 74 66 28 65 72 72 2c 22 25 73 6f 70 74 69 6f 6e  tf(err,"%soption
df20: 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67   requires an arg
df30: 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b  ument.\n",emsg);
df40: 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 6c 69  .          errli
df50: 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20  ne(i,0,err);.   
df60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65       }.        e
df70: 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  rrcnt++;.       
df80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
df90: 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20  se OPT_DBL:.    
dfa0: 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a    case OPT_FDBL:
dfb0: 0a 20 20 20 20 20 20 20 20 64 76 20 3d 20 73 74  .        dv = st
dfc0: 72 74 6f 64 28 63 70 2c 26 65 6e 64 29 3b 0a 20  rtod(cp,&end);. 
dfd0: 20 20 20 20 20 20 20 69 66 28 20 2a 65 6e 64 20         if( *end 
dfe0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
dff0: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20   err ){.        
e000: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
e010: 22 25 73 69 6c 6c 65 67 61 6c 20 63 68 61 72 61  "%sillegal chara
e020: 63 74 65 72 20 69 6e 20 66 6c 6f 61 74 69 6e 67  cter in floating
e030: 2d 70 6f 69 6e 74 20 61 72 67 75 6d 65 6e 74 2e  -point argument.
e040: 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20  \n",emsg);.     
e050: 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69         errline(i
e060: 2c 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ,((unsigned long
e070: 29 65 6e 64 29 2d 28 75 6e 73 69 67 6e 65 64 20  )end)-(unsigned 
e080: 6c 6f 6e 67 29 61 72 67 76 5b 69 5d 2c 65 72 72  long)argv[i],err
e090: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
e0a0: 20 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b           errcnt+
e0b0: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
e0c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e0d0: 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a    case OPT_INT:.
e0e0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
e0f0: 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c 76 20  INT:.        lv 
e100: 3d 20 73 74 72 74 6f 6c 28 63 70 2c 26 65 6e 64  = strtol(cp,&end
e110: 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ,0);.        if(
e120: 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20   *end ){.       
e130: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
e140: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
e150: 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c  f(err,"%sillegal
e160: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 69 6e   character in in
e170: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 5c  teger argument.\
e180: 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20  n",emsg);.      
e190: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
e1a0: 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29  ((unsigned long)
e1b0: 65 6e 64 29 2d 28 75 6e 73 69 67 6e 65 64 20 6c  end)-(unsigned l
e1c0: 6f 6e 67 29 61 72 67 76 5b 69 5d 2c 65 72 72 29  ong)argv[i],err)
e1d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
e1e0: 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b          errcnt++
e1f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e200: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e210: 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20   case OPT_STR:. 
e220: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53       case OPT_FS
e230: 54 52 3a 0a 20 20 20 20 20 20 20 20 73 76 20 3d  TR:.        sv =
e240: 20 63 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65   cp;.        bre
e250: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77  ak;.    }.    sw
e260: 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70 65  itch( op[j].type
e270: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
e280: 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63  PT_FLAG:.      c
e290: 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20  ase OPT_FFLAG:. 
e2a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e2b0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c      case OPT_DBL
e2c0: 3a 0a 20 20 20 20 20 20 20 20 2a 28 64 6f 75 62  :.        *(doub
e2d0: 6c 65 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20  le*)(op[j].arg) 
e2e0: 3d 20 64 76 3b 0a 20 20 20 20 20 20 20 20 62 72  = dv;.        br
e2f0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
e300: 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20  OPT_FDBL:.      
e310: 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 29 29 28    (*(void(*)())(
e320: 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 64 76 29 3b  op[j].arg))(dv);
e330: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e340: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49        case OPT_I
e350: 4e 54 3a 0a 20 20 20 20 20 20 20 20 2a 28 69 6e  NT:.        *(in
e360: 74 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d  t*)(op[j].arg) =
e370: 20 6c 76 3b 0a 20 20 20 20 20 20 20 20 62 72 65   lv;.        bre
e380: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
e390: 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20  PT_FINT:.       
e3a0: 20 28 2a 28 76 6f 69 64 28 2a 29 28 29 29 28 6f   (*(void(*)())(o
e3b0: 70 5b 6a 5d 2e 61 72 67 29 29 28 28 69 6e 74 29  p[j].arg))((int)
e3c0: 6c 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  lv);.        bre
e3d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
e3e0: 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 20 20  PT_STR:.        
e3f0: 2a 28 63 68 61 72 2a 2a 29 28 6f 70 5b 6a 5d 2e  *(char**)(op[j].
e400: 61 72 67 29 20 3d 20 73 76 3b 0a 20 20 20 20 20  arg) = sv;.     
e410: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
e420: 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20  case OPT_FSTR:. 
e430: 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a         (*(void(*
e440: 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29  )())(op[j].arg))
e450: 28 73 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (sv);.        br
e460: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
e470: 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a   return errcnt;.
e480: 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e 69 74 28 61  }..int OptInit(a
e490: 2c 6f 2c 65 72 72 29 0a 63 68 61 72 20 2a 2a 61  ,o,err).char **a
e4a0: 3b 0a 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f  ;.struct s_optio
e4b0: 6e 73 20 2a 6f 3b 0a 46 49 4c 45 20 2a 65 72 72  ns *o;.FILE *err
e4c0: 3b 0a 7b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74  ;.{.  int errcnt
e4d0: 20 3d 20 30 3b 0a 20 20 61 72 67 76 20 3d 20 61   = 0;.  argv = a
e4e0: 3b 0a 20 20 6f 70 20 3d 20 6f 3b 0a 20 20 65 72  ;.  op = o;.  er
e4f0: 72 73 74 72 65 61 6d 20 3d 20 65 72 72 3b 0a 20  rstream = err;. 
e500: 20 69 66 28 20 61 72 67 76 20 26 26 20 2a 61 72   if( argv && *ar
e510: 67 76 20 26 26 20 6f 70 20 29 7b 0a 20 20 20 20  gv && op ){.    
e520: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
e530: 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b  =1; argv[i]; i++
e540: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 72 67  ){.      if( arg
e550: 76 5b 69 5d 5b 30 5d 3d 3d 27 2b 27 20 7c 7c 20  v[i][0]=='+' || 
e560: 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27 20  argv[i][0]=='-' 
e570: 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e  ){.        errcn
e580: 74 20 2b 3d 20 68 61 6e 64 6c 65 66 6c 61 67 73  t += handleflags
e590: 28 69 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 7d  (i,err);.      }
e5a0: 65 6c 73 65 20 69 66 28 20 73 74 72 63 68 72 28  else if( strchr(
e5b0: 61 72 67 76 5b 69 5d 2c 27 3d 27 29 20 29 7b 0a  argv[i],'=') ){.
e5c0: 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 20 2b          errcnt +
e5d0: 3d 20 68 61 6e 64 6c 65 73 77 69 74 63 68 28 69  = handleswitch(i
e5e0: 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ,err);.      }. 
e5f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65     }.  }.  if( e
e600: 72 72 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 66  rrcnt>0 ){.    f
e610: 70 72 69 6e 74 66 28 65 72 72 2c 22 56 61 6c 69  printf(err,"Vali
e620: 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f  d command line o
e630: 70 74 69 6f 6e 73 20 66 6f 72 20 5c 22 25 73 5c  ptions for \"%s\
e640: 22 20 61 72 65 3a 5c 6e 22 2c 2a 61 29 3b 0a 20  " are:\n",*a);. 
e650: 20 20 20 4f 70 74 50 72 69 6e 74 28 29 3b 0a 20     OptPrint();. 
e660: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
e670: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 69    return 0;.}..i
e680: 6e 74 20 4f 70 74 4e 41 72 67 73 28 29 7b 0a 20  nt OptNArgs(){. 
e690: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
e6a0: 69 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20 30  int dashdash = 0
e6b0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
e6c0: 20 61 72 67 76 21 3d 30 20 26 26 20 61 72 67 76   argv!=0 && argv
e6d0: 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f  [0]!=0 ){.    fo
e6e0: 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20  r(i=1; argv[i]; 
e6f0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
e700: 64 61 73 68 64 61 73 68 20 7c 7c 20 21 49 53 4f  dashdash || !ISO
e710: 50 54 28 61 72 67 76 5b 69 5d 29 20 29 20 63 6e  PT(argv[i]) ) cn
e720: 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 73  t++;.      if( s
e730: 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22 2d  trcmp(argv[i],"-
e740: 2d 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61 73  -")==0 ) dashdas
e750: 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  h = 1;.    }.  }
e760: 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 3b 0a 7d  .  return cnt;.}
e770: 0a 0a 63 68 61 72 20 2a 4f 70 74 41 72 67 28 6e  ..char *OptArg(n
e780: 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 69 6e 74  ).int n;.{.  int
e790: 20 69 3b 0a 20 20 69 20 3d 20 61 72 67 69 6e 64   i;.  i = argind
e7a0: 65 78 28 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex(n);.  return 
e7b0: 69 3e 3d 30 20 3f 20 61 72 67 76 5b 69 5d 20 3a  i>=0 ? argv[i] :
e7c0: 20 30 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 45   0;.}..void OptE
e7d0: 72 72 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20  rr(n).int n;.{. 
e7e0: 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61 72   int i;.  i = ar
e7f0: 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 69 66 28  gindex(n);.  if(
e800: 20 69 3e 3d 30 20 29 20 65 72 72 6c 69 6e 65 28   i>=0 ) errline(
e810: 69 2c 30 2c 65 72 72 73 74 72 65 61 6d 29 3b 0a  i,0,errstream);.
e820: 7d 0a 0a 76 6f 69 64 20 4f 70 74 50 72 69 6e 74  }..void OptPrint
e830: 28 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  (){.  int i;.  i
e840: 6e 74 20 6d 61 78 2c 20 6c 65 6e 3b 0a 20 20 6d  nt max, len;.  m
e850: 61 78 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ax = 0;.  for(i=
e860: 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20  0; op[i].label; 
e870: 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20  i++){.    len = 
e880: 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69  lemonStrlen(op[i
e890: 5d 2e 6c 61 62 65 6c 29 20 2b 20 31 3b 0a 20 20  ].label) + 1;.  
e8a0: 20 20 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e    switch( op[i].
e8b0: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
e8c0: 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20  se OPT_FLAG:.   
e8d0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41     case OPT_FFLA
e8e0: 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  G:.        break
e8f0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
e900: 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65  _INT:.      case
e910: 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20   OPT_FINT:.     
e920: 20 20 20 6c 65 6e 20 2b 3d 20 39 3b 20 20 20 20     len += 9;    
e930: 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20     /* length of 
e940: 22 3c 69 6e 74 65 67 65 72 3e 22 20 2a 2f 0a 20  "<integer>" */. 
e950: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e960: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c      case OPT_DBL
e970: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
e980: 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 6c  _FDBL:.        l
e990: 65 6e 20 2b 3d 20 36 3b 20 20 20 20 20 20 20 2f  en += 6;       /
e9a0: 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 72 65  * length of "<re
e9b0: 61 6c 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20  al>" */.        
e9c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
e9d0: 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20  e OPT_STR:.     
e9e0: 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a   case OPT_FSTR:.
e9f0: 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 38          len += 8
ea00: 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74  ;       /* lengt
ea10: 68 20 6f 66 20 22 3c 73 74 72 69 6e 67 3e 22 20  h of "<string>" 
ea20: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
ea30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ea40: 6c 65 6e 3e 6d 61 78 20 29 20 6d 61 78 20 3d 20  len>max ) max = 
ea50: 6c 65 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  len;.  }.  for(i
ea60: 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b  =0; op[i].label;
ea70: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74 63   i++){.    switc
ea80: 68 28 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b  h( op[i].type ){
ea90: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
eaa0: 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65  FLAG:.      case
eab0: 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20   OPT_FFLAG:.    
eac0: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73      fprintf(errs
ead0: 74 72 65 61 6d 2c 22 20 20 2d 25 2d 2a 73 20 20  tream,"  -%-*s  
eae0: 25 73 5c 6e 22 2c 6d 61 78 2c 6f 70 5b 69 5d 2e  %s\n",max,op[i].
eaf0: 6c 61 62 65 6c 2c 6f 70 5b 69 5d 2e 6d 65 73 73  label,op[i].mess
eb00: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  age);.        br
eb10: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
eb20: 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63  OPT_INT:.      c
eb30: 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20  ase OPT_FINT:.  
eb40: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
eb50: 72 73 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 69  rstream,"  %s=<i
eb60: 6e 74 65 67 65 72 3e 25 2a 73 20 20 25 73 5c 6e  nteger>%*s  %s\n
eb70: 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20  ",op[i].label,. 
eb80: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d           (int)(m
eb90: 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f  ax-lemonStrlen(o
eba0: 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 39 29 2c 22  p[i].label)-9),"
ebb0: 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29  ",op[i].message)
ebc0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
ebd0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
ebe0: 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20  DBL:.      case 
ebf0: 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20  OPT_FDBL:.      
ec00: 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72    fprintf(errstr
ec10: 65 61 6d 2c 22 20 20 25 73 3d 3c 72 65 61 6c 3e  eam,"  %s=<real>
ec20: 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d  %*s  %s\n",op[i]
ec30: 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20  .label,.        
ec40: 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f    (int)(max-lemo
ec50: 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61  nStrlen(op[i].la
ec60: 62 65 6c 29 2d 36 29 2c 22 22 2c 6f 70 5b 69 5d  bel)-6),"",op[i]
ec70: 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20  .message);.     
ec80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
ec90: 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20  case OPT_STR:.  
eca0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54      case OPT_FST
ecb0: 52 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  R:.        fprin
ecc0: 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20  tf(errstream,"  
ecd0: 25 73 3d 3c 73 74 72 69 6e 67 3e 25 2a 73 20 20  %s=<string>%*s  
ece0: 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65  %s\n",op[i].labe
ecf0: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e  l,.          (in
ed00: 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c  t)(max-lemonStrl
ed10: 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d  en(op[i].label)-
ed20: 38 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73  8),"",op[i].mess
ed30: 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  age);.        br
ed40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
ed50: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
ed60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
ed70: 68 65 20 66 69 6c 65 20 22 70 61 72 73 65 2e 63  he file "parse.c
ed80: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
ed90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
eda0: 2f 2a 0a 2a 2a 20 49 6e 70 75 74 20 66 69 6c 65  /*.** Input file
edb0: 20 70 61 72 73 65 72 20 66 6f 72 20 74 68 65 20   parser for the 
edc0: 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
edd0: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 54  erator..*/../* T
ede0: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
edf0: 70 61 72 73 65 72 20 2a 2f 0a 73 74 72 75 63 74  parser */.struct
ee00: 20 70 73 74 61 74 65 20 7b 0a 20 20 63 68 61 72   pstate {.  char
ee10: 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20   *filename;     
ee20: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
ee30: 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
ee40: 20 69 6e 74 20 74 6f 6b 65 6e 6c 69 6e 65 6e 6f   int tokenlineno
ee50: 3b 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75  ;      /* Linenu
ee60: 6d 62 65 72 20 61 74 20 77 68 69 63 68 20 63 75  mber at which cu
ee70: 72 72 65 6e 74 20 74 6f 6b 65 6e 20 73 74 61 72  rrent token star
ee80: 74 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f  ts */.  int erro
ee90: 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  rcnt;         /*
eea0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   Number of error
eeb0: 73 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68  s so far */.  ch
eec0: 61 72 20 2a 74 6f 6b 65 6e 73 74 61 72 74 3b 20  ar *tokenstart; 
eed0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 63      /* Text of c
eee0: 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a  urrent token */.
eef0: 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a    struct lemon *
ef00: 67 70 3b 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61  gp;     /* Globa
ef10: 6c 20 73 74 61 74 65 20 76 65 63 74 6f 72 20 2a  l state vector *
ef20: 2f 0a 20 20 65 6e 75 6d 20 65 5f 73 74 61 74 65  /.  enum e_state
ef30: 20 7b 0a 20 20 20 20 49 4e 49 54 49 41 4c 49 5a   {.    INITIALIZ
ef40: 45 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46  E,.    WAITING_F
ef50: 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 2c  OR_DECL_OR_RULE,
ef60: 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  .    WAITING_FOR
ef70: 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 2c 0a 20  _DECL_KEYWORD,. 
ef80: 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44     WAITING_FOR_D
ef90: 45 43 4c 5f 41 52 47 2c 0a 20 20 20 20 57 41 49  ECL_ARG,.    WAI
efa0: 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45  TING_FOR_PRECEDE
efb0: 4e 43 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 20 20  NCE_SYMBOL,.    
efc0: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f  WAITING_FOR_ARRO
efd0: 57 2c 0a 20 20 20 20 49 4e 5f 52 48 53 2c 0a 20  W,.    IN_RHS,. 
efe0: 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f 31 2c 0a     LHS_ALIAS_1,.
eff0: 20 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f 32 2c      LHS_ALIAS_2,
f000: 0a 20 20 20 20 4c 48 53 5f 41 4c 49 41 53 5f 33  .    LHS_ALIAS_3
f010: 2c 0a 20 20 20 20 52 48 53 5f 41 4c 49 41 53 5f  ,.    RHS_ALIAS_
f020: 31 2c 0a 20 20 20 20 52 48 53 5f 41 4c 49 41 53  1,.    RHS_ALIAS
f030: 5f 32 2c 0a 20 20 20 20 50 52 45 43 45 44 45 4e  _2,.    PRECEDEN
f040: 43 45 5f 4d 41 52 4b 5f 31 2c 0a 20 20 20 20 50  CE_MARK_1,.    P
f050: 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32  RECEDENCE_MARK_2
f060: 2c 0a 20 20 20 20 52 45 53 59 4e 43 5f 41 46 54  ,.    RESYNC_AFT
f070: 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 2c 0a 20  ER_RULE_ERROR,. 
f080: 20 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f     RESYNC_AFTER_
f090: 44 45 43 4c 5f 45 52 52 4f 52 2c 0a 20 20 20 20  DECL_ERROR,.    
f0a0: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54  WAITING_FOR_DEST
f0b0: 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 2c 0a 20  RUCTOR_SYMBOL,. 
f0c0: 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44     WAITING_FOR_D
f0d0: 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 2c 0a  ATATYPE_SYMBOL,.
f0e0: 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f      WAITING_FOR_
f0f0: 46 41 4c 4c 42 41 43 4b 5f 49 44 2c 0a 20 20 20  FALLBACK_ID,.   
f100: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 45 58 50   WAITING_FOR_EXP
f110: 45 43 54 5f 56 41 4c 55 45 2c 0a 20 20 20 20 57  ECT_VALUE,.    W
f120: 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43  AITING_FOR_WILDC
f130: 41 52 44 5f 49 44 0a 20 20 7d 20 73 74 61 74 65  ARD_ID.  } state
f140: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f150: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65      /* The state
f160: 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20 2a   of the parser *
f170: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
f180: 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 20 20 2f  l *fallback;   /
f190: 2a 20 54 68 65 20 66 61 6c 6c 62 61 63 6b 20 74  * The fallback t
f1a0: 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74  oken */.  struct
f1b0: 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20 20   symbol *lhs;   
f1c0: 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e       /* Left-han
f1d0: 64 20 73 69 64 65 20 6f 66 20 63 75 72 72 65 6e  d side of curren
f1e0: 74 20 72 75 6c 65 20 2a 2f 0a 20 20 63 68 61 72  t rule */.  char
f1f0: 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 20   *lhsalias;     
f200: 20 20 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 20         /* Alias 
f210: 66 6f 72 20 74 68 65 20 4c 48 53 20 2a 2f 0a 20  for the LHS */. 
f220: 20 69 6e 74 20 6e 72 68 73 3b 20 20 20 20 20 20   int nrhs;      
f230: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
f240: 75 6d 62 65 72 20 6f 66 20 72 69 67 68 74 2d 68  umber of right-h
f250: 61 6e 64 20 73 69 64 65 20 73 79 6d 62 6f 6c 73  and side symbols
f260: 20 73 65 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63   seen */.  struc
f270: 74 20 73 79 6d 62 6f 6c 20 2a 72 68 73 5b 4d 41  t symbol *rhs[MA
f280: 58 52 48 53 5d 3b 20 20 2f 2a 20 52 48 53 20 73  XRHS];  /* RHS s
f290: 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61 72  ymbols */.  char
f2a0: 20 2a 61 6c 69 61 73 5b 4d 41 58 52 48 53 5d 3b   *alias[MAXRHS];
f2b0: 20 20 20 20 20 20 20 2f 2a 20 41 6c 69 61 73 65         /* Aliase
f2c0: 73 20 66 6f 72 20 65 61 63 68 20 52 48 53 20 73  s for each RHS s
f2d0: 79 6d 62 6f 6c 20 28 6f 72 20 4e 55 4c 4c 29 20  ymbol (or NULL) 
f2e0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  */.  struct rule
f2f0: 20 2a 70 72 65 76 72 75 6c 65 3b 20 20 20 20 20   *prevrule;     
f300: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 75 6c 65  /* Previous rule
f310: 20 70 61 72 73 65 64 20 2a 2f 0a 20 20 63 68 61   parsed */.  cha
f320: 72 20 2a 64 65 63 6c 6b 65 79 77 6f 72 64 3b 20  r *declkeyword; 
f330: 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79 77 6f          /* Keywo
f340: 72 64 20 6f 66 20 61 20 64 65 63 6c 61 72 61 74  rd of a declarat
f350: 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ion */.  char **
f360: 64 65 63 6c 61 72 67 73 6c 6f 74 3b 20 20 20 20  declargslot;    
f370: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 68 65      /* Where the
f380: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 61 72 67   declaration arg
f390: 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20  ument should be 
f3a0: 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 73  put */.  int ins
f3b0: 65 72 74 4c 69 6e 65 4d 61 63 72 6f 3b 20 20 20  ertLineMacro;   
f3c0: 20 20 20 20 2f 2a 20 41 64 64 20 23 6c 69 6e 65      /* Add #line
f3d0: 20 62 65 66 6f 72 65 20 64 65 63 6c 61 72 61 74   before declarat
f3e0: 69 6f 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20  ion insert */.  
f3f0: 69 6e 74 20 2a 64 65 63 6c 6c 69 6e 65 6e 6f 73  int *decllinenos
f400: 6c 6f 74 3b 20 20 20 20 20 20 20 2f 2a 20 57 68  lot;       /* Wh
f410: 65 72 65 20 74 6f 20 77 72 69 74 65 20 64 65 63  ere to write dec
f420: 6c 61 72 61 74 69 6f 6e 20 6c 69 6e 65 20 6e 75  laration line nu
f430: 6d 62 65 72 20 2a 2f 0a 20 20 65 6e 75 6d 20 65  mber */.  enum e
f440: 5f 61 73 73 6f 63 20 64 65 63 6c 61 73 73 6f 63  _assoc declassoc
f450: 3b 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 74  ;    /* Assign t
f460: 68 69 73 20 61 73 73 6f 63 69 61 74 69 6f 6e 20  his association 
f470: 74 6f 20 64 65 63 6c 20 61 72 67 75 6d 65 6e 74  to decl argument
f480: 73 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63 63  s */.  int precc
f490: 6f 75 6e 74 65 72 3b 20 20 20 20 20 20 20 20 20  ounter;         
f4a0: 20 20 2f 2a 20 41 73 73 69 67 6e 20 74 68 69 73    /* Assign this
f4b0: 20 70 72 65 63 65 64 65 6e 63 65 20 74 6f 20 64   precedence to d
f4c0: 65 63 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ecl arguments */
f4d0: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
f4e0: 66 69 72 73 74 72 75 6c 65 3b 20 20 20 20 2f 2a  firstrule;    /*
f4f0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73   Pointer to firs
f500: 74 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 72  t rule in the gr
f510: 61 6d 6d 61 72 20 2a 2f 0a 20 20 73 74 72 75 63  ammar */.  struc
f520: 74 20 72 75 6c 65 20 2a 6c 61 73 74 72 75 6c 65  t rule *lastrule
f530: 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ;     /* Pointer
f540: 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63   to the most rec
f550: 65 6e 74 6c 79 20 70 61 72 73 65 64 20 72 75 6c  ently parsed rul
f560: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50 61 72 73  e */.};../* Pars
f570: 65 20 61 20 73 69 6e 67 6c 65 20 74 6f 6b 65 6e  e a single token
f580: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
f590: 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 70 73  parseonetoken(ps
f5a0: 70 29 0a 73 74 72 75 63 74 20 70 73 74 61 74 65  p).struct pstate
f5b0: 20 2a 70 73 70 3b 0a 7b 0a 20 20 63 68 61 72 20   *psp;.{.  char 
f5c0: 2a 65 6e 64 70 74 72 3b 0a 20 20 63 68 61 72 20  *endptr;.  char 
f5d0: 2a 78 3b 0a 20 20 78 20 3d 20 53 74 72 73 61 66  *x;.  x = Strsaf
f5e0: 65 28 70 73 70 2d 3e 74 6f 6b 65 6e 73 74 61 72  e(psp->tokenstar
f5f0: 74 29 3b 20 20 20 20 20 2f 2a 20 53 61 76 65 20  t);     /* Save 
f600: 74 68 65 20 74 6f 6b 65 6e 20 70 65 72 6d 61 6e  the token perman
f610: 65 6e 74 6c 79 20 2a 2f 0a 23 69 66 20 30 0a 20  ently */.#if 0. 
f620: 20 70 72 69 6e 74 66 28 22 25 73 3a 25 64 3a 20   printf("%s:%d: 
f630: 54 6f 6b 65 6e 3d 5b 25 73 5d 20 73 74 61 74 65  Token=[%s] state
f640: 3d 25 64 5c 6e 22 2c 70 73 70 2d 3e 66 69 6c 65  =%d\n",psp->file
f650: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
f660: 69 6e 65 6e 6f 2c 0a 20 20 20 20 78 2c 70 73 70  ineno,.    x,psp
f670: 2d 3e 73 74 61 74 65 29 3b 0a 23 65 6e 64 69 66  ->state);.#endif
f680: 0a 20 20 73 77 69 74 63 68 28 20 70 73 70 2d 3e  .  switch( psp->
f690: 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73  state ){.    cas
f6a0: 65 20 49 4e 49 54 49 41 4c 49 5a 45 3a 0a 20 20  e INITIALIZE:.  
f6b0: 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c      psp->prevrul
f6c0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70  e = 0;.      psp
f6d0: 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 20 3d 20  ->preccounter = 
f6e0: 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 66 69  0;.      psp->fi
f6f0: 72 73 74 72 75 6c 65 20 3d 20 70 73 70 2d 3e 6c  rstrule = psp->l
f700: 61 73 74 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20  astrule = 0;.   
f710: 20 20 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c     psp->gp->nrul
f720: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20  e = 0;.      /* 
f730: 46 61 6c 6c 20 74 68 72 75 20 74 6f 20 6e 65 78  Fall thru to nex
f740: 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 63 61  t case */.    ca
f750: 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44  se WAITING_FOR_D
f760: 45 43 4c 5f 4f 52 5f 52 55 4c 45 3a 0a 20 20 20  ECL_OR_RULE:.   
f770: 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 25 27     if( x[0]=='%'
f780: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
f790: 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
f7a0: 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52  _FOR_DECL_KEYWOR
f7b0: 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  D;.      }else i
f7c0: 66 28 20 69 73 6c 6f 77 65 72 28 78 5b 30 5d 29  f( islower(x[0])
f7d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
f7e0: 3e 6c 68 73 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65  >lhs = Symbol_ne
f7f0: 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  w(x);.        ps
f800: 70 2d 3e 6e 72 68 73 20 3d 20 30 3b 0a 20 20 20  p->nrhs = 0;.   
f810: 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 61 6c 69       psp->lhsali
f820: 61 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  as = 0;.        
f830: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
f840: 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3b 0a  TING_FOR_ARROW;.
f850: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
f860: 78 5b 30 5d 3d 3d 27 7b 27 20 29 7b 0a 20 20 20  x[0]=='{' ){.   
f870: 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 70 72       if( psp->pr
f880: 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  evrule==0 ){.   
f890: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
f8a0: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
f8b0: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
f8c0: 22 54 68 65 72 65 20 69 73 20 6e 6f 20 70 72 69  "There is no pri
f8d0: 6f 72 20 72 75 6c 65 20 6f 70 6f 6e 20 77 68 69  or rule opon whi
f8e0: 63 68 20 74 6f 20 61 74 74 61 63 68 20 74 68 65  ch to attach the
f8f0: 20 63 6f 64 65 20 5c 0a 66 72 61 67 6d 65 6e 74   code \.fragment
f900: 20 77 68 69 63 68 20 62 65 67 69 6e 73 20 6f 6e   which begins on
f910: 20 74 68 69 73 20 6c 69 6e 65 2e 22 29 3b 0a 20   this line.");. 
f920: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
f930: 72 6f 72 63 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65  rorcnt++;..}else
f940: 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75   if( psp->prevru
f950: 6c 65 2d 3e 63 6f 64 65 21 3d 30 20 29 7b 0a 20  le->code!=0 ){. 
f960: 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
f970: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
f980: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
f990: 2c 0a 22 43 6f 64 65 20 66 72 61 67 6d 65 6e 74  ,."Code fragment
f9a0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 6e 20 74 68   beginning on th
f9b0: 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74  is line is not t
f9c0: 68 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f  he first \.to fo
f9d0: 6c 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f 75  llow the previou
f9e0: 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20  s rule.");.     
f9f0: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
fa00: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  nt++;.        }e
fa10: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
fa20: 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 6c 69  sp->prevrule->li
fa30: 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ne = psp->tokenl
fa40: 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  ineno;.         
fa50: 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e   psp->prevrule->
fa60: 63 6f 64 65 20 3d 20 26 78 5b 31 5d 3b 0a 09 7d  code = &x[1];..}
fa70: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
fa80: 20 78 5b 30 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20   x[0]=='[' ){.  
fa90: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
faa0: 20 3d 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41   = PRECEDENCE_MA
fab0: 52 4b 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RK_1;.      }els
fac0: 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
fad0: 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
fae0: 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
faf0: 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54  no,.          "T
fb00: 6f 6b 65 6e 20 5c 22 25 73 5c 22 20 73 68 6f 75  oken \"%s\" shou
fb10: 6c 64 20 62 65 20 65 69 74 68 65 72 20 5c 22 25  ld be either \"%
fb20: 25 5c 22 20 6f 72 20 61 20 6e 6f 6e 74 65 72 6d  %\" or a nonterm
fb30: 69 6e 61 6c 20 6e 61 6d 65 2e 22 2c 0a 20 20 20  inal name.",.   
fb40: 20 20 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20         x);.     
fb50: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
fb60: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
fb70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
fb80: 65 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52  e PRECEDENCE_MAR
fb90: 4b 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20 21  K_1:.      if( !
fba0: 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b  isupper(x[0]) ){
fbb0: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
fbc0: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
fbd0: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
fbe0: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 54 68 65  ,.          "The
fbf0: 20 70 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62   precedence symb
fc00: 6f 6c 20 6d 75 73 74 20 62 65 20 61 20 74 65 72  ol must be a ter
fc10: 6d 69 6e 61 6c 2e 22 29 3b 0a 20 20 20 20 20 20  minal.");.      
fc20: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
fc30: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
fc40: 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65  f( psp->prevrule
fc50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ==0 ){.        E
fc60: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
fc70: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
fc80: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
fc90: 20 20 22 54 68 65 72 65 20 69 73 20 6e 6f 20 70    "There is no p
fca0: 72 69 6f 72 20 72 75 6c 65 20 74 6f 20 61 73 73  rior rule to ass
fcb0: 69 67 6e 20 70 72 65 63 65 64 65 6e 63 65 20 5c  ign precedence \
fcc0: 22 5b 25 73 5d 5c 22 2e 22 2c 78 29 3b 0a 20 20  "[%s]\".",x);.  
fcd0: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
fce0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  cnt++;.      }el
fcf0: 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76  se if( psp->prev
fd00: 72 75 6c 65 2d 3e 70 72 65 63 73 79 6d 21 3d 30  rule->precsym!=0
fd10: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
fd20: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
fd30: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
fd40: 65 6e 6f 2c 0a 22 50 72 65 63 65 64 65 6e 63 65  eno,."Precedence
fd50: 20 6d 61 72 6b 20 6f 6e 20 74 68 69 73 20 6c 69   mark on this li
fd60: 6e 65 20 69 73 20 6e 6f 74 20 74 68 65 20 66 69  ne is not the fi
fd70: 72 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20  rst \.to follow 
fd80: 74 68 65 20 70 72 65 76 69 6f 75 73 20 72 75 6c  the previous rul
fd90: 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  e.");.        ps
fda0: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
fdb0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fdc0: 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c      psp->prevrul
fdd0: 65 2d 3e 70 72 65 63 73 79 6d 20 3d 20 53 79 6d  e->precsym = Sym
fde0: 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
fdf0: 20 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73    }.      psp->s
fe00: 74 61 74 65 20 3d 20 50 52 45 43 45 44 45 4e 43  tate = PRECEDENC
fe10: 45 5f 4d 41 52 4b 5f 32 3b 0a 20 20 20 20 20 20  E_MARK_2;.      
fe20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
fe30: 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f  PRECEDENCE_MARK_
fe40: 32 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  2:.      if( x[0
fe50: 5d 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20  ]!=']' ){.      
fe60: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
fe70: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
fe80: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
fe90: 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22       "Missing \"
fea0: 5d 5c 22 20 6f 6e 20 70 72 65 63 65 64 65 6e 63  ]\" on precedenc
feb0: 65 20 6d 61 72 6b 2e 22 29 3b 0a 20 20 20 20 20  e mark.");.     
fec0: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
fed0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
fee0: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
fef0: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
ff00: 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 62  OR_RULE;.      b
ff10: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57  reak;.    case W
ff20: 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57  AITING_FOR_ARROW
ff30: 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
ff40: 3d 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27  ==':' && x[1]=='
ff50: 3a 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20  :' && x[2]=='=' 
ff60: 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
ff70: 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a  state = IN_RHS;.
ff80: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ff90: 78 5b 30 5d 3d 3d 27 28 27 20 29 7b 0a 20 20 20  x[0]=='(' ){.   
ffa0: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
ffb0: 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20  = LHS_ALIAS_1;. 
ffc0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ffd0: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
ffe0: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
fff0: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
10000 20 20 20 20 20 20 20 22 45 78 70 65 63 74 65 64         "Expected
10010 20 74 6f 20 73 65 65 20 61 20 5c 22 3a 5c 22 20   to see a \":\" 
10020 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 4c 48  following the LH
10030 53 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 2e  S symbol \"%s\".
10040 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ",.          psp
10050 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ->lhs->name);.  
10060 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
10070 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
10080 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
10090 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
100a0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
100b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
100c0 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 31 3a 0a  se LHS_ALIAS_1:.
100d0 20 20 20 20 20 20 69 66 28 20 69 73 61 6c 70 68        if( isalph
100e0 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  a(x[0]) ){.     
100f0 20 20 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73     psp->lhsalias
10100 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73   = x;.        ps
10110 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41  p->state = LHS_A
10120 4c 49 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65  LIAS_2;.      }e
10130 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
10140 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
10150 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
10160 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
10170 22 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61  "\"%s\" is not a
10180 20 76 61 6c 69 64 20 61 6c 69 61 73 20 66 6f 72   valid alias for
10190 20 74 68 65 20 4c 48 53 20 5c 22 25 73 5c 22 5c   the LHS \"%s\"\
101a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c  n",.          x,
101b0 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b  psp->lhs->name);
101c0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
101d0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
101e0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
101f0 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
10200 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
10210 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10220 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f   case LHS_ALIAS_
10230 32 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  2:.      if( x[0
10240 5d 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20  ]==')' ){.      
10250 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c    psp->state = L
10260 48 53 5f 41 4c 49 41 53 5f 33 3b 0a 20 20 20 20  HS_ALIAS_3;.    
10270 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10280 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
10290 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
102a0 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
102b0 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29      "Missing \")
102c0 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53  \" following LHS
102d0 20 61 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25 73   alias name \"%s
102e0 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69  \".",psp->lhsali
102f0 61 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  as);.        psp
10300 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
10310 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10320 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
10330 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
10340 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
10350 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c  .    case LHS_AL
10360 49 41 53 5f 33 3a 0a 20 20 20 20 20 20 69 66 28  IAS_3:.      if(
10370 20 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b   x[0]==':' && x[
10380 31 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d  1]==':' && x[2]=
10390 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='=' ){.        
103a0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f  psp->state = IN_
103b0 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  RHS;.      }else
103c0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
103d0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
103e0 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
103f0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69  o,.          "Mi
10400 73 73 69 6e 67 20 5c 22 2d 3e 5c 22 20 66 6f 6c  ssing \"->\" fol
10410 6c 6f 77 69 6e 67 3a 20 5c 22 25 73 28 25 73 29  lowing: \"%s(%s)
10420 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  \".",.          
10430 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c   psp->lhs->name,
10440 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a  psp->lhsalias);.
10450 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
10460 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
10470 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
10480 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
10490 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
104a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
104b0 63 61 73 65 20 49 4e 5f 52 48 53 3a 0a 20 20 20  case IN_RHS:.   
104c0 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27     if( x[0]=='.'
104d0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
104e0 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 20  ct rule *rp;.   
104f0 20 20 20 20 20 72 70 20 3d 20 28 73 74 72 75 63       rp = (struc
10500 74 20 72 75 6c 65 20 2a 29 63 61 6c 6c 6f 63 28  t rule *)calloc(
10510 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 72   sizeof(struct r
10520 75 6c 65 29 20 2b 20 0a 20 20 20 20 20 20 20 20  ule) + .        
10530 20 20 20 20 20 73 69 7a 65 6f 66 28 73 74 72 75       sizeof(stru
10540 63 74 20 73 79 6d 62 6f 6c 2a 29 2a 70 73 70 2d  ct symbol*)*psp-
10550 3e 6e 72 68 73 20 2b 20 73 69 7a 65 6f 66 28 63  >nrhs + sizeof(c
10560 68 61 72 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 2c  har*)*psp->nrhs,
10570 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
10580 20 72 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   rp==0 ){.      
10590 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
105a0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
105b0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
105c0 20 20 20 20 20 20 20 20 20 22 43 61 6e 27 74 20           "Can't 
105d0 61 6c 6c 6f 63 61 74 65 20 65 6e 6f 75 67 68 20  allocate enough 
105e0 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 69 73 20  memory for this 
105f0 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20  rule.");.       
10600 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
10610 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
10620 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 30 3b  p->prevrule = 0;
10630 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20  ..}else{.       
10640 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
10650 20 20 20 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65      rp->ruleline
10660 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e   = psp->tokenlin
10670 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  eno;.          r
10680 70 2d 3e 72 68 73 20 3d 20 28 73 74 72 75 63 74  p->rhs = (struct
10690 20 73 79 6d 62 6f 6c 2a 2a 29 26 72 70 5b 31 5d   symbol**)&rp[1]
106a0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
106b0 72 68 73 61 6c 69 61 73 20 3d 20 28 63 68 61 72  rhsalias = (char
106c0 2a 2a 29 26 28 72 70 2d 3e 72 68 73 5b 70 73 70  **)&(rp->rhs[psp
106d0 2d 3e 6e 72 68 73 5d 29 3b 0a 20 20 20 20 20 20  ->nrhs]);.      
106e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
106f0 73 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a  sp->nrhs; i++){.
10700 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e              rp->
10710 72 68 73 5b 69 5d 20 3d 20 70 73 70 2d 3e 72 68  rhs[i] = psp->rh
10720 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  s[i];.          
10730 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69    rp->rhsalias[i
10740 5d 20 3d 20 70 73 70 2d 3e 61 6c 69 61 73 5b 69  ] = psp->alias[i
10750 5d 3b 0a 09 20 20 7d 0a 20 20 20 20 20 20 20 20  ];..  }.        
10760 20 20 72 70 2d 3e 6c 68 73 20 3d 20 70 73 70 2d    rp->lhs = psp-
10770 3e 6c 68 73 3b 0a 20 20 20 20 20 20 20 20 20 20  >lhs;.          
10780 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 70  rp->lhsalias = p
10790 73 70 2d 3e 6c 68 73 61 6c 69 61 73 3b 0a 20 20  sp->lhsalias;.  
107a0 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 72 68 73          rp->nrhs
107b0 20 3d 20 70 73 70 2d 3e 6e 72 68 73 3b 0a 20 20   = psp->nrhs;.  
107c0 20 20 20 20 20 20 20 20 72 70 2d 3e 63 6f 64 65          rp->code
107d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
107e0 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 30 3b  rp->precsym = 0;
107f0 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 69  .          rp->i
10800 6e 64 65 78 20 3d 20 70 73 70 2d 3e 67 70 2d 3e  ndex = psp->gp->
10810 6e 72 75 6c 65 2b 2b 3b 0a 20 20 20 20 20 20 20  nrule++;.       
10820 20 20 20 72 70 2d 3e 6e 65 78 74 6c 68 73 20 3d     rp->nextlhs =
10830 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65 3b 0a   rp->lhs->rule;.
10840 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68            rp->lh
10850 73 2d 3e 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20  s->rule = rp;.  
10860 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 65 78 74          rp->next
10870 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
10880 69 66 28 20 70 73 70 2d 3e 66 69 72 73 74 72 75  if( psp->firstru
10890 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
108a0 20 20 20 20 20 70 73 70 2d 3e 66 69 72 73 74 72       psp->firstr
108b0 75 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72  ule = psp->lastr
108c0 75 6c 65 20 3d 20 72 70 3b 0a 09 20 20 7d 65 6c  ule = rp;..  }el
108d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
108e0 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 2d 3e 6e  psp->lastrule->n
108f0 65 78 74 20 3d 20 72 70 3b 0a 20 20 20 20 20 20  ext = rp;.      
10900 20 20 20 20 20 20 70 73 70 2d 3e 6c 61 73 74 72        psp->lastr
10910 75 6c 65 20 3d 20 72 70 3b 0a 09 20 20 7d 0a 20  ule = rp;..  }. 
10920 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
10930 65 76 72 75 6c 65 20 3d 20 72 70 3b 0a 09 7d 0a  evrule = rp;..}.
10940 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
10950 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
10960 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20  _DECL_OR_RULE;. 
10970 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
10980 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a  salpha(x[0]) ){.
10990 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d          if( psp-
109a0 3e 6e 72 68 73 3e 3d 4d 41 58 52 48 53 20 29 7b  >nrhs>=MAXRHS ){
109b0 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
109c0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
109d0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
109e0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
109f0 22 54 6f 6f 20 6d 61 6e 79 20 73 79 6d 62 6f 6c  "Too many symbol
10a00 73 20 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c 65  s on RHS of rule
10a10 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 5c 22   beginning at \"
10a20 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20  %s\".",.        
10a30 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20 20      x);.        
10a40 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
10a50 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  +;.          psp
10a60 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
10a70 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
10a80 52 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20  R;..}else{.     
10a90 20 20 20 20 20 70 73 70 2d 3e 72 68 73 5b 70 73       psp->rhs[ps
10aa0 70 2d 3e 6e 72 68 73 5d 20 3d 20 53 79 6d 62 6f  p->nrhs] = Symbo
10ab0 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20  l_new(x);.      
10ac0 20 20 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70      psp->alias[p
10ad0 73 70 2d 3e 6e 72 68 73 5d 20 3d 20 30 3b 0a 20  sp->nrhs] = 0;. 
10ae0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6e 72           psp->nr
10af0 68 73 2b 2b 3b 0a 09 7d 0a 20 20 20 20 20 20 7d  hs++;..}.      }
10b00 65 6c 73 65 20 69 66 28 20 28 78 5b 30 5d 3d 3d  else if( (x[0]==
10b10 27 7c 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 2f 27  '|' || x[0]=='/'
10b20 29 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30  ) && psp->nrhs>0
10b30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
10b40 63 74 20 73 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d  ct symbol *msp =
10b50 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e   psp->rhs[psp->n
10b60 72 68 73 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20  rhs-1];.        
10b70 69 66 28 20 6d 73 70 2d 3e 74 79 70 65 21 3d 4d  if( msp->type!=M
10b80 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
10b90 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
10ba0 20 73 79 6d 62 6f 6c 20 2a 6f 72 69 67 73 70 20   symbol *origsp 
10bb0 3d 20 6d 73 70 3b 0a 20 20 20 20 20 20 20 20 20  = msp;.         
10bc0 20 6d 73 70 20 3d 20 63 61 6c 6c 6f 63 28 31 2c   msp = calloc(1,
10bd0 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20  sizeof(*msp));. 
10be0 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
10bf0 6d 73 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  msp, 0, sizeof(*
10c00 6d 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20 20  msp));.         
10c10 20 6d 73 70 2d 3e 74 79 70 65 20 3d 20 4d 55 4c   msp->type = MUL
10c20 54 49 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20  TITERMINAL;.    
10c30 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73        msp->nsubs
10c40 79 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ym = 1;.        
10c50 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20    msp->subsym = 
10c60 63 61 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f 66 28  calloc(1,sizeof(
10c70 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 29  struct symbol*))
10c80 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d  ;.          msp-
10c90 3e 73 75 62 73 79 6d 5b 30 5d 20 3d 20 6f 72 69  >subsym[0] = ori
10ca0 67 73 70 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  gsp;.          m
10cb0 73 70 2d 3e 6e 61 6d 65 20 3d 20 6f 72 69 67 73  sp->name = origs
10cc0 70 2d 3e 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  p->name;.       
10cd0 20 20 20 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d     psp->rhs[psp-
10ce0 3e 6e 72 68 73 2d 31 5d 20 3d 20 6d 73 70 3b 0a  >nrhs-1] = msp;.
10cf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10d00 20 20 6d 73 70 2d 3e 6e 73 75 62 73 79 6d 2b 2b    msp->nsubsym++
10d10 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73  ;.        msp->s
10d20 75 62 73 79 6d 20 3d 20 72 65 61 6c 6c 6f 63 28  ubsym = realloc(
10d30 6d 73 70 2d 3e 73 75 62 73 79 6d 2c 20 73 69 7a  msp->subsym, siz
10d40 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
10d50 6c 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62 73 79 6d  l*)*msp->nsubsym
10d60 29 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e  );.        msp->
10d70 73 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75 62  subsym[msp->nsub
10d80 73 79 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c 5f  sym-1] = Symbol_
10d90 6e 65 77 28 26 78 5b 31 5d 29 3b 0a 20 20 20 20  new(&x[1]);.    
10da0 20 20 20 20 69 66 28 20 69 73 6c 6f 77 65 72 28      if( islower(
10db0 78 5b 31 5d 29 20 7c 7c 20 69 73 6c 6f 77 65 72  x[1]) || islower
10dc0 28 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d  (msp->subsym[0]-
10dd0 3e 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20 20  >name[0]) ){.   
10de0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
10df0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
10e00 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
10e10 20 20 20 20 20 20 20 20 20 20 20 20 22 43 61 6e              "Can
10e20 6e 6f 74 20 66 6f 72 6d 20 61 20 63 6f 6d 70 6f  not form a compo
10e30 75 6e 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  und containing a
10e40 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 22 29 3b   non-terminal");
10e50 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10e60 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
10e70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
10e80 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20  e if( x[0]=='(' 
10e90 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29  && psp->nrhs>0 )
10ea0 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
10eb0 74 61 74 65 20 3d 20 52 48 53 5f 41 4c 49 41 53  tate = RHS_ALIAS
10ec0 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _1;.      }else{
10ed0 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
10ee0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
10ef0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
10f00 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c  ,.          "Ill
10f10 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20 6f  egal character o
10f20 6e 20 52 48 53 20 6f 66 20 72 75 6c 65 3a 20 5c  n RHS of rule: \
10f30 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20  "%s\".",x);.    
10f40 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
10f50 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
10f60 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
10f70 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
10f80 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
10f90 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
10fa0 20 52 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20   RHS_ALIAS_1:.  
10fb0 20 20 20 20 69 66 28 20 69 73 61 6c 70 68 61 28      if( isalpha(
10fc0 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
10fd0 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d   psp->alias[psp-
10fe0 3e 6e 72 68 73 2d 31 5d 20 3d 20 78 3b 0a 20 20  >nrhs-1] = x;.  
10ff0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
11000 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 32 3b 0a   = RHS_ALIAS_2;.
11010 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11020 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
11030 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
11040 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
11050 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20          "\"%s\" 
11060 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61  is not a valid a
11070 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52 48 53  lias for the RHS
11080 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c 6e   symbol \"%s\"\n
11090 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c 70  ",.          x,p
110a0 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68  sp->rhs[psp->nrh
110b0 73 2d 31 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  s-1]->name);.   
110c0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
110d0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
110e0 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
110f0 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
11100 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
11110 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
11120 65 20 52 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20  e RHS_ALIAS_2:. 
11130 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
11140 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  )' ){.        ps
11150 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48  p->state = IN_RH
11160 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  S;.      }else{.
11170 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
11180 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
11190 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
111a0 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73  .          "Miss
111b0 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77  ing \")\" follow
111c0 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e 61  ing LHS alias na
111d0 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d  me \"%s\".",psp-
111e0 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 20  >lhsalias);.    
111f0 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
11200 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
11210 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
11220 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
11230 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
11240 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
11250 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
11260 4c 5f 4b 45 59 57 4f 52 44 3a 0a 20 20 20 20 20  L_KEYWORD:.     
11270 20 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30   if( isalpha(x[0
11280 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  ]) ){.        ps
11290 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 20 3d  p->declkeyword =
112a0 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   x;.        psp-
112b0 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 30  >declargslot = 0
112c0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64  ;.        psp->d
112d0 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d 20  ecllinenoslot = 
112e0 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
112f0 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
11300 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = 1;.        psp
11310 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
11320 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a  G_FOR_DECL_ARG;.
11330 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
11340 6d 70 28 78 2c 22 6e 61 6d 65 22 29 3d 3d 30 20  mp(x,"name")==0 
11350 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
11360 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
11370 26 28 70 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65 29  &(psp->gp->name)
11380 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
11390 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
113a0 20 3d 20 30 3b 0a 09 7d 65 6c 73 65 20 69 66 28   = 0;..}else if(
113b0 20 73 74 72 63 6d 70 28 78 2c 22 69 6e 63 6c 75   strcmp(x,"inclu
113c0 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  de")==0 ){.     
113d0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
113e0 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
113f0 70 2d 3e 69 6e 63 6c 75 64 65 29 3b 0a 09 7d 65  p->include);..}e
11400 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
11410 2c 22 63 6f 64 65 22 29 3d 3d 30 20 29 7b 0a 20  ,"code")==0 ){. 
11420 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
11430 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
11440 70 2d 3e 67 70 2d 3e 65 78 74 72 61 63 6f 64 65  p->gp->extracode
11450 29 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74  );..}else if( st
11460 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 64 65  rcmp(x,"token_de
11470 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b  structor")==0 ){
11480 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11490 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70  declargslot = &p
114a0 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 64 65 73  sp->gp->tokendes
114b0 74 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74  t;..}else if( st
114c0 72 63 6d 70 28 78 2c 22 64 65 66 61 75 6c 74 5f  rcmp(x,"default_
114d0 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20  destructor")==0 
114e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
114f0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
11500 26 70 73 70 2d 3e 67 70 2d 3e 76 61 72 64 65 73  &psp->gp->vardes
11510 74 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74  t;..}else if( st
11520 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 70 72  rcmp(x,"token_pr
11530 65 66 69 78 22 29 3d 3d 30 20 29 7b 0a 20 20 20  efix")==0 ){.   
11540 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
11550 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e  argslot = &psp->
11560 67 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b  gp->tokenprefix;
11570 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11580 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
11590 3d 20 30 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  = 0;..}else if( 
115a0 73 74 72 63 6d 70 28 78 2c 22 73 79 6e 74 61 78  strcmp(x,"syntax
115b0 5f 65 72 72 6f 72 22 29 3d 3d 30 20 29 7b 0a 20  _error")==0 ){. 
115c0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
115d0 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
115e0 70 2d 3e 67 70 2d 3e 65 72 72 6f 72 29 3b 0a 09  p->gp->error);..
115f0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
11600 28 78 2c 22 70 61 72 73 65 5f 61 63 63 65 70 74  (x,"parse_accept
11610 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
11620 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
11630 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
11640 3e 61 63 63 65 70 74 29 3b 0a 09 7d 65 6c 73 65  >accept);..}else
11650 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 70   if( strcmp(x,"p
11660 61 72 73 65 5f 66 61 69 6c 75 72 65 22 29 3d 3d  arse_failure")==
11670 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
11680 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
11690 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 66 61 69  = &(psp->gp->fai
116a0 6c 75 72 65 29 3b 0a 09 7d 65 6c 73 65 20 69 66  lure);..}else if
116b0 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 63  ( strcmp(x,"stac
116c0 6b 5f 6f 76 65 72 66 6c 6f 77 22 29 3d 3d 30 20  k_overflow")==0 
116d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
116e0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
116f0 26 28 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72 66  &(psp->gp->overf
11700 6c 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  low);.        }e
11710 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
11720 2c 22 65 78 74 72 61 5f 61 72 67 75 6d 65 6e 74  ,"extra_argument
11730 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
11740 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
11750 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
11760 3e 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20  >arg);.         
11770 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65   psp->insertLine
11780 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20  Macro = 0;.     
11790 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
117a0 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 74 79 70  cmp(x,"token_typ
117b0 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
117c0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
117d0 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
117e0 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3b 0a 20 20  ->tokentype);.  
117f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73          psp->ins
11800 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30  ertLineMacro = 0
11810 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
11820 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65  if( strcmp(x,"de
11830 66 61 75 6c 74 5f 74 79 70 65 22 29 3d 3d 30 20  fault_type")==0 
11840 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
11850 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
11860 26 28 70 73 70 2d 3e 67 70 2d 3e 76 61 72 74 79  &(psp->gp->varty
11870 70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pe);.          p
11880 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
11890 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cro = 0;.       
118a0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
118b0 70 28 78 2c 22 73 74 61 63 6b 5f 73 69 7a 65 22  p(x,"stack_size"
118c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
118d0 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
118e0 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
118f0 73 74 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20  stacksize);.    
11900 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72        psp->inser
11910 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a  tLineMacro = 0;.
11920 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
11930 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 72  ( strcmp(x,"star
11940 74 5f 73 79 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b  t_symbol")==0 ){
11950 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11960 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
11970 70 73 70 2d 3e 67 70 2d 3e 73 74 61 72 74 29 3b  psp->gp->start);
11980 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11990 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
119a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
119b0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
119c0 22 6c 65 66 74 22 29 3d 3d 30 20 29 7b 0a 20 20  "left")==0 ){.  
119d0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
119e0 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  ccounter++;.    
119f0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
11a00 73 73 6f 63 20 3d 20 4c 45 46 54 3b 0a 20 20 20  ssoc = LEFT;.   
11a10 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11a20 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
11a30 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
11a40 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
11a50 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 72   if( strcmp(x,"r
11a60 69 67 68 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ight")==0 ){.   
11a70 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63         psp->prec
11a80 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20  counter++;.     
11a90 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73       psp->declas
11aa0 73 6f 63 20 3d 20 52 49 47 48 54 3b 0a 20 20 20  soc = RIGHT;.   
11ab0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11ac0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
11ad0 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
11ae0 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
11af0 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e   if( strcmp(x,"n
11b00 6f 6e 61 73 73 6f 63 22 29 3d 3d 30 20 29 7b 0a  onassoc")==0 ){.
11b10 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
11b20 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  reccounter++;.  
11b30 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
11b40 6c 61 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20  lassoc = NONE;. 
11b50 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
11b60 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
11b70 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d  R_PRECEDENCE_SYM
11b80 42 4f 4c 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  BOL;..}else if( 
11b90 73 74 72 63 6d 70 28 78 2c 22 64 65 73 74 72 75  strcmp(x,"destru
11ba0 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ctor")==0 ){.   
11bb0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11bc0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
11bd0 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f  DESTRUCTOR_SYMBO
11be0 4c 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74  L;..}else if( st
11bf0 72 63 6d 70 28 78 2c 22 74 79 70 65 22 29 3d 3d  rcmp(x,"type")==
11c00 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
11c10 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
11c20 49 4e 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45  ING_FOR_DATATYPE
11c30 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20  _SYMBOL;.       
11c40 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
11c50 70 28 78 2c 22 66 61 6c 6c 62 61 63 6b 22 29 3d  p(x,"fallback")=
11c60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11c70 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20  psp->fallback = 
11c80 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  0;.          psp
11c90 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
11ca0 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49  G_FOR_FALLBACK_I
11cb0 44 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  D;.        }else
11cc0 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 77   if( strcmp(x,"w
11cd0 69 6c 64 63 61 72 64 22 29 3d 3d 30 20 29 7b 0a  ildcard")==0 ){.
11ce0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
11cf0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
11d00 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 3b 0a  OR_WILDCARD_ID;.
11d10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
11d20 28 20 73 74 72 63 6d 70 28 78 2c 22 65 78 70 65  ( strcmp(x,"expe
11d30 63 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ct")==0 ){.     
11d40 20 20 20 20 20 69 66 20 28 70 73 70 2d 3e 67 70       if (psp->gp
11d50 2d 3e 6e 65 78 70 65 63 74 65 64 20 3e 3d 20 30  ->nexpected >= 0
11d60 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
11d70 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
11d80 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
11d90 6e 6c 69 6e 65 6e 6f 2c 20 22 4d 75 6c 74 69 70  nlineno, "Multip
11da0 6c 65 20 25 65 78 70 65 63 74 20 64 65 63 6c 61  le %expect decla
11db0 72 61 74 69 6f 6e 73 2e 22 29 3b 0a 20 20 20 20  rations.");.    
11dc0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
11dd0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
11de0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11df0 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
11e00 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
11e10 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
11e20 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73            psp->s
11e30 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
11e40 4f 52 5f 45 58 50 45 43 54 5f 56 41 4c 55 45 3b  OR_EXPECT_VALUE;
11e50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
11e60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11e70 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11e80 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
11e90 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
11ea0 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 6b 6e             "Unkn
11eb0 6f 77 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  own declaration 
11ec0 6b 65 79 77 6f 72 64 3a 20 5c 22 25 25 25 73 5c  keyword: \"%%%s\
11ed0 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20  ".",x);.        
11ee0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
11ef0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  +;.          psp
11f00 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
11f10 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
11f20 52 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73  R;..}.      }els
11f30 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
11f40 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
11f50 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
11f60 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49  no,.          "I
11f70 6c 6c 65 67 61 6c 20 64 65 63 6c 61 72 61 74 69  llegal declarati
11f80 6f 6e 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25 73  on keyword: \"%s
11f90 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20  \".",x);.       
11fa0 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
11fb0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
11fc0 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
11fd0 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a  TER_DECL_ERROR;.
11fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
11ff0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
12000 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55  ITING_FOR_DESTRU
12010 43 54 4f 52 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20  CTOR_SYMBOL:.   
12020 20 20 20 69 66 28 20 21 69 73 61 6c 70 68 61 28     if( !isalpha(
12030 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
12040 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
12050 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
12060 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
12070 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61 6d 65      "Symbol name
12080 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72 20 25   missing after %
12090 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79 77 6f  destructor keywo
120a0 72 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73  rd");.        ps
120b0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
120c0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
120d0 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
120e0 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  _DECL_ERROR;.   
120f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12100 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
12110 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  *sp = Symbol_new
12120 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  (x);.        psp
12130 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
12140 26 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b  &sp->destructor;
12150 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65  .        psp->de
12160 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d 20 26  cllinenoslot = &
12170 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f 3b 0a  sp->destLineno;.
12180 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73          psp->ins
12190 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 31  ertLineMacro = 1
121a0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
121b0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
121c0 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20  OR_DECL_ARG;.   
121d0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
121e0 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  ;.    case WAITI
121f0 4e 47 5f 46 4f 52 5f 45 58 50 45 43 54 5f 56 41  NG_FOR_EXPECT_VA
12200 4c 55 45 3a 0a 20 20 20 20 20 20 20 20 70 73 70  LUE:.        psp
12210 2d 3e 67 70 2d 3e 6e 65 78 70 65 63 74 65 64 20  ->gp->nexpected 
12220 3d 20 28 69 6e 74 29 20 73 74 72 74 6f 6c 28 78  = (int) strtol(x
12230 2c 20 26 65 6e 64 70 74 72 2c 20 31 30 29 3b 0a  , &endptr, 10);.
12240 20 20 20 20 20 20 20 20 69 66 28 20 28 2a 65 6e          if( (*en
12250 64 70 74 72 20 21 3d 20 27 5c 30 27 29 20 7c 7c  dptr != '\0') ||
12260 20 28 65 6e 64 70 74 72 20 3d 3d 20 78 29 20 29   (endptr == x) )
12270 20 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72   {.          Err
12280 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
12290 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
122a0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
122b0 20 20 22 49 6e 74 65 67 65 72 20 65 78 70 65 63    "Integer expec
122c0 74 65 64 20 61 66 74 65 72 20 25 25 65 78 70 65  ted after %%expe
122d0 63 74 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20  ct keyword");.  
122e0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
122f0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
12300 20 7d 20 65 6c 73 65 20 69 66 20 28 70 73 70 2d   } else if (psp-
12310 3e 67 70 2d 3e 6e 65 78 70 65 63 74 65 64 20 3c  >gp->nexpected <
12320 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   0) {.          
12330 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
12340 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
12350 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
12360 20 20 20 20 20 22 49 6e 74 65 67 65 72 20 63 61       "Integer ca
12370 6e 27 74 20 62 65 20 6e 65 67 61 74 69 76 65 20  n't be negative 
12380 61 66 74 65 72 20 25 25 65 78 70 65 63 74 20 6b  after %%expect k
12390 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20 20 20  eyword");.      
123a0 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
123b0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
123c0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
123d0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
123e0 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20  DECL_OR_RULE;.  
123f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12400 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
12410 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f  R_DATATYPE_SYMBO
12420 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  L:.      if( !is
12430 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20  alpha(x[0]) ){. 
12440 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
12450 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
12460 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
12470 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f            "Symbo
12480 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61  l name missing a
12490 66 74 65 72 20 25 64 65 73 74 72 75 63 74 6f 72  fter %destructor
124a0 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20   keyword");.    
124b0 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
124c0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
124d0 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
124e0 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
124f0 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
12500 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
12510 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62  ymbol *sp = Symb
12520 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
12530 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
12540 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 61 74 61 74  lot = &sp->datat
12550 79 70 65 3b 0a 20 20 20 20 20 20 20 20 70 73 70  ype;.        psp
12560 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
12570 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  o = 0;.        p
12580 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
12590 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47  ING_FOR_DECL_ARG
125a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
125b0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
125c0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43  WAITING_FOR_PREC
125d0 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3a 0a 20  EDENCE_SYMBOL:. 
125e0 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
125f0 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  .' ){.        ps
12600 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
12610 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
12620 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
12630 20 69 66 28 20 69 73 75 70 70 65 72 28 78 5b 30   if( isupper(x[0
12640 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  ]) ){.        st
12650 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
12660 0a 20 20 20 20 20 20 20 20 73 70 20 3d 20 53 79  .        sp = Sy
12670 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
12680 20 20 20 20 20 69 66 28 20 73 70 2d 3e 70 72 65       if( sp->pre
12690 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c>=0 ){.        
126a0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
126b0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
126c0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
126d0 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 5c         "Symbol \
126e0 22 25 73 5c 22 20 68 61 73 20 61 6c 72 65 61 64  "%s\" has alread
126f0 79 20 62 65 20 67 69 76 65 6e 20 61 20 70 72 65  y be given a pre
12700 63 65 64 65 6e 63 65 2e 22 2c 78 29 3b 0a 20 20  cedence.",x);.  
12710 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
12720 6f 72 63 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65 7b  orcnt++;..}else{
12730 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 70  .          sp->p
12740 72 65 63 20 3d 20 70 73 70 2d 3e 70 72 65 63 63  rec = psp->precc
12750 6f 75 6e 74 65 72 3b 0a 20 20 20 20 20 20 20 20  ounter;.        
12760 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20 70 73    sp->assoc = ps
12770 70 2d 3e 64 65 63 6c 61 73 73 6f 63 3b 0a 09 7d  p->declassoc;..}
12780 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12790 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
127a0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
127b0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
127c0 20 20 20 20 20 20 20 20 20 22 43 61 6e 27 74 20           "Can't 
127d0 61 73 73 69 67 6e 20 61 20 70 72 65 63 65 64 65  assign a precede
127e0 6e 63 65 20 74 6f 20 5c 22 25 73 5c 22 2e 22 2c  nce to \"%s\".",
127f0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
12800 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
12810 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
12820 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  ;.    case WAITI
12830 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3a  NG_FOR_DECL_ARG:
12840 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
12850 3d 27 7b 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c  ='{' || x[0]=='\
12860 22 27 20 7c 7c 20 69 73 61 6c 6e 75 6d 28 78 5b  "' || isalnum(x[
12870 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  0]) ){.        c
12880 68 61 72 20 2a 7a 4f 6c 64 2c 20 2a 7a 4e 65 77  har *zOld, *zNew
12890 2c 20 2a 7a 42 75 66 2c 20 2a 7a 3b 0a 20 20 20  , *zBuf, *z;.   
128a0 20 20 20 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 6e       int nOld, n
128b0 2c 20 6e 4c 69 6e 65 2c 20 6e 4e 65 77 2c 20 6e  , nLine, nNew, n
128c0 42 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e  Back;.        in
128d0 74 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 3b 0a  t addLineMacro;.
128e0 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 4c 69          char zLi
128f0 6e 65 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20  ne[50];.        
12900 7a 4e 65 77 20 3d 20 78 3b 0a 20 20 20 20 20 20  zNew = x;.      
12910 20 20 69 66 28 20 7a 4e 65 77 5b 30 5d 3d 3d 27    if( zNew[0]=='
12920 22 27 20 7c 7c 20 7a 4e 65 77 5b 30 5d 3d 3d 27  "' || zNew[0]=='
12930 7b 27 20 29 20 7a 4e 65 77 2b 2b 3b 0a 20 20 20  {' ) zNew++;.   
12940 20 20 20 20 20 6e 4e 65 77 20 3d 20 6c 65 6d 6f       nNew = lemo
12950 6e 53 74 72 6c 65 6e 28 7a 4e 65 77 29 3b 0a 20  nStrlen(zNew);. 
12960 20 20 20 20 20 20 20 69 66 28 20 2a 70 73 70 2d         if( *psp-
12970 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 29 7b 0a  >declargslot ){.
12980 20 20 20 20 20 20 20 20 20 20 7a 4f 6c 64 20 3d            zOld =
12990 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c   *psp->declargsl
129a0 6f 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ot;.        }els
129b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c  e{.          zOl
129c0 64 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  d = "";.        
129d0 7d 0a 20 20 20 20 20 20 20 20 6e 4f 6c 64 20 3d  }.        nOld =
129e0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4f 6c   lemonStrlen(zOl
129f0 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20  d);.        n = 
12a00 6e 4f 6c 64 20 2b 20 6e 4e 65 77 20 2b 20 32 30  nOld + nNew + 20
12a10 3b 0a 20 20 20 20 20 20 20 20 61 64 64 4c 69 6e  ;.        addLin
12a20 65 4d 61 63 72 6f 20 3d 20 21 70 73 70 2d 3e 67  eMacro = !psp->g
12a30 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  p->nolinenosflag
12a40 20 26 26 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c   && psp->insertL
12a50 69 6e 65 4d 61 63 72 6f 20 26 26 0a 20 20 20 20  ineMacro &&.    
12a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a70 20 20 20 20 28 70 73 70 2d 3e 64 65 63 6c 6c 69      (psp->declli
12a80 6e 65 6e 6f 73 6c 6f 74 3d 3d 30 20 7c 7c 20 70  nenoslot==0 || p
12a90 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c  sp->decllinenosl
12aa0 6f 74 5b 30 5d 21 3d 30 29 3b 0a 20 20 20 20 20  ot[0]!=0);.     
12ab0 20 20 20 69 66 28 20 61 64 64 4c 69 6e 65 4d 61     if( addLineMa
12ac0 63 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  cro ){.         
12ad0 20 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65   for(z=psp->file
12ae0 6e 61 6d 65 2c 20 6e 42 61 63 6b 3d 30 3b 20 2a  name, nBack=0; *
12af0 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  z; z++){.       
12b00 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c       if( *z=='\\
12b10 27 20 29 20 6e 42 61 63 6b 2b 2b 3b 0a 20 20 20  ' ) nBack++;.   
12b20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12b30 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65     sprintf(zLine
12b40 2c 20 22 23 6c 69 6e 65 20 25 64 20 22 2c 20 70  , "#line %d ", p
12b50 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 29  sp->tokenlineno)
12b60 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e  ;.          nLin
12b70 65 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  e = lemonStrlen(
12b80 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  zLine);.        
12b90 20 20 6e 20 2b 3d 20 6e 4c 69 6e 65 20 2b 20 6c    n += nLine + l
12ba0 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 73 70 2d 3e  emonStrlen(psp->
12bb0 66 69 6c 65 6e 61 6d 65 29 20 2b 20 6e 42 61 63  filename) + nBac
12bc0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
12bd0 20 20 20 20 20 2a 70 73 70 2d 3e 64 65 63 6c 61       *psp->decla
12be0 72 67 73 6c 6f 74 20 3d 20 7a 42 75 66 20 3d 20  rgslot = zBuf = 
12bf0 72 65 61 6c 6c 6f 63 28 2a 70 73 70 2d 3e 64 65  realloc(*psp->de
12c00 63 6c 61 72 67 73 6c 6f 74 2c 20 6e 29 3b 0a 20  clargslot, n);. 
12c10 20 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 6e         zBuf += n
12c20 4f 6c 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Old;.        if(
12c30 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 20 29 7b   addLineMacro ){
12c40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
12c50 4f 6c 64 20 26 26 20 7a 42 75 66 5b 2d 31 5d 21  Old && zBuf[-1]!
12c60 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\n' ){.       
12c70 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
12c80 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20   '\n';.         
12c90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
12ca0 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c  cpy(zBuf, zLine,
12cb0 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20   nLine);.       
12cc0 20 20 20 7a 42 75 66 20 2b 3d 20 6e 4c 69 6e 65     zBuf += nLine
12cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42  ;.          *(zB
12ce0 75 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20  uf++) = '"';.   
12cf0 20 20 20 20 20 20 20 66 6f 72 28 7a 3d 70 73 70         for(z=psp
12d00 2d 3e 66 69 6c 65 6e 61 6d 65 3b 20 2a 7a 3b 20  ->filename; *z; 
12d10 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  z++){.          
12d20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20 29    if( *z=='\\' )
12d30 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
12d40 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 5c 27  *(zBuf++) = '\\'
12d50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
12d60 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42              *(zB
12d70 75 66 2b 2b 29 20 3d 20 2a 7a 3b 0a 20 20 20 20  uf++) = *z;.    
12d80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12d90 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 22    *(zBuf++) = '"
12da0 27 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a  ';.          *(z
12db0 42 75 66 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a 20  Buf++) = '\n';. 
12dc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12dd0 20 69 66 28 20 70 73 70 2d 3e 64 65 63 6c 6c 69   if( psp->declli
12de0 6e 65 6e 6f 73 6c 6f 74 20 26 26 20 70 73 70 2d  nenoslot && psp-
12df0 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b  >decllinenoslot[
12e00 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0]==0 ){.       
12e10 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65     psp->declline
12e20 6e 6f 73 6c 6f 74 5b 30 5d 20 3d 20 70 73 70 2d  noslot[0] = psp-
12e30 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20  >tokenlineno;.  
12e40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12e50 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4e 65  memcpy(zBuf, zNe
12e60 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20  w, nNew);.      
12e70 20 20 7a 42 75 66 20 2b 3d 20 6e 4e 65 77 3b 0a    zBuf += nNew;.
12e80 20 20 20 20 20 20 20 20 2a 7a 42 75 66 20 3d 20          *zBuf = 
12e90 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
12ea0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
12eb0 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
12ec0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12ed0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
12ee0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
12ef0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
12f00 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67            "Illeg
12f10 61 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 25  al argument to %
12f20 25 25 73 3a 20 25 73 22 2c 70 73 70 2d 3e 64 65  %%s: %s",psp->de
12f30 63 6c 6b 65 79 77 6f 72 64 2c 78 29 3b 0a 20 20  clkeyword,x);.  
12f40 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
12f50 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
12f60 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
12f70 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
12f80 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
12f90 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
12fa0 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46  se WAITING_FOR_F
12fb0 41 4c 4c 42 41 43 4b 5f 49 44 3a 0a 20 20 20 20  ALLBACK_ID:.    
12fc0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
12fd0 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
12fe0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
12ff0 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
13000 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
13010 28 20 21 69 73 75 70 70 65 72 28 78 5b 30 5d 29  ( !isupper(x[0])
13020 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
13030 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
13040 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
13050 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
13060 22 25 25 66 61 6c 6c 62 61 63 6b 20 61 72 67 75  "%%fallback argu
13070 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75  ment \"%s\" shou
13080 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20  ld be a token", 
13090 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
130a0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
130b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
130c0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
130d0 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  *sp = Symbol_new
130e0 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (x);.        if(
130f0 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d   psp->fallback==
13100 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
13110 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 73  sp->fallback = s
13120 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
13130 20 69 66 28 20 73 70 2d 3e 66 61 6c 6c 62 61 63   if( sp->fallbac
13140 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  k ){.          E
13150 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
13160 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65  ename, psp->toke
13170 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
13180 20 20 20 20 20 22 4d 6f 72 65 20 74 68 61 6e 20       "More than 
13190 6f 6e 65 20 66 61 6c 6c 62 61 63 6b 20 61 73 73  one fallback ass
131a0 69 67 6e 65 64 20 74 6f 20 74 6f 6b 65 6e 20 25  igned to token %
131b0 73 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  s", x);.        
131c0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
131d0 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
131e0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e  {.          sp->
131f0 66 61 6c 6c 62 61 63 6b 20 3d 20 70 73 70 2d 3e  fallback = psp->
13200 66 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20  fallback;.      
13210 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 68 61 73      psp->gp->has
13220 5f 66 61 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  _fallback = 1;. 
13230 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13240 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13250 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
13260 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 3a 0a  OR_WILDCARD_ID:.
13270 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
13280 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '.' ){.        p
13290 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
132a0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
132b0 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RULE;.      }els
132c0 65 20 69 66 28 20 21 69 73 75 70 70 65 72 28 78  e if( !isupper(x
132d0 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
132e0 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
132f0 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b  lename, psp->tok
13300 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
13310 20 20 20 20 22 25 25 77 69 6c 64 63 61 72 64 20      "%%wildcard 
13320 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20  argument \"%s\" 
13330 73 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65  should be a toke
13340 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  n", x);.        
13350 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
13360 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13370 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
13380 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c  bol *sp = Symbol
13390 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
133a0 20 69 66 28 20 70 73 70 2d 3e 67 70 2d 3e 77 69   if( psp->gp->wi
133b0 6c 64 63 61 72 64 3d 3d 30 20 29 7b 0a 20 20 20  ldcard==0 ){.   
133c0 20 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e         psp->gp->
133d0 77 69 6c 64 63 61 72 64 20 3d 20 73 70 3b 0a 20  wildcard = sp;. 
133e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
133f0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
13400 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  (psp->filename, 
13410 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
13420 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 45  ,.            "E
13430 78 74 72 61 20 77 69 6c 64 63 61 72 64 20 74 6f  xtra wildcard to
13440 20 74 6f 6b 65 6e 3a 20 25 73 22 2c 20 78 29 3b   token: %s", x);
13450 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
13460 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
13470 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13480 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
13490 61 73 65 20 52 45 53 59 4e 43 5f 41 46 54 45 52  ase RESYNC_AFTER
134a0 5f 52 55 4c 45 5f 45 52 52 4f 52 3a 0a 2f 2a 20  _RULE_ERROR:./* 
134b0 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
134c0 2e 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20  .' ) psp->state 
134d0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
134e0 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 2a 2a 20 20  CL_OR_RULE;.**  
134f0 20 20 20 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20      break; */.  
13500 20 20 63 61 73 65 20 52 45 53 59 4e 43 5f 41 46    case RESYNC_AF
13510 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3a 0a  TER_DECL_ERROR:.
13520 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
13530 27 2e 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65  '.' ) psp->state
13540 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
13550 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20  ECL_OR_RULE;.   
13560 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 25 27     if( x[0]=='%'
13570 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20   ) psp->state = 
13580 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
13590 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20 20  _KEYWORD;.      
135a0 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  break;.  }.}../*
135b0 20 52 75 6e 20 74 68 65 20 70 72 65 70 72 6f 63   Run the preproc
135c0 65 73 73 6f 72 20 6f 76 65 72 20 74 68 65 20 69  essor over the i
135d0 6e 70 75 74 20 66 69 6c 65 20 74 65 78 74 2e 20  nput file text. 
135e0 20 54 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   The global vari
135f0 61 62 6c 65 73 0a 2a 2a 20 61 7a 44 65 66 69 6e  ables.** azDefin
13600 65 5b 30 5d 20 74 68 72 6f 75 67 68 20 61 7a 44  e[0] through azD
13610 65 66 69 6e 65 5b 6e 44 65 66 69 6e 65 2d 31 5d  efine[nDefine-1]
13620 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
13630 6d 65 73 20 6f 66 20 61 6c 6c 20 64 65 66 69 6e  mes of all defin
13640 65 64 0a 2a 2a 20 6d 61 63 72 6f 73 2e 20 20 54  ed.** macros.  T
13650 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
13660 73 20 66 6f 72 20 22 25 69 66 64 65 66 22 20 61  s for "%ifdef" a
13670 6e 64 20 22 25 69 66 6e 64 65 66 22 20 61 6e 64  nd "%ifndef" and
13680 20 22 25 65 6e 64 69 66 22 20 61 6e 64 0a 2a 2a   "%endif" and.**
13690 20 63 6f 6d 6d 65 6e 74 73 20 74 68 65 6d 20 6f   comments them o
136a0 75 74 2e 20 20 54 65 78 74 20 69 6e 20 62 65 74  ut.  Text in bet
136b0 77 65 65 6e 20 69 73 20 61 6c 73 6f 20 63 6f 6d  ween is also com
136c0 6d 65 6e 74 65 64 20 6f 75 74 20 61 73 20 61 70  mented out as ap
136d0 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74  propriate..*/.st
136e0 61 74 69 63 20 76 6f 69 64 20 70 72 65 70 72 6f  atic void prepro
136f0 63 65 73 73 5f 69 6e 70 75 74 28 63 68 61 72 20  cess_input(char 
13700 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  *z){.  int i, j,
13710 20 6b 2c 20 6e 3b 0a 20 20 69 6e 74 20 65 78 63   k, n;.  int exc
13720 6c 75 64 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lude = 0;.  int 
13730 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74  start = 0;.  int
13740 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 69   lineno = 1;.  i
13750 6e 74 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 20  nt start_lineno 
13760 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 1;.  for(i=0; 
13770 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
13780 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29  if( z[i]=='\n' )
13790 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69   lineno++;.    i
137a0 66 28 20 7a 5b 69 5d 21 3d 27 25 27 20 7c 7c 20  f( z[i]!='%' || 
137b0 28 69 3e 30 20 26 26 20 7a 5b 69 2d 31 5d 21 3d  (i>0 && z[i-1]!=
137c0 27 5c 6e 27 29 20 29 20 63 6f 6e 74 69 6e 75 65  '\n') ) continue
137d0 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  ;.    if( strncm
137e0 70 28 26 7a 5b 69 5d 2c 22 25 65 6e 64 69 66 22  p(&z[i],"%endif"
137f0 2c 36 29 3d 3d 30 20 26 26 20 69 73 73 70 61 63  ,6)==0 && isspac
13800 65 28 7a 5b 69 2b 36 5d 29 20 29 7b 0a 20 20 20  e(z[i+6]) ){.   
13810 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29     if( exclude )
13820 7b 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75 64  {.        exclud
13830 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e--;.        if(
13840 20 65 78 63 6c 75 64 65 3d 3d 30 20 29 7b 0a 20   exclude==0 ){. 
13850 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 73           for(j=s
13860 74 61 72 74 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 20  tart; j<i; j++) 
13870 69 66 28 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 20 29  if( z[j]!='\n' )
13880 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20   z[j] = ' ';.   
13890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
138a0 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b       for(j=i; z[
138b0 6a 5d 20 26 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27  j] && z[j]!='\n'
138c0 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20  ; j++) z[j] = ' 
138d0 27 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ';.    }else if(
138e0 20 28 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c   (strncmp(&z[i],
138f0 22 25 69 66 64 65 66 22 2c 36 29 3d 3d 30 20 26  "%ifdef",6)==0 &
13900 26 20 69 73 73 70 61 63 65 28 7a 5b 69 2b 36 5d  & isspace(z[i+6]
13910 29 29 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  )).          || 
13920 28 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22  (strncmp(&z[i],"
13930 25 69 66 6e 64 65 66 22 2c 37 29 3d 3d 30 20 26  %ifndef",7)==0 &
13940 26 20 69 73 73 70 61 63 65 28 7a 5b 69 2b 37 5d  & isspace(z[i+7]
13950 29 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  )) ){.      if( 
13960 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20  exclude ){.     
13970 20 20 20 65 78 63 6c 75 64 65 2b 2b 3b 0a 20 20     exclude++;.  
13980 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13990 20 20 20 66 6f 72 28 6a 3d 69 2b 37 3b 20 69 73     for(j=i+7; is
139a0 73 70 61 63 65 28 7a 5b 6a 5d 29 3b 20 6a 2b 2b  space(z[j]); j++
139b0 29 7b 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ){}.        for(
139c0 6e 3d 30 3b 20 7a 5b 6a 2b 6e 5d 20 26 26 20 21  n=0; z[j+n] && !
139d0 69 73 73 70 61 63 65 28 7a 5b 6a 2b 6e 5d 29 3b  isspace(z[j+n]);
139e0 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   n++){}.        
139f0 65 78 63 6c 75 64 65 20 3d 20 31 3b 0a 20 20 20  exclude = 1;.   
13a00 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
13a10 6e 44 65 66 69 6e 65 3b 20 6b 2b 2b 29 7b 0a 20  nDefine; k++){. 
13a20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72           if( str
13a30 6e 63 6d 70 28 61 7a 44 65 66 69 6e 65 5b 6b 5d  ncmp(azDefine[k]
13a40 2c 26 7a 5b 6a 5d 2c 6e 29 3d 3d 30 20 26 26 20  ,&z[j],n)==0 && 
13a50 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 7a 44 65  lemonStrlen(azDe
13a60 66 69 6e 65 5b 6b 5d 29 3d 3d 6e 20 29 7b 0a 20  fine[k])==n ){. 
13a70 20 20 20 20 20 20 20 20 20 20 20 65 78 63 6c 75             exclu
13a80 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
13a90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
13aa0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
13ab0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
13ac0 2b 33 5d 3d 3d 27 6e 27 20 29 20 65 78 63 6c 75  +3]=='n' ) exclu
13ad0 64 65 20 3d 20 21 65 78 63 6c 75 64 65 3b 0a 20  de = !exclude;. 
13ae0 20 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75         if( exclu
13af0 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
13b00 73 74 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20  start = i;.     
13b10 20 20 20 20 20 73 74 61 72 74 5f 6c 69 6e 65 6e       start_linen
13b20 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20  o = lineno;.    
13b30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
13b40 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a      for(j=i; z[j
13b50 5d 20 26 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b  ] && z[j]!='\n';
13b60 20 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20 27   j++) z[j] = ' '
13b70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
13b80 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20  ( exclude ){.   
13b90 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
13ba0 22 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 25 25  "unterminated %%
13bb0 69 66 64 65 66 20 73 74 61 72 74 69 6e 67 20 6f  ifdef starting o
13bc0 6e 20 6c 69 6e 65 20 25 64 5c 6e 22 2c 20 73 74  n line %d\n", st
13bd0 61 72 74 5f 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  art_lineno);.   
13be0 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a   exit(1);.  }.}.
13bf0 0a 2f 2a 20 49 6e 20 73 70 69 74 65 20 6f 66 20  ./* In spite of 
13c00 69 74 73 20 6e 61 6d 65 2c 20 74 68 69 73 20 66  its name, this f
13c10 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 61 6c 6c  unction is reall
13c20 79 20 61 20 73 63 61 6e 6e 65 72 2e 20 20 49 74  y a scanner.  It
13c30 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
13c40 65 6e 74 69 72 65 20 69 6e 70 75 74 20 66 69 6c  entire input fil
13c50 65 20 28 61 6c 6c 20 61 74 20 6f 6e 63 65 29 20  e (all at once) 
13c60 74 68 65 6e 20 74 6f 6b 65 6e 69 7a 65 73 20 69  then tokenizes i
13c70 74 2e 20 20 45 61 63 68 0a 2a 2a 20 74 6f 6b 65  t.  Each.** toke
13c80 6e 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  n is passed to t
13c90 68 65 20 66 75 6e 63 74 69 6f 6e 20 22 70 61 72  he function "par
13ca0 73 65 6f 6e 65 74 6f 6b 65 6e 22 20 77 68 69 63  seonetoken" whic
13cb0 68 20 62 75 69 6c 64 73 20 61 6c 6c 0a 2a 2a 20  h builds all.** 
13cc0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
13cd0 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
13ce0 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c 20 73 74  in the global st
13cf0 61 74 65 20 76 65 63 74 6f 72 20 22 67 70 22 2e  ate vector "gp".
13d00 0a 2a 2f 0a 76 6f 69 64 20 50 61 72 73 65 28 67  .*/.void Parse(g
13d10 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
13d20 2a 67 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  *gp;.{.  struct 
13d30 70 73 74 61 74 65 20 70 73 3b 0a 20 20 46 49 4c  pstate ps;.  FIL
13d40 45 20 2a 66 70 3b 0a 20 20 63 68 61 72 20 2a 66  E *fp;.  char *f
13d50 69 6c 65 62 75 66 3b 0a 20 20 69 6e 74 20 66 69  ilebuf;.  int fi
13d60 6c 65 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 69  lesize;.  int li
13d70 6e 65 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a 20  neno;.  int c;. 
13d80 20 63 68 61 72 20 2a 63 70 2c 20 2a 6e 65 78 74   char *cp, *next
13d90 63 70 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 6c  cp;.  int startl
13da0 69 6e 65 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73  ine = 0;..  mems
13db0 65 74 28 26 70 73 2c 20 27 5c 30 27 2c 20 73 69  et(&ps, '\0', si
13dc0 7a 65 6f 66 28 70 73 29 29 3b 0a 20 20 70 73 2e  zeof(ps));.  ps.
13dd0 67 70 20 3d 20 67 70 3b 0a 20 20 70 73 2e 66 69  gp = gp;.  ps.fi
13de0 6c 65 6e 61 6d 65 20 3d 20 67 70 2d 3e 66 69 6c  lename = gp->fil
13df0 65 6e 61 6d 65 3b 0a 20 20 70 73 2e 65 72 72 6f  ename;.  ps.erro
13e00 72 63 6e 74 20 3d 20 30 3b 0a 20 20 70 73 2e 73  rcnt = 0;.  ps.s
13e10 74 61 74 65 20 3d 20 49 4e 49 54 49 41 4c 49 5a  tate = INITIALIZ
13e20 45 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62  E;..  /* Begin b
13e30 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 69 6e  y reading the in
13e40 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 66 70  put file */.  fp
13e50 20 3d 20 66 6f 70 65 6e 28 70 73 2e 66 69 6c 65   = fopen(ps.file
13e60 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69 66  name,"rb");.  if
13e70 28 20 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 45  ( fp==0 ){.    E
13e80 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e  rrorMsg(ps.filen
13e90 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20 6f 70 65  ame,0,"Can't ope
13ea0 6e 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20  n this file for 
13eb0 72 65 61 64 69 6e 67 2e 22 29 3b 0a 20 20 20 20  reading.");.    
13ec0 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  gp->errorcnt++;.
13ed0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
13ee0 20 20 66 73 65 65 6b 28 66 70 2c 30 2c 32 29 3b    fseek(fp,0,2);
13ef0 0a 20 20 66 69 6c 65 73 69 7a 65 20 3d 20 66 74  .  filesize = ft
13f00 65 6c 6c 28 66 70 29 3b 0a 20 20 72 65 77 69 6e  ell(fp);.  rewin
13f10 64 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66  d(fp);.  filebuf
13f20 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f   = (char *)mallo
13f30 63 28 20 66 69 6c 65 73 69 7a 65 2b 31 20 29 3b  c( filesize+1 );
13f40 0a 20 20 69 66 28 20 66 69 6c 65 62 75 66 3d 3d  .  if( filebuf==
13f50 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73  0 ){.    ErrorMs
13f60 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c  g(ps.filename,0,
13f70 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20  "Can't allocate 
13f80 25 64 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  %d of memory to 
13f90 68 6f 6c 64 20 74 68 69 73 20 66 69 6c 65 2e 22  hold this file."
13fa0 2c 0a 20 20 20 20 20 20 66 69 6c 65 73 69 7a 65  ,.      filesize
13fb0 2b 31 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72  +1);.    gp->err
13fc0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  orcnt++;.    ret
13fd0 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  urn;.  }.  if( f
13fe0 72 65 61 64 28 66 69 6c 65 62 75 66 2c 31 2c 66  read(filebuf,1,f
13ff0 69 6c 65 73 69 7a 65 2c 66 70 29 21 3d 66 69 6c  ilesize,fp)!=fil
14000 65 73 69 7a 65 20 29 7b 0a 20 20 20 20 45 72 72  esize ){.    Err
14010 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d  orMsg(ps.filenam
14020 65 2c 30 2c 22 43 61 6e 27 74 20 72 65 61 64 20  e,0,"Can't read 
14030 69 6e 20 61 6c 6c 20 25 64 20 62 79 74 65 73 20  in all %d bytes 
14040 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a  of this file.",.
14050 20 20 20 20 20 20 66 69 6c 65 73 69 7a 65 29 3b        filesize);
14060 0a 20 20 20 20 66 72 65 65 28 66 69 6c 65 62 75  .    free(filebu
14070 66 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f  f);.    gp->erro
14080 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  rcnt++;.    retu
14090 72 6e 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  rn;.  }.  fclose
140a0 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 5b  (fp);.  filebuf[
140b0 66 69 6c 65 73 69 7a 65 5d 20 3d 20 30 3b 0a 0a  filesize] = 0;..
140c0 20 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 69 6e 69    /* Make an ini
140d0 74 69 61 6c 20 70 61 73 73 20 74 68 72 6f 75 67  tial pass throug
140e0 68 20 74 68 65 20 66 69 6c 65 20 74 6f 20 68 61  h the file to ha
140f0 6e 64 6c 65 20 25 69 66 64 65 66 20 61 6e 64 20  ndle %ifdef and 
14100 25 69 66 6e 64 65 66 20 2a 2f 0a 20 20 70 72 65  %ifndef */.  pre
14110 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 66 69  process_input(fi
14120 6c 65 62 75 66 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  lebuf);..  /* No
14130 77 20 73 63 61 6e 20 74 68 65 20 74 65 78 74 20  w scan the text 
14140 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  of the input fil
14150 65 20 2a 2f 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20  e */.  lineno = 
14160 31 3b 0a 20 20 66 6f 72 28 63 70 3d 66 69 6c 65  1;.  for(cp=file
14170 62 75 66 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30  buf; (c= *cp)!=0
14180 3b 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ; ){.    if( c==
14190 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
141a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
141b0 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
141c0 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a  he line number *
141d0 2f 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63  /.    if( isspac
141e0 65 28 63 29 20 29 7b 20 63 70 2b 2b 3b 20 63 6f  e(c) ){ cp++; co
141f0 6e 74 69 6e 75 65 3b 20 7d 20 20 2f 2a 20 53 6b  ntinue; }  /* Sk
14200 69 70 20 61 6c 6c 20 77 68 69 74 65 20 73 70 61  ip all white spa
14210 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d  ce */.    if( c=
14220 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='/' && cp[1]=='
14230 2f 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f  /' ){          /
14240 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65  * Skip C++ style
14250 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   comments */.   
14260 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20     cp+=2;.      
14270 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
14280 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20  =0 && c!='\n' ) 
14290 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74  cp++;.      cont
142a0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
142b0 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70  if( c=='/' && cp
142c0 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 20 20 20  [1]=='*' ){     
142d0 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 20 73       /* Skip C s
142e0 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f  tyle comments */
142f0 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20  .      cp+=2;.  
14300 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a      while( (c= *
14310 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d 27 2f  cp)!=0 && (c!='/
14320 27 20 7c 7c 20 63 70 5b 2d 31 5d 21 3d 27 2a 27  ' || cp[-1]!='*'
14330 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
14340 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e   c=='\n' ) linen
14350 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 70 2b  o++;.        cp+
14360 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
14370 20 69 66 28 20 63 20 29 20 63 70 2b 2b 3b 0a 20   if( c ) cp++;. 
14380 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
14390 20 20 20 7d 0a 20 20 20 20 70 73 2e 74 6f 6b 65     }.    ps.toke
143a0 6e 73 74 61 72 74 20 3d 20 63 70 3b 20 20 20 20  nstart = cp;    
143b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
143c0 61 72 6b 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ark the beginnin
143d0 67 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 2a  g of the token *
143e0 2f 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e 6c 69  /.    ps.tokenli
143f0 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 20 20  neno = lineno;  
14400 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
14410 6e 75 6d 62 65 72 20 6f 6e 20 77 68 69 63 68 20  number on which 
14420 74 6f 6b 65 6e 20 62 65 67 69 6e 73 20 2a 2f 0a  token begins */.
14430 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 22 27 20      if( c=='\"' 
14440 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
14450 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67         /* String
14460 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20   literals */.   
14470 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 77     cp++;.      w
14480 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d  hile( (c= *cp)!=
14490 30 20 26 26 20 63 21 3d 27 5c 22 27 20 29 7b 0a  0 && c!='\"' ){.
144a0 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
144b0 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n' ) lineno++;.
144c0 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20          cp++;.  
144d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
144e0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
144f0 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65  ErrorMsg(ps.file
14500 6e 61 6d 65 2c 73 74 61 72 74 6c 69 6e 65 2c 0a  name,startline,.
14510 22 53 74 72 69 6e 67 20 73 74 61 72 74 69 6e 67  "String starting
14520 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73   on this line is
14530 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20   not terminated 
14540 62 65 66 6f 72 65 20 74 68 65 20 65 6e 64 20 6f  before the end o
14550 66 20 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20  f the file.");. 
14560 20 20 20 20 20 20 20 70 73 2e 65 72 72 6f 72 63         ps.errorc
14570 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65  nt++;.        ne
14580 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 20  xtcp = cp;.     
14590 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
145a0 6e 65 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20  nextcp = cp+1;. 
145b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
145c0 20 69 66 28 20 63 3d 3d 27 7b 27 20 29 7b 20 20   if( c=='{' ){  
145d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
145e0 41 20 62 6c 6f 63 6b 20 6f 66 20 43 20 63 6f 64  A block of C cod
145f0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c  e */.      int l
14600 65 76 65 6c 3b 0a 20 20 20 20 20 20 63 70 2b 2b  evel;.      cp++
14610 3b 0a 20 20 20 20 20 20 66 6f 72 28 6c 65 76 65  ;.      for(leve
14620 6c 3d 31 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30  l=1; (c= *cp)!=0
14630 20 26 26 20 28 6c 65 76 65 6c 3e 31 20 7c 7c 20   && (level>1 || 
14640 63 21 3d 27 7d 27 29 3b 20 63 70 2b 2b 29 7b 0a  c!='}'); cp++){.
14650 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
14660 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n' ) lineno++;.
14670 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
14680 20 63 3d 3d 27 7b 27 20 29 20 6c 65 76 65 6c 2b   c=='{' ) level+
14690 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20  +;.        else 
146a0 69 66 28 20 63 3d 3d 27 7d 27 20 29 20 6c 65 76  if( c=='}' ) lev
146b0 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20 65 6c  el--;.        el
146c0 73 65 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26  se if( c=='/' &&
146d0 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20   cp[1]=='*' ){  
146e0 2f 2a 20 53 6b 69 70 20 63 6f 6d 6d 65 6e 74 73  /* Skip comments
146f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
14700 74 20 70 72 65 76 63 3b 0a 20 20 20 20 20 20 20  t prevc;.       
14710 20 20 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a     cp = &cp[2];.
14720 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63 20            prevc 
14730 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 77  = 0;.          w
14740 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d  hile( (c= *cp)!=
14750 30 20 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20  0 && (c!='/' || 
14760 70 72 65 76 63 21 3d 27 2a 27 29 20 29 7b 0a 20  prevc!='*') ){. 
14770 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
14780 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
14790 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  +;.            p
147a0 72 65 76 63 20 3d 20 63 3b 0a 20 20 20 20 20 20  revc = c;.      
147b0 20 20 20 20 20 20 63 70 2b 2b 3b 0a 09 20 20 7d        cp++;..  }
147c0 0a 09 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27  ..}else if( c=='
147d0 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27  /' && cp[1]=='/'
147e0 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b   ){  /* Skip C++
147f0 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20   style comments 
14800 74 6f 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  too */.         
14810 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20   cp = &cp[2];.  
14820 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
14830 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21  c= *cp)!=0 && c!
14840 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20  ='\n' ) cp++;.  
14850 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 20          if( c ) 
14860 6c 69 6e 65 6e 6f 2b 2b 3b 0a 09 7d 65 6c 73 65  lineno++;..}else
14870 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c 20   if( c=='\'' || 
14880 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 2f 2a  c=='\"' ){    /*
14890 20 53 74 72 69 6e 67 20 61 20 63 68 61 72 61 63   String a charac
148a0 74 65 72 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a  ter literals */.
148b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 73 74            int st
148c0 61 72 74 63 68 61 72 2c 20 70 72 65 76 63 3b 0a  artchar, prevc;.
148d0 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 63            startc
148e0 68 61 72 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  har = c;.       
148f0 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20     prevc = 0;.  
14900 20 20 20 20 20 20 20 20 66 6f 72 28 63 70 2b 2b          for(cp++
14910 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ; (c= *cp)!=0 &&
14920 20 28 63 21 3d 73 74 61 72 74 63 68 61 72 20 7c   (c!=startchar |
14930 7c 20 70 72 65 76 63 3d 3d 27 5c 5c 27 29 3b 20  | prevc=='\\'); 
14940 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  cp++){.         
14950 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
14960 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
14970 20 20 20 20 20 20 20 69 66 28 20 70 72 65 76 63         if( prevc
14980 3d 3d 27 5c 5c 27 20 29 20 70 72 65 76 63 20 3d  =='\\' ) prevc =
14990 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
149a0 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
149b0 20 20 70 72 65 76 63 20 3d 20 63 3b 0a 09 20 20    prevc = c;..  
149c0 7d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20  }..}.      }.   
149d0 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
149e0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
149f0 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 70 73 2e 74  ps.filename,ps.t
14a00 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20 63  okenlineno,."C c
14a10 6f 64 65 20 73 74 61 72 74 69 6e 67 20 6f 6e 20  ode starting on 
14a20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74  this line is not
14a30 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f   terminated befo
14a40 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  re the end of th
14a50 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20  e file.");.     
14a60 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b     ps.errorcnt++
14a70 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70  ;.        nextcp
14a80 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c   = cp;.      }el
14a90 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74  se{.        next
14aa0 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20  cp = cp+1;.     
14ab0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
14ac0 20 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b 20 20   isalnum(c) ){  
14ad0 20 20 20 20 20 20 20 20 2f 2a 20 49 64 65 6e 74          /* Ident
14ae0 69 66 69 65 72 73 20 2a 2f 0a 20 20 20 20 20 20  ifiers */.      
14af0 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
14b00 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 63  =0 && (isalnum(c
14b10 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63  ) || c=='_') ) c
14b20 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63  p++;.      nextc
14b30 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73  p = cp;.    }els
14b40 65 20 69 66 28 20 63 3d 3d 27 3a 27 20 26 26 20  e if( c==':' && 
14b50 63 70 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 63 70  cp[1]==':' && cp
14b60 5b 32 5d 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20 54  [2]=='=' ){ /* T
14b70 68 65 20 6f 70 65 72 61 74 6f 72 20 22 3a 3a 3d  he operator "::=
14b80 22 20 2a 2f 0a 20 20 20 20 20 20 63 70 20 2b 3d  " */.      cp +=
14b90 20 33 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70   3;.      nextcp
14ba0 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65   = cp;.    }else
14bb0 20 69 66 28 20 28 63 3d 3d 27 2f 27 20 7c 7c 20   if( (c=='/' || 
14bc0 63 3d 3d 27 7c 27 29 20 26 26 20 69 73 61 6c 70  c=='|') && isalp
14bd0 68 61 28 63 70 5b 31 5d 29 20 29 7b 0a 20 20 20  ha(cp[1]) ){.   
14be0 20 20 20 63 70 20 2b 3d 20 32 3b 0a 20 20 20 20     cp += 2;.    
14bf0 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 63    while( (c = *c
14c00 70 29 21 3d 30 20 26 26 20 28 69 73 61 6c 6e 75  p)!=0 && (isalnu
14c10 6d 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20  m(c) || c=='_') 
14c20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65  ) cp++;.      ne
14c30 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d  xtcp = cp;.    }
14c40 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
14c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14c60 2a 20 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65  * All other (one
14c70 20 63 68 61 72 61 63 74 65 72 29 20 6f 70 65 72   character) oper
14c80 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 63  ators */.      c
14c90 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63  p++;.      nextc
14ca0 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20  p = cp;.    }.  
14cb0 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a    c = *cp;.    *
14cc0 63 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  cp = 0;         
14cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14ce0 2a 20 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65  * Null terminate
14cf0 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20   the token */.  
14d00 20 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28    parseonetoken(
14d10 26 70 73 29 3b 20 20 20 20 20 20 20 20 20 20 20  &ps);           
14d20 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 74    /* Parse the t
14d30 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20  oken */.    *cp 
14d40 3d 20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  = c;            
14d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14d60 65 73 74 6f 72 65 20 74 68 65 20 62 75 66 66 65  estore the buffe
14d70 72 20 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65  r */.    cp = ne
14d80 78 74 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65  xtcp;.  }.  free
14d90 28 66 69 6c 65 62 75 66 29 3b 20 20 20 20 20 20  (filebuf);      
14da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14db0 20 52 65 6c 65 61 73 65 20 74 68 65 20 62 75 66   Release the buf
14dc0 66 65 72 20 61 66 74 65 72 20 70 61 72 73 69 6e  fer after parsin
14dd0 67 20 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20  g */.  gp->rule 
14de0 3d 20 70 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a  = ps.firstrule;.
14df0 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d    gp->errorcnt =
14e00 20 70 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a   ps.errorcnt;.}.
14e10 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
14e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
14e30 6d 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69 6e  m the file "plin
14e40 6b 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  k.c" ***********
14e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
14e60 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65  * Routines proce
14e70 73 73 69 6e 67 20 63 6f 6e 66 69 67 75 72 61 74  ssing configurat
14e80 69 6f 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70  ion follow-set p
14e90 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73  ropagation links
14ea0 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e  .** in the LEMON
14eb0 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
14ec0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  r..*/.static str
14ed0 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b  uct plink *plink
14ee0 5f 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a  _freelist = 0;..
14ef0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
14f00 77 20 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63  w plink */.struc
14f10 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e  t plink *Plink_n
14f20 65 77 28 29 7b 0a 20 20 73 74 72 75 63 74 20 70  ew(){.  struct p
14f30 6c 69 6e 6b 20 2a 6e 65 77 3b 0a 0a 20 20 69 66  link *new;..  if
14f40 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74  ( plink_freelist
14f50 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
14f60 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20  ;.    int amt = 
14f70 31 30 30 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66  100;.    plink_f
14f80 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63  reelist = (struc
14f90 74 20 70 6c 69 6e 6b 20 2a 29 63 61 6c 6c 6f 63  t plink *)calloc
14fa0 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74  ( amt, sizeof(st
14fb0 72 75 63 74 20 70 6c 69 6e 6b 29 20 29 3b 0a 20  ruct plink) );. 
14fc0 20 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65     if( plink_fre
14fd0 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
14fe0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
14ff0 2c 0a 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20  ,.      "Unable 
15000 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
15010 72 79 20 66 6f 72 20 61 20 6e 65 77 20 66 6f 6c  ry for a new fol
15020 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74  low-set propagat
15030 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20  ion link.\n");. 
15040 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
15050 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
15060 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 70   i<amt-1; i++) p
15070 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 5d  link_freelist[i]
15080 2e 6e 65 78 74 20 3d 20 26 70 6c 69 6e 6b 5f 66  .next = &plink_f
15090 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20  reelist[i+1];.  
150a0 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74    plink_freelist
150b0 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30  [amt-1].next = 0
150c0 3b 0a 20 20 7d 0a 20 20 6e 65 77 20 3d 20 70 6c  ;.  }.  new = pl
150d0 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20  ink_freelist;.  
150e0 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d  plink_freelist =
150f0 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 2d   plink_freelist-
15100 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20  >next;.  return 
15110 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61  new;.}../* Add a
15120 20 70 6c 69 6e 6b 20 74 6f 20 61 20 70 6c 69 6e   plink to a plin
15130 6b 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50  k list */.void P
15140 6c 69 6e 6b 5f 61 64 64 28 70 6c 70 70 2c 63 66  link_add(plpp,cf
15150 70 29 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  p).struct plink 
15160 2a 2a 70 6c 70 70 3b 0a 73 74 72 75 63 74 20 63  **plpp;.struct c
15170 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20  onfig *cfp;.{.  
15180 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
15190 77 3b 0a 20 20 6e 65 77 20 3d 20 50 6c 69 6e 6b  w;.  new = Plink
151a0 5f 6e 65 77 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e  _new();.  new->n
151b0 65 78 74 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a  ext = *plpp;.  *
151c0 70 6c 70 70 20 3d 20 6e 65 77 3b 0a 20 20 6e 65  plpp = new;.  ne
151d0 77 2d 3e 63 66 70 20 3d 20 63 66 70 3b 0a 7d 0a  w->cfp = cfp;.}.
151e0 0a 2f 2a 20 54 72 61 6e 73 66 65 72 20 65 76 65  ./* Transfer eve
151f0 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20  ry plink on the 
15200 6c 69 73 74 20 22 66 72 6f 6d 22 20 74 6f 20 74  list "from" to t
15210 68 65 20 6c 69 73 74 20 22 74 6f 22 20 2a 2f 0a  he list "to" */.
15220 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28  void Plink_copy(
15230 74 6f 2c 66 72 6f 6d 29 0a 73 74 72 75 63 74 20  to,from).struct 
15240 70 6c 69 6e 6b 20 2a 2a 74 6f 3b 0a 73 74 72 75  plink **to;.stru
15250 63 74 20 70 6c 69 6e 6b 20 2a 66 72 6f 6d 3b 0a  ct plink *from;.
15260 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  {.  struct plink
15270 20 2a 6e 65 78 74 70 6c 3b 0a 20 20 77 68 69 6c   *nextpl;.  whil
15280 65 28 20 66 72 6f 6d 20 29 7b 0a 20 20 20 20 6e  e( from ){.    n
15290 65 78 74 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65  extpl = from->ne
152a0 78 74 3b 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e 65  xt;.    from->ne
152b0 78 74 20 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a 74  xt = *to;.    *t
152c0 6f 20 3d 20 66 72 6f 6d 3b 0a 20 20 20 20 66 72  o = from;.    fr
152d0 6f 6d 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d  om = nextpl;.  }
152e0 0a 7d 0a 0a 2f 2a 20 44 65 6c 65 74 65 20 65 76  .}../* Delete ev
152f0 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65  ery plink on the
15300 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c   list */.void Pl
15310 69 6e 6b 5f 64 65 6c 65 74 65 28 70 6c 70 29 0a  ink_delete(plp).
15320 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c  struct plink *pl
15330 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c  p;.{.  struct pl
15340 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20  ink *nextpl;..  
15350 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20  while( plp ){.  
15360 20 20 6e 65 78 74 70 6c 20 3d 20 70 6c 70 2d 3e    nextpl = plp->
15370 6e 65 78 74 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e  next;.    plp->n
15380 65 78 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65  ext = plink_free
15390 6c 69 73 74 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f  list;.    plink_
153a0 66 72 65 65 6c 69 73 74 20 3d 20 70 6c 70 3b 0a  freelist = plp;.
153b0 20 20 20 20 70 6c 70 20 3d 20 6e 65 78 74 70 6c      plp = nextpl
153c0 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  ;.  }.}./*******
153d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
153e0 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
153f0 72 65 70 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  report.c" ******
15400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15410 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  ****/./*.** Proc
15420 65 64 75 72 65 73 20 66 6f 72 20 67 65 6e 65 72  edures for gener
15430 61 74 69 6e 67 20 72 65 70 6f 72 74 73 20 61 6e  ating reports an
15440 64 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  d tables in the 
15450 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
15460 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47  erator..*/../* G
15470 65 6e 65 72 61 74 65 20 61 20 66 69 6c 65 6e 61  enerate a filena
15480 6d 65 20 77 69 74 68 20 74 68 65 20 67 69 76 65  me with the give
15490 6e 20 73 75 66 66 69 78 2e 20 20 53 70 61 63 65  n suffix.  Space
154a0 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
154b0 6e 61 6d 65 20 63 6f 6d 65 73 20 66 72 6f 6d 20  name comes from 
154c0 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  malloc() and mus
154d0 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
154e0 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
154f0 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54  ction..*/.PRIVAT
15500 45 20 63 68 61 72 20 2a 66 69 6c 65 5f 6d 61 6b  E char *file_mak
15510 65 6e 61 6d 65 28 6c 65 6d 70 2c 73 75 66 66 69  ename(lemp,suffi
15520 78 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  x).struct lemon 
15530 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73 75 66  *lemp;.char *suf
15540 66 69 78 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 6e  fix;.{.  char *n
15550 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b  ame;.  char *cp;
15560 0a 0a 20 20 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f  ..  name = mallo
15570 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c  c( lemonStrlen(l
15580 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 20 2b  emp->filename) +
15590 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 75 66   lemonStrlen(suf
155a0 66 69 78 29 20 2b 20 35 20 29 3b 0a 20 20 69 66  fix) + 5 );.  if
155b0 28 20 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  ( name==0 ){.   
155c0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
155d0 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20  "Can't allocate 
155e0 73 70 61 63 65 20 66 6f 72 20 61 20 66 69 6c 65  space for a file
155f0 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20 20 20 20 65  name.\n");.    e
15600 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 73 74  xit(1);.  }.  st
15610 72 63 70 79 28 6e 61 6d 65 2c 6c 65 6d 70 2d 3e  rcpy(name,lemp->
15620 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 63 70 20  filename);.  cp 
15630 3d 20 73 74 72 72 63 68 72 28 6e 61 6d 65 2c 27  = strrchr(name,'
15640 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20 29 20  .');.  if( cp ) 
15650 2a 63 70 20 3d 20 30 3b 0a 20 20 73 74 72 63 61  *cp = 0;.  strca
15660 74 28 6e 61 6d 65 2c 73 75 66 66 69 78 29 3b 0a  t(name,suffix);.
15670 20 20 72 65 74 75 72 6e 20 6e 61 6d 65 3b 0a 7d    return name;.}
15680 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  ../* Open a file
15690 20 77 69 74 68 20 61 20 6e 61 6d 65 20 62 61 73   with a name bas
156a0 65 64 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20 6f  ed on the name o
156b0 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
156c0 2c 0a 2a 2a 20 62 75 74 20 77 69 74 68 20 61 20  ,.** but with a 
156d0 64 69 66 66 65 72 65 6e 74 20 28 73 70 65 63 69  different (speci
156e0 66 69 65 64 29 20 73 75 66 66 69 78 2c 20 61 6e  fied) suffix, an
156f0 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
15700 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 72  er.** to the str
15710 65 61 6d 20 2a 2f 0a 50 52 49 56 41 54 45 20 46  eam */.PRIVATE F
15720 49 4c 45 20 2a 66 69 6c 65 5f 6f 70 65 6e 28 6c  ILE *file_open(l
15730 65 6d 70 2c 73 75 66 66 69 78 2c 6d 6f 64 65 29  emp,suffix,mode)
15740 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
15750 65 6d 70 3b 0a 63 68 61 72 20 2a 73 75 66 66 69  emp;.char *suffi
15760 78 3b 0a 63 68 61 72 20 2a 6d 6f 64 65 3b 0a 7b  x;.char *mode;.{
15770 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20  .  FILE *fp;..  
15780 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  if( lemp->outnam
15790 65 20 29 20 66 72 65 65 28 6c 65 6d 70 2d 3e 6f  e ) free(lemp->o
157a0 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d 70 2d  utname);.  lemp-
157b0 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c 65 5f  >outname = file_
157c0 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 73  makename(lemp, s
157d0 75 66 66 69 78 29 3b 0a 20 20 66 70 20 3d 20 66  uffix);.  fp = f
157e0 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61  open(lemp->outna
157f0 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66 28 20  me,mode);.  if( 
15800 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65 3d 3d  fp==0 && *mode==
15810 27 77 27 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  'w' ){.    fprin
15820 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74  tf(stderr,"Can't
15830 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25 73 5c   open file \"%s\
15840 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75 74 6e  ".\n",lemp->outn
15850 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e  ame);.    lemp->
15860 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
15870 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
15880 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a 2f 2a  return fp;.}../*
15890 20 44 75 70 6c 69 63 61 74 65 20 74 68 65 20 69   Duplicate the i
158a0 6e 70 75 74 20 66 69 6c 65 20 77 69 74 68 6f 75  nput file withou
158b0 74 20 63 6f 6d 6d 65 6e 74 73 20 61 6e 64 20 77  t comments and w
158c0 69 74 68 6f 75 74 20 61 63 74 69 6f 6e 73 20 0a  ithout actions .
158d0 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a 2f 0a 76  ** on rules */.v
158e0 6f 69 64 20 52 65 70 72 69 6e 74 28 6c 65 6d 70  oid Reprint(lemp
158f0 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
15900 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74  lemp;.{.  struct
15910 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72   rule *rp;.  str
15920 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
15930 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6d 61 78 6c    int i, j, maxl
15940 65 6e 2c 20 6c 65 6e 2c 20 6e 63 6f 6c 75 6d 6e  en, len, ncolumn
15950 73 2c 20 73 6b 69 70 3b 0a 20 20 70 72 69 6e 74  s, skip;.  print
15960 66 28 22 2f 2f 20 52 65 70 72 69 6e 74 20 6f 66  f("// Reprint of
15970 20 69 6e 70 75 74 20 66 69 6c 65 20 5c 22 25 73   input file \"%s
15980 5c 22 2e 5c 6e 2f 2f 20 53 79 6d 62 6f 6c 73 3a  \".\n// Symbols:
15990 5c 6e 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  \n",lemp->filena
159a0 6d 65 29 3b 0a 20 20 6d 61 78 6c 65 6e 20 3d 20  me);.  maxlen = 
159b0 31 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  10;.  for(i=0; i
159c0 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
159d0 69 2b 2b 29 7b 0a 20 20 20 20 73 70 20 3d 20 6c  i++){.    sp = l
159e0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
159f0 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e  .    len = lemon
15a00 53 74 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29  Strlen(sp->name)
15a10 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61  ;.    if( len>ma
15a20 78 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20  xlen ) maxlen = 
15a30 6c 65 6e 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75  len;.  }.  ncolu
15a40 6d 6e 73 20 3d 20 37 36 2f 28 6d 61 78 6c 65 6e  mns = 76/(maxlen
15a50 2b 35 29 3b 0a 20 20 69 66 28 20 6e 63 6f 6c 75  +5);.  if( ncolu
15a60 6d 6e 73 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e 73  mns<1 ) ncolumns
15a70 20 3d 20 31 3b 0a 20 20 73 6b 69 70 20 3d 20 28   = 1;.  skip = (
15a80 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20  lemp->nsymbol + 
15a90 6e 63 6f 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e 63  ncolumns - 1)/nc
15aa0 6f 6c 75 6d 6e 73 3b 0a 20 20 66 6f 72 28 69 3d  olumns;.  for(i=
15ab0 30 3b 20 69 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b  0; i<skip; i++){
15ac0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2f 2f 22  .    printf("//"
15ad0 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20  );.    for(j=i; 
15ae0 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  j<lemp->nsymbol;
15af0 20 6a 2b 3d 73 6b 69 70 29 7b 0a 20 20 20 20 20   j+=skip){.     
15b00 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62   sp = lemp->symb
15b10 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73  ols[j];.      as
15b20 73 65 72 74 28 20 73 70 2d 3e 69 6e 64 65 78 3d  sert( sp->index=
15b30 3d 6a 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6e  =j );.      prin
15b40 74 66 28 22 20 25 33 64 20 25 2d 2a 2e 2a 73 22  tf(" %3d %-*.*s"
15b50 2c 6a 2c 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e  ,j,maxlen,maxlen
15b60 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  ,sp->name);.    
15b70 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e  }.    printf("\n
15b80 22 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70  ");.  }.  for(rp
15b90 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
15ba0 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
15bb0 20 20 20 70 72 69 6e 74 66 28 22 25 73 22 2c 72     printf("%s",r
15bc0 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20  p->lhs->name);. 
15bd0 20 20 20 2f 2a 20 20 20 20 69 66 28 20 72 70 2d     /*    if( rp-
15be0 3e 6c 68 73 61 6c 69 61 73 20 29 20 70 72 69 6e  >lhsalias ) prin
15bf0 74 66 28 22 28 25 73 29 22 2c 72 70 2d 3e 6c 68  tf("(%s)",rp->lh
15c00 73 61 6c 69 61 73 29 3b 20 2a 2f 0a 20 20 20 20  salias); */.    
15c10 70 72 69 6e 74 66 28 22 20 3a 3a 3d 22 29 3b 0a  printf(" ::=");.
15c20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
15c30 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
15c40 20 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68       sp = rp->rh
15c50 73 5b 69 5d 3b 0a 20 20 20 20 20 20 70 72 69 6e  s[i];.      prin
15c60 74 66 28 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61  tf(" %s", sp->na
15c70 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  me);.      if( s
15c80 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  p->type==MULTITE
15c90 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
15ca0 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70 2d    for(j=1; j<sp-
15cb0 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a  >nsubsym; j++){.
15cc0 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66            printf
15cd0 28 22 7c 25 73 22 2c 20 73 70 2d 3e 73 75 62 73  ("|%s", sp->subs
15ce0 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ym[j]->name);.  
15cf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15d00 20 20 20 20 20 20 2f 2a 20 69 66 28 20 72 70 2d        /* if( rp-
15d10 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 29 20 70  >rhsalias[i] ) p
15d20 72 69 6e 74 66 28 22 28 25 73 29 22 2c 72 70 2d  rintf("(%s)",rp-
15d30 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 20 2a  >rhsalias[i]); *
15d40 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e  /.    }.    prin
15d50 74 66 28 22 2e 22 29 3b 0a 20 20 20 20 69 66 28  tf(".");.    if(
15d60 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 29 20 70   rp->precsym ) p
15d70 72 69 6e 74 66 28 22 20 5b 25 73 5d 22 2c 72 70  rintf(" [%s]",rp
15d80 2d 3e 70 72 65 63 73 79 6d 2d 3e 6e 61 6d 65 29  ->precsym->name)
15d90 3b 0a 20 20 20 20 2f 2a 20 69 66 28 20 72 70 2d  ;.    /* if( rp-
15da0 3e 63 6f 64 65 20 29 20 70 72 69 6e 74 66 28 22  >code ) printf("
15db0 5c 6e 20 20 20 20 25 73 22 2c 72 70 2d 3e 63 6f  \n    %s",rp->co
15dc0 64 65 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e  de); */.    prin
15dd0 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a  tf("\n");.  }.}.
15de0 0a 76 6f 69 64 20 43 6f 6e 66 69 67 50 72 69 6e  .void ConfigPrin
15df0 74 28 66 70 2c 63 66 70 29 0a 46 49 4c 45 20 2a  t(fp,cfp).FILE *
15e00 66 70 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  fp;.struct confi
15e10 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72 75  g *cfp;.{.  stru
15e20 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73  ct rule *rp;.  s
15e30 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
15e40 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
15e50 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20  rp = cfp->rp;.  
15e60 66 70 72 69 6e 74 66 28 66 70 2c 22 25 73 20 3a  fprintf(fp,"%s :
15e70 3a 3d 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d  :=",rp->lhs->nam
15e80 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e);.  for(i=0; i
15e90 3c 3d 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  <=rp->nrhs; i++)
15ea0 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 63 66 70  {.    if( i==cfp
15eb0 2d 3e 64 6f 74 20 29 20 66 70 72 69 6e 74 66 28  ->dot ) fprintf(
15ec0 66 70 2c 22 20 2a 22 29 3b 0a 20 20 20 20 69 66  fp," *");.    if
15ed0 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20  ( i==rp->nrhs ) 
15ee0 62 72 65 61 6b 3b 0a 20 20 20 20 73 70 20 3d 20  break;.    sp = 
15ef0 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20  rp->rhs[i];.    
15f00 66 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73 22  fprintf(fp," %s"
15f10 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  , sp->name);.   
15f20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d   if( sp->type==M
15f30 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
15f40 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a        for(j=1; j
15f50 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b  <sp->nsubsym; j+
15f60 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
15f70 6e 74 66 28 66 70 2c 22 7c 25 73 22 2c 73 70 2d  ntf(fp,"|%s",sp-
15f80 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65  >subsym[j]->name
15f90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
15fa0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 23 64 65 66 69  .  }.}../* #defi
15fb0 6e 65 20 54 45 53 54 20 2a 2f 0a 23 69 66 20 30  ne TEST */.#if 0
15fc0 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 65 74 20  ./* Print a set 
15fd0 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
15fe0 53 65 74 50 72 69 6e 74 28 6f 75 74 2c 73 65 74  SetPrint(out,set
15ff0 2c 6c 65 6d 70 29 0a 46 49 4c 45 20 2a 6f 75 74  ,lemp).FILE *out
16000 3b 0a 63 68 61 72 20 2a 73 65 74 3b 0a 73 74 72  ;.char *set;.str
16010 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
16020 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  .{.  int i;.  ch
16030 61 72 20 2a 73 70 61 63 65 72 3b 0a 20 20 73 70  ar *spacer;.  sp
16040 61 63 65 72 20 3d 20 22 22 3b 0a 20 20 66 70 72  acer = "";.  fpr
16050 69 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 5b 22  intf(out,"%12s["
16060 2c 22 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ,"");.  for(i=0;
16070 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e   i<lemp->ntermin
16080 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  al; i++){.    if
16090 28 20 53 65 74 46 69 6e 64 28 73 65 74 2c 69 29  ( SetFind(set,i)
160a0 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
160b0 66 28 6f 75 74 2c 22 25 73 25 73 22 2c 73 70 61  f(out,"%s%s",spa
160c0 63 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  cer,lemp->symbol
160d0 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  s[i]->name);.   
160e0 20 20 20 73 70 61 63 65 72 20 3d 20 22 20 22 3b     spacer = " ";
160f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
16100 69 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e 22 29 3b  intf(out,"]\n");
16110 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 70  .}../* Print a p
16120 6c 69 6e 6b 20 63 68 61 69 6e 20 2a 2f 0a 50 52  link chain */.PR
16130 49 56 41 54 45 20 76 6f 69 64 20 50 6c 69 6e 6b  IVATE void Plink
16140 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2c 74 61  Print(out,plp,ta
16150 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74  g).FILE *out;.st
16160 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b  ruct plink *plp;
16170 0a 63 68 61 72 20 2a 74 61 67 3b 0a 7b 0a 20 20  .char *tag;.{.  
16180 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20  while( plp ){.  
16190 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
161a0 31 32 73 25 73 20 28 73 74 61 74 65 20 25 32 64  12s%s (state %2d
161b0 29 20 22 2c 22 22 2c 74 61 67 2c 70 6c 70 2d 3e  ) ","",tag,plp->
161c0 63 66 70 2d 3e 73 74 70 2d 3e 73 74 61 74 65 6e  cfp->stp->staten
161d0 75 6d 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 50  um);.    ConfigP
161e0 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2d 3e 63 66  rint(out,plp->cf
161f0 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  p);.    fprintf(
16200 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 70  out,"\n");.    p
16210 6c 70 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a  lp = plp->next;.
16220 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
16230 20 50 72 69 6e 74 20 61 6e 20 61 63 74 69 6f 6e   Print an action
16240 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69   to the given fi
16250 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
16260 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a  Return FALSE if.
16270 2a 2a 20 6e 6f 74 68 69 6e 67 20 77 61 73 20 61  ** nothing was a
16280 63 74 75 61 6c 6c 79 20 70 72 69 6e 74 65 64 2e  ctually printed.
16290 0a 2a 2f 0a 69 6e 74 20 50 72 69 6e 74 41 63 74  .*/.int PrintAct
162a0 69 6f 6e 28 73 74 72 75 63 74 20 61 63 74 69 6f  ion(struct actio
162b0 6e 20 2a 61 70 2c 20 46 49 4c 45 20 2a 66 70 2c  n *ap, FILE *fp,
162c0 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20   int indent){.  
162d0 69 6e 74 20 72 65 73 75 6c 74 20 3d 20 31 3b 0a  int result = 1;.
162e0 20 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79    switch( ap->ty
162f0 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  pe ){.    case S
16300 48 49 46 54 3a 0a 20 20 20 20 20 20 66 70 72 69  HIFT:.      fpri
16310 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66  ntf(fp,"%*s shif
16320 74 20 20 25 64 22 2c 69 6e 64 65 6e 74 2c 61 70  t  %d",indent,ap
16330 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78  ->sp->name,ap->x
16340 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b  .stp->statenum);
16350 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
16360 20 20 63 61 73 65 20 52 45 44 55 43 45 3a 0a 20    case REDUCE:. 
16370 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
16380 22 25 2a 73 20 72 65 64 75 63 65 20 25 64 22 2c  "%*s reduce %d",
16390 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e  indent,ap->sp->n
163a0 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e  ame,ap->x.rp->in
163b0 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  dex);.      brea
163c0 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 43 43 45  k;.    case ACCE
163d0 50 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74  PT:.      fprint
163e0 66 28 66 70 2c 22 25 2a 73 20 61 63 63 65 70 74  f(fp,"%*s accept
163f0 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d  ",indent,ap->sp-
16400 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  >name);.      br
16410 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 52  eak;.    case ER
16420 52 4f 52 3a 0a 20 20 20 20 20 20 66 70 72 69 6e  ROR:.      fprin
16430 74 66 28 66 70 2c 22 25 2a 73 20 65 72 72 6f 72  tf(fp,"%*s error
16440 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d  ",indent,ap->sp-
16450 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  >name);.      br
16460 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 52  eak;.    case SR
16470 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 63 61  CONFLICT:.    ca
16480 73 65 20 52 52 43 4f 4e 46 4c 49 43 54 3a 0a 20  se RRCONFLICT:. 
16490 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
164a0 22 25 2a 73 20 72 65 64 75 63 65 20 25 2d 33 64  "%*s reduce %-3d
164b0 20 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66   ** Parsing conf
164c0 6c 69 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20  lict **",.      
164d0 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d    indent,ap->sp-
164e0 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e  >name,ap->x.rp->
164f0 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72  index);.      br
16500 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53  eak;.    case SS
16510 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20  CONFLICT:.      
16520 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20  fprintf(fp,"%*s 
16530 73 68 69 66 74 20 20 25 64 20 2a 2a 20 50 61 72  shift  %d ** Par
16540 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a  sing conflict **
16550 22 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 64 65  ", .        inde
16560 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c  nt,ap->sp->name,
16570 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65  ap->x.stp->state
16580 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  num);.      brea
16590 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 48 5f 52  k;.    case SH_R
165a0 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 63 61 73  ESOLVED:.    cas
165b0 65 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a 20  e RD_RESOLVED:. 
165c0 20 20 20 63 61 73 65 20 4e 4f 54 5f 55 53 45 44     case NOT_USED
165d0 3a 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d  :.      result =
165e0 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
165f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
16600 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  sult;.}../* Gene
16610 72 61 74 65 20 74 68 65 20 22 79 2e 6f 75 74 70  rate the "y.outp
16620 75 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a  ut" log file */.
16630 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75  void ReportOutpu
16640 74 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  t(lemp).struct l
16650 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
16660 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
16670 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
16680 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
16690 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
166a0 6e 20 2a 61 70 3b 0a 20 20 46 49 4c 45 20 2a 66  n *ap;.  FILE *f
166b0 70 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65 5f  p;..  fp = file_
166c0 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74 22  open(lemp,".out"
166d0 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 66 70  ,"wb");.  if( fp
166e0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
166f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
16700 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
16710 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
16720 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 70  orted[i];.    fp
16730 72 69 6e 74 66 28 66 70 2c 22 53 74 61 74 65 20  rintf(fp,"State 
16740 25 64 3a 5c 6e 22 2c 73 74 70 2d 3e 73 74 61 74  %d:\n",stp->stat
16750 65 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 6c  enum);.    if( l
16760 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29  emp->basisflag )
16770 20 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a 20 20   cfp=stp->bp;.  
16780 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
16790 20 20 20 20 20 20 20 20 63 66 70 3d 73 74 70 2d          cfp=stp-
167a0 3e 63 66 70 3b 0a 20 20 20 20 77 68 69 6c 65 28  >cfp;.    while(
167b0 20 63 66 70 20 29 7b 0a 20 20 20 20 20 20 63 68   cfp ){.      ch
167c0 61 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20 20 20  ar buf[20];.    
167d0 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3d 3d    if( cfp->dot==
167e0 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 7b  cfp->rp->nrhs ){
167f0 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
16800 28 62 75 66 2c 22 28 25 64 29 22 2c 63 66 70 2d  (buf,"(%d)",cfp-
16810 3e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  >rp->index);.   
16820 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
16830 22 20 20 20 20 25 35 73 20 22 2c 62 75 66 29 3b  "    %5s ",buf);
16840 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16850 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
16860 2c 22 20 20 20 20 20 20 20 20 20 20 22 29 3b 0a  ,"          ");.
16870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 43 6f        }.      Co
16880 6e 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66 70  nfigPrint(fp,cfp
16890 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
168a0 28 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 20 30  (fp,"\n");.#if 0
168b0 0a 20 20 20 20 20 20 53 65 74 50 72 69 6e 74 28  .      SetPrint(
168c0 66 70 2c 63 66 70 2d 3e 66 77 73 2c 6c 65 6d 70  fp,cfp->fws,lemp
168d0 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72  );.      PlinkPr
168e0 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66 70 6c 70  int(fp,cfp->fplp
168f0 2c 22 54 6f 20 20 22 29 3b 0a 20 20 20 20 20 20  ,"To  ");.      
16900 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66  PlinkPrint(fp,cf
16910 70 2d 3e 62 70 6c 70 2c 22 46 72 6f 6d 22 29 3b  p->bplp,"From");
16920 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
16930 28 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61  ( lemp->basisfla
16940 67 20 29 20 63 66 70 3d 63 66 70 2d 3e 62 70 3b  g ) cfp=cfp->bp;
16950 0a 20 20 20 20 20 20 65 6c 73 65 20 20 20 20 20  .      else     
16960 20 20 20 20 20 20 20 20 20 20 20 20 20 63 66 70               cfp
16970 3d 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20  =cfp->next;.    
16980 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70  }.    fprintf(fp
16990 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28  ,"\n");.    for(
169a0 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
169b0 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
169c0 20 20 20 20 69 66 28 20 50 72 69 6e 74 41 63 74      if( PrintAct
169d0 69 6f 6e 28 61 70 2c 66 70 2c 33 30 29 20 29 20  ion(ap,fp,30) ) 
169e0 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29  fprintf(fp,"\n")
169f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
16a00 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20  ntf(fp,"\n");.  
16a10 7d 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20  }.  fprintf(fp, 
16a20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  "---------------
16a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a50 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 66 70 72  -----\n");.  fpr
16a60 69 6e 74 66 28 66 70 2c 20 22 53 79 6d 62 6f 6c  intf(fp, "Symbol
16a70 73 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69 3d  s:\n");.  for(i=
16a80 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
16a90 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ol; i++){.    in
16aa0 74 20 6a 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t j;.    struct 
16ab0 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 20  symbol *sp;..   
16ac0 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62   sp = lemp->symb
16ad0 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69  ols[i];.    fpri
16ae0 6e 74 66 28 66 70 2c 20 22 20 20 25 33 64 3a 20  ntf(fp, "  %3d: 
16af0 25 73 22 2c 20 69 2c 20 73 70 2d 3e 6e 61 6d 65  %s", i, sp->name
16b00 29 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74  );.    if( sp->t
16b10 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c  ype==NONTERMINAL
16b20 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
16b30 66 28 66 70 2c 20 22 3a 22 29 3b 0a 20 20 20 20  f(fp, ":");.    
16b40 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61    if( sp->lambda
16b50 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
16b60 6e 74 66 28 66 70 2c 20 22 20 3c 6c 61 6d 62 64  ntf(fp, " <lambd
16b70 61 3e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  a>");.      }.  
16b80 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c      for(j=0; j<l
16b90 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
16ba0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
16bb0 28 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20 26  ( sp->firstset &
16bc0 26 20 53 65 74 46 69 6e 64 28 73 70 2d 3e 66 69  & SetFind(sp->fi
16bd0 72 73 74 73 65 74 2c 20 6a 29 20 29 7b 0a 20 20  rstset, j) ){.  
16be0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
16bf0 66 70 2c 20 22 20 25 73 22 2c 20 6c 65 6d 70 2d  fp, " %s", lemp-
16c00 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2d 3e 6e 61 6d  >symbols[j]->nam
16c10 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
16c20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
16c30 66 70 72 69 6e 74 66 28 66 70 2c 20 22 5c 6e 22  fprintf(fp, "\n"
16c40 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28  );.  }.  fclose(
16c50 66 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  fp);.  return;.}
16c60 0a 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20  ../* Search for 
16c70 74 68 65 20 66 69 6c 65 20 22 6e 61 6d 65 22 20  the file "name" 
16c80 77 68 69 63 68 20 69 73 20 69 6e 20 74 68 65 20  which is in the 
16c90 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
16ca0 73 0a 2a 2a 20 74 68 65 20 65 78 61 63 75 74 61  s.** the exacuta
16cb0 62 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 63  ble */.PRIVATE c
16cc0 68 61 72 20 2a 70 61 74 68 73 65 61 72 63 68 28  har *pathsearch(
16cd0 61 72 67 76 30 2c 6e 61 6d 65 2c 6d 6f 64 65 6d  argv0,name,modem
16ce0 61 73 6b 29 0a 63 68 61 72 20 2a 61 72 67 76 30  ask).char *argv0
16cf0 3b 0a 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 69 6e  ;.char *name;.in
16d00 74 20 6d 6f 64 65 6d 61 73 6b 3b 0a 7b 0a 20 20  t modemask;.{.  
16d10 63 68 61 72 20 2a 70 61 74 68 6c 69 73 74 3b 0a  char *pathlist;.
16d20 20 20 63 68 61 72 20 2a 70 61 74 68 2c 2a 63 70    char *path,*cp
16d30 3b 0a 20 20 63 68 61 72 20 63 3b 0a 0a 23 69 66  ;.  char c;..#if
16d40 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 20 20  def __WIN32__.  
16d50 63 70 20 3d 20 73 74 72 72 63 68 72 28 61 72 67  cp = strrchr(arg
16d60 76 30 2c 27 5c 5c 27 29 3b 0a 23 65 6c 73 65 0a  v0,'\\');.#else.
16d70 20 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 61    cp = strrchr(a
16d80 72 67 76 30 2c 27 2f 27 29 3b 0a 23 65 6e 64 69  rgv0,'/');.#endi
16d90 66 0a 20 20 69 66 28 20 63 70 20 29 7b 0a 20 20  f.  if( cp ){.  
16da0 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a    c = *cp;.    *
16db0 63 70 20 3d 20 30 3b 0a 20 20 20 20 70 61 74 68  cp = 0;.    path
16dc0 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f   = (char *)mallo
16dd0 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61  c( lemonStrlen(a
16de0 72 67 76 30 29 20 2b 20 6c 65 6d 6f 6e 53 74 72  rgv0) + lemonStr
16df0 6c 65 6e 28 6e 61 6d 65 29 20 2b 20 32 20 29 3b  len(name) + 2 );
16e00 0a 20 20 20 20 69 66 28 20 70 61 74 68 20 29 20  .    if( path ) 
16e10 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73  sprintf(path,"%s
16e20 2f 25 73 22 2c 61 72 67 76 30 2c 6e 61 6d 65 29  /%s",argv0,name)
16e30 3b 0a 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20  ;.    *cp = c;. 
16e40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 78 74 65   }else{.    exte
16e50 72 6e 20 63 68 61 72 20 2a 67 65 74 65 6e 76 28  rn char *getenv(
16e60 29 3b 0a 20 20 20 20 70 61 74 68 6c 69 73 74 20  );.    pathlist 
16e70 3d 20 67 65 74 65 6e 76 28 22 50 41 54 48 22 29  = getenv("PATH")
16e80 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68 6c 69  ;.    if( pathli
16e90 73 74 3d 3d 30 20 29 20 70 61 74 68 6c 69 73 74  st==0 ) pathlist
16ea0 20 3d 20 22 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f   = ".:/bin:/usr/
16eb0 62 69 6e 22 3b 0a 20 20 20 20 70 61 74 68 20 3d  bin";.    path =
16ec0 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28   (char *)malloc(
16ed0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74   lemonStrlen(pat
16ee0 68 6c 69 73 74 29 2b 6c 65 6d 6f 6e 53 74 72 6c  hlist)+lemonStrl
16ef0 65 6e 28 6e 61 6d 65 29 2b 32 20 29 3b 0a 20 20  en(name)+2 );.  
16f00 20 20 69 66 28 20 70 61 74 68 21 3d 30 20 29 7b    if( path!=0 ){
16f10 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 70  .      while( *p
16f20 61 74 68 6c 69 73 74 20 29 7b 0a 20 20 20 20 20  athlist ){.     
16f30 20 20 20 63 70 20 3d 20 73 74 72 63 68 72 28 70     cp = strchr(p
16f40 61 74 68 6c 69 73 74 2c 27 3a 27 29 3b 0a 20 20  athlist,':');.  
16f50 20 20 20 20 20 20 69 66 28 20 63 70 3d 3d 30 20        if( cp==0 
16f60 29 20 63 70 20 3d 20 26 70 61 74 68 6c 69 73 74  ) cp = &pathlist
16f70 5b 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74  [lemonStrlen(pat
16f80 68 6c 69 73 74 29 5d 3b 0a 20 20 20 20 20 20 20  hlist)];.       
16f90 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20   c = *cp;.      
16fa0 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 20    *cp = 0;.     
16fb0 20 20 20 73 70 72 69 6e 74 66 28 70 61 74 68 2c     sprintf(path,
16fc0 22 25 73 2f 25 73 22 2c 70 61 74 68 6c 69 73 74  "%s/%s",pathlist
16fd0 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ,name);.        
16fe0 2a 63 70 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  *cp = c;.       
16ff0 20 69 66 28 20 63 3d 3d 30 20 29 20 70 61 74 68   if( c==0 ) path
17000 6c 69 73 74 20 3d 20 22 22 3b 0a 20 20 20 20 20  list = "";.     
17010 20 20 20 65 6c 73 65 20 70 61 74 68 6c 69 73 74     else pathlist
17020 20 3d 20 26 63 70 5b 31 5d 3b 0a 20 20 20 20 20   = &cp[1];.     
17030 20 20 20 69 66 28 20 61 63 63 65 73 73 28 70 61     if( access(pa
17040 74 68 2c 6d 6f 64 65 6d 61 73 6b 29 3d 3d 30 20  th,modemask)==0 
17050 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
17060 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
17070 75 72 6e 20 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20  urn path;.}../* 
17080 47 69 76 65 6e 20 61 6e 20 61 63 74 69 6f 6e 2c  Given an action,
17090 20 63 6f 6d 70 75 74 65 20 74 68 65 20 69 6e 74   compute the int
170a0 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74  eger value for t
170b0 68 61 74 20 61 63 74 69 6f 6e 0a 2a 2a 20 77 68  hat action.** wh
170c0 69 63 68 20 69 73 20 74 6f 20 62 65 20 70 75 74  ich is to be put
170d0 20 69 6e 20 74 68 65 20 61 63 74 69 6f 6e 20 74   in the action t
170e0 61 62 6c 65 20 6f 66 20 74 68 65 20 67 65 6e 65  able of the gene
170f0 72 61 74 65 64 20 6d 61 63 68 69 6e 65 2e 0a 2a  rated machine..*
17100 2a 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76  * Return negativ
17110 65 20 69 66 20 6e 6f 20 61 63 74 69 6f 6e 20 73  e if no action s
17120 68 6f 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74  hould be generat
17130 65 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 69  ed..*/.PRIVATE i
17140 6e 74 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f  nt compute_actio
17150 6e 28 6c 65 6d 70 2c 61 70 29 0a 73 74 72 75 63  n(lemp,ap).struc
17160 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 73  t lemon *lemp;.s
17170 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
17180 3b 0a 7b 0a 20 20 69 6e 74 20 61 63 74 3b 0a 20  ;.{.  int act;. 
17190 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70   switch( ap->typ
171a0 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48  e ){.    case SH
171b0 49 46 54 3a 20 20 61 63 74 20 3d 20 61 70 2d 3e  IFT:  act = ap->
171c0 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 3b  x.stp->statenum;
171d0 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
171e0 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45 44 55  k;.    case REDU
171f0 43 45 3a 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e  CE: act = ap->x.
17200 72 70 2d 3e 69 6e 64 65 78 20 2b 20 6c 65 6d 70  rp->index + lemp
17210 2d 3e 6e 73 74 61 74 65 3b 20 62 72 65 61 6b 3b  ->nstate; break;
17220 0a 20 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a  .    case ERROR:
17230 20 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73    act = lemp->ns
17240 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75  tate + lemp->nru
17250 6c 65 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  le;     break;. 
17260 20 20 20 63 61 73 65 20 41 43 43 45 50 54 3a 20     case ACCEPT: 
17270 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  act = lemp->nsta
17280 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  te + lemp->nrule
17290 20 2b 20 31 3b 20 62 72 65 61 6b 3b 0a 20 20 20   + 1; break;.   
172a0 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 61 63   default:     ac
172b0 74 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 0a 20  t = -1; break;. 
172c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 63 74 3b   }.  return act;
172d0 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45  .}..#define LINE
172e0 53 49 5a 45 20 31 30 30 30 0a 2f 2a 20 54 68 65  SIZE 1000./* The
172f0 20 6e 65 78 74 20 63 6c 75 73 74 65 72 20 6f 66   next cluster of
17300 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 66 6f   routines are fo
17310 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 74 65  r reading the te
17320 6d 70 6c 61 74 65 20 66 69 6c 65 0a 2a 2a 20 61  mplate file.** a
17330 6e 64 20 77 72 69 74 69 6e 67 20 74 68 65 20 72  nd writing the r
17340 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 67 65  esults to the ge
17350 6e 65 72 61 74 65 64 20 70 61 72 73 65 72 20 2a  nerated parser *
17360 2f 0a 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66  /./* The first f
17370 75 6e 63 74 69 6f 6e 20 74 72 61 6e 73 66 65 72  unction transfer
17380 73 20 64 61 74 61 20 66 72 6f 6d 20 22 69 6e 22  s data from "in"
17390 20 74 6f 20 22 6f 75 74 22 20 75 6e 74 69 6c 0a   to "out" until.
173a0 2a 2a 20 61 20 6c 69 6e 65 20 69 73 20 73 65 65  ** a line is see
173b0 6e 20 77 68 69 63 68 20 62 65 67 69 6e 73 20 77  n which begins w
173c0 69 74 68 20 22 25 25 22 2e 20 20 54 68 65 20 6c  ith "%%".  The l
173d0 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ine number is.**
173e0 20 74 72 61 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20   tracked..**.** 
173f0 69 66 20 6e 61 6d 65 21 3d 30 2c 20 74 68 65 6e  if name!=0, then
17400 20 61 6e 79 20 77 6f 72 64 20 74 68 61 74 20 62   any word that b
17410 65 67 69 6e 20 77 69 74 68 20 22 50 61 72 73 65  egin with "Parse
17420 22 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a  " is changed to.
17430 2a 2a 20 62 65 67 69 6e 20 77 69 74 68 20 2a 6e  ** begin with *n
17440 61 6d 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a  ame instead..*/.
17450 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c  PRIVATE void tpl
17460 74 5f 78 66 65 72 28 6e 61 6d 65 2c 69 6e 2c 6f  t_xfer(name,in,o
17470 75 74 2c 6c 69 6e 65 6e 6f 29 0a 63 68 61 72 20  ut,lineno).char 
17480 2a 6e 61 6d 65 3b 0a 46 49 4c 45 20 2a 69 6e 3b  *name;.FILE *in;
17490 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 69 6e 74 20  .FILE *out;.int 
174a0 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 6e 74  *lineno;.{.  int
174b0 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 63 68   i, iStart;.  ch
174c0 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45  ar line[LINESIZE
174d0 5d 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74  ];.  while( fget
174e0 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c  s(line,LINESIZE,
174f0 69 6e 29 20 26 26 20 28 6c 69 6e 65 5b 30 5d 21  in) && (line[0]!
17500 3d 27 25 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d 21  ='%' || line[1]!
17510 3d 27 25 27 29 20 29 7b 0a 20 20 20 20 28 2a 6c  ='%') ){.    (*l
17520 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69 53  ineno)++;.    iS
17530 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  tart = 0;.    if
17540 28 20 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  ( name ){.      
17550 66 6f 72 28 69 3d 30 3b 20 6c 69 6e 65 5b 69 5d  for(i=0; line[i]
17560 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
17570 69 66 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50 27  if( line[i]=='P'
17580 20 26 26 20 73 74 72 6e 63 6d 70 28 26 6c 69 6e   && strncmp(&lin
17590 65 5b 69 5d 2c 22 50 61 72 73 65 22 2c 35 29 3d  e[i],"Parse",5)=
175a0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
175b0 28 69 3d 3d 30 20 7c 7c 20 21 69 73 61 6c 70 68  (i==0 || !isalph
175c0 61 28 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a 20 20  a(line[i-1])).  
175d0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
175e0 20 20 20 69 66 28 20 69 3e 69 53 74 61 72 74 20     if( i>iStart 
175f0 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25  ) fprintf(out,"%
17600 2e 2a 73 22 2c 69 2d 69 53 74 61 72 74 2c 26 6c  .*s",i-iStart,&l
17610 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20  ine[iStart]);.  
17620 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
17630 6f 75 74 2c 22 25 73 22 2c 6e 61 6d 65 29 3b 0a  out,"%s",name);.
17640 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34            i += 4
17650 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53 74 61  ;.          iSta
17660 72 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20  rt = i+1;.      
17670 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
17680 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  }.    fprintf(ou
17690 74 2c 22 25 73 22 2c 26 6c 69 6e 65 5b 69 53 74  t,"%s",&line[iSt
176a0 61 72 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  art]);.  }.}../*
176b0 20 54 68 65 20 6e 65 78 74 20 66 75 6e 63 74 69   The next functi
176c0 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 74 65 6d  on finds the tem
176d0 70 6c 61 74 65 20 66 69 6c 65 20 61 6e 64 20 6f  plate file and o
176e0 70 65 6e 73 20 69 74 2c 20 72 65 74 75 72 6e 69  pens it, returni
176f0 6e 67 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  ng.** a pointer 
17700 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69  to the opened fi
17710 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20 46  le. */.PRIVATE F
17720 49 4c 45 20 2a 74 70 6c 74 5f 6f 70 65 6e 28 6c  ILE *tplt_open(l
17730 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
17740 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 61  n *lemp;.{.  sta
17750 74 69 63 20 63 68 61 72 20 74 65 6d 70 6c 61 74  tic char templat
17760 65 6e 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d 70 61  ename[] = "lempa
17770 72 2e 63 22 3b 0a 20 20 63 68 61 72 20 62 75 66  r.c";.  char buf
17780 5b 31 30 30 30 5d 3b 0a 20 20 46 49 4c 45 20 2a  [1000];.  FILE *
17790 69 6e 3b 0a 20 20 63 68 61 72 20 2a 74 70 6c 74  in;.  char *tplt
177a0 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70  name;.  char *cp
177b0 3b 0a 0a 20 20 2f 2a 20 66 69 72 73 74 2c 20 73  ;..  /* first, s
177c0 65 65 20 69 66 20 75 73 65 72 20 73 70 65 63 69  ee if user speci
177d0 66 69 65 64 20 61 20 74 65 6d 70 6c 61 74 65 20  fied a template 
177e0 66 69 6c 65 6e 61 6d 65 20 6f 6e 20 74 68 65 20  filename on the 
177f0 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 2e 20 2a 2f  command line. */
17800 0a 20 20 69 66 20 28 75 73 65 72 5f 74 65 6d 70  .  if (user_temp
17810 6c 61 74 65 6e 61 6d 65 20 21 3d 20 30 29 20 7b  latename != 0) {
17820 0a 20 20 20 20 69 66 28 20 61 63 63 65 73 73 28  .    if( access(
17830 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d  user_templatenam
17840 65 2c 30 30 34 29 3d 3d 2d 31 20 29 7b 0a 20 20  e,004)==-1 ){.  
17850 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
17860 72 72 2c 22 43 61 6e 27 74 20 66 69 6e 64 20 74  rr,"Can't find t
17870 68 65 20 70 61 72 73 65 72 20 64 72 69 76 65 72  he parser driver
17880 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c   template file \
17890 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 20  "%s\".\n",.     
178a0 20 20 20 75 73 65 72 5f 74 65 6d 70 6c 61 74 65     user_template
178b0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d  name);.      lem
178c0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
178d0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
178e0 20 20 20 7d 0a 20 20 20 20 69 6e 20 3d 20 66 6f     }.    in = fo
178f0 70 65 6e 28 75 73 65 72 5f 74 65 6d 70 6c 61 74  pen(user_templat
17900 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 20  ename,"rb");.   
17910 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
17920 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
17930 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74  rr,"Can't open t
17940 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  he template file
17950 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 75 73 65 72   \"%s\".\n",user
17960 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a  _templatename);.
17970 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
17980 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65  rcnt++;.      re
17990 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
179a0 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a 20 20 7d    return in;.  }
179b0 0a 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72  ..  cp = strrchr
179c0 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
179d0 27 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20 29  '.');.  if( cp )
179e0 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 62 75  {.    sprintf(bu
179f0 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28 69 6e 74  f,"%.*s.lt",(int
17a00 29 28 63 70 2d 6c 65 6d 70 2d 3e 66 69 6c 65 6e  )(cp-lemp->filen
17a10 61 6d 65 29 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  ame),lemp->filen
17a20 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
17a30 20 20 20 73 70 72 69 6e 74 66 28 62 75 66 2c 22     sprintf(buf,"
17a40 25 73 2e 6c 74 22 2c 6c 65 6d 70 2d 3e 66 69 6c  %s.lt",lemp->fil
17a50 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66  ename);.  }.  if
17a60 28 20 61 63 63 65 73 73 28 62 75 66 2c 30 30 34  ( access(buf,004
17a70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74  )==0 ){.    tplt
17a80 6e 61 6d 65 20 3d 20 62 75 66 3b 0a 20 20 7d 65  name = buf;.  }e
17a90 6c 73 65 20 69 66 28 20 61 63 63 65 73 73 28 74  lse if( access(t
17aa0 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34 29  emplatename,004)
17ab0 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74 6e  ==0 ){.    tpltn
17ac0 61 6d 65 20 3d 20 74 65 6d 70 6c 61 74 65 6e 61  ame = templatena
17ad0 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  me;.  }else{.   
17ae0 20 74 70 6c 74 6e 61 6d 65 20 3d 20 70 61 74 68   tpltname = path
17af0 73 65 61 72 63 68 28 6c 65 6d 70 2d 3e 61 72 67  search(lemp->arg
17b00 76 30 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c  v0,templatename,
17b10 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 70  0);.  }.  if( tp
17b20 6c 74 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  ltname==0 ){.   
17b30 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
17b40 22 43 61 6e 27 74 20 66 69 6e 64 20 74 68 65 20  "Can't find the 
17b50 70 61 72 73 65 72 20 64 72 69 76 65 72 20 74 65  parser driver te
17b60 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73  mplate file \"%s
17b70 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 74 65 6d 70  \".\n",.    temp
17b80 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c  latename);.    l
17b90 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
17ba0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
17bb0 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28   }.  in = fopen(
17bc0 74 70 6c 74 6e 61 6d 65 2c 22 72 62 22 29 3b 0a  tpltname,"rb");.
17bd0 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
17be0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
17bf0 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68  r,"Can't open th
17c00 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20  e template file 
17c10 5c 22 25 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70 6c  \"%s\".\n",templ
17c20 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65  atename);.    le
17c30 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
17c40 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
17c50 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a 7d  }.  return in;.}
17c60 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 23 6c 69  ../* Print a #li
17c70 6e 65 20 64 69 72 65 63 74 69 76 65 20 6c 69 6e  ne directive lin
17c80 65 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  e to the output 
17c90 66 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45  file. */.PRIVATE
17ca0 20 76 6f 69 64 20 74 70 6c 74 5f 6c 69 6e 65 64   void tplt_lined
17cb0 69 72 28 6f 75 74 2c 6c 69 6e 65 6e 6f 2c 66 69  ir(out,lineno,fi
17cc0 6c 65 6e 61 6d 65 29 0a 46 49 4c 45 20 2a 6f 75  lename).FILE *ou
17cd0 74 3b 0a 69 6e 74 20 6c 69 6e 65 6e 6f 3b 0a 63  t;.int lineno;.c
17ce0 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 0a 7b  har *filename;.{
17cf0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
17d00 23 6c 69 6e 65 20 25 64 20 5c 22 22 2c 6c 69 6e  #line %d \"",lin
17d10 65 6e 6f 29 3b 0a 20 20 77 68 69 6c 65 28 20 2a  eno);.  while( *
17d20 66 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20  filename ){.    
17d30 69 66 28 20 2a 66 69 6c 65 6e 61 6d 65 20 3d 3d  if( *filename ==
17d40 20 27 5c 5c 27 20 29 20 70 75 74 63 28 27 5c 5c   '\\' ) putc('\\
17d50 27 2c 6f 75 74 29 3b 0a 20 20 20 20 70 75 74 63  ',out);.    putc
17d60 28 2a 66 69 6c 65 6e 61 6d 65 2c 6f 75 74 29 3b  (*filename,out);
17d70 0a 20 20 20 20 66 69 6c 65 6e 61 6d 65 2b 2b 3b  .    filename++;
17d80 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
17d90 75 74 2c 22 5c 22 5c 6e 22 29 3b 0a 7d 0a 0a 2f  ut,"\"\n");.}../
17da0 2a 20 50 72 69 6e 74 20 61 20 73 74 72 69 6e 67  * Print a string
17db0 20 74 6f 20 74 68 65 20 66 69 6c 65 20 61 6e 64   to the file and
17dc0 20 6b 65 65 70 20 74 68 65 20 6c 69 6e 65 6e 75   keep the linenu
17dd0 6d 62 65 72 20 75 70 20 74 6f 20 64 61 74 65 20  mber up to date 
17de0 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
17df0 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
17e00 65 6d 70 2c 73 74 72 2c 6c 69 6e 65 6e 6f 29 0a  emp,str,lineno).
17e10 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63  FILE *out;.struc
17e20 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 63  t lemon *lemp;.c
17e30 68 61 72 20 2a 73 74 72 3b 0a 69 6e 74 20 2a 6c  har *str;.int *l
17e40 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 66 28 20 73  ineno;.{.  if( s
17e50 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  tr==0 ) return;.
17e60 20 20 77 68 69 6c 65 28 20 2a 73 74 72 20 29 7b    while( *str ){
17e70 0a 20 20 20 20 70 75 74 63 28 2a 73 74 72 2c 6f  .    putc(*str,o
17e80 75 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 74  ut);.    if( *st
17e90 72 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65  r=='\n' ) (*line
17ea0 6e 6f 29 2b 2b 3b 0a 20 20 20 20 73 74 72 2b 2b  no)++;.    str++
17eb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72 5b  ;.  }.  if( str[
17ec0 2d 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  -1]!='\n' ){.   
17ed0 20 70 75 74 63 28 27 5c 6e 27 2c 6f 75 74 29 3b   putc('\n',out);
17ee0 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  .    (*lineno)++
17ef0 3b 0a 20 20 7d 0a 20 20 69 66 20 28 21 6c 65 6d  ;.  }.  if (!lem
17f00 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  p->nolinenosflag
17f10 29 20 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f  ) {.    (*lineno
17f20 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69  )++; tplt_linedi
17f30 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65  r(out,*lineno,le
17f40 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 0a 20  mp->outname); . 
17f50 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a   }.  return;.}..
17f60 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
17f70 69 6e 67 20 72 6f 75 74 69 6e 65 20 65 6d 69 74  ing routine emit
17f80 73 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 64  s code for the d
17f90 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68  estructor for th
17fa0 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 73 70 0a 2a  e.** symbol sp.*
17fb0 2f 0a 76 6f 69 64 20 65 6d 69 74 5f 64 65 73 74  /.void emit_dest
17fc0 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c  ructor_code(out,
17fd0 73 70 2c 6c 65 6d 70 2c 6c 69 6e 65 6e 6f 29 0a  sp,lemp,lineno).
17fe0 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63  FILE *out;.struc
17ff0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 73 74  t symbol *sp;.st
18000 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
18010 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b  ;.int *lineno;.{
18020 0a 20 63 68 61 72 20 2a 63 70 20 3d 20 30 3b 0a  . char *cp = 0;.
18030 0a 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d  . if( sp->type==
18040 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 63  TERMINAL ){.   c
18050 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64  p = lemp->tokend
18060 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70 3d 3d  est;.   if( cp==
18070 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 66  0 ) return;.   f
18080 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e 22  printf(out,"{\n"
18090 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a  ); (*lineno)++;.
180a0 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e 64   }else if( sp->d
180b0 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
180c0 63 70 20 3d 20 73 70 2d 3e 64 65 73 74 72 75 63  cp = sp->destruc
180d0 74 6f 72 3b 0a 20 20 20 66 70 72 69 6e 74 66 28  tor;.   fprintf(
180e0 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69  out,"{\n"); (*li
180f0 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66 20 28  neno)++;.   if (
18100 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73  !lemp->nolinenos
18110 66 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65 6e 6f  flag) { (*lineno
18120 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69  )++; tplt_linedi
18130 72 28 6f 75 74 2c 73 70 2d 3e 64 65 73 74 4c 69  r(out,sp->destLi
18140 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  neno,lemp->filen
18150 61 6d 65 29 3b 20 7d 0a 20 7d 65 6c 73 65 20 69  ame); }. }else i
18160 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74  f( lemp->vardest
18170 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70   ){.   cp = lemp
18180 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20 69 66  ->vardest;.   if
18190 28 20 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( cp==0 ) return
181a0 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  ;.   fprintf(out
181b0 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e  ,"{\n"); (*linen
181c0 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65 7b 0a 20 20  o)++;. }else{.  
181d0 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20 2f   assert( 0 );  /
181e0 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20  * Cannot happen 
181f0 2a 2f 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a 63 70  */. }. for(; *cp
18200 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 69 66 28 20  ; cp++){.   if( 
18210 2a 63 70 3d 3d 27 24 27 20 26 26 20 63 70 5b 31  *cp=='$' && cp[1
18220 5d 3d 3d 27 24 27 20 29 7b 0a 20 20 20 20 20 66  ]=='$' ){.     f
18230 70 72 69 6e 74 66 28 6f 75 74 2c 22 28 79 79 70  printf(out,"(yyp
18240 6d 69 6e 6f 72 2d 3e 79 79 25 64 29 22 2c 73 70  minor->yy%d)",sp
18250 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 63  ->dtnum);.     c
18260 70 2b 2b 3b 0a 20 20 20 20 20 63 6f 6e 74 69 6e  p++;.     contin
18270 75 65 3b 0a 20 20 20 7d 0a 20 20 20 69 66 28 20  ue;.   }.   if( 
18280 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69  *cp=='\n' ) (*li
18290 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 66 70 75 74  neno)++;.   fput
182a0 63 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20  c(*cp,out);. }. 
182b0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22  fprintf(out,"\n"
182c0 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a  ); (*lineno)++;.
182d0 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69   if (!lemp->noli
182e0 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 20 0a 20 20  nenosflag) { .  
182f0 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70   (*lineno)++; tp
18300 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a  lt_linedir(out,*
18310 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74  lineno,lemp->out
18320 6e 61 6d 65 29 3b 20 0a 20 7d 0a 20 66 70 72 69  name); . }. fpri
18330 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20  ntf(out,"}\n"); 
18340 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 72 65  (*lineno)++;. re
18350 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  turn;.}../*.** R
18360 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d  eturn TRUE (non-
18370 7a 65 72 6f 29 20 69 66 20 74 68 65 20 67 69 76  zero) if the giv
18380 65 6e 20 73 79 6d 62 6f 6c 20 68 61 73 20 61 20  en symbol has a 
18390 64 65 73 74 72 75 63 74 6f 72 2e 0a 2a 2f 0a 69  destructor..*/.i
183a0 6e 74 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f  nt has_destructo
183b0 72 28 73 70 2c 20 6c 65 6d 70 29 0a 73 74 72 75  r(sp, lemp).stru
183c0 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 73  ct symbol *sp;.s
183d0 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
183e0 70 3b 0a 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a  p;.{.  int ret;.
183f0 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d    if( sp->type==
18400 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
18410 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65  ret = lemp->toke
18420 6e 64 65 73 74 21 3d 30 3b 0a 20 20 7d 65 6c 73  ndest!=0;.  }els
18430 65 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c 65 6d  e{.    ret = lem
18440 70 2d 3e 76 61 72 64 65 73 74 21 3d 30 20 7c 7c  p->vardest!=0 ||
18450 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21   sp->destructor!
18460 3d 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  =0;.  }.  return
18470 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   ret;.}../*.** A
18480 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20 61 20  ppend text to a 
18490 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f  dynamically allo
184a0 63 61 74 65 64 20 73 74 72 69 6e 67 2e 20 20 49  cated string.  I
184b0 66 20 7a 54 65 78 74 20 69 73 20 30 20 74 68 65  f zText is 0 the
184c0 6e 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 73  n.** reset the s
184d0 74 72 69 6e 67 20 74 6f 20 62 65 20 65 6d 70 74  tring to be empt
184e0 79 20 61 67 61 69 6e 2e 20 20 41 6c 77 61 79 73  y again.  Always
184f0 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6d 70   return the comp
18500 6c 65 74 65 20 74 65 78 74 0a 2a 2a 20 6f 66 20  lete text.** of 
18510 74 68 65 20 73 74 72 69 6e 67 20 28 77 68 69 63  the string (whic
18520 68 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  h is overwritten
18530 20 77 69 74 68 20 65 61 63 68 20 63 61 6c 6c 29   with each call)
18540 2e 0a 2a 2a 0a 2a 2a 20 6e 20 62 79 74 65 73 20  ..**.** n bytes 
18550 6f 66 20 7a 54 65 78 74 20 61 72 65 20 73 74 6f  of zText are sto
18560 72 65 64 2e 20 20 49 66 20 6e 3d 3d 30 20 74 68  red.  If n==0 th
18570 65 6e 20 61 6c 6c 20 6f 66 20 7a 54 65 78 74 20  en all of zText 
18580 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a  up to the first.
18590 2a 2a 20 5c 30 30 30 20 74 65 72 6d 69 6e 61 74  ** \000 terminat
185a0 6f 72 20 69 73 20 73 74 6f 72 65 64 2e 20 20 7a  or is stored.  z
185b0 54 65 78 74 20 63 61 6e 20 63 6f 6e 74 61 69 6e  Text can contain
185c0 20 75 70 20 74 6f 20 74 77 6f 20 69 6e 73 74 61   up to two insta
185d0 6e 63 65 73 20 6f 66 0a 2a 2a 20 25 64 2e 20 20  nces of.** %d.  
185e0 54 68 65 20 76 61 6c 75 65 73 20 6f 66 20 70 31  The values of p1
185f0 20 61 6e 64 20 70 32 20 61 72 65 20 77 72 69 74   and p2 are writ
18600 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 66 69 72  ten into the fir
18610 73 74 20 61 6e 64 20 73 65 63 6f 6e 64 0a 2a 2a  st and second.**
18620 20 25 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3d   %d..**.** If n=
18630 3d 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 70 72  =-1, then the pr
18640 65 76 69 6f 75 73 20 63 68 61 72 61 63 74 65 72  evious character
18650 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 2e   is overwritten.
18660 0a 2a 2f 0a 50 52 49 56 41 54 45 20 63 68 61 72  .*/.PRIVATE char
18670 20 2a 61 70 70 65 6e 64 5f 73 74 72 28 63 68 61   *append_str(cha
18680 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 6e 2c  r *zText, int n,
18690 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29   int p1, int p2)
186a0 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
186b0 2a 7a 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  *z = 0;.  static
186c0 20 69 6e 74 20 61 6c 6c 6f 63 65 64 20 3d 20 30   int alloced = 0
186d0 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 75  ;.  static int u
186e0 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  sed = 0;.  int c
186f0 3b 0a 20 20 63 68 61 72 20 7a 49 6e 74 5b 34 30  ;.  char zInt[40
18700 5d 3b 0a 0a 20 20 69 66 28 20 7a 54 65 78 74 3d  ];..  if( zText=
18710 3d 30 20 29 7b 0a 20 20 20 20 75 73 65 64 20 3d  =0 ){.    used =
18720 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 7a   0;.    return z
18730 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c 3d 30  ;.  }.  if( n<=0
18740 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 3c 30 20   ){.    if( n<0 
18750 29 7b 0a 20 20 20 20 20 20 75 73 65 64 20 2b 3d  ){.      used +=
18760 20 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   n;.      assert
18770 28 20 75 73 65 64 3e 3d 30 20 29 3b 0a 20 20 20  ( used>=0 );.   
18780 20 7d 0a 20 20 20 20 6e 20 3d 20 6c 65 6d 6f 6e   }.    n = lemon
18790 53 74 72 6c 65 6e 28 7a 54 65 78 74 29 3b 0a 20  Strlen(zText);. 
187a0 20 7d 0a 20 20 69 66 28 20 6e 2b 73 69 7a 65 6f   }.  if( n+sizeo
187b0 66 28 7a 49 6e 74 29 2a 32 2b 75 73 65 64 20 3e  f(zInt)*2+used >
187c0 3d 20 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20  = alloced ){.   
187d0 20 61 6c 6c 6f 63 65 64 20 3d 20 6e 20 2b 20 73   alloced = n + s
187e0 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 20 2b 20  izeof(zInt)*2 + 
187f0 75 73 65 64 20 2b 20 32 30 30 3b 0a 20 20 20 20  used + 200;.    
18800 7a 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 2c 20 20  z = realloc(z,  
18810 61 6c 6c 6f 63 65 64 29 3b 0a 20 20 7d 0a 20 20  alloced);.  }.  
18820 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
18830 6e 20 22 22 3b 0a 20 20 77 68 69 6c 65 28 20 6e  n "";.  while( n
18840 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 63 20  -- > 0 ){.    c 
18850 3d 20 2a 28 7a 54 65 78 74 2b 2b 29 3b 0a 20 20  = *(zText++);.  
18860 20 20 69 66 28 20 63 3d 3d 27 25 27 20 26 26 20    if( c=='%' && 
18870 6e 3e 30 20 26 26 20 7a 54 65 78 74 5b 30 5d 3d  n>0 && zText[0]=
18880 3d 27 64 27 20 29 7b 0a 20 20 20 20 20 20 73 70  ='d' ){.      sp
18890 72 69 6e 74 66 28 7a 49 6e 74 2c 20 22 25 64 22  rintf(zInt, "%d"
188a0 2c 20 70 31 29 3b 0a 20 20 20 20 20 20 70 31 20  , p1);.      p1 
188b0 3d 20 70 32 3b 0a 20 20 20 20 20 20 73 74 72 63  = p2;.      strc
188c0 70 79 28 26 7a 5b 75 73 65 64 5d 2c 20 7a 49 6e  py(&z[used], zIn
188d0 74 29 3b 0a 20 20 20 20 20 20 75 73 65 64 20 2b  t);.      used +
188e0 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 26 7a  = lemonStrlen(&z
188f0 5b 75 73 65 64 5d 29 3b 0a 20 20 20 20 20 20 7a  [used]);.      z
18900 54 65 78 74 2b 2b 3b 0a 20 20 20 20 20 20 6e 2d  Text++;.      n-
18910 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  -;.    }else{.  
18920 20 20 20 20 7a 5b 75 73 65 64 2b 2b 5d 20 3d 20      z[used++] = 
18930 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  c;.    }.  }.  z
18940 5b 75 73 65 64 5d 20 3d 20 30 3b 0a 20 20 72 65  [used] = 0;.  re
18950 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn z;.}../*.**
18960 20 7a 43 6f 64 65 20 69 73 20 61 20 73 74 72 69   zCode is a stri
18970 6e 67 20 74 68 61 74 20 69 73 20 74 68 65 20 61  ng that is the a
18980 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64  ction associated
18990 20 77 69 74 68 20 61 20 72 75 6c 65 2e 20 20 45   with a rule.  E
189a0 78 70 61 6e 64 0a 2a 2a 20 74 68 65 20 73 79 6d  xpand.** the sym
189b0 62 6f 6c 73 20 69 6e 20 74 68 69 73 20 73 74 72  bols in this str
189c0 69 6e 67 20 73 6f 20 74 68 61 74 20 74 68 65 20  ing so that the 
189d0 72 65 66 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74  refer to element
189e0 73 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 0a  s of the parser.
189f0 2a 2a 20 73 74 61 63 6b 2e 0a 2a 2f 0a 50 52 49  ** stack..*/.PRI
18a00 56 41 54 45 20 76 6f 69 64 20 74 72 61 6e 73 6c  VATE void transl
18a10 61 74 65 5f 63 6f 64 65 28 73 74 72 75 63 74 20  ate_code(struct 
18a20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72  lemon *lemp, str
18a30 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a 20  uct rule *rp){. 
18a40 20 63 68 61 72 20 2a 63 70 2c 20 2a 78 70 3b 0a   char *cp, *xp;.
18a50 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
18a60 6c 68 73 75 73 65 64 20 3d 20 30 3b 20 20 20 20  lhsused = 0;    
18a70 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 4c  /* True if the L
18a80 48 53 20 65 6c 65 6d 65 6e 74 20 68 61 73 20 62  HS element has b
18a90 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20 63 68  een used */.  ch
18aa0 61 72 20 75 73 65 64 5b 4d 41 58 52 48 53 5d 3b  ar used[MAXRHS];
18ab0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 65     /* True for e
18ac0 61 63 68 20 52 48 53 20 65 6c 65 6d 65 6e 74 20  ach RHS element 
18ad0 77 68 69 63 68 20 69 73 20 75 73 65 64 20 2a 2f  which is used */
18ae0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72  ..  for(i=0; i<r
18af0 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 20 75 73  p->nrhs; i++) us
18b00 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 6c 68 73  ed[i] = 0;.  lhs
18b10 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28  used = 0;..  if(
18b20 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 7b 0a   rp->code==0 ){.
18b30 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 22      rp->code = "
18b40 5c 6e 22 3b 0a 20 20 20 20 72 70 2d 3e 6c 69 6e  \n";.    rp->lin
18b50 65 20 3d 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65  e = rp->ruleline
18b60 3b 0a 20 20 7d 0a 0a 20 20 61 70 70 65 6e 64 5f  ;.  }..  append_
18b70 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 20 20  str(0,0,0,0);.  
18b80 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65 3b  for(cp=rp->code;
18b90 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20   *cp; cp++){.   
18ba0 20 69 66 28 20 69 73 61 6c 70 68 61 28 2a 63 70   if( isalpha(*cp
18bb0 29 20 26 26 20 28 63 70 3d 3d 72 70 2d 3e 63 6f  ) && (cp==rp->co
18bc0 64 65 20 7c 7c 20 28 21 69 73 61 6c 6e 75 6d 28  de || (!isalnum(
18bd0 63 70 5b 2d 31 5d 29 20 26 26 20 63 70 5b 2d 31  cp[-1]) && cp[-1
18be0 5d 21 3d 27 5f 27 29 29 20 29 7b 0a 20 20 20 20  ]!='_')) ){.    
18bf0 20 20 63 68 61 72 20 73 61 76 65 64 3b 0a 20 20    char saved;.  
18c00 20 20 20 20 66 6f 72 28 78 70 3d 20 26 63 70 5b      for(xp= &cp[
18c10 31 5d 3b 20 69 73 61 6c 6e 75 6d 28 2a 78 70 29  1]; isalnum(*xp)
18c20 20 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b 20 78 70   || *xp=='_'; xp
18c30 2b 2b 29 3b 0a 20 20 20 20 20 20 73 61 76 65 64  ++);.      saved
18c40 20 3d 20 2a 78 70 3b 0a 20 20 20 20 20 20 2a 78   = *xp;.      *x
18c50 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  p = 0;.      if(
18c60 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26   rp->lhsalias &&
18c70 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 6c   strcmp(cp,rp->l
18c80 68 73 61 6c 69 61 73 29 3d 3d 30 20 29 7b 0a 20  hsalias)==0 ){. 
18c90 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74         append_st
18ca0 72 28 22 79 79 67 6f 74 6f 6d 69 6e 6f 72 2e 79  r("yygotominor.y
18cb0 79 25 64 22 2c 30 2c 72 70 2d 3e 6c 68 73 2d 3e  y%d",0,rp->lhs->
18cc0 64 74 6e 75 6d 2c 30 29 3b 0a 20 20 20 20 20 20  dtnum,0);.      
18cd0 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20    cp = xp;.     
18ce0 20 20 20 6c 68 73 75 73 65 64 20 3d 20 31 3b 0a     lhsused = 1;.
18cf0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18d00 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
18d10 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a  rp->nrhs; i++){.
18d20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 70            if( rp
18d30 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26 26  ->rhsalias[i] &&
18d40 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 72   strcmp(cp,rp->r
18d50 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30 20 29  hsalias[i])==0 )
18d60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
18d70 28 20 63 70 21 3d 72 70 2d 3e 63 6f 64 65 20 26  ( cp!=rp->code &
18d80 26 20 63 70 5b 2d 31 5d 3d 3d 27 40 27 20 29 7b  & cp[-1]=='@' ){
18d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
18da0 2a 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e  * If the argumen
18db0 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
18dc0 20 40 58 20 74 68 65 6e 20 73 75 62 73 74 69 74   @X then substit
18dd0 75 74 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  uted.           
18de0 20 20 20 2a 2a 20 74 68 65 20 74 6f 6b 65 6e 20     ** the token 
18df0 6e 75 6d 62 65 72 20 6f 66 20 58 2c 20 6e 6f 74  number of X, not
18e00 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 58 20   the value of X 
18e10 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
18e20 20 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79 6d   append_str("yym
18e30 73 70 5b 25 64 5d 2e 6d 61 6a 6f 72 22 2c 2d 31  sp[%d].major",-1
18e40 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 30 29  ,i-rp->nrhs+1,0)
18e50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
18e60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
18e70 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
18e80 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69   *sp = rp->rhs[i
18e90 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
18ea0 20 69 6e 74 20 64 74 6e 75 6d 3b 0a 20 20 20 20   int dtnum;.    
18eb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 70            if( sp
18ec0 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52  ->type==MULTITER
18ed0 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
18ee0 20 20 20 20 20 20 20 20 20 64 74 6e 75 6d 20 3d           dtnum =
18ef0 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e   sp->subsym[0]->
18f00 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20  dtnum;.         
18f10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18f20 20 20 20 20 20 20 20 20 20 20 20 20 64 74 6e 75              dtnu
18f30 6d 20 3d 20 73 70 2d 3e 64 74 6e 75 6d 3b 0a 20  m = sp->dtnum;. 
18f40 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
18f50 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70 70               app
18f60 65 6e 64 5f 73 74 72 28 22 79 79 6d 73 70 5b 25  end_str("yymsp[%
18f70 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 30  d].minor.yy%d",0
18f80 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 20 64  ,i-rp->nrhs+1, d
18f90 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  tnum);.         
18fa0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
18fb0 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20   cp = xp;.      
18fc0 20 20 20 20 20 20 75 73 65 64 5b 69 5d 20 3d 20        used[i] = 
18fd0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  1;.            b
18fe0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
18ff0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
19000 20 20 7d 0a 20 20 20 20 20 20 2a 78 70 20 3d 20    }.      *xp = 
19010 73 61 76 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  saved;.    }.   
19020 20 61 70 70 65 6e 64 5f 73 74 72 28 63 70 2c 20   append_str(cp, 
19030 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 20 2f 2a  1, 0, 0);.  } /*
19040 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20   End loop */..  
19050 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65  /* Check to make
19060 20 73 75 72 65 20 74 68 65 20 4c 48 53 20 68 61   sure the LHS ha
19070 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20  s been used */. 
19080 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61   if( rp->lhsalia
19090 73 20 26 26 20 21 6c 68 73 75 73 65 64 20 29 7b  s && !lhsused ){
190a0 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65  .    ErrorMsg(le
190b0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d  mp->filename,rp-
190c0 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20  >ruleline,.     
190d0 20 22 4c 61 62 65 6c 20 5c 22 25 73 5c 22 20 66   "Label \"%s\" f
190e0 6f 72 20 5c 22 25 73 28 25 73 29 5c 22 20 69 73  or \"%s(%s)\" is
190f0 20 6e 65 76 65 72 20 75 73 65 64 2e 22 2c 0a 20   never used.",. 
19100 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61 6c         rp->lhsal
19110 69 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d  ias,rp->lhs->nam
19120 65 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b  e,rp->lhsalias);
19130 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72  .    lemp->error
19140 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  cnt++;.  }..  /*
19150 20 47 65 6e 65 72 61 74 65 20 64 65 73 74 72 75   Generate destru
19160 63 74 6f 72 20 63 6f 64 65 20 66 6f 72 20 52 48  ctor code for RH
19170 53 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20  S symbols which 
19180 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20  are not used in 
19190 74 68 65 0a 20 20 2a 2a 20 72 65 64 75 63 65 20  the.  ** reduce 
191a0 63 6f 64 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  code */.  for(i=
191b0 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
191c0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d  ++){.    if( rp-
191d0 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26 26 20  >rhsalias[i] && 
191e0 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20 20 20 20  !used[i] ){.    
191f0 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
19200 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75  >filename,rp->ru
19210 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 20  leline,.        
19220 22 4c 61 62 65 6c 20 25 73 20 66 6f 72 20 5c 22  "Label %s for \"
19230 25 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76 65  %s(%s)\" is neve
19240 72 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20 20  r used.",.      
19250 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69    rp->rhsalias[i
19260 5d 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61  ],rp->rhs[i]->na
19270 6d 65 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  me,rp->rhsalias[
19280 69 5d 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d  i]);.      lemp-
19290 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
192a0 20 7d 65 6c 73 65 20 69 66 28 20 72 70 2d 3e 72   }else if( rp->r
192b0 68 73 61 6c 69 61 73 5b 69 5d 3d 3d 30 20 29 7b  hsalias[i]==0 ){
192c0 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 5f 64  .      if( has_d
192d0 65 73 74 72 75 63 74 6f 72 28 72 70 2d 3e 72 68  estructor(rp->rh
192e0 73 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20 20  s[i],lemp) ){.  
192f0 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72        append_str
19300 28 22 20 20 79 79 5f 64 65 73 74 72 75 63 74 6f  ("  yy_destructo
19310 72 28 79 79 70 50 61 72 73 65 72 2c 25 64 2c 26  r(yypParser,%d,&
19320 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29  yymsp[%d].minor)
19330 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20 20 20 20  ;\n", 0,.       
19340 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e      rp->rhs[i]->
19350 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e 72 68 73  index,i-rp->nrhs
19360 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  +1);.      }else
19370 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20  {.        /* No 
19380 64 65 73 74 72 75 63 74 6f 72 20 64 65 66 69 6e  destructor defin
19390 65 64 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d  ed for this term
193a0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
193b0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 70 2d 3e  }.  }.  if( rp->
193c0 63 6f 64 65 20 29 7b 0a 20 20 20 20 63 70 20 3d  code ){.    cp =
193d0 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30 2c   append_str(0,0,
193e0 30 2c 30 29 3b 0a 20 20 20 20 72 70 2d 3e 63 6f  0,0);.    rp->co
193f0 64 65 20 3d 20 53 74 72 73 61 66 65 28 63 70 3f  de = Strsafe(cp?
19400 63 70 3a 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  cp:"");.  }.}../
19410 2a 20 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  * .** Generate c
19420 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
19430 65 73 20 77 68 65 6e 20 74 68 65 20 72 75 6c 65  es when the rule
19440 20 22 72 70 22 20 69 73 20 72 65 64 75 63 65 64   "rp" is reduced
19450 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20  .  Write.** the 
19460 63 6f 64 65 20 74 6f 20 22 6f 75 74 22 2e 20 20  code to "out".  
19470 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e 65 6e 6f  Make sure lineno
19480 20 73 74 61 79 73 20 75 70 2d 74 6f 2d 64 61 74   stays up-to-dat
19490 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  e..*/.PRIVATE vo
194a0 69 64 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74  id emit_code(out
194b0 2c 72 70 2c 6c 65 6d 70 2c 6c 69 6e 65 6e 6f 29  ,rp,lemp,lineno)
194c0 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75  .FILE *out;.stru
194d0 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 73 74 72  ct rule *rp;.str
194e0 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
194f0 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a  .int *lineno;.{.
19500 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 2f 2a 20   char *cp;.. /* 
19510 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
19520 20 64 6f 20 74 68 65 20 72 65 64 75 63 65 20 61   do the reduce a
19530 63 74 69 6f 6e 20 2a 2f 0a 20 69 66 28 20 72 70  ction */. if( rp
19540 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 69 66 20  ->code ){.   if 
19550 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f  (!lemp->nolineno
19560 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65 6e  sflag) { (*linen
19570 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64  o)++; tplt_lined
19580 69 72 28 6f 75 74 2c 72 70 2d 3e 6c 69 6e 65 2c  ir(out,rp->line,
19590 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
195a0 20 7d 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75   }.   fprintf(ou
195b0 74 2c 22 7b 25 73 22 2c 72 70 2d 3e 63 6f 64 65  t,"{%s",rp->code
195c0 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72 70 2d  );.   for(cp=rp-
195d0 3e 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b  >code; *cp; cp++
195e0 29 7b 0a 20 20 20 20 20 69 66 28 20 2a 63 70 3d  ){.     if( *cp=
195f0 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f  ='\n' ) (*lineno
19600 29 2b 2b 3b 0a 20 20 20 7d 20 2f 2a 20 45 6e 64  )++;.   } /* End
19610 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 66 70 72 69   loop */.   fpri
19620 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20  ntf(out,"}\n"); 
19630 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20  (*lineno)++;.   
19640 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e  if (!lemp->nolin
19650 65 6e 6f 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69  enosflag) { (*li
19660 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69  neno)++; tplt_li
19670 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e  nedir(out,*linen
19680 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29  o,lemp->outname)
19690 3b 20 7d 0a 20 7d 20 2f 2a 20 45 6e 64 20 69 66  ; }. } /* End if
196a0 28 20 72 70 2d 3e 63 6f 64 65 20 29 20 2a 2f 0a  ( rp->code ) */.
196b0 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  . return;.}../*.
196c0 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 64 65 66  ** Print the def
196d0 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 75  inition of the u
196e0 6e 69 6f 6e 20 75 73 65 64 20 66 6f 72 20 74 68  nion used for th
196f0 65 20 70 61 72 73 65 72 27 73 20 64 61 74 61 20  e parser's data 
19700 73 74 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 75  stack..** This u
19710 6e 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 66 69  nion contains fi
19720 65 6c 64 73 20 66 6f 72 20 65 76 65 72 79 20 70  elds for every p
19730 6f 73 73 69 62 6c 65 20 64 61 74 61 20 74 79 70  ossible data typ
19740 65 20 66 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20  e for tokens.** 
19750 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73  and nonterminals
19760 2e 20 20 49 6e 20 74 68 65 20 70 72 6f 63 65 73  .  In the proces
19770 73 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61  s of computing a
19780 6e 64 20 70 72 69 6e 74 69 6e 67 20 74 68 69 73  nd printing this
19790 0a 2a 2a 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20  .** union, also 
197a0 73 65 74 20 74 68 65 20 22 2e 64 74 6e 75 6d 22  set the ".dtnum"
197b0 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20   field of every 
197c0 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e  terminal and non
197d0 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62  terminal.** symb
197e0 6f 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 70 72 69 6e  ol..*/.void prin
197f0 74 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75  t_stack_union(ou
19800 74 2c 6c 65 6d 70 2c 70 6c 69 6e 65 6e 6f 2c 6d  t,lemp,plineno,m
19810 68 66 6c 61 67 29 0a 46 49 4c 45 20 2a 6f 75 74  hflag).FILE *out
19820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19830 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74     /* The output
19840 20 73 74 72 65 61 6d 20 2a 2f 0a 73 74 72 75 63   stream */.struc
19850 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 20 20  t lemon *lemp;  
19860 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
19870 69 6e 20 69 6e 66 6f 20 73 74 72 75 63 74 75 72  in info structur
19880 65 20 66 6f 72 20 74 68 69 73 20 70 61 72 73 65  e for this parse
19890 72 20 2a 2f 0a 69 6e 74 20 2a 70 6c 69 6e 65 6e  r */.int *plinen
198a0 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
198b0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74   /* Pointer to t
198c0 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a  he line number *
198d0 2f 0a 69 6e 74 20 6d 68 66 6c 61 67 3b 20 20 20  /.int mhflag;   
198e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
198f0 20 54 72 75 65 20 69 66 20 67 65 6e 65 72 61 74   True if generat
19900 69 6e 67 20 6d 61 6b 65 68 65 61 64 65 72 73 20  ing makeheaders 
19910 6f 75 74 70 75 74 20 2a 2f 0a 7b 0a 20 20 69 6e  output */.{.  in
19920 74 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e  t lineno = *plin
19930 65 6e 6f 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c  eno;    /* The l
19940 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  ine number of th
19950 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 63 68  e output */.  ch
19960 61 72 20 2a 2a 74 79 70 65 73 3b 20 20 20 20 20  ar **types;     
19970 20 20 20 20 20 20 20 20 2f 2a 20 41 20 68 61 73          /* A has
19980 68 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74  h table of datat
19990 79 70 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72  ypes */.  int ar
199a0 72 61 79 73 69 7a 65 3b 20 20 20 20 20 20 20 20  raysize;        
199b0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
199c0 68 65 20 22 74 79 70 65 73 22 20 61 72 72 61 79  he "types" array
199d0 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 64 74 6c   */.  int maxdtl
199e0 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 20 20  ength;          
199f0 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74  /* Maximum lengt
19a00 68 20 6f 66 20 61 6e 79 20 22 2e 64 61 74 61 74  h of any ".datat
19a10 79 70 65 22 20 66 69 65 6c 64 2e 20 2a 2f 0a 20  ype" field. */. 
19a20 20 63 68 61 72 20 2a 73 74 64 64 74 3b 20 20 20   char *stddt;   
19a30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
19a40 61 6e 64 61 72 64 69 7a 65 64 20 6e 61 6d 65 20  andardized name 
19a50 66 6f 72 20 61 20 64 61 74 61 74 79 70 65 20 2a  for a datatype *
19a60 2f 0a 20 20 69 6e 74 20 69 2c 6a 3b 20 20 20 20  /.  int i,j;    
19a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19a80 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
19a90 2f 0a 20 20 69 6e 74 20 68 61 73 68 3b 20 20 20  /.  int hash;   
19aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19ab0 20 46 6f 72 20 68 61 73 68 69 6e 67 20 74 68 65   For hashing the
19ac0 20 6e 61 6d 65 20 6f 66 20 61 20 74 79 70 65 20   name of a type 
19ad0 2a 2f 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b  */.  char *name;
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19af0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 61  * Name of the pa
19b00 72 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  rser */..  /* Al
19b10 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69  locate and initi
19b20 61 6c 69 7a 65 20 74 79 70 65 73 5b 5d 20 61 6e  alize types[] an
19b30 64 20 61 6c 6c 6f 63 61 74 65 20 73 74 64 64 74  d allocate stddt
19b40 5b 5d 20 2a 2f 0a 20 20 61 72 72 61 79 73 69 7a  [] */.  arraysiz
19b50 65 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  e = lemp->nsymbo
19b60 6c 20 2a 20 32 3b 0a 20 20 74 79 70 65 73 20 3d  l * 2;.  types =
19b70 20 28 63 68 61 72 2a 2a 29 63 61 6c 6c 6f 63 28   (char**)calloc(
19b80 20 61 72 72 61 79 73 69 7a 65 2c 20 73 69 7a 65   arraysize, size
19b90 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 20 20 66  of(char*) );.  f
19ba0 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61 79 73  or(i=0; i<arrays
19bb0 69 7a 65 3b 20 69 2b 2b 29 20 74 79 70 65 73 5b  ize; i++) types[
19bc0 69 5d 20 3d 20 30 3b 0a 20 20 6d 61 78 64 74 6c  i] = 0;.  maxdtl
19bd0 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20 69 66 28  ength = 0;.  if(
19be0 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 20 29   lemp->vartype )
19bf0 7b 0a 20 20 20 20 6d 61 78 64 74 6c 65 6e 67 74  {.    maxdtlengt
19c00 68 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  h = lemonStrlen(
19c10 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 29 3b 0a  lemp->vartype);.
19c20 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
19c30 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
19c40 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 65  i++){.    int le
19c50 6e 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79  n;.    struct sy
19c60 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d  mbol *sp = lemp-
19c70 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
19c80 20 69 66 28 20 73 70 2d 3e 64 61 74 61 74 79 70   if( sp->datatyp
19c90 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  e==0 ) continue;
19ca0 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e  .    len = lemon
19cb0 53 74 72 6c 65 6e 28 73 70 2d 3e 64 61 74 61 74  Strlen(sp->datat
19cc0 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20 6c 65  ype);.    if( le
19cd0 6e 3e 6d 61 78 64 74 6c 65 6e 67 74 68 20 29 20  n>maxdtlength ) 
19ce0 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65  maxdtlength = le
19cf0 6e 3b 0a 20 20 7d 0a 20 20 73 74 64 64 74 20 3d  n;.  }.  stddt =
19d00 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20   (char*)malloc( 
19d10 6d 61 78 64 74 6c 65 6e 67 74 68 2a 32 20 2b 20  maxdtlength*2 + 
19d20 31 20 29 3b 0a 20 20 69 66 28 20 74 79 70 65 73  1 );.  if( types
19d30 3d 3d 30 20 7c 7c 20 73 74 64 64 74 3d 3d 30 20  ==0 || stddt==0 
19d40 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
19d50 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65  tderr,"Out of me
19d60 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65  mory.\n");.    e
19d70 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f  xit(1);.  }..  /
19d80 2a 20 42 75 69 6c 64 20 61 20 68 61 73 68 20 74  * Build a hash t
19d90 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65  able of datatype
19da0 73 2e 20 54 68 65 20 22 2e 64 74 6e 75 6d 22 20  s. The ".dtnum" 
19db0 66 69 65 6c 64 20 6f 66 20 65 61 63 68 20 73 79  field of each sy
19dc0 6d 62 6f 6c 0a 20 20 2a 2a 20 69 73 20 66 69 6c  mbol.  ** is fil
19dd0 6c 65 64 20 69 6e 20 77 69 74 68 20 74 68 65 20  led in with the 
19de0 68 61 73 68 20 69 6e 64 65 78 20 70 6c 75 73 20  hash index plus 
19df0 31 2e 20 20 41 20 22 2e 64 74 6e 75 6d 22 20 76  1.  A ".dtnum" v
19e00 61 6c 75 65 20 6f 66 20 30 20 69 73 0a 20 20 2a  alue of 0 is.  *
19e10 2a 20 75 73 65 64 20 66 6f 72 20 74 65 72 6d 69  * used for termi
19e20 6e 61 6c 20 73 79 6d 62 6f 6c 73 2e 20 20 49 66  nal symbols.  If
19e30 20 74 68 65 72 65 20 69 73 20 6e 6f 20 25 64 65   there is no %de
19e40 66 61 75 6c 74 5f 74 79 70 65 20 64 65 66 69 6e  fault_type defin
19e50 65 64 20 74 68 65 6e 0a 20 20 2a 2a 20 30 20 69  ed then.  ** 0 i
19e60 73 20 61 6c 73 6f 20 75 73 65 64 20 61 73 20 74  s also used as t
19e70 68 65 20 2e 64 74 6e 75 6d 20 76 61 6c 75 65 20  he .dtnum value 
19e80 66 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73  for nonterminals
19e90 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 73 70   which do not sp
19ea0 65 63 69 66 79 0a 20 20 2a 2a 20 61 20 64 61 74  ecify.  ** a dat
19eb0 61 74 79 70 65 20 75 73 69 6e 67 20 74 68 65 20  atype using the 
19ec0 25 74 79 70 65 20 64 69 72 65 63 74 69 76 65 2e  %type directive.
19ed0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
19ee0 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
19ef0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
19f00 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
19f10 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
19f20 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 70 3b 0a  ;.    char *cp;.
19f30 20 20 20 20 69 66 28 20 73 70 3d 3d 6c 65 6d 70      if( sp==lemp
19f40 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20  ->errsym ){.    
19f50 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 61 72    sp->dtnum = ar
19f60 72 61 79 73 69 7a 65 2b 31 3b 0a 20 20 20 20 20  raysize+1;.     
19f70 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
19f80 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70  .    if( sp->typ
19f90 65 21 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c  e!=NONTERMINAL |
19fa0 7c 20 28 73 70 2d 3e 64 61 74 61 74 79 70 65 3d  | (sp->datatype=
19fb0 3d 30 20 26 26 20 6c 65 6d 70 2d 3e 76 61 72 74  =0 && lemp->vart
19fc0 79 70 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20  ype==0) ){.     
19fd0 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a   sp->dtnum = 0;.
19fe0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
19ff0 20 20 20 20 7d 0a 20 20 20 20 63 70 20 3d 20 73      }.    cp = s
1a000 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20  p->datatype;.   
1a010 20 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20   if( cp==0 ) cp 
1a020 3d 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3b  = lemp->vartype;
1a030 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20  .    j = 0;.    
1a040 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a  while( isspace(*
1a050 63 70 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20  cp) ) cp++;.    
1a060 77 68 69 6c 65 28 20 2a 63 70 20 29 20 73 74 64  while( *cp ) std
1a070 64 74 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b  dt[j++] = *cp++;
1a080 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20  .    while( j>0 
1a090 26 26 20 69 73 73 70 61 63 65 28 73 74 64 64 74  && isspace(stddt
1a0a0 5b 6a 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20  [j-1]) ) j--;.  
1a0b0 20 20 73 74 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a    stddt[j] = 0;.
1a0c0 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f      if( lemp->to
1a0d0 6b 65 6e 74 79 70 65 20 26 26 20 73 74 72 63 6d  kentype && strcm
1a0e0 70 28 73 74 64 64 74 2c 20 6c 65 6d 70 2d 3e 74  p(stddt, lemp->t
1a0f0 6f 6b 65 6e 74 79 70 65 29 3d 3d 30 20 29 7b 0a  okentype)==0 ){.
1a100 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20        sp->dtnum 
1a110 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 0;.      conti
1a120 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  nue;.    }.    h
1a130 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ash = 0;.    for
1a140 28 6a 3d 30 3b 20 73 74 64 64 74 5b 6a 5d 3b 20  (j=0; stddt[j]; 
1a150 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 68 61 73 68  j++){.      hash
1a160 20 3d 20 68 61 73 68 2a 35 33 20 2b 20 73 74 64   = hash*53 + std
1a170 64 74 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  dt[j];.    }.   
1a180 20 68 61 73 68 20 3d 20 28 68 61 73 68 20 26 20   hash = (hash & 
1a190 30 78 37 66 66 66 66 66 66 66 29 25 61 72 72 61  0x7fffffff)%arra
1a1a0 79 73 69 7a 65 3b 0a 20 20 20 20 77 68 69 6c 65  ysize;.    while
1a1b0 28 20 74 79 70 65 73 5b 68 61 73 68 5d 20 29 7b  ( types[hash] ){
1a1c0 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
1a1d0 70 28 74 79 70 65 73 5b 68 61 73 68 5d 2c 73 74  p(types[hash],st
1a1e0 64 64 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ddt)==0 ){.     
1a1f0 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68     sp->dtnum = h
1a200 61 73 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  ash + 1;.       
1a210 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1a220 20 20 20 20 20 20 68 61 73 68 2b 2b 3b 0a 20 20        hash++;.  
1a230 20 20 20 20 69 66 28 20 68 61 73 68 3e 3d 61 72      if( hash>=ar
1a240 72 61 79 73 69 7a 65 20 29 20 68 61 73 68 20 3d  raysize ) hash =
1a250 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1a260 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30  ( types[hash]==0
1a270 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74   ){.      sp->dt
1a280 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a  num = hash + 1;.
1a290 20 20 20 20 20 20 74 79 70 65 73 5b 68 61 73 68        types[hash
1a2a0 5d 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f  ] = (char*)mallo
1a2b0 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73  c( lemonStrlen(s
1a2c0 74 64 64 74 29 2b 31 20 29 3b 0a 20 20 20 20 20  tddt)+1 );.     
1a2d0 20 69 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d   if( types[hash]
1a2e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
1a2f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f  printf(stderr,"O
1a300 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22  ut of memory.\n"
1a310 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74 28  );.        exit(
1a320 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
1a330 20 20 73 74 72 63 70 79 28 74 79 70 65 73 5b 68    strcpy(types[h
1a340 61 73 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20 20  ash],stddt);.   
1a350 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69   }.  }..  /* Pri
1a360 6e 74 20 6f 75 74 20 74 68 65 20 64 65 66 69 6e  nt out the defin
1a370 69 74 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45 4e  ition of YYTOKEN
1a380 54 59 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f 52  TYPE and YYMINOR
1a390 54 59 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d  TYPE */.  name =
1a3a0 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65   lemp->name ? le
1a3b0 6d 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73  mp->name : "Pars
1a3c0 65 22 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a  e";.  lineno = *
1a3d0 70 6c 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20 6d  plineno;.  if( m
1a3e0 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66  hflag ){ fprintf
1a3f0 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46  (out,"#if INTERF
1a400 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ACE\n"); lineno+
1a410 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  +; }.  fprintf(o
1a420 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 54 4f  ut,"#define %sTO
1a430 4b 45 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e 61  KENTYPE %s\n",na
1a440 6d 65 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 6f  me,.    lemp->to
1a450 6b 65 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f  kentype?lemp->to
1a460 6b 65 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22 29  kentype:"void*")
1a470 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69  ;  lineno++;.  i
1a480 66 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72  f( mhflag ){ fpr
1a490 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66  intf(out,"#endif
1a4a0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20  \n"); lineno++; 
1a4b0 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
1a4c0 22 74 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b  "typedef union {
1a4d0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1a4e0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1a4f0 20 69 6e 74 20 79 79 69 6e 69 74 3b 5c 6e 22 29   int yyinit;\n")
1a500 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1a510 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25 73 54  rintf(out,"  %sT
1a520 4f 4b 45 4e 54 59 50 45 20 79 79 30 3b 5c 6e 22  OKENTYPE yy0;\n"
1a530 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ,name); lineno++
1a540 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61  ;.  for(i=0; i<a
1a550 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a  rraysize; i++){.
1a560 20 20 20 20 69 66 28 20 74 79 70 65 73 5b 69 5d      if( types[i]
1a570 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1a580 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1a590 22 20 20 25 73 20 79 79 25 64 3b 5c 6e 22 2c 74  "  %s yy%d;\n",t
1a5a0 79 70 65 73 5b 69 5d 2c 69 2b 31 29 3b 20 6c 69  ypes[i],i+1); li
1a5b0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65  neno++;.    free
1a5c0 28 74 79 70 65 73 5b 69 5d 29 3b 0a 20 20 7d 0a  (types[i]);.  }.
1a5d0 20 20 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73    if( lemp->errs
1a5e0 79 6d 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20  ym->useCnt ){.  
1a5f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1a600 20 69 6e 74 20 79 79 25 64 3b 5c 6e 22 2c 6c 65   int yy%d;\n",le
1a610 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75  mp->errsym->dtnu
1a620 6d 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  m); lineno++;.  
1a630 7d 0a 20 20 66 72 65 65 28 73 74 64 64 74 29 3b  }.  free(stddt);
1a640 0a 20 20 66 72 65 65 28 74 79 70 65 73 29 3b 0a  .  free(types);.
1a650 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d    fprintf(out,"}
1a660 20 59 59 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e 22   YYMINORTYPE;\n"
1a670 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a  ); lineno++;.  *
1a680 70 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f  plineno = lineno
1a690 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1a6a0 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
1a6b0 43 20 64 61 74 61 74 79 70 65 20 61 62 6c 65 20  C datatype able 
1a6c0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 76 61 6c  to represent val
1a6d0 75 65 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 6c  ues between.** l
1a6e0 77 72 20 61 6e 64 20 75 70 72 2c 20 69 6e 63 6c  wr and upr, incl
1a6f0 75 73 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  usive..*/.static
1a700 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e   const char *min
1a710 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69  imum_size_type(i
1a720 6e 74 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 29  nt lwr, int upr)
1a730 7b 0a 20 20 69 66 28 20 6c 77 72 3e 3d 30 20 29  {.  if( lwr>=0 )
1a740 7b 0a 20 20 20 20 69 66 28 20 75 70 72 3c 3d 32  {.    if( upr<=2
1a750 35 35 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  55 ){.      retu
1a760 72 6e 20 22 75 6e 73 69 67 6e 65 64 20 63 68 61  rn "unsigned cha
1a770 72 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  r";.    }else if
1a780 28 20 75 70 72 3c 36 35 35 33 35 20 29 7b 0a 20  ( upr<65535 ){. 
1a790 20 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73       return "uns
1a7a0 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 22  igned short int"
1a7b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a7c0 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67     return "unsig
1a7d0 6e 65 64 20 69 6e 74 22 3b 0a 20 20 20 20 7d 0a  ned int";.    }.
1a7e0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e    }else if( lwr>
1a7f0 3d 2d 31 32 37 20 26 26 20 75 70 72 3c 3d 31 32  =-127 && upr<=12
1a800 37 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  7 ){.    return 
1a810 22 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20  "signed char";. 
1a820 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
1a830 2d 33 32 37 36 37 20 26 26 20 75 70 72 3c 33 32  -32767 && upr<32
1a840 37 36 37 20 29 7b 0a 20 20 20 20 72 65 74 75 72  767 ){.    retur
1a850 6e 20 22 73 68 6f 72 74 22 3b 0a 20 20 7d 65 6c  n "short";.  }el
1a860 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22  se{.    return "
1a870 69 6e 74 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  int";.  }.}../*.
1a880 2a 2a 20 45 61 63 68 20 73 74 61 74 65 20 63 6f  ** Each state co
1a890 6e 74 61 69 6e 73 20 61 20 73 65 74 20 6f 66 20  ntains a set of 
1a8a0 74 6f 6b 65 6e 20 74 72 61 6e 73 61 63 74 69 6f  token transactio
1a8b0 6e 20 61 6e 64 20 61 20 73 65 74 20 6f 66 0a 2a  n and a set of.*
1a8c0 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 74 72  * nonterminal tr
1a8d0 61 6e 73 61 63 74 69 6f 6e 73 2e 20 20 45 61 63  ansactions.  Eac
1a8e0 68 20 6f 66 20 74 68 65 73 65 20 73 65 74 73 20  h of these sets 
1a8f0 6d 61 6b 65 73 20 61 6e 20 69 6e 73 74 61 6e 63  makes an instanc
1a900 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
1a910 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
1a920 20 20 41 6e 20 61 72 72 61 79 20 6f 66 20 74 68    An array of th
1a930 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20 69  ese structures i
1a940 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6f 72 64  s used.** to ord
1a950 65 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  er the creation 
1a960 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
1a970 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61  e yy_action[] ta
1a980 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 61  ble..*/.struct a
1a990 78 73 65 74 20 7b 0a 20 20 73 74 72 75 63 74 20  xset {.  struct 
1a9a0 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20 2f 2a  state *stp;   /*
1a9b0 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   A pointer to a 
1a9c0 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  state */.  int i
1a9d0 73 54 6b 6e 3b 20 20 20 20 20 20 20 20 20 20 20  sTkn;           
1a9e0 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 74  /* True to use t
1a9f0 6f 6b 65 6e 73 2e 20 20 46 61 6c 73 65 20 66 6f  okens.  False fo
1aa00 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20  r non-terminals 
1aa10 2a 2f 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e  */.  int nAction
1aa20 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
1aa30 62 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20 2a  ber of actions *
1aa40 2f 0a 20 20 69 6e 74 20 69 4f 72 64 65 72 3b 20  /.  int iOrder; 
1aa50 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67           /* Orig
1aa60 69 6e 61 6c 20 6f 72 64 65 72 20 6f 66 20 61 63  inal order of ac
1aa70 74 69 6f 6e 20 73 65 74 73 20 2a 2f 0a 7d 3b 0a  tion sets */.};.
1aa80 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
1aa90 6f 20 61 78 73 65 74 20 73 74 72 75 63 74 75 72  o axset structur
1aaa0 65 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70  es for sorting p
1aab0 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69  urposes.*/.stati
1aac0 63 20 69 6e 74 20 61 78 73 65 74 5f 63 6f 6d 70  c int axset_comp
1aad0 61 72 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a  are(const void *
1aae0 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62  a, const void *b
1aaf0 29 7b 0a 20 20 73 74 72 75 63 74 20 61 78 73 65  ){.  struct axse
1ab00 74 20 2a 70 31 20 3d 20 28 73 74 72 75 63 74 20  t *p1 = (struct 
1ab10 61 78 73 65 74 2a 29 61 3b 0a 20 20 73 74 72 75  axset*)a;.  stru
1ab20 63 74 20 61 78 73 65 74 20 2a 70 32 20 3d 20 28  ct axset *p2 = (
1ab30 73 74 72 75 63 74 20 61 78 73 65 74 2a 29 62 3b  struct axset*)b;
1ab40 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20  .  int c;.  c = 
1ab50 70 32 2d 3e 6e 41 63 74 69 6f 6e 20 2d 20 70 31  p2->nAction - p1
1ab60 2d 3e 6e 41 63 74 69 6f 6e 3b 0a 20 20 69 66 28  ->nAction;.  if(
1ab70 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d   c==0 ){.    c =
1ab80 20 70 32 2d 3e 69 4f 72 64 65 72 20 2d 20 70 31   p2->iOrder - p1
1ab90 2d 3e 69 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20  ->iOrder;.  }.  
1aba0 61 73 73 65 72 74 28 20 63 21 3d 30 20 7c 7c 20  assert( c!=0 || 
1abb0 70 31 3d 3d 70 32 20 29 3b 0a 20 20 72 65 74 75  p1==p2 );.  retu
1abc0 72 6e 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  rn c;.}../*.** W
1abd0 72 69 74 65 20 74 65 78 74 20 6f 6e 20 22 6f 75  rite text on "ou
1abe0 74 22 20 74 68 61 74 20 64 65 73 63 72 69 62 65  t" that describe
1abf0 73 20 74 68 65 20 72 75 6c 65 20 22 72 70 22 2e  s the rule "rp".
1ac00 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1ac10 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 46 49  writeRuleText(FI
1ac20 4c 45 20 2a 6f 75 74 2c 20 73 74 72 75 63 74 20  LE *out, struct 
1ac30 72 75 6c 65 20 2a 72 70 29 7b 0a 20 20 69 6e 74  rule *rp){.  int
1ac40 20 6a 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   j;.  fprintf(ou
1ac50 74 2c 22 25 73 20 3a 3a 3d 22 2c 20 72 70 2d 3e  t,"%s ::=", rp->
1ac60 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f  lhs->name);.  fo
1ac70 72 28 6a 3d 30 3b 20 6a 3c 72 70 2d 3e 6e 72 68  r(j=0; j<rp->nrh
1ac80 73 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72  s; j++){.    str
1ac90 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
1aca0 20 72 70 2d 3e 72 68 73 5b 6a 5d 3b 0a 20 20 20   rp->rhs[j];.   
1acb0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 25   fprintf(out," %
1acc0 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  s", sp->name);. 
1acd0 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d     if( sp->type=
1ace0 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
1acf0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20  {.      int k;. 
1ad00 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c       for(k=1; k<
1ad10 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b  sp->nsubsym; k++
1ad20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
1ad30 74 66 28 6f 75 74 2c 22 7c 25 73 22 2c 73 70 2d  tf(out,"|%s",sp-
1ad40 3e 73 75 62 73 79 6d 5b 6b 5d 2d 3e 6e 61 6d 65  >subsym[k]->name
1ad50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1ad60 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e 65  .  }.}.../* Gene
1ad70 72 61 74 65 20 43 20 73 6f 75 72 63 65 20 63 6f  rate C source co
1ad80 64 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  de for the parse
1ad90 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74  r */.void Report
1ada0 54 61 62 6c 65 28 6c 65 6d 70 2c 20 6d 68 66 6c  Table(lemp, mhfl
1adb0 61 67 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  ag).struct lemon
1adc0 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20 6d 68 66 6c   *lemp;.int mhfl
1add0 61 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70 75  ag;     /* Outpu
1ade0 74 20 69 6e 20 6d 61 6b 65 68 65 61 64 65 72 73  t in makeheaders
1adf0 20 66 6f 72 6d 61 74 20 69 66 20 74 72 75 65 20   format if true 
1ae00 2a 2f 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74  */.{.  FILE *out
1ae10 2c 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 6c 69  , *in;.  char li
1ae20 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20  ne[LINESIZE];.  
1ae30 69 6e 74 20 20 6c 69 6e 65 6e 6f 3b 0a 20 20 73  int  lineno;.  s
1ae40 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
1ae50 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
1ae60 6e 20 2a 61 70 3b 0a 20 20 73 74 72 75 63 74 20  n *ap;.  struct 
1ae70 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72 75  rule *rp;.  stru
1ae80 63 74 20 61 63 74 74 61 62 20 2a 70 41 63 74 74  ct acttab *pActt
1ae90 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  ab;.  int i, j, 
1aea0 6b 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 6e 61  k, n;.  char *na
1aeb0 6d 65 3b 0a 20 20 69 6e 74 20 6d 6e 54 6b 6e 4f  me;.  int mnTknO
1aec0 66 73 74 2c 20 6d 78 54 6b 6e 4f 66 73 74 3b 0a  fst, mxTknOfst;.
1aed0 20 20 69 6e 74 20 6d 6e 4e 74 4f 66 73 74 2c 20    int mnNtOfst, 
1aee0 6d 78 4e 74 4f 66 73 74 3b 0a 20 20 73 74 72 75  mxNtOfst;.  stru
1aef0 63 74 20 61 78 73 65 74 20 2a 61 78 3b 0a 0a 20  ct axset *ax;.. 
1af00 20 69 6e 20 3d 20 74 70 6c 74 5f 6f 70 65 6e 28   in = tplt_open(
1af10 6c 65 6d 70 29 3b 0a 20 20 69 66 28 20 69 6e 3d  lemp);.  if( in=
1af20 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f  =0 ) return;.  o
1af30 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c  ut = file_open(l
1af40 65 6d 70 2c 22 2e 63 22 2c 22 77 62 22 29 3b 0a  emp,".c","wb");.
1af50 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a    if( out==0 ){.
1af60 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a      fclose(in);.
1af70 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
1af80 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20    lineno = 1;.  
1af90 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1afa0 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1afb0 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1afc0 72 61 74 65 20 74 68 65 20 69 6e 63 6c 75 64 65  rate the include
1afd0 20 63 6f 64 65 2c 20 69 66 20 61 6e 79 20 2a 2f   code, if any */
1afe0 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75  .  tplt_print(ou
1aff0 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 69 6e 63  t,lemp,lemp->inc
1b000 6c 75 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lude,&lineno);. 
1b010 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20   if( mhflag ){. 
1b020 20 20 20 63 68 61 72 20 2a 6e 61 6d 65 20 3d 20     char *name = 
1b030 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65  file_makename(le
1b040 6d 70 2c 20 22 2e 68 22 29 3b 0a 20 20 20 20 66  mp, ".h");.    f
1b050 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 6e 63  printf(out,"#inc
1b060 6c 75 64 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  lude \"%s\"\n", 
1b070 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
1b080 0a 20 20 20 20 66 72 65 65 28 6e 61 6d 65 29 3b  .    free(name);
1b090 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
1b0a0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1b0b0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1b0c0 2f 2a 20 47 65 6e 65 72 61 74 65 20 23 64 65 66  /* Generate #def
1b0d0 69 6e 65 73 20 66 6f 72 20 61 6c 6c 20 74 6f 6b  ines for all tok
1b0e0 65 6e 73 20 2a 2f 0a 20 20 69 66 28 20 6d 68 66  ens */.  if( mhf
1b0f0 6c 61 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20  lag ){.    char 
1b100 2a 70 72 65 66 69 78 3b 0a 20 20 20 20 66 70 72  *prefix;.    fpr
1b110 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e  intf(out,"#if IN
1b120 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e  TERFACE\n"); lin
1b130 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6c  eno++;.    if( l
1b140 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78  emp->tokenprefix
1b150 20 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d 70   ) prefix = lemp
1b160 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20  ->tokenprefix;. 
1b170 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20     else         
1b180 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69             prefi
1b190 78 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72 28  x = "";.    for(
1b1a0 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65  i=1; i<lemp->nte
1b1b0 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20  rminal; i++){.  
1b1c0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b1d0 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73  "#define %s%-30s
1b1e0 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c   %2d\n",prefix,l
1b1f0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
1b200 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20  >name,i);.      
1b210 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
1b220 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b230 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e  "#endif\n"); lin
1b240 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c  eno++;.  }.  tpl
1b250 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1b260 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1b270 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1b280 65 20 74 68 65 20 64 65 66 69 6e 65 73 20 2a 2f  e the defines */
1b290 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1b2a0 23 64 65 66 69 6e 65 20 59 59 43 4f 44 45 54 59  #define YYCODETY
1b2b0 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20 6d 69  PE %s\n",.    mi
1b2c0 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28  nimum_size_type(
1b2d0 30 2c 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c  0, lemp->nsymbol
1b2e0 2b 31 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  +1)); lineno++;.
1b2f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1b300 64 65 66 69 6e 65 20 59 59 4e 4f 43 4f 44 45 20  define YYNOCODE 
1b310 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 79 6d  %d\n",lemp->nsym
1b320 62 6f 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e 6f 2b  bol+1);  lineno+
1b330 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
1b340 2c 22 23 64 65 66 69 6e 65 20 59 59 41 43 54 49  ,"#define YYACTI
1b350 4f 4e 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20  ONTYPE %s\n",.  
1b360 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74    minimum_size_t
1b370 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 74  ype(0, lemp->nst
1b380 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2b  ate+lemp->nrule+
1b390 35 29 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  5));  lineno++;.
1b3a0 20 20 69 66 28 20 6c 65 6d 70 2d 3e 77 69 6c 64    if( lemp->wild
1b3b0 63 61 72 64 20 29 7b 0a 20 20 20 20 66 70 72 69  card ){.    fpri
1b3c0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1b3d0 20 59 59 57 49 4c 44 43 41 52 44 20 25 64 5c 6e   YYWILDCARD %d\n
1b3e0 22 2c 0a 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e  ",.       lemp->
1b3f0 77 69 6c 64 63 61 72 64 2d 3e 69 6e 64 65 78 29  wildcard->index)
1b400 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
1b410 20 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e    print_stack_un
1b420 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26 6c 69  ion(out,lemp,&li
1b430 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a 20 20  neno,mhflag);.  
1b440 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 69  fprintf(out, "#i
1b450 66 6e 64 65 66 20 59 59 53 54 41 43 4b 44 45 50  fndef YYSTACKDEP
1b460 54 48 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  TH\n"); lineno++
1b470 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74  ;.  if( lemp->st
1b480 61 63 6b 73 69 7a 65 20 29 7b 0a 20 20 20 20 66  acksize ){.    f
1b490 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1b4a0 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54 48  ine YYSTACKDEPTH
1b4b0 20 25 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73 74 61   %s\n",lemp->sta
1b4c0 63 6b 73 69 7a 65 29 3b 20 20 6c 69 6e 65 6e 6f  cksize);  lineno
1b4d0 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1b4e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1b4f0 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50  efine YYSTACKDEP
1b500 54 48 20 31 30 30 5c 6e 22 29 3b 20 20 6c 69 6e  TH 100\n");  lin
1b510 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72  eno++;.  }.  fpr
1b520 69 6e 74 66 28 6f 75 74 2c 20 22 23 65 6e 64 69  intf(out, "#endi
1b530 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  f\n"); lineno++;
1b540 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b  .  if( mhflag ){
1b550 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1b560 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c  ,"#if INTERFACE\
1b570 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1b580 20 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70   }.  name = lemp
1b590 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e  ->name ? lemp->n
1b5a0 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b 0a 20  ame : "Parse";. 
1b5b0 20 69 66 28 20 6c 65 6d 70 2d 3e 61 72 67 20 26   if( lemp->arg &
1b5c0 26 20 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d 20 29  & lemp->arg[0] )
1b5d0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
1b5e0 20 69 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e   i = lemonStrlen
1b5f0 28 6c 65 6d 70 2d 3e 61 72 67 29 3b 0a 20 20 20  (lemp->arg);.   
1b600 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20   while( i>=1 && 
1b610 69 73 73 70 61 63 65 28 6c 65 6d 70 2d 3e 61 72  isspace(lemp->ar
1b620 67 5b 69 2d 31 5d 29 20 29 20 69 2d 2d 3b 0a 20  g[i-1]) ) i--;. 
1b630 20 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26     while( i>=1 &
1b640 26 20 28 69 73 61 6c 6e 75 6d 28 6c 65 6d 70 2d  & (isalnum(lemp-
1b650 3e 61 72 67 5b 69 2d 31 5d 29 20 7c 7c 20 6c 65  >arg[i-1]) || le
1b660 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 3d 3d 27 5f  mp->arg[i-1]=='_
1b670 27 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20 66 70  ') ) i--;.    fp
1b680 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1b690 6e 65 20 25 73 41 52 47 5f 53 44 45 43 4c 20 25  ne %sARG_SDECL %
1b6a0 73 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d  s;\n",name,lemp-
1b6b0 3e 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  >arg);  lineno++
1b6c0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1b6d0 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
1b6e0 5f 50 44 45 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61  _PDECL ,%s\n",na
1b6f0 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20  me,lemp->arg);  
1b700 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70  lineno++;.    fp
1b710 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1b720 6e 65 20 25 73 41 52 47 5f 46 45 54 43 48 20 25  ne %sARG_FETCH %
1b730 73 20 3d 20 79 79 70 50 61 72 73 65 72 2d 3e 25  s = yypParser->%
1b740 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1b750 20 20 20 20 20 20 20 6e 61 6d 65 2c 6c 65 6d 70         name,lemp
1b760 2d 3e 61 72 67 2c 26 6c 65 6d 70 2d 3e 61 72 67  ->arg,&lemp->arg
1b770 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  [i]);  lineno++;
1b780 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1b790 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
1b7a0 53 54 4f 52 45 20 79 79 70 50 61 72 73 65 72 2d  STORE yypParser-
1b7b0 3e 25 73 20 3d 20 25 73 5c 6e 22 2c 0a 20 20 20  >%s = %s\n",.   
1b7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61                na
1b7d0 6d 65 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d  me,&lemp->arg[i]
1b7e0 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b  ,&lemp->arg[i]);
1b7f0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65    lineno++;.  }e
1b800 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  lse{.    fprintf
1b810 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1b820 41 52 47 5f 53 44 45 43 4c 5c 6e 22 2c 6e 61 6d  ARG_SDECL\n",nam
1b830 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  e);  lineno++;. 
1b840 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1b850 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44  #define %sARG_PD
1b860 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c  ECL\n",name);  l
1b870 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
1b880 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1b890 65 20 25 73 41 52 47 5f 46 45 54 43 48 5c 6e 22  e %sARG_FETCH\n"
1b8a0 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ,name); lineno++
1b8b0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1b8c0 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
1b8d0 5f 53 54 4f 52 45 5c 6e 22 2c 6e 61 6d 65 29 3b  _STORE\n",name);
1b8e0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1b8f0 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20   if( mhflag ){. 
1b900 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1b910 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65  #endif\n"); line
1b920 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69  no++;.  }.  fpri
1b930 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1b940 20 59 59 4e 53 54 41 54 45 20 25 64 5c 6e 22 2c   YYNSTATE %d\n",
1b950 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 29 3b 20 20  lemp->nstate);  
1b960 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1b970 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1b980 20 59 59 4e 52 55 4c 45 20 25 64 5c 6e 22 2c 6c   YYNRULE %d\n",l
1b990 65 6d 70 2d 3e 6e 72 75 6c 65 29 3b 20 20 6c 69  emp->nrule);  li
1b9a0 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65  neno++;.  if( le
1b9b0 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 75 73 65 43  mp->errsym->useC
1b9c0 6e 74 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  nt ){.    fprint
1b9d0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1b9e0 59 45 52 52 4f 52 53 59 4d 42 4f 4c 20 25 64 5c  YERRORSYMBOL %d\
1b9f0 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d  n",lemp->errsym-
1ba00 3e 69 6e 64 65 78 29 3b 20 20 6c 69 6e 65 6e 6f  >index);  lineno
1ba10 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
1ba20 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45  out,"#define YYE
1ba30 52 52 53 59 4d 44 54 20 79 79 25 64 5c 6e 22 2c  RRSYMDT yy%d\n",
1ba40 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74  lemp->errsym->dt
1ba50 6e 75 6d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  num);  lineno++;
1ba60 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d  .  }.  if( lemp-
1ba70 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b  >has_fallback ){
1ba80 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1ba90 2c 22 23 64 65 66 69 6e 65 20 59 59 46 41 4c 4c  ,"#define YYFALL
1baa0 42 41 43 4b 20 31 5c 6e 22 29 3b 20 20 6c 69 6e  BACK 1\n");  lin
1bab0 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c  eno++;.  }.  tpl
1bac0 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1bad0 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1bae0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1baf0 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  e the action tab
1bb00 6c 65 20 61 6e 64 20 69 74 73 20 61 73 73 6f 63  le and its assoc
1bb10 69 61 74 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  iates:.  **.  **
1bb20 20 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 20 20    yy_action[]   
1bb30 20 20 20 20 20 41 20 73 69 6e 67 6c 65 20 74 61       A single ta
1bb40 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  ble containing a
1bb50 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a  ll actions..  **
1bb60 20 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d    yy_lookahead[]
1bb70 20 20 20 20 20 41 20 74 61 62 6c 65 20 63 6f 6e       A table con
1bb80 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 6b  taining the look
1bb90 61 68 65 61 64 20 66 6f 72 20 65 61 63 68 20 65  ahead for each e
1bba0 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 20 20 20  ntry in.  **    
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbc0 20 79 79 5f 61 63 74 69 6f 6e 2e 20 20 55 73 65   yy_action.  Use
1bbd0 64 20 74 6f 20 64 65 74 65 63 74 20 68 61 73 68  d to detect hash
1bbe0 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a   collisions..  *
1bbf0 2a 20 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74  *  yy_shift_ofst
1bc00 5b 5d 20 20 20 20 46 6f 72 20 65 61 63 68 20 73  []    For each s
1bc10 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74  tate, the offset
1bc20 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20   into yy_action 
1bc30 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  for.  **        
1bc40 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 69               shi
1bc50 66 74 69 6e 67 20 74 65 72 6d 69 6e 61 6c 73 2e  fting terminals.
1bc60 0a 20 20 2a 2a 20 20 79 79 5f 72 65 64 75 63 65  .  **  yy_reduce
1bc70 5f 6f 66 73 74 5b 5d 20 20 20 46 6f 72 20 65 61  _ofst[]   For ea
1bc80 63 68 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66  ch state, the of
1bc90 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74  fset into yy_act
1bca0 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20  ion for.  **    
1bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcc0 20 73 68 69 66 74 69 6e 67 20 6e 6f 6e 2d 74 65   shifting non-te
1bcd0 72 6d 69 6e 61 6c 73 20 61 66 74 65 72 20 61 20  rminals after a 
1bce0 72 65 64 75 63 65 2e 0a 20 20 2a 2a 20 20 79 79  reduce..  **  yy
1bcf0 5f 64 65 66 61 75 6c 74 5b 5d 20 20 20 20 20 20  _default[]      
1bd00 20 44 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20   Default action 
1bd10 66 6f 72 20 65 61 63 68 20 73 74 61 74 65 2e 0a  for each state..
1bd20 20 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75    */..  /* Compu
1bd30 74 65 20 74 68 65 20 61 63 74 69 6f 6e 73 20 6f  te the actions o
1bd40 6e 20 61 6c 6c 20 73 74 61 74 65 73 20 61 6e 64  n all states and
1bd50 20 63 6f 75 6e 74 20 74 68 65 6d 20 75 70 20 2a   count them up *
1bd60 2f 0a 20 20 61 78 20 3d 20 63 61 6c 6c 6f 63 28  /.  ax = calloc(
1bd70 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 2c 20  lemp->nstate*2, 
1bd80 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29 29 3b 0a  sizeof(ax[0]));.
1bd90 20 20 69 66 28 20 61 78 3d 3d 30 20 29 7b 0a 20    if( ax==0 ){. 
1bda0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
1bdb0 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  r,"malloc failed
1bdc0 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
1bdd0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
1bde0 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
1bdf0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
1be00 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
1be10 5d 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 73  ];.    ax[i*2].s
1be20 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61 78  tp = stp;.    ax
1be30 5b 69 2a 32 5d 2e 69 73 54 6b 6e 20 3d 20 31 3b  [i*2].isTkn = 1;
1be40 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 6e 41 63  .    ax[i*2].nAc
1be50 74 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 54 6b 6e  tion = stp->nTkn
1be60 41 63 74 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b  Act;.    ax[i*2+
1be70 31 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20  1].stp = stp;.  
1be80 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 69 73 54 6b    ax[i*2+1].isTk
1be90 6e 20 3d 20 30 3b 0a 20 20 20 20 61 78 5b 69 2a  n = 0;.    ax[i*
1bea0 32 2b 31 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73  2+1].nAction = s
1beb0 74 70 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20 7d 0a  tp->nNtAct;.  }.
1bec0 20 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20 6d 6e    mxTknOfst = mn
1bed0 54 6b 6e 4f 66 73 74 20 3d 20 30 3b 0a 20 20 6d  TknOfst = 0;.  m
1bee0 78 4e 74 4f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66  xNtOfst = mnNtOf
1bef0 73 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f  st = 0;..  /* Co
1bf00 6d 70 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e  mpute the action
1bf10 20 74 61 62 6c 65 2e 20 20 49 6e 20 6f 72 64 65   table.  In orde
1bf20 72 20 74 6f 20 74 72 79 20 74 6f 20 6b 65 65 70  r to try to keep
1bf30 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
1bf40 0a 20 20 2a 2a 20 61 63 74 69 6f 6e 20 74 61 62  .  ** action tab
1bf50 6c 65 20 74 6f 20 61 20 6d 69 6e 69 6d 75 6d 2c  le to a minimum,
1bf60 20 74 68 65 20 68 65 75 72 69 73 74 69 63 20 6f   the heuristic o
1bf70 66 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6c 61  f placing the la
1bf80 72 67 65 73 74 20 61 63 74 69 6f 6e 0a 20 20 2a  rgest action.  *
1bf90 2a 20 73 65 74 73 20 66 69 72 73 74 20 69 73 20  * sets first is 
1bfa0 75 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  used..  */.  for
1bfb0 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1bfc0 74 61 74 65 2a 32 3b 20 69 2b 2b 29 20 61 78 5b  tate*2; i++) ax[
1bfd0 69 5d 2e 69 4f 72 64 65 72 20 3d 20 69 3b 0a 20  i].iOrder = i;. 
1bfe0 20 71 73 6f 72 74 28 61 78 2c 20 6c 65 6d 70 2d   qsort(ax, lemp-
1bff0 3e 6e 73 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f  >nstate*2, sizeo
1c000 66 28 61 78 5b 30 5d 29 2c 20 61 78 73 65 74 5f  f(ax[0]), axset_
1c010 63 6f 6d 70 61 72 65 29 3b 0a 20 20 70 41 63 74  compare);.  pAct
1c020 74 61 62 20 3d 20 61 63 74 74 61 62 5f 61 6c 6c  tab = acttab_all
1c030 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  oc();.  for(i=0;
1c040 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a   i<lemp->nstate*
1c050 32 20 26 26 20 61 78 5b 69 5d 2e 6e 41 63 74 69  2 && ax[i].nActi
1c060 6f 6e 3e 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  on>0; i++){.    
1c070 73 74 70 20 3d 20 61 78 5b 69 5d 2e 73 74 70 3b  stp = ax[i].stp;
1c080 0a 20 20 20 20 69 66 28 20 61 78 5b 69 5d 2e 69  .    if( ax[i].i
1c090 73 54 6b 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f  sTkn ){.      fo
1c0a0 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
1c0b0 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
1c0c0 20 20 20 20 20 20 20 20 69 6e 74 20 61 63 74 69          int acti
1c0d0 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  on;.        if( 
1c0e0 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d 6c  ap->sp->index>=l
1c0f0 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29  emp->nterminal )
1c100 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1c110 20 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70     action = comp
1c120 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c  ute_action(lemp,
1c130 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66   ap);.        if
1c140 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e  ( action<0 ) con
1c150 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
1c160 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63  cttab_action(pAc
1c170 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e  ttab, ap->sp->in
1c180 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20  dex, action);.  
1c190 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d      }.      stp-
1c1a0 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 61 63 74 74  >iTknOfst = actt
1c1b0 61 62 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61  ab_insert(pActta
1c1c0 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  b);.      if( st
1c1d0 70 2d 3e 69 54 6b 6e 4f 66 73 74 3c 6d 6e 54 6b  p->iTknOfst<mnTk
1c1e0 6e 4f 66 73 74 20 29 20 6d 6e 54 6b 6e 4f 66 73  nOfst ) mnTknOfs
1c1f0 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73  t = stp->iTknOfs
1c200 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70  t;.      if( stp
1c210 2d 3e 69 54 6b 6e 4f 66 73 74 3e 6d 78 54 6b 6e  ->iTknOfst>mxTkn
1c220 4f 66 73 74 20 29 20 6d 78 54 6b 6e 4f 66 73 74  Ofst ) mxTknOfst
1c230 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74   = stp->iTknOfst
1c240 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c250 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
1c260 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
1c270 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  xt){.        int
1c280 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20   action;.       
1c290 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64   if( ap->sp->ind
1c2a0 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e  ex<lemp->ntermin
1c2b0 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  al ) continue;. 
1c2c0 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73         if( ap->s
1c2d0 70 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d 70 2d 3e  p->index==lemp->
1c2e0 6e 73 79 6d 62 6f 6c 20 29 20 63 6f 6e 74 69 6e  nsymbol ) contin
1c2f0 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69  ue;.        acti
1c300 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74  on = compute_act
1c310 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20  ion(lemp, ap);. 
1c320 20 20 20 20 20 20 20 69 66 28 20 61 63 74 69 6f         if( actio
1c330 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  n<0 ) continue;.
1c340 20 20 20 20 20 20 20 20 61 63 74 74 61 62 5f 61          acttab_a
1c350 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61  ction(pActtab, a
1c360 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63  p->sp->index, ac
1c370 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tion);.      }. 
1c380 20 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73       stp->iNtOfs
1c390 74 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72  t = acttab_inser
1c3a0 74 28 70 41 63 74 74 61 62 29 3b 0a 20 20 20 20  t(pActtab);.    
1c3b0 20 20 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66    if( stp->iNtOf
1c3c0 73 74 3c 6d 6e 4e 74 4f 66 73 74 20 29 20 6d 6e  st<mnNtOfst ) mn
1c3d0 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e  NtOfst = stp->iN
1c3e0 74 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28  tOfst;.      if(
1c3f0 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3e 6d 78   stp->iNtOfst>mx
1c400 4e 74 4f 66 73 74 20 29 20 6d 78 4e 74 4f 66 73  NtOfst ) mxNtOfs
1c410 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  t = stp->iNtOfst
1c420 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 72  ;.    }.  }.  fr
1c430 65 65 28 61 78 29 3b 0a 0a 20 20 2f 2a 20 4f 75  ee(ax);..  /* Ou
1c440 74 70 75 74 20 74 68 65 20 79 79 5f 61 63 74 69  tput the yy_acti
1c450 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 6e 20  on table */.  n 
1c460 3d 20 61 63 74 74 61 62 5f 73 69 7a 65 28 70 41  = acttab_size(pA
1c470 63 74 74 61 62 29 3b 0a 20 20 66 70 72 69 6e 74  cttab);.  fprint
1c480 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1c490 59 5f 41 43 54 54 41 42 5f 43 4f 55 4e 54 20 28  Y_ACTTAB_COUNT (
1c4a0 25 64 29 5c 6e 22 2c 20 6e 29 3b 20 6c 69 6e 65  %d)\n", n); line
1c4b0 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1c4c0 6f 75 74 2c 22 73 74 61 74 69 63 20 63 6f 6e 73  out,"static cons
1c4d0 74 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 79  t YYACTIONTYPE y
1c4e0 79 5f 61 63 74 69 6f 6e 5b 5d 20 3d 20 7b 5c 6e  y_action[] = {\n
1c4f0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1c500 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
1c510 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 63  i++){.    int ac
1c520 74 69 6f 6e 20 3d 20 61 63 74 74 61 62 5f 79 79  tion = acttab_yy
1c530 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20  action(pActtab, 
1c540 69 29 3b 0a 20 20 20 20 69 66 28 20 61 63 74 69  i);.    if( acti
1c550 6f 6e 3c 30 20 29 20 61 63 74 69 6f 6e 20 3d 20  on<0 ) action = 
1c560 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c  lemp->nstate + l
1c570 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20 32 3b 0a  emp->nrule + 2;.
1c580 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66      if( j==0 ) f
1c590 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
1c5a0 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20  %5d */ ", i);.  
1c5b0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1c5c0 20 25 34 64 2c 22 2c 20 61 63 74 69 6f 6e 29 3b   %4d,", action);
1c5d0 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
1c5e0 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
1c5f0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
1c600 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1c610 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
1c620 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
1c630 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
1c640 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
1c650 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20  "); lineno++;.. 
1c660 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79   /* Output the y
1c670 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 74 61 62 6c  y_lookahead tabl
1c680 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  e */.  fprintf(o
1c690 75 74 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74  ut,"static const
1c6a0 20 59 59 43 4f 44 45 54 59 50 45 20 79 79 5f 6c   YYCODETYPE yy_l
1c6b0 6f 6f 6b 61 68 65 61 64 5b 5d 20 3d 20 7b 5c 6e  ookahead[] = {\n
1c6c0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1c6d0 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
1c6e0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 61  i++){.    int la
1c6f0 20 3d 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b   = acttab_yylook
1c700 61 68 65 61 64 28 70 41 63 74 74 61 62 2c 20 69  ahead(pActtab, i
1c710 29 3b 0a 20 20 20 20 69 66 28 20 6c 61 3c 30 20  );.    if( la<0 
1c720 29 20 6c 61 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79  ) la = lemp->nsy
1c730 6d 62 6f 6c 3b 0a 20 20 20 20 69 66 28 20 6a 3d  mbol;.    if( j=
1c740 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  =0 ) fprintf(out
1c750 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20  ," /* %5d */ ", 
1c760 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i);.    fprintf(
1c770 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6c 61  out, " %4d,", la
1c780 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20  );.    if( j==9 
1c790 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20  || i==n-1 ){.   
1c7a0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1c7b0 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
1c7c0 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  .      j = 0;.  
1c7d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a    }else{.      j
1c7e0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1c7f0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b  fprintf(out, "};
1c800 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1c810 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
1c820 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d   yy_shift_ofst[]
1c830 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69   table */.  fpri
1c840 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
1c850 65 20 59 59 5f 53 48 49 46 54 5f 55 53 45 5f 44  e YY_SHIFT_USE_D
1c860 46 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54  FLT (%d)\n", mnT
1c870 6b 6e 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e  knOfst-1); linen
1c880 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d  o++;.  n = lemp-
1c890 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65  >nstate;.  while
1c8a0 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73  ( n>0 && lemp->s
1c8b0 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 54 6b 6e  orted[n-1]->iTkn
1c8c0 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20  Ofst==NO_OFFSET 
1c8d0 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66  ) n--;.  fprintf
1c8e0 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
1c8f0 59 5f 53 48 49 46 54 5f 43 4f 55 4e 54 20 28 25  Y_SHIFT_COUNT (%
1c900 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e  d)\n", n-1); lin
1c910 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1c920 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
1c930 59 5f 53 48 49 46 54 5f 4d 49 4e 20 20 20 28 25  Y_SHIFT_MIN   (%
1c940 64 29 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74  d)\n", mnTknOfst
1c950 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1c960 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65  printf(out, "#de
1c970 66 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 4d 41  fine YY_SHIFT_MA
1c980 58 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 78 54  X   (%d)\n", mxT
1c990 6b 6e 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b  knOfst); lineno+
1c9a0 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
1c9b0 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20  , "static const 
1c9c0 25 73 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74  %s yy_shift_ofst
1c9d0 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20 20  [] = {\n", .    
1c9e0 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69        minimum_si
1c9f0 7a 65 5f 74 79 70 65 28 6d 6e 54 6b 6e 4f 66 73  ze_type(mnTknOfs
1ca00 74 2d 31 2c 20 6d 78 54 6b 6e 4f 66 73 74 29 29  t-1, mxTknOfst))
1ca10 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f  ; lineno++;.  fo
1ca20 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
1ca30 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74  +){.    int ofst
1ca40 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  ;.    stp = lemp
1ca50 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
1ca60 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b   ofst = stp->iTk
1ca70 6e 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f  nOfst;.    if( o
1ca80 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29  fst==NO_OFFSET )
1ca90 20 6f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73   ofst = mnTknOfs
1caa0 74 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a  t - 1;.    if( j
1cab0 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75  ==0 ) fprintf(ou
1cac0 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c  t," /* %5d */ ",
1cad0 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66   i);.    fprintf
1cae0 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f  (out, " %4d,", o
1caf0 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d  fst);.    if( j=
1cb00 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
1cb10 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1cb20 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
1cb30 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
1cb40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cb50 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
1cb60 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1cb70 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
1cb80 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  +;..  /* Output 
1cb90 74 68 65 20 79 79 5f 72 65 64 75 63 65 5f 6f 66  the yy_reduce_of
1cba0 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20  st[] table */.  
1cbb0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64  fprintf(out, "#d
1cbc0 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f  efine YY_REDUCE_
1cbd0 55 53 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22  USE_DFLT (%d)\n"
1cbe0 2c 20 6d 6e 4e 74 4f 66 73 74 2d 31 29 3b 20 6c  , mnNtOfst-1); l
1cbf0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c  ineno++;.  n = l
1cc00 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77  emp->nstate;.  w
1cc10 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d  hile( n>0 && lem
1cc20 70 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e  p->sorted[n-1]->
1cc30 69 4e 74 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53  iNtOfst==NO_OFFS
1cc40 45 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69  ET ) n--;.  fpri
1cc50 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
1cc60 65 20 59 59 5f 52 45 44 55 43 45 5f 43 4f 55 4e  e YY_REDUCE_COUN
1cc70 54 20 28 25 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b  T (%d)\n", n-1);
1cc80 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
1cc90 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69  intf(out, "#defi
1cca0 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 4d 49 4e  ne YY_REDUCE_MIN
1ccb0 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74     (%d)\n", mnNt
1ccc0 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  Ofst); lineno++;
1ccd0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1cce0 22 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55  "#define YY_REDU
1ccf0 43 45 5f 4d 41 58 20 20 20 28 25 64 29 5c 6e 22  CE_MAX   (%d)\n"
1cd00 2c 20 6d 78 4e 74 4f 66 73 74 29 3b 20 6c 69 6e  , mxNtOfst); lin
1cd10 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
1cd20 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f  (out, "static co
1cd30 6e 73 74 20 25 73 20 79 79 5f 72 65 64 75 63 65  nst %s yy_reduce
1cd40 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20  _ofst[] = {\n", 
1cd50 0a 20 20 20 20 20 20 20 20 20 20 6d 69 6e 69 6d  .          minim
1cd60 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 4e  um_size_type(mnN
1cd70 74 4f 66 73 74 2d 31 2c 20 6d 78 4e 74 4f 66 73  tOfst-1, mxNtOfs
1cd80 74 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  t)); lineno++;. 
1cd90 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
1cda0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f   i++){.    int o
1cdb0 66 73 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c  fst;.    stp = l
1cdc0 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
1cdd0 20 20 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e      ofst = stp->
1cde0 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 69 66 28  iNtOfst;.    if(
1cdf0 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54   ofst==NO_OFFSET
1ce00 20 29 20 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66   ) ofst = mnNtOf
1ce10 73 74 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20  st - 1;.    if( 
1ce20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f  j==0 ) fprintf(o
1ce30 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22  ut," /* %5d */ "
1ce40 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , i);.    fprint
1ce50 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20  f(out, " %4d,", 
1ce60 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a  ofst);.    if( j
1ce70 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b  ==9 || i==n-1 ){
1ce80 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1ce90 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ut, "\n"); linen
1cea0 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30  o++;.      j = 0
1ceb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1cec0 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     j++;.    }.  
1ced0 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
1cee0 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   "};\n"); lineno
1cef0 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  ++;..  /* Output
1cf00 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 63 74   the default act
1cf10 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  ion table */.  f
1cf20 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61  printf(out, "sta
1cf30 74 69 63 20 63 6f 6e 73 74 20 59 59 41 43 54 49  tic const YYACTI
1cf40 4f 4e 54 59 50 45 20 79 79 5f 64 65 66 61 75 6c  ONTYPE yy_defaul
1cf50 74 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e  t[] = {\n"); lin
1cf60 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d  eno++;.  n = lem
1cf70 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 66 6f 72  p->nstate;.  for
1cf80 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
1cf90 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  ){.    stp = lem
1cfa0 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
1cfb0 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72    if( j==0 ) fpr
1cfc0 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35  intf(out," /* %5
1cfd0 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20  d */ ", i);.    
1cfe0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25  fprintf(out, " %
1cff0 34 64 2c 22 2c 20 73 74 70 2d 3e 69 44 66 6c 74  4d,", stp->iDflt
1d000 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20  );.    if( j==9 
1d010 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20  || i==n-1 ){.   
1d020 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1d030 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
1d040 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  .      j = 0;.  
1d050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a    }else{.      j
1d060 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1d070 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b  fprintf(out, "};
1d080 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1d090 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1d0a0 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1d0b0 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
1d0c0 6e 65 72 61 74 65 20 74 68 65 20 74 61 62 6c 65  nerate the table
1d0d0 20 6f 66 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b   of fallback tok
1d0e0 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ens..  */.  if( 
1d0f0 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61  lemp->has_fallba
1d100 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 78  ck ){.    int mx
1d110 20 3d 20 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e   = lemp->ntermin
1d120 61 6c 20 2d 20 31 3b 0a 20 20 20 20 77 68 69 6c  al - 1;.    whil
1d130 65 28 20 6d 78 3e 30 20 26 26 20 6c 65 6d 70 2d  e( mx>0 && lemp-
1d140 3e 73 79 6d 62 6f 6c 73 5b 6d 78 5d 2d 3e 66 61  >symbols[mx]->fa
1d150 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 20 6d 78 2d  llback==0 ){ mx-
1d160 2d 3b 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30  -; }.    for(i=0
1d170 3b 20 69 3c 3d 6d 78 3b 20 69 2b 2b 29 7b 0a 20  ; i<=mx; i++){. 
1d180 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
1d190 6f 6c 20 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73 79  ol *p = lemp->sy
1d1a0 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20  mbols[i];.      
1d1b0 69 66 28 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d  if( p->fallback=
1d1c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  =0 ){.        fp
1d1d0 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20  rintf(out, "    
1d1e0 30 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 6e  0,  /* %10s => n
1d1f0 6f 74 68 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70 2d  othing */\n", p-
1d200 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  >name);.      }e
1d210 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72  lse{.        fpr
1d220 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 25 33 64  intf(out, "  %3d
1d230 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 25 73  ,  /* %10s => %s
1d240 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c 62   */\n", p->fallb
1d250 61 63 6b 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20  ack->index,.    
1d260 20 20 20 20 20 20 70 2d 3e 6e 61 6d 65 2c 20 70        p->name, p
1d270 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d 65  ->fallback->name
1d280 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1d290 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d   lineno++;.    }
1d2a0 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
1d2b0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e 2c  (lemp->name, in,
1d2c0 20 6f 75 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a   out, &lineno);.
1d2d0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1d2e0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
1d2f0 67 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e  g the symbolic n
1d300 61 6d 65 20 6f 66 20 65 76 65 72 79 20 73 79 6d  ame of every sym
1d310 62 6f 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  bol.  */.  for(i
1d320 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
1d330 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  bol; i++){.    s
1d340 70 72 69 6e 74 66 28 6c 69 6e 65 2c 22 5c 22 25  printf(line,"\"%
1d350 73 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d 62  s\",",lemp->symb
1d360 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  ols[i]->name);. 
1d370 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1d380 20 20 25 2d 31 35 73 22 2c 6c 69 6e 65 29 3b 0a    %-15s",line);.
1d390 20 20 20 20 69 66 28 20 28 69 26 33 29 3d 3d 33      if( (i&3)==3
1d3a0 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c   ){ fprintf(out,
1d3b0 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
1d3c0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 26   }.  }.  if( (i&
1d3d0 33 29 21 3d 30 20 29 7b 20 66 70 72 69 6e 74 66  3)!=0 ){ fprintf
1d3e0 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65  (out,"\n"); line
1d3f0 6e 6f 2b 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f 78  no++; }.  tplt_x
1d400 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1d410 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1d420 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
1d430 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
1d440 67 20 61 20 74 65 78 74 20 73 74 72 69 6e 67 20  g a text string 
1d450 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 65  that describes e
1d460 76 65 72 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69  very.  ** rule i
1d470 6e 20 74 68 65 20 72 75 6c 65 20 73 65 74 20 6f  n the rule set o
1d480 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20  f the grammar.  
1d490 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
1d4a0 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 77 68   is used.  ** wh
1d4b0 65 6e 20 74 72 61 63 69 6e 67 20 52 45 44 55 43  en tracing REDUC
1d4c0 45 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  E actions..  */.
1d4d0 20 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65    for(i=0, rp=le
1d4e0 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
1d4f0 3d 72 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b  =rp->next, i++){
1d500 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 70 2d  .    assert( rp-
1d510 3e 69 6e 64 65 78 3d 3d 69 20 29 3b 0a 20 20 20  >index==i );.   
1d520 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f   fprintf(out," /
1d530 2a 20 25 33 64 20 2a 2f 20 5c 22 22 2c 20 69 29  * %3d */ \"", i)
1d540 3b 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54  ;.    writeRuleT
1d550 65 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20  ext(out, rp);.  
1d560 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c    fprintf(out,"\
1d570 22 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ",\n"); lineno++
1d580 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ;.  }.  tplt_xfe
1d590 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1d5a0 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1d5b0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1d5c0 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
1d5d0 20 65 76 65 72 79 20 74 69 6d 65 20 61 20 73 79   every time a sy
1d5e0 6d 62 6f 6c 20 69 73 20 70 6f 70 70 65 64 20 66  mbol is popped f
1d5f0 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 73 74 61  rom.  ** the sta
1d600 63 6b 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73  ck while process
1d610 69 6e 67 20 65 72 72 6f 72 73 20 6f 72 20 77 68  ing errors or wh
1d620 69 6c 65 20 64 65 73 74 72 6f 79 69 6e 67 20 74  ile destroying t
1d630 68 65 20 70 61 72 73 65 72 2e 20 0a 20 20 2a 2a  he parser. .  **
1d640 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
1d650 2c 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 25  , generate the %
1d660 64 65 73 74 72 75 63 74 6f 72 20 61 63 74 69 6f  destructor actio
1d670 6e 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ns).  */.  if( l
1d680 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29  emp->tokendest )
1d690 7b 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d  {.    int once =
1d6a0 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   1;.    for(i=0;
1d6b0 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
1d6c0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
1d6d0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20  ruct symbol *sp 
1d6e0 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
1d6f0 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70  i];.      if( sp
1d700 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21  ==0 || sp->type!
1d710 3d 54 45 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74  =TERMINAL ) cont
1d720 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
1d730 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  once ){.        
1d740 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20  fprintf(out, "  
1d750 20 20 20 20 2f 2a 20 54 45 52 4d 49 4e 41 4c 20      /* TERMINAL 
1d760 44 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22  Destructor */\n"
1d770 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1d780 20 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20       once = 0;. 
1d790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
1d7a0 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61  intf(out,"    ca
1d7b0 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c  se %d: /* %s */\
1d7c0 6e 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73  n", sp->index, s
1d7d0 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  p->name); lineno
1d7e0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ++;.    }.    fo
1d7f0 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1d800 73 79 6d 62 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e  symbol && lemp->
1d810 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65  symbols[i]->type
1d820 21 3d 54 45 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29  !=TERMINAL; i++)
1d830 3b 0a 20 20 20 20 69 66 28 20 69 3c 6c 65 6d 70  ;.    if( i<lemp
1d840 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20  ->nsymbol ){.   
1d850 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74     emit_destruct
1d860 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70  or_code(out,lemp
1d870 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d  ->symbols[i],lem
1d880 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20  p,&lineno);.    
1d890 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1d8a0 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b       break;\n");
1d8b0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d   lineno++;.    }
1d8c0 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d  .  }.  if( lemp-
1d8d0 3e 76 61 72 64 65 73 74 20 29 7b 0a 20 20 20 20  >vardest ){.    
1d8e0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64  struct symbol *d
1d8f0 66 6c 74 5f 73 70 20 3d 20 30 3b 0a 20 20 20 20  flt_sp = 0;.    
1d900 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20  int once = 1;.  
1d910 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1d920 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
1d930 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
1d940 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
1d950 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
1d960 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c      if( sp==0 ||
1d970 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49   sp->type==TERMI
1d980 4e 41 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  NAL ||.         
1d990 20 73 70 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c   sp->index<=0 ||
1d9a0 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21   sp->destructor!
1d9b0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1d9c0 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20 29 7b       if( once ){
1d9d0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
1d9e0 28 6f 75 74 2c 20 22 20 20 20 20 20 20 2f 2a 20  (out, "      /* 
1d9f0 44 65 66 61 75 6c 74 20 4e 4f 4e 2d 54 45 52 4d  Default NON-TERM
1da00 49 4e 41 4c 20 44 65 73 74 72 75 63 74 6f 72 20  INAL Destructor 
1da10 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  */\n"); lineno++
1da20 3b 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d  ;.        once =
1da30 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1da40 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1da50 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25     case %d: /* %
1da60 73 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64  s */\n", sp->ind
1da70 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c  ex, sp->name); l
1da80 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 64  ineno++;.      d
1da90 66 6c 74 5f 73 70 20 3d 20 73 70 3b 0a 20 20 20  flt_sp = sp;.   
1daa0 20 7d 0a 20 20 20 20 69 66 28 20 64 66 6c 74 5f   }.    if( dflt_
1dab0 73 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 65  sp!=0 ){.      e
1dac0 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63  mit_destructor_c
1dad0 6f 64 65 28 6f 75 74 2c 64 66 6c 74 5f 73 70 2c  ode(out,dflt_sp,
1dae0 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lemp,&lineno);. 
1daf0 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
1db00 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65 61  (out,"      brea
1db10 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  k;\n"); lineno++
1db20 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1db30 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   i<lemp->nsymbol
1db40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
1db50 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20  ct symbol *sp = 
1db60 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
1db70 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20  ;.    if( sp==0 
1db80 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52  || sp->type==TER
1db90 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 64 65 73  MINAL || sp->des
1dba0 74 72 75 63 74 6f 72 3d 3d 30 20 29 20 63 6f 6e  tructor==0 ) con
1dbb0 74 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e  tinue;.    fprin
1dbc0 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65  tf(out,"    case
1dbd0 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22   %d: /* %s */\n"
1dbe0 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d  , sp->index, sp-
1dbf0 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  >name); lineno++
1dc00 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e  ;..    /* Combin
1dc10 65 20 64 75 70 6c 69 63 61 74 65 20 64 65 73 74  e duplicate dest
1dc20 72 75 63 74 6f 72 73 20 69 6e 74 6f 20 61 20 73  ructors into a s
1dc30 69 6e 67 6c 65 20 63 61 73 65 20 2a 2f 0a 20 20  ingle case */.  
1dc40 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6c    for(j=i+1; j<l
1dc50 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b  emp->nsymbol; j+
1dc60 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
1dc70 20 73 79 6d 62 6f 6c 20 2a 73 70 32 20 3d 20 6c   symbol *sp2 = l
1dc80 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b  emp->symbols[j];
1dc90 0a 20 20 20 20 20 20 69 66 28 20 73 70 32 20 26  .      if( sp2 &
1dca0 26 20 73 70 32 2d 3e 74 79 70 65 21 3d 54 45 52  & sp2->type!=TER
1dcb0 4d 49 4e 41 4c 20 26 26 20 73 70 32 2d 3e 64 65  MINAL && sp2->de
1dcc0 73 74 72 75 63 74 6f 72 0a 20 20 20 20 20 20 20  structor.       
1dcd0 20 20 20 26 26 20 73 70 32 2d 3e 64 74 6e 75 6d     && sp2->dtnum
1dce0 3d 3d 73 70 2d 3e 64 74 6e 75 6d 0a 20 20 20 20  ==sp->dtnum.    
1dcf0 20 20 20 20 20 20 26 26 20 73 74 72 63 6d 70 28        && strcmp(
1dd00 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 2c 73  sp->destructor,s
1dd10 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 29 3d  p2->destructor)=
1dd20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 66  =0 ){.         f
1dd30 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
1dd40 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a  case %d: /* %s *
1dd50 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  /\n",.          
1dd60 20 20 20 20 20 20 20 73 70 32 2d 3e 69 6e 64 65         sp2->inde
1dd70 78 2c 20 73 70 32 2d 3e 6e 61 6d 65 29 3b 20 6c  x, sp2->name); l
1dd80 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
1dd90 20 20 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f    sp2->destructo
1dda0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  r = 0;.      }. 
1ddb0 20 20 20 7d 0a 0a 20 20 20 20 65 6d 69 74 5f 64     }..    emit_d
1ddc0 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f  estructor_code(o
1ddd0 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ut,lemp->symbols
1dde0 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f  [i],lemp,&lineno
1ddf0 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1de00 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b  ut,"      break;
1de10 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1de20 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
1de30 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1de40 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1de50 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1de60 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
1de70 68 65 6e 65 76 65 72 20 74 68 65 20 70 61 72 73  henever the pars
1de80 65 72 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f  er stack overflo
1de90 77 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  ws */.  tplt_pri
1dea0 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
1deb0 2d 3e 6f 76 65 72 66 6c 6f 77 2c 26 6c 69 6e 65  ->overflow,&line
1dec0 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72  no);.  tplt_xfer
1ded0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1dee0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1def0 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
1df00 74 61 62 6c 65 20 6f 66 20 72 75 6c 65 20 69 6e  table of rule in
1df10 66 6f 72 6d 61 74 69 6f 6e 20 0a 20 20 2a 2a 0a  formation .  **.
1df20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20    ** Note: This 
1df30 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
1df40 74 68 65 20 66 61 63 74 20 74 68 61 74 20 72 75  the fact that ru
1df50 6c 65 73 20 61 72 65 20 6e 75 6d 62 65 72 0a 20  les are number. 
1df60 20 2a 2a 20 73 65 71 75 65 6e 74 75 61 6c 6c 79   ** sequentually
1df70 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
1df80 30 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 72 70  0..  */.  for(rp
1df90 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
1dfa0 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
1dfb0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1dfc0 20 20 7b 20 25 64 2c 20 25 64 20 7d 2c 5c 6e 22    { %d, %d },\n"
1dfd0 2c 72 70 2d 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c  ,rp->lhs->index,
1dfe0 72 70 2d 3e 6e 72 68 73 29 3b 20 6c 69 6e 65 6e  rp->nrhs); linen
1dff0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
1e000 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1e010 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1e020 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1e030 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
1e040 74 69 6f 6e 20 64 75 72 69 6e 67 20 65 61 63 68  tion during each
1e050 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20 2a   REDUCE action *
1e060 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  /.  for(rp=lemp-
1e070 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
1e080 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 74 72 61  ->next){.    tra
1e090 6e 73 6c 61 74 65 5f 63 6f 64 65 28 6c 65 6d 70  nslate_code(lemp
1e0a0 2c 20 72 70 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  , rp);.  }.  /* 
1e0b0 46 69 72 73 74 20 6f 75 74 70 75 74 20 72 75 6c  First output rul
1e0c0 65 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  es other than th
1e0d0 65 20 64 65 66 61 75 6c 74 3a 20 72 75 6c 65 20  e default: rule 
1e0e0 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  */.  for(rp=lemp
1e0f0 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
1e100 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 73 74  p->next){.    st
1e110 72 75 63 74 20 72 75 6c 65 20 2a 72 70 32 3b 20  ruct rule *rp2; 
1e120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e130 20 4f 74 68 65 72 20 72 75 6c 65 73 20 77 69 74   Other rules wit
1e140 68 20 74 68 65 20 73 61 6d 65 20 61 63 74 69 6f  h the same actio
1e150 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 70 2d  n */.    if( rp-
1e160 3e 63 6f 64 65 3d 3d 30 20 29 20 63 6f 6e 74 69  >code==0 ) conti
1e170 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 72 70 2d  nue;.    if( rp-
1e180 3e 63 6f 64 65 5b 30 5d 3d 3d 27 5c 6e 27 20 26  >code[0]=='\n' &
1e190 26 20 72 70 2d 3e 63 6f 64 65 5b 31 5d 3d 3d 30  & rp->code[1]==0
1e1a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20   ) continue; /* 
1e1b0 57 69 6c 6c 20 62 65 20 64 65 66 61 75 6c 74 3a  Will be default:
1e1c0 20 2a 2f 0a 20 20 20 20 66 70 72 69 6e 74 66 28   */.    fprintf(
1e1d0 6f 75 74 2c 22 20 20 20 20 20 20 63 61 73 65 20  out,"      case 
1e1e0 25 64 3a 20 2f 2a 20 22 2c 20 72 70 2d 3e 69 6e  %d: /* ", rp->in
1e1f0 64 65 78 29 3b 0a 20 20 20 20 77 72 69 74 65 52  dex);.    writeR
1e200 75 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 29  uleText(out, rp)
1e210 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1e220 74 2c 20 22 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e  t, " */\n"); lin
1e230 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 72  eno++;.    for(r
1e240 70 32 3d 72 70 2d 3e 6e 65 78 74 3b 20 72 70 32  p2=rp->next; rp2
1e250 3b 20 72 70 32 3d 72 70 32 2d 3e 6e 65 78 74 29  ; rp2=rp2->next)
1e260 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70 32 2d  {.      if( rp2-
1e270 3e 63 6f 64 65 3d 3d 72 70 2d 3e 63 6f 64 65 20  >code==rp->code 
1e280 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
1e290 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63 61  tf(out,"      ca
1e2a0 73 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72 70 32  se %d: /* ", rp2
1e2b0 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
1e2c0 20 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28    writeRuleText(
1e2d0 6f 75 74 2c 20 72 70 32 29 3b 0a 20 20 20 20 20  out, rp2);.     
1e2e0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1e2f0 20 2a 2f 20 79 79 74 65 73 74 63 61 73 65 28 79   */ yytestcase(y
1e300 79 72 75 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22  yruleno==%d);\n"
1e310 2c 20 72 70 32 2d 3e 69 6e 64 65 78 29 3b 20 6c  , rp2->index); l
1e320 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
1e330 20 72 70 32 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a   rp2->code = 0;.
1e340 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e350 20 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c    emit_code(out,
1e360 72 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  rp,lemp,&lineno)
1e370 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1e380 74 2c 22 20 20 20 20 20 20 20 20 62 72 65 61 6b  t,"        break
1e390 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1e3a0 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20  .    rp->code = 
1e3b0 30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 69 6e 61  0;.  }.  /* Fina
1e3c0 6c 6c 79 2c 20 6f 75 74 70 75 74 20 74 68 65 20  lly, output the 
1e3d0 64 65 66 61 75 6c 74 3a 20 72 75 6c 65 2e 20 20  default: rule.  
1e3e0 57 65 20 63 68 6f 6f 73 65 20 61 73 20 74 68 65  We choose as the
1e3f0 20 64 65 66 61 75 6c 74 3a 20 61 6c 6c 0a 20 20   default: all.  
1e400 2a 2a 20 65 6d 70 74 79 20 61 63 74 69 6f 6e 73  ** empty actions
1e410 2e 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  . */.  fprintf(o
1e420 75 74 2c 22 20 20 20 20 20 20 64 65 66 61 75 6c  ut,"      defaul
1e430 74 3a 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  t:\n"); lineno++
1e440 3b 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  ;.  for(rp=lemp-
1e450 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
1e460 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  ->next){.    if(
1e470 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 20 63   rp->code==0 ) c
1e480 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73  ontinue;.    ass
1e490 65 72 74 28 20 72 70 2d 3e 63 6f 64 65 5b 30 5d  ert( rp->code[0]
1e4a0 3d 3d 27 5c 6e 27 20 26 26 20 72 70 2d 3e 63 6f  =='\n' && rp->co
1e4b0 64 65 5b 31 5d 3d 3d 30 20 29 3b 0a 20 20 20 20  de[1]==0 );.    
1e4c0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
1e4d0 20 20 20 2f 2a 20 28 25 64 29 20 22 2c 20 72 70     /* (%d) ", rp
1e4e0 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 77 72  ->index);.    wr
1e4f0 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c  iteRuleText(out,
1e500 20 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74   rp);.    fprint
1e510 66 28 6f 75 74 2c 20 22 20 2a 2f 20 79 79 74 65  f(out, " */ yyte
1e520 73 74 63 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d  stcase(yyruleno=
1e530 3d 25 64 29 3b 5c 6e 22 2c 20 72 70 2d 3e 69 6e  =%d);\n", rp->in
1e540 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  dex); lineno++;.
1e550 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75    }.  fprintf(ou
1e560 74 2c 22 20 20 20 20 20 20 20 20 62 72 65 61 6b  t,"        break
1e570 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1e580 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1e590 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1e5a0 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
1e5b0 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
1e5c0 63 68 20 65 78 65 63 75 74 65 73 20 69 66 20 61  ch executes if a
1e5d0 20 70 61 72 73 65 20 66 61 69 6c 73 20 2a 2f 0a   parse fails */.
1e5e0 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
1e5f0 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 66 61 69 6c  ,lemp,lemp->fail
1e600 75 72 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  ure,&lineno);.  
1e610 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e  tplt_xfer(lemp->
1e620 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e  name,in,out,&lin
1e630 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65  eno);..  /* Gene
1e640 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20  rate code which 
1e650 65 78 65 63 75 74 65 73 20 77 68 65 6e 20 61 20  executes when a 
1e660 73 79 6e 74 61 78 20 65 72 72 6f 72 20 6f 63 63  syntax error occ
1e670 75 72 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72  urs */.  tplt_pr
1e680 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d  int(out,lemp,lem
1e690 70 2d 3e 65 72 72 6f 72 2c 26 6c 69 6e 65 6e 6f  p->error,&lineno
1e6a0 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  );.  tplt_xfer(l
1e6b0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1e6c0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1e6d0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
1e6e0 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68  hich executes wh
1e6f0 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 63  en the parser ac
1e700 63 65 70 74 73 20 69 74 73 20 69 6e 70 75 74 20  cepts its input 
1e710 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
1e720 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 61  out,lemp,lemp->a
1e730 63 63 65 70 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  ccept,&lineno);.
1e740 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1e750 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1e760 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 41 70  ineno);..  /* Ap
1e770 70 65 6e 64 20 61 6e 79 20 61 64 64 69 74 69 6f  pend any additio
1e780 6e 20 63 6f 64 65 20 74 68 65 20 75 73 65 72 20  n code the user 
1e790 64 65 73 69 72 65 73 20 2a 2f 0a 20 20 74 70 6c  desires */.  tpl
1e7a0 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70  t_print(out,lemp
1e7b0 2c 6c 65 6d 70 2d 3e 65 78 74 72 61 63 6f 64 65  ,lemp->extracode
1e7c0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 66 63  ,&lineno);..  fc
1e7d0 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 66 63 6c 6f  lose(in);.  fclo
1e7e0 73 65 28 6f 75 74 29 3b 0a 20 20 72 65 74 75 72  se(out);.  retur
1e7f0 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74  n;.}../* Generat
1e800 65 20 61 20 68 65 61 64 65 72 20 66 69 6c 65 20  e a header file 
1e810 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 2a  for the parser *
1e820 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 48 65 61  /.void ReportHea
1e830 64 65 72 28 6c 65 6d 70 29 0a 73 74 72 75 63 74  der(lemp).struct
1e840 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a   lemon *lemp;.{.
1e850 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e    FILE *out, *in
1e860 3b 0a 20 20 63 68 61 72 20 2a 70 72 65 66 69 78  ;.  char *prefix
1e870 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49  ;.  char line[LI
1e880 4e 45 53 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20  NESIZE];.  char 
1e890 70 61 74 74 65 72 6e 5b 4c 49 4e 45 53 49 5a 45  pattern[LINESIZE
1e8a0 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  ];.  int i;..  i
1e8b0 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72  f( lemp->tokenpr
1e8c0 65 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20  efix ) prefix = 
1e8d0 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
1e8e0 78 3b 0a 20 20 65 6c 73 65 20 20 20 20 20 20 20  x;.  else       
1e8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65               pre
1e900 66 69 78 20 3d 20 22 22 3b 0a 20 20 69 6e 20 3d  fix = "";.  in =
1e910 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c   file_open(lemp,
1e920 22 2e 68 22 2c 22 72 62 22 29 3b 0a 20 20 69 66  ".h","rb");.  if
1e930 28 20 69 6e 20 29 7b 0a 20 20 20 20 66 6f 72 28  ( in ){.    for(
1e940 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65  i=1; i<lemp->nte
1e950 72 6d 69 6e 61 6c 20 26 26 20 66 67 65 74 73 28  rminal && fgets(
1e960 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69 6e  line,LINESIZE,in
1e970 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  ); i++){.      s
1e980 70 72 69 6e 74 66 28 70 61 74 74 65 72 6e 2c 22  printf(pattern,"
1e990 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20  #define %s%-30s 
1e9a0 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65  %2d\n",prefix,le
1e9b0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
1e9c0 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 69  name,i);.      i
1e9d0 66 28 20 73 74 72 63 6d 70 28 6c 69 6e 65 2c 70  f( strcmp(line,p
1e9e0 61 74 74 65 72 6e 29 20 29 20 62 72 65 61 6b 3b  attern) ) break;
1e9f0 0a 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73  .    }.    fclos
1ea00 65 28 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 69  e(in);.    if( i
1ea10 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  ==lemp->ntermina
1ea20 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f  l ){.      /* No
1ea30 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20 66   change in the f
1ea40 69 6c 65 2e 20 20 44 6f 6e 27 74 20 72 65 77 72  ile.  Don't rewr
1ea50 69 74 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 20  ite it. */.     
1ea60 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20   return;.    }. 
1ea70 20 7d 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f   }.  out = file_
1ea80 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c 22  open(lemp,".h","
1ea90 77 62 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 20  wb");.  if( out 
1eaa0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
1eab0 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  i<lemp->ntermina
1eac0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  l; i++){.      f
1ead0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1eae0 69 6e 65 20 25 73 25 2d 33 30 73 20 25 32 64 5c  ine %s%-30s %2d\
1eaf0 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e  n",prefix,lemp->
1eb00 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65  symbols[i]->name
1eb10 2c 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ,i);.    }.    f
1eb20 63 6c 6f 73 65 28 6f 75 74 29 3b 20 20 0a 20 20  close(out);  .  
1eb30 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.  return;.}../
1eb40 2a 20 52 65 64 75 63 65 20 74 68 65 20 73 69 7a  * Reduce the siz
1eb50 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20  e of the action 
1eb60 74 61 62 6c 65 73 2c 20 69 66 20 70 6f 73 73 69  tables, if possi
1eb70 62 6c 65 2c 20 62 79 20 6d 61 6b 69 6e 67 20 75  ble, by making u
1eb80 73 65 0a 2a 2a 20 6f 66 20 64 65 66 61 75 6c 74  se.** of default
1eb90 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69 73  s..**.** In this
1eba0 20 76 65 72 73 69 6f 6e 2c 20 77 65 20 74 61 6b   version, we tak
1ebb0 65 20 74 68 65 20 6d 6f 73 74 20 66 72 65 71 75  e the most frequ
1ebc0 65 6e 74 20 52 45 44 55 43 45 20 61 63 74 69 6f  ent REDUCE actio
1ebd0 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a 20 69 74  n and make.** it
1ebe0 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20 45   the default.  E
1ebf0 78 63 65 70 74 2c 20 74 68 65 72 65 20 69 73 20  xcept, there is 
1ec00 6e 6f 20 64 65 66 61 75 6c 74 20 69 66 20 74 68  no default if th
1ec10 65 20 77 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e  e wildcard token
1ec20 0a 2a 2a 20 69 73 20 61 20 70 6f 73 73 69 62 6c  .** is a possibl
1ec30 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 2e 0a 2a 2f  e look-ahead..*/
1ec40 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73 73 54 61  .void CompressTa
1ec50 62 6c 65 73 28 6c 65 6d 70 29 0a 73 74 72 75 63  bles(lemp).struc
1ec60 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
1ec70 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
1ec80 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61  *stp;.  struct a
1ec90 63 74 69 6f 6e 20 2a 61 70 2c 20 2a 61 70 32 3b  ction *ap, *ap2;
1eca0 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
1ecb0 72 70 2c 20 2a 72 70 32 2c 20 2a 72 62 65 73 74  rp, *rp2, *rbest
1ecc0 3b 0a 20 20 69 6e 74 20 6e 62 65 73 74 2c 20 6e  ;.  int nbest, n
1ecd0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
1ece0 20 75 73 65 73 57 69 6c 64 63 61 72 64 3b 0a 0a   usesWildcard;..
1ecf0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1ed00 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
1ed10 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
1ed20 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
1ed30 6e 62 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 72  nbest = 0;.    r
1ed40 62 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 75 73  best = 0;.    us
1ed50 65 73 57 69 6c 64 63 61 72 64 20 3d 20 30 3b 0a  esWildcard = 0;.
1ed60 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
1ed70 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
1ed80 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
1ed90 20 61 70 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54   ap->type==SHIFT
1eda0 20 26 26 20 61 70 2d 3e 73 70 3d 3d 6c 65 6d 70   && ap->sp==lemp
1edb0 2d 3e 77 69 6c 64 63 61 72 64 20 29 7b 0a 20 20  ->wildcard ){.  
1edc0 20 20 20 20 20 20 75 73 65 73 57 69 6c 64 63 61        usesWildca
1edd0 72 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rd = 1;.      }.
1ede0 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
1edf0 70 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f 6e  pe!=REDUCE ) con
1ee00 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 72 70 20  tinue;.      rp 
1ee10 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20 20  = ap->x.rp;.    
1ee20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 53 74 61    if( rp->lhsSta
1ee30 72 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  rt ) continue;. 
1ee40 20 20 20 20 20 69 66 28 20 72 70 3d 3d 72 62 65       if( rp==rbe
1ee50 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  st ) continue;. 
1ee60 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20       n = 1;.    
1ee70 20 20 66 6f 72 28 61 70 32 3d 61 70 2d 3e 6e 65    for(ap2=ap->ne
1ee80 78 74 3b 20 61 70 32 3b 20 61 70 32 3d 61 70 32  xt; ap2; ap2=ap2
1ee90 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
1eea0 20 69 66 28 20 61 70 32 2d 3e 74 79 70 65 21 3d   if( ap2->type!=
1eeb0 52 45 44 55 43 45 20 29 20 63 6f 6e 74 69 6e 75  REDUCE ) continu
1eec0 65 3b 0a 20 20 20 20 20 20 20 20 72 70 32 20 3d  e;.        rp2 =
1eed0 20 61 70 32 2d 3e 78 2e 72 70 3b 0a 20 20 20 20   ap2->x.rp;.    
1eee0 20 20 20 20 69 66 28 20 72 70 32 3d 3d 72 62 65      if( rp2==rbe
1eef0 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  st ) continue;. 
1ef00 20 20 20 20 20 20 20 69 66 28 20 72 70 32 3d 3d         if( rp2==
1ef10 72 70 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20  rp ) n++;.      
1ef20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 62  }.      if( n>nb
1ef30 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  est ){.        n
1ef40 62 65 73 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20  best = n;.      
1ef50 20 20 72 62 65 73 74 20 3d 20 72 70 3b 0a 20 20    rbest = rp;.  
1ef60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 0a 20 20      }.    }. .  
1ef70 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b 65    /* Do not make
1ef80 20 61 20 64 65 66 61 75 6c 74 20 69 66 20 74 68   a default if th
1ef90 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 75 6c 65  e number of rule
1efa0 73 20 74 6f 20 64 65 66 61 75 6c 74 0a 20 20 20  s to default.   
1efb0 20 2a 2a 20 69 73 20 6e 6f 74 20 61 74 20 6c 65   ** is not at le
1efc0 61 73 74 20 31 20 6f 72 20 69 66 20 74 68 65 20  ast 1 or if the 
1efd0 77 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e 20 69  wildcard token i
1efe0 73 20 61 20 70 6f 73 73 69 62 6c 65 0a 20 20 20  s a possible.   
1eff0 20 2a 2a 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20   ** lookahead.. 
1f000 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 62     */.    if( nb
1f010 65 73 74 3c 31 20 7c 7c 20 75 73 65 73 57 69 6c  est<1 || usesWil
1f020 64 63 61 72 64 20 29 20 63 6f 6e 74 69 6e 75 65  dcard ) continue
1f030 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69  ;...    /* Combi
1f040 6e 65 20 6d 61 74 63 68 69 6e 67 20 52 45 44 55  ne matching REDU
1f050 43 45 20 61 63 74 69 6f 6e 73 20 69 6e 74 6f 20  CE actions into 
1f060 61 20 73 69 6e 67 6c 65 20 64 65 66 61 75 6c 74  a single default
1f070 20 2a 2f 0a 20 20 20 20 66 6f 72 28 61 70 3d 73   */.    for(ap=s
1f080 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  tp->ap; ap; ap=a
1f090 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
1f0a0 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45  if( ap->type==RE
1f0b0 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72 70  DUCE && ap->x.rp
1f0c0 3d 3d 72 62 65 73 74 20 29 20 62 72 65 61 6b 3b  ==rbest ) break;
1f0d0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1f0e0 74 28 20 61 70 20 29 3b 0a 20 20 20 20 61 70 2d  t( ap );.    ap-
1f0f0 3e 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  >sp = Symbol_new
1f100 28 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20  ("{default}");. 
1f110 20 20 20 66 6f 72 28 61 70 3d 61 70 2d 3e 6e 65     for(ap=ap->ne
1f120 78 74 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e  xt; ap; ap=ap->n
1f130 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
1f140 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45  ap->type==REDUCE
1f150 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62   && ap->x.rp==rb
1f160 65 73 74 20 29 20 61 70 2d 3e 74 79 70 65 20 3d  est ) ap->type =
1f170 20 4e 4f 54 5f 55 53 45 44 3b 0a 20 20 20 20 7d   NOT_USED;.    }
1f180 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 41  .    stp->ap = A
1f190 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e  ction_sort(stp->
1f1a0 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  ap);.  }.}.../*.
1f1b0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73  ** Compare two s
1f1c0 74 61 74 65 73 20 66 6f 72 20 73 6f 72 74 69 6e  tates for sortin
1f1d0 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68 65  g purposes.  The
1f1e0 20 73 6d 61 6c 6c 65 72 20 73 74 61 74 65 20 69   smaller state i
1f1f0 73 20 74 68 65 0a 2a 2a 20 6f 6e 65 20 77 69 74  s the.** one wit
1f200 68 20 74 68 65 20 6d 6f 73 74 20 6e 6f 6e 2d 74  h the most non-t
1f210 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2e  erminal actions.
1f220 20 20 49 66 20 74 68 65 79 20 68 61 76 65 20 74    If they have t
1f230 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a  he same number.*
1f240 2a 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  * of non-termina
1f250 6c 20 61 63 74 69 6f 6e 73 2c 20 74 68 65 6e 20  l actions, then 
1f260 74 68 65 20 73 6d 61 6c 6c 65 72 20 69 73 20 74  the smaller is t
1f270 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20  he one with the 
1f280 6d 6f 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 61 63  most.** token ac
1f290 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  tions..*/.static
1f2a0 20 69 6e 74 20 73 74 61 74 65 52 65 73 6f 72 74   int stateResort
1f2b0 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76 6f  Compare(const vo
1f2c0 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69  id *a, const voi
1f2d0 64 20 2a 62 29 7b 0a 20 20 63 6f 6e 73 74 20 73  d *b){.  const s
1f2e0 74 72 75 63 74 20 73 74 61 74 65 20 2a 70 41 20  truct state *pA 
1f2f0 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75 63 74  = *(const struct
1f300 20 73 74 61 74 65 2a 2a 29 61 3b 0a 20 20 63 6f   state**)a;.  co
1f310 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65  nst struct state
1f320 20 2a 70 42 20 3d 20 2a 28 63 6f 6e 73 74 20 73   *pB = *(const s
1f330 74 72 75 63 74 20 73 74 61 74 65 2a 2a 29 62 3b  truct state**)b;
1f340 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20 3d  .  int n;..  n =
1f350 20 70 42 2d 3e 6e 4e 74 41 63 74 20 2d 20 70 41   pB->nNtAct - pA
1f360 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20 69 66 28 20  ->nNtAct;.  if( 
1f370 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20  n==0 ){.    n = 
1f380 70 42 2d 3e 6e 54 6b 6e 41 63 74 20 2d 20 70 41  pB->nTknAct - pA
1f390 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20 69  ->nTknAct;.    i
1f3a0 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
1f3b0 20 6e 20 3d 20 70 42 2d 3e 73 74 61 74 65 6e 75   n = pB->statenu
1f3c0 6d 20 2d 20 70 41 2d 3e 73 74 61 74 65 6e 75 6d  m - pA->statenum
1f3d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
1f3e0 73 65 72 74 28 20 6e 21 3d 30 20 29 3b 0a 20 20  sert( n!=0 );.  
1f3f0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 2f 2a  return n;.}.../*
1f400 0a 2a 2a 20 52 65 6e 75 6d 62 65 72 20 61 6e 64  .** Renumber and
1f410 20 72 65 73 6f 72 74 20 73 74 61 74 65 73 20 73   resort states s
1f420 6f 20 74 68 61 74 20 73 74 61 74 65 73 20 77 69  o that states wi
1f430 74 68 20 66 65 77 65 72 20 63 68 6f 69 63 65 73  th fewer choices
1f440 0a 2a 2a 20 6f 63 63 75 72 20 61 74 20 74 68 65  .** occur at the
1f450 20 65 6e 64 2e 20 20 45 78 63 65 70 74 2c 20 6b   end.  Except, k
1f460 65 65 70 20 73 74 61 74 65 20 30 20 61 73 20 74  eep state 0 as t
1f470 68 65 20 66 69 72 73 74 20 73 74 61 74 65 2e 0a  he first state..
1f480 2a 2f 0a 76 6f 69 64 20 52 65 73 6f 72 74 53 74  */.void ResortSt
1f490 61 74 65 73 28 6c 65 6d 70 29 0a 73 74 72 75 63  ates(lemp).struc
1f4a0 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
1f4b0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1f4c0 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
1f4d0 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
1f4e0 61 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ap;..  for(i=0; 
1f4f0 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
1f500 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
1f510 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
1f520 0a 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63  .    stp->nTknAc
1f530 74 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74 20  t = stp->nNtAct 
1f540 3d 20 30 3b 0a 20 20 20 20 73 74 70 2d 3e 69 44  = 0;.    stp->iD
1f550 66 6c 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  flt = lemp->nsta
1f560 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  te + lemp->nrule
1f570 3b 0a 20 20 20 20 73 74 70 2d 3e 69 54 6b 6e 4f  ;.    stp->iTknO
1f580 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b  fst = NO_OFFSET;
1f590 0a 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73  .    stp->iNtOfs
1f5a0 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20  t = NO_OFFSET;. 
1f5b0 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
1f5c0 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
1f5d0 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  xt){.      if( c
1f5e0 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65  ompute_action(le
1f5f0 6d 70 2c 61 70 29 3e 3d 30 20 29 7b 0a 20 20 20  mp,ap)>=0 ){.   
1f600 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d       if( ap->sp-
1f610 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65  >index<lemp->nte
1f620 72 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  rminal ){.      
1f630 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74      stp->nTknAct
1f640 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
1f650 65 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e  e if( ap->sp->in
1f660 64 65 78 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  dex<lemp->nsymbo
1f670 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  l ){.          s
1f680 74 70 2d 3e 6e 4e 74 41 63 74 2b 2b 3b 0a 20 20  tp->nNtAct++;.  
1f690 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f6a0 20 20 20 20 20 20 20 73 74 70 2d 3e 69 44 66 6c         stp->iDfl
1f6b0 74 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69  t = compute_acti
1f6c0 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20  on(lemp, ap);.  
1f6d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f6e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 71 73 6f 72      }.  }.  qsor
1f6f0 74 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b  t(&lemp->sorted[
1f700 31 5d 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  1], lemp->nstate
1f710 2d 31 2c 20 73 69 7a 65 6f 66 28 6c 65 6d 70 2d  -1, sizeof(lemp-
1f720 3e 73 6f 72 74 65 64 5b 30 5d 29 2c 0a 20 20 20  >sorted[0]),.   
1f730 20 20 20 20 20 73 74 61 74 65 52 65 73 6f 72 74       stateResort
1f740 43 6f 6d 70 61 72 65 29 3b 0a 20 20 66 6f 72 28  Compare);.  for(
1f750 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
1f760 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c  ate; i++){.    l
1f770 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e  emp->sorted[i]->
1f780 73 74 61 74 65 6e 75 6d 20 3d 20 69 3b 0a 20 20  statenum = i;.  
1f790 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}.../*********
1f7a0 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
1f7b0 65 20 66 69 6c 65 20 22 73 65 74 2e 63 22 20 2a  e file "set.c" *
1f7c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f7d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f7e0 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6d  ***/./*.** Set m
1f7f0 61 6e 69 70 75 6c 61 74 69 6f 6e 20 72 6f 75 74  anipulation rout
1f800 69 6e 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d  ines for the LEM
1f810 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
1f820 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20  tor..*/..static 
1f830 69 6e 74 20 73 69 7a 65 20 3d 20 30 3b 0a 0a 2f  int size = 0;../
1f840 2a 20 53 65 74 20 74 68 65 20 73 65 74 20 73 69  * Set the set si
1f850 7a 65 20 2a 2f 0a 76 6f 69 64 20 53 65 74 53 69  ze */.void SetSi
1f860 7a 65 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20  ze(n).int n;.{. 
1f870 20 73 69 7a 65 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a   size = n+1;.}..
1f880 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
1f890 77 20 73 65 74 20 2a 2f 0a 63 68 61 72 20 2a 53  w set */.char *S
1f8a0 65 74 4e 65 77 28 29 7b 0a 20 20 63 68 61 72 20  etNew(){.  char 
1f8b0 2a 73 3b 0a 20 20 73 20 3d 20 28 63 68 61 72 2a  *s;.  s = (char*
1f8c0 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65 2c 20 31  )calloc( size, 1
1f8d0 29 3b 0a 20 20 69 66 28 20 73 3d 3d 30 20 29 7b  );.  if( s==0 ){
1f8e0 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64  .    extern void
1f8f0 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b   memory_error();
1f900 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f  .    memory_erro
1f910 72 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  r();.  }.  retur
1f920 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20 44 65 61 6c 6c  n s;.}../* Deall
1f930 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f 0a 76  ocate a set */.v
1f940 6f 69 64 20 53 65 74 46 72 65 65 28 73 29 0a 63  oid SetFree(s).c
1f950 68 61 72 20 2a 73 3b 0a 7b 0a 20 20 66 72 65 65  har *s;.{.  free
1f960 28 73 29 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61  (s);.}../* Add a
1f970 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
1f980 74 68 65 20 73 65 74 2e 20 20 52 65 74 75 72 6e  the set.  Return
1f990 20 54 52 55 45 20 69 66 20 74 68 65 20 65 6c 65   TRUE if the ele
1f9a0 6d 65 6e 74 20 77 61 73 20 61 64 64 65 64 0a 2a  ment was added.*
1f9b0 2a 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20 69  * and FALSE if i
1f9c0 74 20 77 61 73 20 61 6c 72 65 61 64 79 20 74 68  t was already th
1f9d0 65 72 65 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 41  ere. */.int SetA
1f9e0 64 64 28 73 2c 65 29 0a 63 68 61 72 20 2a 73 3b  dd(s,e).char *s;
1f9f0 0a 69 6e 74 20 65 3b 0a 7b 0a 20 20 69 6e 74 20  .int e;.{.  int 
1fa00 72 76 3b 0a 20 20 61 73 73 65 72 74 28 20 65 3e  rv;.  assert( e>
1fa10 3d 30 20 26 26 20 65 3c 73 69 7a 65 20 29 3b 0a  =0 && e<size );.
1fa20 20 20 72 76 20 3d 20 73 5b 65 5d 3b 0a 20 20 73    rv = s[e];.  s
1fa30 5b 65 5d 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  [e] = 1;.  retur
1fa40 6e 20 21 72 76 3b 0a 7d 0a 0a 2f 2a 20 41 64 64  n !rv;.}../* Add
1fa50 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f   every element o
1fa60 66 20 73 32 20 74 6f 20 73 31 2e 20 20 52 65 74  f s2 to s1.  Ret
1fa70 75 72 6e 20 54 52 55 45 20 69 66 20 73 31 20 63  urn TRUE if s1 c
1fa80 68 61 6e 67 65 73 2e 20 2a 2f 0a 69 6e 74 20 53  hanges. */.int S
1fa90 65 74 55 6e 69 6f 6e 28 73 31 2c 73 32 29 0a 63  etUnion(s1,s2).c
1faa0 68 61 72 20 2a 73 31 3b 0a 63 68 61 72 20 2a 73  har *s1;.char *s
1fab0 32 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 70 72  2;.{.  int i, pr
1fac0 6f 67 72 65 73 73 3b 0a 20 20 70 72 6f 67 72 65  ogress;.  progre
1fad0 73 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ss = 0;.  for(i=
1fae0 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 7b  0; i<size; i++){
1faf0 0a 20 20 20 20 69 66 28 20 73 32 5b 69 5d 3d 3d  .    if( s2[i]==
1fb00 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1fb10 20 20 69 66 28 20 73 31 5b 69 5d 3d 3d 30 20 29    if( s1[i]==0 )
1fb20 7b 0a 20 20 20 20 20 20 70 72 6f 67 72 65 73 73  {.      progress
1fb30 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 31 5b 69   = 1;.      s1[i
1fb40 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 1;.    }.  }
1fb50 0a 20 20 72 65 74 75 72 6e 20 70 72 6f 67 72 65  .  return progre
1fb60 73 73 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ss;.}./*********
1fb70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
1fb80 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74 61 62  om the file "tab
1fb90 6c 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le.c" **********
1fba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1fbb0 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f  **/./*.** All co
1fbc0 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  de in this file 
1fbd0 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61 74  has been automat
1fbe0 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64  ically generated
1fbf0 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65 63 69  .** from a speci
1fc00 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  fication in the 
1fc10 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  file.**         
1fc20 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22 0a 2a       "table.q".*
1fc30 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63 69 61  * by the associa
1fc40 74 69 76 65 20 61 72 72 61 79 20 63 6f 64 65 20  tive array code 
1fc50 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72 61 6d  building program
1fc60 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20   "aagen"..** Do 
1fc70 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20 66 69  not edit this fi
1fc80 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20 65 64  le!  Instead, ed
1fc90 69 74 20 74 68 65 20 73 70 65 63 69 66 69 63 61  it the specifica
1fca0 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  tion.** file, th
1fcb0 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e 2e 0a  en rerun aagen..
1fcc0 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f  */./*.** Code fo
1fcd0 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74 61 62  r processing tab
1fce0 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e  les in the LEMON
1fcf0 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
1fd00 72 2e 0a 2a 2f 0a 0a 50 52 49 56 41 54 45 20 69  r..*/..PRIVATE i
1fd10 6e 74 20 73 74 72 68 61 73 68 28 78 29 0a 63 68  nt strhash(x).ch
1fd20 61 72 20 2a 78 3b 0a 7b 0a 20 20 69 6e 74 20 68  ar *x;.{.  int h
1fd30 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a   = 0;.  while( *
1fd40 78 29 20 68 20 3d 20 68 2a 31 33 20 2b 20 2a 28  x) h = h*13 + *(
1fd50 78 2b 2b 29 3b 0a 20 20 72 65 74 75 72 6e 20 68  x++);.  return h
1fd60 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72 6b 73 20 6c 69  ;.}../* Works li
1fd70 6b 65 20 73 74 72 64 75 70 2c 20 73 6f 72 74 20  ke strdup, sort 
1fd80 6f 66 2e 20 20 53 61 76 65 20 61 20 73 74 72 69  of.  Save a stri
1fd90 6e 67 20 69 6e 20 6d 61 6c 6c 6f 63 65 64 20 6d  ng in malloced m
1fda0 65 6d 6f 72 79 2c 20 62 75 74 0a 2a 2a 20 6b 65  emory, but.** ke
1fdb0 65 70 20 73 74 72 69 6e 67 73 20 69 6e 20 61 20  ep strings in a 
1fdc0 74 61 62 6c 65 20 73 6f 20 74 68 61 74 20 74 68  table so that th
1fdd0 65 20 73 61 6d 65 20 73 74 72 69 6e 67 20 69 73  e same string is
1fde0 20 6e 6f 74 20 69 6e 20 6d 6f 72 65 0a 2a 2a 20   not in more.** 
1fdf0 74 68 61 6e 20 6f 6e 65 20 70 6c 61 63 65 2e 0a  than one place..
1fe00 2a 2f 0a 63 68 61 72 20 2a 53 74 72 73 61 66 65  */.char *Strsafe
1fe10 28 79 29 0a 63 68 61 72 20 2a 79 3b 0a 7b 0a 20  (y).char *y;.{. 
1fe20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28   char *z;..  if(
1fe30 20 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   y==0 ) return 0
1fe40 3b 0a 20 20 7a 20 3d 20 53 74 72 73 61 66 65 5f  ;.  z = Strsafe_
1fe50 66 69 6e 64 28 79 29 3b 0a 20 20 69 66 28 20 7a  find(y);.  if( z
1fe60 3d 3d 30 20 26 26 20 28 7a 3d 6d 61 6c 6c 6f 63  ==0 && (z=malloc
1fe70 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 79 29  ( lemonStrlen(y)
1fe80 2b 31 20 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  +1 ))!=0 ){.    
1fe90 73 74 72 63 70 79 28 7a 2c 79 29 3b 0a 20 20 20  strcpy(z,y);.   
1fea0 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28   Strsafe_insert(
1feb0 7a 29 3b 0a 20 20 7d 0a 20 20 4d 65 6d 6f 72 79  z);.  }.  Memory
1fec0 43 68 65 63 6b 28 7a 29 3b 0a 20 20 72 65 74 75  Check(z);.  retu
1fed0 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72  rn z;.}../* Ther
1fee0 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
1fef0 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
1ff00 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  ng structure for
1ff10 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61   each.** associa
1ff20 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
1ff30 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 73 74 72 75  pe "x1"..*/.stru
1ff40 63 74 20 73 5f 78 31 20 7b 0a 20 20 69 6e 74 20  ct s_x1 {.  int 
1ff50 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
1ff60 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
1ff70 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73  r of available s
1ff80 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lots. */.       
1ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffa0 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20     /*   Must be 
1ffb0 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65  a power of 2 gre
1ffc0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a  ater than or */.
1ffd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65            /*   e
1fff0 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69  qual to 1 */.  i
20000 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20  nt count;       
20010 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
20020 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c   of currently sl
20030 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ots filled */.  
20040 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20  struct s_x1node 
20050 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61  *tbl;  /* The da
20060 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a  ta stored here *
20070 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e  /.  struct s_x1n
20080 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61  ode **ht;  /* Ha
20090 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f  sh table for loo
200a0 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54  kups */.};../* T
200b0 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
200c0 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
200d0 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79  ucture for every
200e0 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a   data element.**
200f0 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69   in an associati
20100 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
20110 20 22 78 31 22 2e 0a 2a 2f 0a 74 79 70 65 64 65   "x1"..*/.typede
20120 66 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64  f struct s_x1nod
20130 65 20 7b 0a 20 20 63 68 61 72 20 2a 64 61 74 61  e {.  char *data
20140 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20150 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
20160 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e  /.  struct s_x1n
20170 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20  ode *next;   /* 
20180 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20  Next entry with 
20190 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f  the same hash */
201a0 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f  .  struct s_x1no
201b0 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50  de **from;  /* P
201c0 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a  revious link */.
201d0 7d 20 78 31 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68  } x1node;../* Th
201e0 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
201f0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
20200 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20  array, which is 
20210 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
20220 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73  .static struct s
20230 5f 78 31 20 2a 78 31 61 3b 0a 0a 2f 2a 20 41 6c  _x1 *x1a;../* Al
20240 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73  locate a new ass
20250 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a  ociative array *
20260 2f 0a 76 6f 69 64 20 53 74 72 73 61 66 65 5f 69  /.void Strsafe_i
20270 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78 31 61  nit(){.  if( x1a
20280 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 31 61   ) return;.  x1a
20290 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 31 2a   = (struct s_x1*
202a0 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
202b0 73 74 72 75 63 74 20 73 5f 78 31 29 20 29 3b 0a  struct s_x1) );.
202c0 20 20 69 66 28 20 78 31 61 20 29 7b 0a 20 20 20    if( x1a ){.   
202d0 20 78 31 61 2d 3e 73 69 7a 65 20 3d 20 31 30 32   x1a->size = 102
202e0 34 3b 0a 20 20 20 20 78 31 61 2d 3e 63 6f 75 6e  4;.    x1a->coun
202f0 74 20 3d 20 30 3b 0a 20 20 20 20 78 31 61 2d 3e  t = 0;.    x1a->
20300 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29 6d  tbl = (x1node*)m
20310 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73  alloc( .      (s
20320 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20  izeof(x1node) + 
20330 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29  sizeof(x1node*))
20340 2a 31 30 32 34 20 29 3b 0a 20 20 20 20 69 66 28  *1024 );.    if(
20350 20 78 31 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a   x1a->tbl==0 ){.
20360 20 20 20 20 20 20 66 72 65 65 28 78 31 61 29 3b        free(x1a);
20370 0a 20 20 20 20 20 20 78 31 61 20 3d 20 30 3b 0a  .      x1a = 0;.
20380 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20390 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 31   int i;.      x1
203a0 61 2d 3e 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a  a->ht = (x1node*
203b0 2a 29 26 28 78 31 61 2d 3e 74 62 6c 5b 31 30 32  *)&(x1a->tbl[102
203c0 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  4]);.      for(i
203d0 3d 30 3b 20 69 3c 31 30 32 34 3b 20 69 2b 2b 29  =0; i<1024; i++)
203e0 20 78 31 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b   x1a->ht[i] = 0;
203f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20  .    }.  }.}./* 
20400 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
20410 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72  ord into the arr
20420 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ay.  Return TRUE
20430 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
20440 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77 69  ** Prior data wi
20450 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
20460 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74  is NOT overwritt
20470 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 72 73 61 66  en */.int Strsaf
20480 65 5f 69 6e 73 65 72 74 28 64 61 74 61 29 0a 63  e_insert(data).c
20490 68 61 72 20 2a 64 61 74 61 3b 0a 7b 0a 20 20 78  har *data;.{.  x
204a0 31 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74  1node *np;.  int
204b0 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20   h;.  int ph;.. 
204c0 20 69 66 28 20 78 31 61 3d 3d 30 20 29 20 72 65   if( x1a==0 ) re
204d0 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73  turn 0;.  ph = s
204e0 74 72 68 61 73 68 28 64 61 74 61 29 3b 0a 20 20  trhash(data);.  
204f0 68 20 3d 20 70 68 20 26 20 28 78 31 61 2d 3e 73  h = ph & (x1a->s
20500 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
20510 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  1a->ht[h];.  whi
20520 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
20530 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74  ( strcmp(np->dat
20540 61 2c 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20  a,data)==0 ){.  
20550 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
20560 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  ng entry with th
20570 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f  e same key is fo
20580 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  und. */.      /*
20590 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76   Fail because ov
205a0 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61  erwrite is not a
205b0 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20  llows. */.      
205c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
205d0 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
205e0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 31 61  t;.  }.  if( x1a
205f0 2d 3e 63 6f 75 6e 74 3e 3d 78 31 61 2d 3e 73 69  ->count>=x1a->si
20600 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65  ze ){.    /* Nee
20610 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61  d to make the ha
20620 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20  sh table bigger 
20630 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a  */.    int i,siz
20640 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f  e;.    struct s_
20650 78 31 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72  x1 array;.    ar
20660 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20  ray.size = size 
20670 3d 20 78 31 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20  = x1a->size*2;. 
20680 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d     array.count =
20690 20 78 31 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20   x1a->count;.   
206a0 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 31   array.tbl = (x1
206b0 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20  node*)malloc(.  
206c0 20 20 20 20 28 73 69 7a 65 6f 66 28 78 31 6e 6f      (sizeof(x1no
206d0 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e  de) + sizeof(x1n
206e0 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20  ode*))*size );. 
206f0 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c     if( array.tbl
20700 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
20710 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20   /* Fail due to 
20720 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a  malloc failure *
20730 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d  /.    array.ht =
20740 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28 61 72 72   (x1node**)&(arr
20750 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20  ay.tbl[size]);. 
20760 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
20770 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68  ze; i++) array.h
20780 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f  t[i] = 0;.    fo
20790 72 28 69 3d 30 3b 20 69 3c 78 31 61 2d 3e 63 6f  r(i=0; i<x1a->co
207a0 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unt; i++){.     
207b0 20 78 31 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20   x1node *oldnp, 
207c0 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c  *newnp;.      ol
207d0 64 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c  dnp = &(x1a->tbl
207e0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20  [i]);.      h = 
207f0 73 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64  strhash(oldnp->d
20800 61 74 61 29 20 26 20 28 73 69 7a 65 2d 31 29 3b  ata) & (size-1);
20810 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26  .      newnp = &
20820 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a  (array.tbl[i]);.
20830 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e        if( array.
20840 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74  ht[h] ) array.ht
20850 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65  [h]->from = &(ne
20860 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20  wnp->next);.    
20870 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20    newnp->next = 
20880 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20  array.ht[h];.   
20890 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d     newnp->data =
208a0 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20   oldnp->data;.  
208b0 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20      newnp->from 
208c0 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29  = &(array.ht[h])
208d0 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74  ;.      array.ht
208e0 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20  [h] = newnp;.   
208f0 20 7d 0a 20 20 20 20 66 72 65 65 28 78 31 61 2d   }.    free(x1a-
20900 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 31 61 20  >tbl);.    *x1a 
20910 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f  = array;.  }.  /
20920 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
20930 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70   data */.  h = p
20940 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31  h & (x1a->size-1
20950 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 31 61 2d  );.  np = &(x1a-
20960 3e 74 62 6c 5b 78 31 61 2d 3e 63 6f 75 6e 74 2b  >tbl[x1a->count+
20970 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20  +]);.  np->data 
20980 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 31  = data;.  if( x1
20990 61 2d 3e 68 74 5b 68 5d 20 29 20 78 31 61 2d 3e  a->ht[h] ) x1a->
209a0 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
209b0 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d  np->next);.  np-
209c0 3e 6e 65 78 74 20 3d 20 78 31 61 2d 3e 68 74 5b  >next = x1a->ht[
209d0 68 5d 3b 0a 20 20 78 31 61 2d 3e 68 74 5b 68 5d  h];.  x1a->ht[h]
209e0 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f   = np;.  np->fro
209f0 6d 20 3d 20 26 28 78 31 61 2d 3e 68 74 5b 68 5d  m = &(x1a->ht[h]
20a00 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
20a10 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
20a20 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73  inter to data as
20a30 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69  signed to the gi
20a40 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e  ven key.  Return
20a50 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73   NULL.** if no s
20a60 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 63 68 61 72  uch key. */.char
20a70 20 2a 53 74 72 73 61 66 65 5f 66 69 6e 64 28 6b   *Strsafe_find(k
20a80 65 79 29 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b  ey).char *key;.{
20a90 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 31 6e 6f  .  int h;.  x1no
20aa0 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78  de *np;..  if( x
20ab0 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  1a==0 ) return 0
20ac0 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73 68 28  ;.  h = strhash(
20ad0 6b 65 79 29 20 26 20 28 78 31 61 2d 3e 73 69 7a  key) & (x1a->siz
20ae0 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61  e-1);.  np = x1a
20af0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
20b00 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
20b10 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c  strcmp(np->data,
20b20 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  key)==0 ) break;
20b30 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
20b40 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
20b50 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a   np ? np->data :
20b60 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   0;.}../* Return
20b70 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
20b80 65 20 28 74 65 72 6d 69 6e 61 6c 20 6f 72 20 6e  e (terminal or n
20b90 6f 6e 74 65 72 6d 69 6e 61 6c 29 20 73 79 6d 62  onterminal) symb
20ba0 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43 72 65 61 74  ol "x"..** Creat
20bb0 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 20 69  e a new symbol i
20bc0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
20bd0 72 73 74 20 74 69 6d 65 20 22 78 22 20 68 61 73  rst time "x" has
20be0 20 62 65 65 6e 20 73 65 65 6e 2e 0a 2a 2f 0a 73   been seen..*/.s
20bf0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
20c00 6d 62 6f 6c 5f 6e 65 77 28 78 29 0a 63 68 61 72  mbol_new(x).char
20c10 20 2a 78 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20   *x;.{.  struct 
20c20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 73  symbol *sp;..  s
20c30 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28  p = Symbol_find(
20c40 78 29 3b 0a 20 20 69 66 28 20 73 70 3d 3d 30 20  x);.  if( sp==0 
20c50 29 7b 0a 20 20 20 20 73 70 20 3d 20 28 73 74 72  ){.    sp = (str
20c60 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 63 61 6c  uct symbol *)cal
20c70 6c 6f 63 28 31 2c 20 73 69 7a 65 6f 66 28 73 74  loc(1, sizeof(st
20c80 72 75 63 74 20 73 79 6d 62 6f 6c 29 20 29 3b 0a  ruct symbol) );.
20c90 20 20 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28      MemoryCheck(
20ca0 73 70 29 3b 0a 20 20 20 20 73 70 2d 3e 6e 61 6d  sp);.    sp->nam
20cb0 65 20 3d 20 53 74 72 73 61 66 65 28 78 29 3b 0a  e = Strsafe(x);.
20cc0 20 20 20 20 73 70 2d 3e 74 79 70 65 20 3d 20 69      sp->type = i
20cd0 73 75 70 70 65 72 28 2a 78 29 20 3f 20 54 45 52  supper(*x) ? TER
20ce0 4d 49 4e 41 4c 20 3a 20 4e 4f 4e 54 45 52 4d 49  MINAL : NONTERMI
20cf0 4e 41 4c 3b 0a 20 20 20 20 73 70 2d 3e 72 75 6c  NAL;.    sp->rul
20d00 65 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 66  e = 0;.    sp->f
20d10 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20  allback = 0;.   
20d20 20 73 70 2d 3e 70 72 65 63 20 3d 20 2d 31 3b 0a   sp->prec = -1;.
20d30 20 20 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20      sp->assoc = 
20d40 55 4e 4b 3b 0a 20 20 20 20 73 70 2d 3e 66 69 72  UNK;.    sp->fir
20d50 73 74 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 73  stset = 0;.    s
20d60 70 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f  p->lambda = LEMO
20d70 4e 5f 46 41 4c 53 45 3b 0a 20 20 20 20 73 70 2d  N_FALSE;.    sp-
20d80 3e 64 65 73 74 72 75 63 74 6f 72 20 3d 20 30 3b  >destructor = 0;
20d90 0a 20 20 20 20 73 70 2d 3e 64 65 73 74 4c 69 6e  .    sp->destLin
20da0 65 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d  eno = 0;.    sp-
20db0 3e 64 61 74 61 74 79 70 65 20 3d 20 30 3b 0a 20  >datatype = 0;. 
20dc0 20 20 20 73 70 2d 3e 75 73 65 43 6e 74 20 3d 20     sp->useCnt = 
20dd0 30 3b 0a 20 20 20 20 53 79 6d 62 6f 6c 5f 69 6e  0;.    Symbol_in
20de0 73 65 72 74 28 73 70 2c 73 70 2d 3e 6e 61 6d 65  sert(sp,sp->name
20df0 29 3b 0a 20 20 7d 0a 20 20 73 70 2d 3e 75 73 65  );.  }.  sp->use
20e00 43 6e 74 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20  Cnt++;.  return 
20e10 73 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72  sp;.}../* Compar
20e20 65 20 74 77 6f 20 73 79 6d 62 6f 6c 73 20 66 6f  e two symbols fo
20e30 72 20 77 6f 72 6b 69 6e 67 20 70 75 72 70 6f 73  r working purpos
20e40 65 73 0a 2a 2a 0a 2a 2a 20 53 79 6d 62 6f 6c 73  es.**.** Symbols
20e50 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
20e60 20 75 70 70 65 72 20 63 61 73 65 20 6c 65 74 74   upper case lett
20e70 65 72 73 20 28 74 65 72 6d 69 6e 61 6c 73 20 6f  ers (terminals o
20e80 72 20 74 6f 6b 65 6e 73 29 0a 2a 2a 20 6d 75 73  r tokens).** mus
20e90 74 20 73 6f 72 74 20 62 65 66 6f 72 65 20 73 79  t sort before sy
20ea0 6d 62 6f 6c 73 20 74 68 61 74 20 62 65 67 69 6e  mbols that begin
20eb0 20 77 69 74 68 20 6c 6f 77 65 72 20 63 61 73 65   with lower case
20ec0 20 6c 65 74 74 65 72 73 0a 2a 2a 20 28 6e 6f 6e   letters.** (non
20ed0 2d 74 65 72 6d 69 6e 61 6c 73 29 2e 20 20 4f 74  -terminals).  Ot
20ee0 68 65 72 20 74 68 61 6e 20 74 68 61 74 2c 20 74  her than that, t
20ef0 68 65 20 6f 72 64 65 72 20 64 6f 65 73 20 6e 6f  he order does no
20f00 74 20 6d 61 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  t matter..**.** 
20f10 57 65 20 66 69 6e 64 20 65 78 70 65 72 69 6d 65  We find experime
20f20 6e 74 61 6c 6c 79 20 74 68 61 74 20 6c 65 61 76  ntally that leav
20f30 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c 73 20  ing the symbols 
20f40 69 6e 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  in their origina
20f50 6c 0a 2a 2a 20 6f 72 64 65 72 20 28 74 68 65 20  l.** order (the 
20f60 6f 72 64 65 72 20 74 68 65 79 20 61 70 70 65 61  order they appea
20f70 72 65 64 20 69 6e 20 74 68 65 20 67 72 61 6d 6d  red in the gramm
20f80 61 72 20 66 69 6c 65 29 20 67 69 76 65 73 20 74  ar file) gives t
20f90 68 65 0a 2a 2a 20 73 6d 61 6c 6c 65 73 74 20 70  he.** smallest p
20fa0 61 72 73 65 72 20 74 61 62 6c 65 73 20 69 6e 20  arser tables in 
20fb0 53 51 4c 69 74 65 2e 0a 2a 2f 0a 69 6e 74 20 53  SQLite..*/.int S
20fc0 79 6d 62 6f 6c 63 6d 70 70 28 73 74 72 75 63 74  ymbolcmpp(struct
20fd0 20 73 79 6d 62 6f 6c 20 2a 2a 61 2c 20 73 74 72   symbol **a, str
20fe0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 62 29 7b  uct symbol **b){
20ff0 0a 20 20 69 6e 74 20 69 31 20 3d 20 28 2a 2a 61  .  int i1 = (**a
21000 29 2e 69 6e 64 65 78 20 2b 20 31 30 30 30 30 30  ).index + 100000
21010 30 30 2a 28 28 2a 2a 61 29 2e 6e 61 6d 65 5b 30  00*((**a).name[0
21020 5d 3e 27 5a 27 29 3b 0a 20 20 69 6e 74 20 69 32  ]>'Z');.  int i2
21030 20 3d 20 28 2a 2a 62 29 2e 69 6e 64 65 78 20 2b   = (**b).index +
21040 20 31 30 30 30 30 30 30 30 2a 28 28 2a 2a 62 29   10000000*((**b)
21050 2e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 29 3b 0a 20  .name[0]>'Z');. 
21060 20 61 73 73 65 72 74 28 20 69 31 21 3d 69 32 20   assert( i1!=i2 
21070 7c 7c 20 73 74 72 63 6d 70 28 28 2a 2a 61 29 2e  || strcmp((**a).
21080 6e 61 6d 65 2c 28 2a 2a 62 29 2e 6e 61 6d 65 29  name,(**b).name)
21090 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
210a0 69 31 2d 69 32 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  i1-i2;.}../* The
210b0 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
210c0 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
210d0 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f  ing structure fo
210e0 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69  r each.** associ
210f0 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
21100 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 73 74 72  ype "x2"..*/.str
21110 75 63 74 20 73 5f 78 32 20 7b 0a 20 20 69 6e 74  uct s_x2 {.  int
21120 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
21130 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
21140 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
21150 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20  slots. */.      
21160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21170 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65      /*   Must be
21180 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72   a power of 2 gr
21190 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f  eater than or */
211a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
211b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
211c0 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20  equal to 1 */.  
211d0 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20  int count;      
211e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
211f0 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73  r of currently s
21200 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20  lots filled */. 
21210 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65   struct s_x2node
21220 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64   *tbl;  /* The d
21230 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20  ata stored here 
21240 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32  */.  struct s_x2
21250 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48  node **ht;  /* H
21260 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f  ash table for lo
21270 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  okups */.};../* 
21280 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
21290 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
212a0 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72  ructure for ever
212b0 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a  y data element.*
212c0 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74  * in an associat
212d0 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
212e0 65 20 22 78 32 22 2e 0a 2a 2f 0a 74 79 70 65 64  e "x2"..*/.typed
212f0 65 66 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f  ef struct s_x2no
21300 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79  de {.  struct sy
21310 6d 62 6f 6c 20 2a 64 61 74 61 3b 20 20 20 20 20  mbol *data;     
21320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21330 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 63 68  The data */.  ch
21340 61 72 20 2a 6b 65 79 3b 20 20 20 20 20 20 20 20  ar *key;        
21350 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
21360 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63  e key */.  struc
21370 74 20 73 5f 78 32 6e 6f 64 65 20 2a 6e 65 78 74  t s_x2node *next
21380 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72  ;   /* Next entr
21390 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
213a0 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74  hash */.  struct
213b0 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 66 72 6f 6d   s_x2node **from
213c0 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c  ;  /* Previous l
213d0 69 6e 6b 20 2a 2f 0a 7d 20 78 32 6e 6f 64 65 3b  ink */.} x2node;
213e0 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
213f0 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  ly one instance 
21400 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68  of the array, wh
21410 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f  ich is the follo
21420 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73  wing */.static s
21430 74 72 75 63 74 20 73 5f 78 32 20 2a 78 32 61 3b  truct s_x2 *x2a;
21440 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
21450 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20  new associative 
21460 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 79  array */.void Sy
21470 6d 62 6f 6c 5f 69 6e 69 74 28 29 7b 0a 20 20 69  mbol_init(){.  i
21480 66 28 20 78 32 61 20 29 20 72 65 74 75 72 6e 3b  f( x2a ) return;
21490 0a 20 20 78 32 61 20 3d 20 28 73 74 72 75 63 74  .  x2a = (struct
214a0 20 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63 28 20 73   s_x2*)malloc( s
214b0 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78  izeof(struct s_x
214c0 32 29 20 29 3b 0a 20 20 69 66 28 20 78 32 61 20  2) );.  if( x2a 
214d0 29 7b 0a 20 20 20 20 78 32 61 2d 3e 73 69 7a 65  ){.    x2a->size
214e0 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 32 61 2d   = 128;.    x2a-
214f0 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  >count = 0;.    
21500 78 32 61 2d 3e 74 62 6c 20 3d 20 28 78 32 6e 6f  x2a->tbl = (x2no
21510 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20  de*)malloc( .   
21520 20 20 20 28 73 69 7a 65 6f 66 28 78 32 6e 6f 64     (sizeof(x2nod
21530 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f  e) + sizeof(x2no
21540 64 65 2a 29 29 2a 31 32 38 20 29 3b 0a 20 20 20  de*))*128 );.   
21550 20 69 66 28 20 78 32 61 2d 3e 74 62 6c 3d 3d 30   if( x2a->tbl==0
21560 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78   ){.      free(x
21570 32 61 29 3b 0a 20 20 20 20 20 20 78 32 61 20 3d  2a);.      x2a =
21580 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
21590 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
215a0 20 20 78 32 61 2d 3e 68 74 20 3d 20 28 78 32 6e    x2a->ht = (x2n
215b0 6f 64 65 2a 2a 29 26 28 78 32 61 2d 3e 74 62 6c  ode**)&(x2a->tbl
215c0 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f  [128]);.      fo
215d0 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b  r(i=0; i<128; i+
215e0 2b 29 20 78 32 61 2d 3e 68 74 5b 69 5d 20 3d 20  +) x2a->ht[i] = 
215f0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f  0;.    }.  }.}./
21600 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72  * Insert a new r
21610 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61  ecord into the a
21620 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52  rray.  Return TR
21630 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  UE if successful
21640 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20  ..** Prior data 
21650 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
21660 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69  y is NOT overwri
21670 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d 62  tten */.int Symb
21680 6f 6c 5f 69 6e 73 65 72 74 28 64 61 74 61 2c 6b  ol_insert(data,k
21690 65 79 29 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  ey).struct symbo
216a0 6c 20 2a 64 61 74 61 3b 0a 63 68 61 72 20 2a 6b  l *data;.char *k
216b0 65 79 3b 0a 7b 0a 20 20 78 32 6e 6f 64 65 20 2a  ey;.{.  x2node *
216c0 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69  np;.  int h;.  i
216d0 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 32  nt ph;..  if( x2
216e0 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
216f0 0a 20 20 70 68 20 3d 20 73 74 72 68 61 73 68 28  .  ph = strhash(
21700 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70 68 20 26  key);.  h = ph &
21710 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x2a->size-1);.
21720 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68    np = x2a->ht[h
21730 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
21740 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
21750 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30  (np->key,key)==0
21760 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
21770 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77  existing entry w
21780 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
21790 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20   is found. */.  
217a0 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61      /* Fail beca
217b0 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73  use overwrite is
217c0 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a   not allows. */.
217d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
217e0 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e      }.    np = n
217f0 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  p->next;.  }.  i
21800 66 28 20 78 32 61 2d 3e 63 6f 75 6e 74 3e 3d 78  f( x2a->count>=x
21810 32 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20  2a->size ){.    
21820 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20  /* Need to make 
21830 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62  the hash table b
21840 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  igger */.    int
21850 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72   i,size;.    str
21860 75 63 74 20 73 5f 78 32 20 61 72 72 61 79 3b 0a  uct s_x2 array;.
21870 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d      array.size =
21880 20 73 69 7a 65 20 3d 20 78 32 61 2d 3e 73 69 7a   size = x2a->siz
21890 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63  e*2;.    array.c
218a0 6f 75 6e 74 20 3d 20 78 32 61 2d 3e 63 6f 75 6e  ount = x2a->coun
218b0 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c  t;.    array.tbl
218c0 20 3d 20 28 78 32 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x2node*)mall
218d0 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f  oc(.      (sizeo
218e0 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x2node) + size
218f0 6f 66 28 78 32 6e 6f 64 65 2a 29 29 2a 73 69 7a  of(x2node*))*siz
21900 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72  e );.    if( arr
21910 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75  ay.tbl==0 ) retu
21920 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64  rn 0;  /* Fail d
21930 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69  ue to malloc fai
21940 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61  lure */.    arra
21950 79 2e 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a  y.ht = (x2node**
21960 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a  )&(array.tbl[siz
21970 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e]);.    for(i=0
21980 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61  ; i<size; i++) a
21990 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a  rray.ht[i] = 0;.
219a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78      for(i=0; i<x
219b0 32 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b  2a->count; i++){
219c0 0a 20 20 20 20 20 20 78 32 6e 6f 64 65 20 2a 6f  .      x2node *o
219d0 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20  ldnp, *newnp;.  
219e0 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 32      oldnp = &(x2
219f0 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  a->tbl[i]);.    
21a00 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6f 6c    h = strhash(ol
21a10 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 73 69 7a  dnp->key) & (siz
21a20 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  e-1);.      newn
21a30 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b  p = &(array.tbl[
21a40 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  i]);.      if( a
21a50 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72  rray.ht[h] ) arr
21a60 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  ay.ht[h]->from =
21a70 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b   &(newnp->next);
21a80 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65  .      newnp->ne
21a90 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d  xt = array.ht[h]
21aa0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b  ;.      newnp->k
21ab0 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b  ey = oldnp->key;
21ac0 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61  .      newnp->da
21ad0 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61  ta = oldnp->data
21ae0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66  ;.      newnp->f
21af0 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74  rom = &(array.ht
21b00 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61  [h]);.      arra
21b10 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b  y.ht[h] = newnp;
21b20 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
21b30 78 32 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a  x2a->tbl);.    *
21b40 78 32 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d  x2a = array;.  }
21b50 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
21b60 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68   new data */.  h
21b70 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69   = ph & (x2a->si
21b80 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28  ze-1);.  np = &(
21b90 78 32 61 2d 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f  x2a->tbl[x2a->co
21ba0 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b  unt++]);.  np->k
21bb0 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e  ey = key;.  np->
21bc0 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69  data = data;.  i
21bd0 66 28 20 78 32 61 2d 3e 68 74 5b 68 5d 20 29 20  f( x2a->ht[h] ) 
21be0 78 32 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  x2a->ht[h]->from
21bf0 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a   = &(np->next);.
21c00 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 32 61    np->next = x2a
21c10 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e  ->ht[h];.  x2a->
21c20 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70  ht[h] = np;.  np
21c30 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 32 61 2d 3e  ->from = &(x2a->
21c40 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ht[h]);.  return
21c50 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   1;.}../* Return
21c60 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
21c70 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ta assigned to t
21c80 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52  he given key.  R
21c90 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
21ca0 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f   no such key. */
21cb0 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
21cc0 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6b 65 79 29  Symbol_find(key)
21cd0 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20  .char *key;.{.  
21ce0 69 6e 74 20 68 3b 0a 20 20 78 32 6e 6f 64 65 20  int h;.  x2node 
21cf0 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d  *np;..  if( x2a=
21d00 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
21d10 20 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79   h = strhash(key
21d20 29 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31  ) & (x2a->size-1
21d30 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68  );.  np = x2a->h
21d40 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
21d50 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  p ){.    if( str
21d60 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29  cmp(np->key,key)
21d70 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
21d80 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
21d90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20    }.  return np 
21da0 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a  ? np->data : 0;.
21db0 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  }../* Return the
21dc0 20 6e 2d 74 68 20 64 61 74 61 2e 20 20 52 65 74   n-th data.  Ret
21dd0 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 20 69 73  urn NULL if n is
21de0 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 2a   out of range. *
21df0 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  /.struct symbol 
21e00 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 6e 29 0a 69  *Symbol_Nth(n).i
21e10 6e 74 20 6e 3b 0a 7b 0a 20 20 73 74 72 75 63 74  nt n;.{.  struct
21e20 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a 20   symbol *data;. 
21e30 20 69 66 28 20 78 32 61 20 26 26 20 6e 3e 30 20   if( x2a && n>0 
21e40 26 26 20 6e 3c 3d 78 32 61 2d 3e 63 6f 75 6e 74  && n<=x2a->count
21e50 20 29 7b 0a 20 20 20 20 64 61 74 61 20 3d 20 78   ){.    data = x
21e60 32 61 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e 64 61 74  2a->tbl[n-1].dat
21e70 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
21e80 64 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  data = 0;.  }.  
21e90 72 65 74 75 72 6e 20 64 61 74 61 3b 0a 7d 0a 0a  return data;.}..
21ea0 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  /* Return the si
21eb0 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ze of the array 
21ec0 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f  */.int Symbol_co
21ed0 75 6e 74 28 29 0a 7b 0a 20 20 72 65 74 75 72 6e  unt().{.  return
21ee0 20 78 32 61 20 3f 20 78 32 61 2d 3e 63 6f 75 6e   x2a ? x2a->coun
21ef0 74 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  t : 0;.}../* Ret
21f00 75 72 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20  urn an array of 
21f10 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20  pointers to all 
21f20 64 61 74 61 20 69 6e 20 74 68 65 20 74 61 62 6c  data in the tabl
21f30 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72 61 79 20  e..** The array 
21f40 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
21f50 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e   malloc.  Return
21f60 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20   NULL if memory 
21f70 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72  allocation.** pr
21f80 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74 68  oblems, or if th
21f90 65 20 61 72 72 61 79 20 69 73 20 65 6d 70 74 79  e array is empty
21fa0 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62  . */.struct symb
21fb0 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72 61  ol **Symbol_arra
21fc0 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75 63 74  yof().{.  struct
21fd0 20 73 79 6d 62 6f 6c 20 2a 2a 61 72 72 61 79 3b   symbol **array;
21fe0 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20  .  int i,size;. 
21ff0 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65   if( x2a==0 ) re
22000 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65 20 3d  turn 0;.  size =
22010 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61   x2a->count;.  a
22020 72 72 61 79 20 3d 20 28 73 74 72 75 63 74 20 73  rray = (struct s
22030 79 6d 62 6f 6c 20 2a 2a 29 63 61 6c 6c 6f 63 28  ymbol **)calloc(
22040 73 69 7a 65 2c 20 73 69 7a 65 6f 66 28 73 74 72  size, sizeof(str
22050 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 29 3b 0a  uct symbol *));.
22060 20 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a 20    if( array ){. 
22070 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
22080 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b 69  ze; i++) array[i
22090 5d 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 69 5d 2e  ] = x2a->tbl[i].
220a0 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75  data;.  }.  retu
220b0 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20  rn array;.}../* 
220c0 43 6f 6d 70 61 72 65 20 74 77 6f 20 63 6f 6e 66  Compare two conf
220d0 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 69 6e  igurations */.in
220e0 74 20 43 6f 6e 66 69 67 63 6d 70 28 61 2c 62 29  t Configcmp(a,b)
220f0 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
22100 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  a;.struct config
22110 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20 78 3b 0a   *b;.{.  int x;.
22120 20 20 78 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64    x = a->rp->ind
22130 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65  ex - b->rp->inde
22140 78 3b 0a 20 20 69 66 28 20 78 3d 3d 30 20 29 20  x;.  if( x==0 ) 
22150 78 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e  x = a->dot - b->
22160 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 78 3b  dot;.  return x;
22170 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74  .}../* Compare t
22180 77 6f 20 73 74 61 74 65 73 20 2a 2f 0a 50 52 49  wo states */.PRI
22190 56 41 54 45 20 69 6e 74 20 73 74 61 74 65 63 6d  VATE int statecm
221a0 70 28 61 2c 62 29 0a 73 74 72 75 63 74 20 63 6f  p(a,b).struct co
221b0 6e 66 69 67 20 2a 61 3b 0a 73 74 72 75 63 74 20  nfig *a;.struct 
221c0 63 6f 6e 66 69 67 20 2a 62 3b 0a 7b 0a 20 20 69  config *b;.{.  i
221d0 6e 74 20 72 63 3b 0a 20 20 66 6f 72 28 72 63 3d  nt rc;.  for(rc=
221e0 30 3b 20 72 63 3d 3d 30 20 26 26 20 61 20 26 26  0; rc==0 && a &&
221f0 20 62 3b 20 20 61 3d 61 2d 3e 62 70 2c 20 62 3d   b;  a=a->bp, b=
22200 62 2d 3e 62 70 29 7b 0a 20 20 20 20 72 63 20 3d  b->bp){.    rc =
22210 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20   a->rp->index - 
22220 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20  b->rp->index;.  
22230 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63    if( rc==0 ) rc
22240 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64   = a->dot - b->d
22250 6f 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ot;.  }.  if( rc
22260 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 61  ==0 ){.    if( a
22270 20 29 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 69   ) rc = 1;.    i
22280 66 28 20 62 20 29 20 72 63 20 3d 20 2d 31 3b 0a  f( b ) rc = -1;.
22290 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
222a0 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 73 74  .}../* Hash a st
222b0 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 69  ate */.PRIVATE i
222c0 6e 74 20 73 74 61 74 65 68 61 73 68 28 61 29 0a  nt statehash(a).
222d0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61  struct config *a
222e0 3b 0a 7b 0a 20 20 69 6e 74 20 68 3d 30 3b 0a 20  ;.{.  int h=0;. 
222f0 20 77 68 69 6c 65 28 20 61 20 29 7b 0a 20 20 20   while( a ){.   
22300 20 68 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e   h = h*571 + a->
22310 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61  rp->index*37 + a
22320 2d 3e 64 6f 74 3b 0a 20 20 20 20 61 20 3d 20 61  ->dot;.    a = a
22330 2d 3e 62 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ->bp;.  }.  retu
22340 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f  rn h;.}../* Allo
22350 63 61 74 65 20 61 20 6e 65 77 20 73 74 61 74 65  cate a new state
22360 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 73 74   structure */.st
22370 72 75 63 74 20 73 74 61 74 65 20 2a 53 74 61 74  ruct state *Stat
22380 65 5f 6e 65 77 28 29 0a 7b 0a 20 20 73 74 72 75  e_new().{.  stru
22390 63 74 20 73 74 61 74 65 20 2a 6e 65 77 3b 0a 20  ct state *new;. 
223a0 20 6e 65 77 20 3d 20 28 73 74 72 75 63 74 20 73   new = (struct s
223b0 74 61 74 65 20 2a 29 63 61 6c 6c 6f 63 28 31 2c  tate *)calloc(1,
223c0 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
223d0 74 61 74 65 29 20 29 3b 0a 20 20 4d 65 6d 6f 72  tate) );.  Memor
223e0 79 43 68 65 63 6b 28 6e 65 77 29 3b 0a 20 20 72  yCheck(new);.  r
223f0 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a  eturn new;.}../*
22400 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
22410 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
22420 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
22430 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73  e for each.** as
22440 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
22450 6f 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f  of type "x3"..*/
22460 0a 73 74 72 75 63 74 20 73 5f 78 33 20 7b 0a 20  .struct s_x3 {. 
22470 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
22480 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22490 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
224a0 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20  ble slots. */.  
224b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224c0 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73          /*   Mus
224d0 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
224e0 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  2 greater than o
224f0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  r */.           
22500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22510 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a  *   equal to 1 *
22520 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20  /.  int count;  
22530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22540 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74  umber of current
22550 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20  ly slots filled 
22560 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33  */.  struct s_x3
22570 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54  node *tbl;  /* T
22580 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68  he data stored h
22590 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ere */.  struct 
225a0 73 5f 78 33 6e 6f 64 65 20 2a 2a 68 74 3b 20 20  s_x3node **ht;  
225b0 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f  /* Hash table fo
225c0 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a  r lookups */.};.
225d0 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  ./* There is one
225e0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
225f0 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  s structure for 
22600 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65  every data eleme
22610 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f  nt.** in an asso
22620 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66  ciative array of
22630 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 74   type "x3"..*/.t
22640 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f  ypedef struct s_
22650 78 33 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63  x3node {.  struc
22660 74 20 73 74 61 74 65 20 2a 64 61 74 61 3b 20 20  t state *data;  
22670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22680 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
22690 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
226a0 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  key;            
226b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65         /* The ke
226c0 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  y */.  struct s_
226d0 78 33 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20  x3node *next;   
226e0 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69  /* Next entry wi
226f0 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
22700 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
22710 33 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f  3node **from;  /
22720 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20  * Previous link 
22730 2a 2f 0a 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f 2a  */.} x3node;../*
22740 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   There is only o
22750 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
22760 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  he array, which 
22770 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  is the following
22780 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
22790 74 20 73 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f 2a  t s_x3 *x3a;../*
227a0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
227b0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
227c0 79 20 2a 2f 0a 76 6f 69 64 20 53 74 61 74 65 5f  y */.void State_
227d0 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78 33  init(){.  if( x3
227e0 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 33  a ) return;.  x3
227f0 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 33  a = (struct s_x3
22800 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)malloc( sizeof
22810 28 73 74 72 75 63 74 20 73 5f 78 33 29 20 29 3b  (struct s_x3) );
22820 0a 20 20 69 66 28 20 78 33 61 20 29 7b 0a 20 20  .  if( x3a ){.  
22830 20 20 78 33 61 2d 3e 73 69 7a 65 20 3d 20 31 32    x3a->size = 12
22840 38 3b 0a 20 20 20 20 78 33 61 2d 3e 63 6f 75 6e  8;.    x3a->coun
22850 74 20 3d 20 30 3b 0a 20 20 20 20 78 33 61 2d 3e  t = 0;.    x3a->
22860 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 6d  tbl = (x3node*)m
22870 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73  alloc( .      (s
22880 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20  izeof(x3node) + 
22890 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29  sizeof(x3node*))
228a0 2a 31 32 38 20 29 3b 0a 20 20 20 20 69 66 28 20  *128 );.    if( 
228b0 78 33 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20  x3a->tbl==0 ){. 
228c0 20 20 20 20 20 66 72 65 65 28 78 33 61 29 3b 0a       free(x3a);.
228d0 20 20 20 20 20 20 78 33 61 20 3d 20 30 3b 0a 20        x3a = 0;. 
228e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
228f0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 33 61  int i;.      x3a
22900 2d 3e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a  ->ht = (x3node**
22910 29 26 28 78 33 61 2d 3e 74 62 6c 5b 31 32 38 5d  )&(x3a->tbl[128]
22920 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
22930 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78 33  ; i<128; i++) x3
22940 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  a->ht[i] = 0;.  
22950 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73    }.  }.}./* Ins
22960 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
22970 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e   into the array.
22980 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
22990 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20   successful..** 
229a0 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20  Prior data with 
229b0 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
229c0 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20  NOT overwritten 
229d0 2a 2f 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73  */.int State_ins
229e0 65 72 74 28 64 61 74 61 2c 6b 65 79 29 0a 73 74  ert(data,key).st
229f0 72 75 63 74 20 73 74 61 74 65 20 2a 64 61 74 61  ruct state *data
22a00 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
22a10 2a 6b 65 79 3b 0a 7b 0a 20 20 78 33 6e 6f 64 65  *key;.{.  x3node
22a20 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20   *np;.  int h;. 
22a30 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20   int ph;..  if( 
22a40 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x3a==0 ) return 
22a50 30 3b 0a 20 20 70 68 20 3d 20 73 74 61 74 65 68  0;.  ph = stateh
22a60 61 73 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20  ash(key);.  h = 
22a70 70 68 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d  ph & (x3a->size-
22a80 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e  1);.  np = x3a->
22a90 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
22aa0 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  np ){.    if( st
22ab0 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b  atecmp(np->key,k
22ac0 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ey)==0 ){.      
22ad0 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65  /* An existing e
22ae0 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
22af0 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e  me key is found.
22b00 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69   */.      /* Fai
22b10 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72  l because overwr
22b20 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ite is not allow
22b30 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  s. */.      retu
22b40 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
22b50 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
22b60 20 7d 0a 20 20 69 66 28 20 78 33 61 2d 3e 63 6f   }.  if( x3a->co
22b70 75 6e 74 3e 3d 78 33 61 2d 3e 73 69 7a 65 20 29  unt>=x3a->size )
22b80 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
22b90 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
22ba0 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20  able bigger */. 
22bb0 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20     int i,size;. 
22bc0 20 20 20 73 74 72 75 63 74 20 73 5f 78 33 20 61     struct s_x3 a
22bd0 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e  rray;.    array.
22be0 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 33  size = size = x3
22bf0 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61  a->size*2;.    a
22c00 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 33 61  rray.count = x3a
22c10 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72  ->count;.    arr
22c20 61 79 2e 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65  ay.tbl = (x3node
22c30 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  *)malloc(.      
22c40 28 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20  (sizeof(x3node) 
22c50 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a  + sizeof(x3node*
22c60 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69  ))*size );.    i
22c70 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20  f( array.tbl==0 
22c80 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
22c90 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c  Fail due to mall
22ca0 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20  oc failure */.  
22cb0 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 33    array.ht = (x3
22cc0 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74  node**)&(array.t
22cd0 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66  bl[size]);.    f
22ce0 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20  or(i=0; i<size; 
22cf0 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d  i++) array.ht[i]
22d00 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
22d10 30 3b 20 69 3c 78 33 61 2d 3e 63 6f 75 6e 74 3b  0; i<x3a->count;
22d20 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 33 6e   i++){.      x3n
22d30 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77  ode *oldnp, *new
22d40 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20  np;.      oldnp 
22d50 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 69 5d 29  = &(x3a->tbl[i])
22d60 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74 61 74  ;.      h = stat
22d70 65 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79  ehash(oldnp->key
22d80 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20  ) & (size-1);.  
22d90 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72      newnp = &(ar
22da0 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  ray.tbl[i]);.   
22db0 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b     if( array.ht[
22dc0 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d  h] ) array.ht[h]
22dd0 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70  ->from = &(newnp
22de0 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ->next);.      n
22df0 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72  ewnp->next = arr
22e00 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20  ay.ht[h];.      
22e10 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64  newnp->key = old
22e20 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e  np->key;.      n
22e30 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64  ewnp->data = old
22e40 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20  np->data;.      
22e50 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  newnp->from = &(
22e60 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20  array.ht[h]);.  
22e70 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20      array.ht[h] 
22e80 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20  = newnp;.    }. 
22e90 20 20 20 66 72 65 65 28 78 33 61 2d 3e 74 62 6c     free(x3a->tbl
22ea0 29 3b 0a 20 20 20 20 2a 78 33 61 20 3d 20 61 72  );.    *x3a = ar
22eb0 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e  ray;.  }.  /* In
22ec0 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74  sert the new dat
22ed0 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20  a */.  h = ph & 
22ee0 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x3a->size-1);. 
22ef0 20 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c   np = &(x3a->tbl
22f00 5b 78 33 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b  [x3a->count++]);
22f10 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79  .  np->key = key
22f20 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64  ;.  np->data = d
22f30 61 74 61 3b 0a 20 20 69 66 28 20 78 33 61 2d 3e  ata;.  if( x3a->
22f40 68 74 5b 68 5d 20 29 20 78 33 61 2d 3e 68 74 5b  ht[h] ) x3a->ht[
22f50 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d  h]->from = &(np-
22f60 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65  >next);.  np->ne
22f70 78 74 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b  xt = x3a->ht[h];
22f80 0a 20 20 78 33 61 2d 3e 68 74 5b 68 5d 20 3d 20  .  x3a->ht[h] = 
22f90 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d  np;.  np->from =
22fa0 20 26 28 78 33 61 2d 3e 68 74 5b 68 5d 29 3b 0a   &(x3a->ht[h]);.
22fb0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
22fc0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
22fd0 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67  er to data assig
22fe0 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ned to the given
22ff0 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55   key.  Return NU
23000 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68  LL.** if no such
23010 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20   key. */.struct 
23020 73 74 61 74 65 20 2a 53 74 61 74 65 5f 66 69 6e  state *State_fin
23030 64 28 6b 65 79 29 0a 73 74 72 75 63 74 20 63 6f  d(key).struct co
23040 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69  nfig *key;.{.  i
23050 6e 74 20 68 3b 0a 20 20 78 33 6e 6f 64 65 20 2a  nt h;.  x3node *
23060 6e 70 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d  np;..  if( x3a==
23070 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
23080 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65  h = statehash(ke
23090 79 29 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d  y) & (x3a->size-
230a0 31 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e  1);.  np = x3a->
230b0 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
230c0 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  np ){.    if( st
230d0 61 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b  atecmp(np->key,k
230e0 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ey)==0 ) break;.
230f0 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
23100 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
23110 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20  np ? np->data : 
23120 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  0;.}../* Return 
23130 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
23140 74 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61  ters to all data
23150 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
23160 2a 20 54 68 65 20 61 72 72 61 79 20 69 73 20 6f  * The array is o
23170 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
23180 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  loc.  Return NUL
23190 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  L if memory allo
231a0 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65  cation.** proble
231b0 6d 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72  ms, or if the ar
231c0 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f  ray is empty. */
231d0 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a  .struct state **
231e0 53 74 61 74 65 5f 61 72 72 61 79 6f 66 28 29 0a  State_arrayof().
231f0 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  {.  struct state
23200 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74 20   **array;.  int 
23210 69 2c 73 69 7a 65 3b 0a 20 20 69 66 28 20 78 33  i,size;.  if( x3
23220 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
23230 0a 20 20 73 69 7a 65 20 3d 20 78 33 61 2d 3e 63  .  size = x3a->c
23240 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20  ount;.  array = 
23250 28 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a  (struct state **
23260 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
23270 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 2a  struct state *)*
23280 73 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 61 72  size );.  if( ar
23290 72 61 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ray ){.    for(i
232a0 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29  =0; i<size; i++)
232b0 20 61 72 72 61 79 5b 69 5d 20 3d 20 78 33 61 2d   array[i] = x3a-
232c0 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20  >tbl[i].data;.  
232d0 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 72 61 79  }.  return array
232e0 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 63  ;.}../* Hash a c
232f0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a  onfiguration */.
23300 50 52 49 56 41 54 45 20 69 6e 74 20 63 6f 6e 66  PRIVATE int conf
23310 69 67 68 61 73 68 28 61 29 0a 73 74 72 75 63 74  ighash(a).struct
23320 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 7b 0a 20 20   config *a;.{.  
23330 69 6e 74 20 68 3d 30 3b 0a 20 20 68 20 3d 20 68  int h=0;.  h = h
23340 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e  *571 + a->rp->in
23350 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b  dex*37 + a->dot;
23360 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a  .  return h;.}..
23370 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
23380 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
23390 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
233a0 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  ure for each.** 
233b0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
233c0 79 20 6f 66 20 74 79 70 65 20 22 78 34 22 2e 0a  y of type "x4"..
233d0 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 34 20 7b  */.struct s_x4 {
233e0 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
233f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
23400 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
23410 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a  lable slots. */.
23420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d            /*   M
23440 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
23450 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e  f 2 greater than
23460 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   or */.         
23470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23480 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31   /*   equal to 1
23490 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b   */.  int count;
234a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
234b0 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65   Number of curre
234c0 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65  ntly slots fille
234d0 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  d */.  struct s_
234e0 78 34 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a  x4node *tbl;  /*
234f0 20 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64   The data stored
23500 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63   here */.  struc
23510 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 68 74 3b  t s_x4node **ht;
23520 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
23530 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d  for lookups */.}
23540 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
23550 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
23560 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f  his structure fo
23570 72 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65  r every data ele
23580 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73  ment.** in an as
23590 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
235a0 6f 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f  of type "x4"..*/
235b0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
235c0 73 5f 78 34 6e 6f 64 65 20 7b 0a 20 20 73 74 72  s_x4node {.  str
235d0 75 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74 61  uct config *data
235e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
235f0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
23600 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e  /.  struct s_x4n
23610 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20  ode *next;   /* 
23620 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20  Next entry with 
23630 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f  the same hash */
23640 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f  .  struct s_x4no
23650 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50  de **from;  /* P
23660 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a  revious link */.
23670 7d 20 78 34 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68  } x4node;../* Th
23680 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
23690 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
236a0 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20  array, which is 
236b0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
236c0 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73  .static struct s
236d0 5f 78 34 20 2a 78 34 61 3b 0a 0a 2f 2a 20 41 6c  _x4 *x4a;../* Al
236e0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73  locate a new ass
236f0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a  ociative array *
23700 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62  /.void Configtab
23710 6c 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28  le_init(){.  if(
23720 20 78 34 61 20 29 20 72 65 74 75 72 6e 3b 0a 20   x4a ) return;. 
23730 20 78 34 61 20 3d 20 28 73 74 72 75 63 74 20 73   x4a = (struct s
23740 5f 78 34 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a  _x4*)malloc( siz
23750 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 34 29  eof(struct s_x4)
23760 20 29 3b 0a 20 20 69 66 28 20 78 34 61 20 29 7b   );.  if( x4a ){
23770 0a 20 20 20 20 78 34 61 2d 3e 73 69 7a 65 20 3d  .    x4a->size =
23780 20 36 34 3b 0a 20 20 20 20 78 34 61 2d 3e 63 6f   64;.    x4a->co
23790 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 34 61  unt = 0;.    x4a
237a0 2d 3e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a  ->tbl = (x4node*
237b0 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20  )malloc( .      
237c0 28 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20  (sizeof(x4node) 
237d0 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a  + sizeof(x4node*
237e0 29 29 2a 36 34 20 29 3b 0a 20 20 20 20 69 66 28  ))*64 );.    if(
237f0 20 78 34 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a   x4a->tbl==0 ){.
23800 20 20 20 20 20 20 66 72 65 65 28 78 34 61 29 3b        free(x4a);
23810 0a 20 20 20 20 20 20 78 34 61 20 3d 20 30 3b 0a  .      x4a = 0;.
23820 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23830 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 34   int i;.      x4
23840 61 2d 3e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a  a->ht = (x4node*
23850 2a 29 26 28 78 34 61 2d 3e 74 62 6c 5b 36 34 5d  *)&(x4a->tbl[64]
23860 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
23870 3b 20 69 3c 36 34 3b 20 69 2b 2b 29 20 78 34 61  ; i<64; i++) x4a
23880 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  ->ht[i] = 0;.   
23890 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65   }.  }.}./* Inse
238a0 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
238b0 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20  into the array. 
238c0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
238d0 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50  successful..** P
238e0 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74  rior data with t
238f0 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e  he same key is N
23900 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a  OT overwritten *
23910 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c  /.int Configtabl
23920 65 5f 69 6e 73 65 72 74 28 64 61 74 61 29 0a 73  e_insert(data).s
23930 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64 61  truct config *da
23940 74 61 3b 0a 7b 0a 20 20 78 34 6e 6f 64 65 20 2a  ta;.{.  x4node *
23950 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69  np;.  int h;.  i
23960 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 34  nt ph;..  if( x4
23970 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
23980 0a 20 20 70 68 20 3d 20 63 6f 6e 66 69 67 68 61  .  ph = configha
23990 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d 20  sh(data);.  h = 
239a0 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d  ph & (x4a->size-
239b0 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e  1);.  np = x4a->
239c0 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20  ht[h];.  while( 
239d0 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 43 6f  np ){.    if( Co
239e0 6e 66 69 67 63 6d 70 28 6e 70 2d 3e 64 61 74 61  nfigcmp(np->data
239f0 2c 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20  ,data)==0 ){.   
23a00 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
23a10 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  g entry with the
23a20 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75   same key is fou
23a30 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  nd. */.      /* 
23a40 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65  Fail because ove
23a50 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c  rwrite is not al
23a60 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72  lows. */.      r
23a70 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
23a80 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
23a90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 34 61 2d  ;.  }.  if( x4a-
23aa0 3e 63 6f 75 6e 74 3e 3d 78 34 61 2d 3e 73 69 7a  >count>=x4a->siz
23ab0 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64  e ){.    /* Need
23ac0 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73   to make the has
23ad0 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a  h table bigger *
23ae0 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65  /.    int i,size
23af0 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78  ;.    struct s_x
23b00 34 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72  4 array;.    arr
23b10 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d  ay.size = size =
23b20 20 78 34 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20   x4a->size*2;.  
23b30 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20    array.count = 
23b40 78 34 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20  x4a->count;.    
23b50 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 34 6e  array.tbl = (x4n
23b60 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20  ode*)malloc(.   
23b70 20 20 20 28 73 69 7a 65 6f 66 28 78 34 6e 6f 64     (sizeof(x4nod
23b80 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f  e) + sizeof(x4no
23b90 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20  de*))*size );.  
23ba0 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d    if( array.tbl=
23bb0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =0 ) return 0;  
23bc0 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d  /* Fail due to m
23bd0 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f  alloc failure */
23be0 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20  .    array.ht = 
23bf0 28 78 34 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61  (x4node**)&(arra
23c00 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20  y.tbl[size]);.  
23c10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
23c20 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74  e; i++) array.ht
23c30 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  [i] = 0;.    for
23c40 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75  (i=0; i<x4a->cou
23c50 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  nt; i++){.      
23c60 78 34 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a  x4node *oldnp, *
23c70 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64  newnp;.      old
23c80 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b  np = &(x4a->tbl[
23c90 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 63  i]);.      h = c
23ca0 6f 6e 66 69 67 68 61 73 68 28 6f 6c 64 6e 70 2d  onfighash(oldnp-
23cb0 3e 64 61 74 61 29 20 26 20 28 73 69 7a 65 2d 31  >data) & (size-1
23cc0 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d  );.      newnp =
23cd0 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29   &(array.tbl[i])
23ce0 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61  ;.      if( arra
23cf0 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e  y.ht[h] ) array.
23d00 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
23d10 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20  newnp->next);.  
23d20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20      newnp->next 
23d30 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20  = array.ht[h];. 
23d40 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61       newnp->data
23d50 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a   = oldnp->data;.
23d60 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f        newnp->fro
23d70 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68  m = &(array.ht[h
23d80 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e  ]);.      array.
23d90 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20  ht[h] = newnp;. 
23da0 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 34     }.    free(x4
23db0 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 34  a->tbl);.    *x4
23dc0 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20  a = array;.  }. 
23dd0 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e   /* Insert the n
23de0 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d  ew data */.  h =
23df0 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65   ph & (x4a->size
23e00 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 34  -1);.  np = &(x4
23e10 61 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63 6f 75 6e  a->tbl[x4a->coun
23e20 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74  t++]);.  np->dat
23e30 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20  a = data;.  if( 
23e40 78 34 61 2d 3e 68 74 5b 68 5d 20 29 20 78 34 61  x4a->ht[h] ) x4a
23e50 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  ->ht[h]->from = 
23e60 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e  &(np->next);.  n
23e70 70 2d 3e 6e 65 78 74 20 3d 20 78 34 61 2d 3e 68  p->next = x4a->h
23e80 74 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e 68 74 5b  t[h];.  x4a->ht[
23e90 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66  h] = np;.  np->f
23ea0 72 6f 6d 20 3d 20 26 28 78 34 61 2d 3e 68 74 5b  rom = &(x4a->ht[
23eb0 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  h]);.  return 1;
23ec0 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
23ed0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
23ee0 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20  assigned to the 
23ef0 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75  given key.  Retu
23f00 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f  rn NULL.** if no
23f10 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74   such key. */.st
23f20 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
23f30 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 6b 65  figtable_find(ke
23f40 79 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  y).struct config
23f50 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68   *key;.{.  int h
23f60 3b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a  ;.  x4node *np;.
23f70 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20  .  if( x4a==0 ) 
23f80 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20  return 0;.  h = 
23f90 63 6f 6e 66 69 67 68 61 73 68 28 6b 65 79 29 20  confighash(key) 
23fa0 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x4a->size-1);
23fb0 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b  .  np = x4a->ht[
23fc0 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
23fd0 29 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69  ){.    if( Confi
23fe0 67 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65  gcmp(np->data,ke
23ff0 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  y)==0 ) break;. 
24000 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
24010 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
24020 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30  p ? np->data : 0
24030 3b 0a 7d 0a 0a 2f 2a 20 52 65 6d 6f 76 65 20 61  ;.}../* Remove a
24040 6c 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ll data from the
24050 20 74 61 62 6c 65 2e 20 20 50 61 73 73 20 65 61   table.  Pass ea
24060 63 68 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  ch data to the f
24070 75 6e 63 74 69 6f 6e 20 22 66 22 0a 2a 2a 20 61  unction "f".** a
24080 73 20 69 74 20 69 73 20 72 65 6d 6f 76 65 64 2e  s it is removed.
24090 20 20 28 22 66 22 20 6d 61 79 20 62 65 20 6e 75    ("f" may be nu
240a0 6c 6c 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73  ll to avoid this
240b0 20 73 74 65 70 2e 29 20 2a 2f 0a 76 6f 69 64 20   step.) */.void 
240c0 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61  Configtable_clea
240d0 72 28 66 29 0a 69 6e 74 28 2a 66 29 28 2f 2a 20  r(f).int(*f)(/* 
240e0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
240f0 2a 2f 29 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  */);.{.  int i;.
24100 20 20 69 66 28 20 78 34 61 3d 3d 30 20 7c 7c 20    if( x4a==0 || 
24110 78 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30 20 29 20  x4a->count==0 ) 
24120 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 66 20  return;.  if( f 
24130 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61  ) for(i=0; i<x4a
24140 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 28 2a  ->count; i++) (*
24150 66 29 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 2e 64  f)(x4a->tbl[i].d
24160 61 74 61 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ata);.  for(i=0;
24170 20 69 3c 78 34 61 2d 3e 73 69 7a 65 3b 20 69 2b   i<x4a->size; i+
24180 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20  +) x4a->ht[i] = 
24190 30 3b 0a 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20  0;.  x4a->count 
241a0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  = 0;.  return;.}
241b0 0a                                               .