/ Hex Artifact Content
Login

Artifact 0f65442d1c99a865525658a47ddf292f4ac2ec54:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
0010: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 6f 75  contains all sou
0020: 72 63 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  rces (including 
0030: 68 65 61 64 65 72 73 29 20 74 6f 20 74 68 65 20  headers) to the 
0040: 4c 45 4d 4f 4e 0a 2a 2a 20 4c 41 4c 52 28 31 29  LEMON.** LALR(1)
0050: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0060: 72 2e 20 20 54 68 65 20 73 6f 75 72 63 65 73 20  r.  The sources 
0070: 68 61 76 65 20 62 65 65 6e 20 63 6f 6d 62 69 6e  have been combin
0080: 65 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e  ed into a.** sin
0090: 67 6c 65 20 66 69 6c 65 20 74 6f 20 6d 61 6b 65  gle file to make
00a0: 20 69 74 20 65 61 73 79 20 74 6f 20 69 6e 63 6c   it easy to incl
00b0: 75 64 65 20 4c 45 4d 4f 4e 20 69 6e 20 74 68 65  ude LEMON in the
00c0: 20 73 6f 75 72 63 65 20 74 72 65 65 0a 2a 2a 20   source tree.** 
00d0: 61 6e 64 20 4d 61 6b 65 66 69 6c 65 20 6f 66 20  and Makefile of 
00e0: 61 6e 6f 74 68 65 72 20 70 72 6f 67 72 61 6d 2e  another program.
00f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0100: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61  r of this progra
0110: 6d 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  m disclaims copy
0120: 72 69 67 68 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  right..*/.#inclu
0130: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
0140: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0150: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0160: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63  g.h>.#include <c
0170: 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  type.h>.#include
0180: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0190: 6c 75 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a  lude <assert.h>.
01a0: 0a 23 69 66 6e 64 65 66 20 5f 5f 57 49 4e 33 32  .#ifndef __WIN32
01b0: 5f 5f 0a 23 20 20 20 69 66 20 64 65 66 69 6e 65  __.#   if define
01c0: 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
01d0: 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 09 64 65  ined(WIN32).#.de
01e0: 66 69 6e 65 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23  fine __WIN32__.#
01f0: 20 20 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a     endif.#endif.
0200: 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e 33 32 5f  .#ifdef __WIN32_
0210: 5f 0a 65 78 74 65 72 6e 20 69 6e 74 20 61 63 63  _.extern int acc
0220: 65 73 73 28 29 3b 0a 23 65 6c 73 65 0a 23 69 6e  ess();.#else.#in
0230: 63 6c 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e  clude <unistd.h>
0240: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 23 64 65 66  .#endif../* #def
0250: 69 6e 65 20 50 52 49 56 41 54 45 20 73 74 61 74  ine PRIVATE stat
0260: 69 63 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  ic */.#define PR
0270: 49 56 41 54 45 0a 0a 23 69 66 64 65 66 20 54 45  IVATE..#ifdef TE
0280: 53 54 0a 23 64 65 66 69 6e 65 20 4d 41 58 52 48  ST.#define MAXRH
0290: 53 20 35 20 20 20 20 20 20 20 2f 2a 20 53 65 74  S 5       /* Set
02a0: 20 6c 6f 77 20 74 6f 20 65 78 65 72 63 69 73 65   low to exercise
02b0: 20 65 78 63 65 70 74 69 6f 6e 20 63 6f 64 65 20   exception code 
02c0: 2a 2f 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  */.#else.#define
02d0: 20 4d 41 58 52 48 53 20 31 30 30 30 0a 23 65 6e   MAXRHS 1000.#en
02e0: 64 69 66 0a 0a 73 74 61 74 69 63 20 63 68 61 72  dif..static char
02f0: 20 2a 6d 73 6f 72 74 28 63 68 61 72 2a 2c 63 68   *msort(char*,ch
0300: 61 72 2a 2a 2c 69 6e 74 28 2a 29 28 63 6f 6e 73  ar**,int(*)(cons
0310: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
0320: 61 72 2a 29 29 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f  ar*));../*.** Co
0330: 6d 70 69 6c 65 72 73 20 61 72 65 20 67 65 74 74  mpilers are gett
0340: 69 6e 67 20 69 6e 63 72 65 61 73 69 6e 67 6c 79  ing increasingly
0350: 20 70 65 64 61 6e 74 69 63 20 61 62 6f 75 74 20   pedantic about 
0360: 74 79 70 65 20 63 6f 6e 76 65 72 73 69 6f 6e 73  type conversions
0370: 0a 2a 2a 20 61 73 20 43 20 65 76 6f 6c 76 65 73  .** as C evolves
0380: 20 65 76 65 72 20 63 6c 6f 73 65 72 20 74 6f 20   ever closer to 
0390: 41 64 61 2e 2e 2e 2e 20 20 54 6f 20 77 6f 72 6b  Ada....  To work
03a0: 20 61 72 6f 75 6e 64 20 74 68 65 20 6c 61 74 65   around the late
03b0: 73 74 20 70 72 6f 62 6c 65 6d 73 0a 2a 2a 20 77  st problems.** w
03c0: 65 20 68 61 76 65 20 74 6f 20 64 65 66 69 6e 65  e have to define
03d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   the following v
03e0: 61 72 69 61 6e 74 20 6f 66 20 73 74 72 6c 65 6e  ariant of strlen
03f0: 28 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 6c  ()..*/.#define l
0400: 65 6d 6f 6e 53 74 72 6c 65 6e 28 58 29 20 20 20  emonStrlen(X)   
0410: 28 28 69 6e 74 29 73 74 72 6c 65 6e 28 58 29 29  ((int)strlen(X))
0420: 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
0430: 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e  action *Action_n
0440: 65 77 28 76 6f 69 64 29 3b 0a 73 74 61 74 69 63  ew(void);.static
0450: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
0460: 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 72 75  Action_sort(stru
0470: 63 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a 0a 2f  ct action *);../
0480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
0490: 74 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e  the file "build.
04a0: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
04b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
04c0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 46 69  *******/.void Fi
04d0: 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65  ndRulePrecedence
04e0: 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 69  s();.void FindFi
04f0: 72 73 74 53 65 74 73 28 29 3b 0a 76 6f 69 64 20  rstSets();.void 
0500: 46 69 6e 64 53 74 61 74 65 73 28 29 3b 0a 76 6f  FindStates();.vo
0510: 69 64 20 46 69 6e 64 4c 69 6e 6b 73 28 29 3b 0a  id FindLinks();.
0520: 76 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53  void FindFollowS
0530: 65 74 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64  ets();.void Find
0540: 41 63 74 69 6f 6e 73 28 29 3b 0a 0a 2f 2a 2a 2a  Actions();../***
0550: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
0560: 66 69 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73 74  file "configlist
0570: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
0580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0590: 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  *****/.void Conf
05a0: 69 67 6c 69 73 74 5f 69 6e 69 74 28 2f 2a 20 76  iglist_init(/* v
05b0: 6f 69 64 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20  oid */);.struct 
05c0: 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69  config *Configli
05d0: 73 74 5f 61 64 64 28 2f 2a 20 73 74 72 75 63 74  st_add(/* struct
05e0: 20 72 75 6c 65 20 2a 2c 20 69 6e 74 20 2a 2f 29   rule *, int */)
05f0: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
0600: 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62  *Configlist_addb
0610: 61 73 69 73 28 2f 2a 20 73 74 72 75 63 74 20 72  asis(/* struct r
0620: 75 6c 65 20 2a 2c 20 69 6e 74 20 2a 2f 29 3b 0a  ule *, int */);.
0630: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
0640: 63 6c 6f 73 75 72 65 28 2f 2a 20 76 6f 69 64 20  closure(/* void 
0650: 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67  */);.void Config
0660: 6c 69 73 74 5f 73 6f 72 74 28 2f 2a 20 76 6f 69  list_sort(/* voi
0670: 64 20 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66  d */);.void Conf
0680: 69 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73  iglist_sortbasis
0690: 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 73 74  (/* void */);.st
06a0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
06b0: 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 2f  figlist_return(/
06c0: 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 73 74 72 75  * void */);.stru
06d0: 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
06e0: 67 6c 69 73 74 5f 62 61 73 69 73 28 2f 2a 20 76  glist_basis(/* v
06f0: 6f 69 64 20 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f  oid */);.void Co
0700: 6e 66 69 67 6c 69 73 74 5f 65 61 74 28 2f 2a 20  nfiglist_eat(/* 
0710: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
0720: 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67  */);.void Config
0730: 6c 69 73 74 5f 72 65 73 65 74 28 2f 2a 20 76 6f  list_reset(/* vo
0740: 69 64 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  id */);../******
0750: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
0760: 65 20 22 65 72 72 6f 72 2e 68 22 20 2a 2a 2a 2a  e "error.h" ****
0770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0790: 2a 2a 2a 2f 0a 76 6f 69 64 20 45 72 72 6f 72 4d  ***/.void ErrorM
07a0: 73 67 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c  sg(const char *,
07b0: 20 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 20   int,const char 
07c0: 2a 2c 20 2e 2e 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  *, ...);../*****
07d0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
07e0: 22 6f 70 74 69 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a  "option.h" *****
07f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0810: 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63 74 20 73 5f  *****/.struct s_
0820: 6f 70 74 69 6f 6e 73 20 7b 0a 20 20 65 6e 75 6d  options {.  enum
0830: 20 7b 20 4f 50 54 5f 46 4c 41 47 3d 31 2c 20 20   { OPT_FLAG=1,  
0840: 4f 50 54 5f 49 4e 54 2c 20 20 4f 50 54 5f 44 42  OPT_INT,  OPT_DB
0850: 4c 2c 20 20 4f 50 54 5f 53 54 52 2c 0a 20 20 20  L,  OPT_STR,.   
0860: 20 20 20 20 20 20 4f 50 54 5f 46 46 4c 41 47 2c        OPT_FFLAG,
0870: 20 4f 50 54 5f 46 49 4e 54 2c 20 4f 50 54 5f 46   OPT_FINT, OPT_F
0880: 44 42 4c 2c 20 4f 50 54 5f 46 53 54 52 7d 20 74  DBL, OPT_FSTR} t
0890: 79 70 65 3b 0a 20 20 63 68 61 72 20 2a 6c 61 62  ype;.  char *lab
08a0: 65 6c 3b 0a 20 20 63 68 61 72 20 2a 61 72 67 3b  el;.  char *arg;
08b0: 0a 20 20 63 68 61 72 20 2a 6d 65 73 73 61 67 65  .  char *message
08c0: 3b 0a 7d 3b 0a 69 6e 74 20 20 20 20 4f 70 74 49  ;.};.int    OptI
08d0: 6e 69 74 28 2f 2a 20 63 68 61 72 2a 2a 2c 73 74  nit(/* char**,st
08e0: 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 2a 2c  ruct s_options*,
08f0: 46 49 4c 45 2a 20 2a 2f 29 3b 0a 69 6e 74 20 20  FILE* */);.int  
0900: 20 20 4f 70 74 4e 41 72 67 73 28 2f 2a 20 76 6f    OptNArgs(/* vo
0910: 69 64 20 2a 2f 29 3b 0a 63 68 61 72 20 20 2a 4f  id */);.char  *O
0920: 70 74 41 72 67 28 2f 2a 20 69 6e 74 20 2a 2f 29  ptArg(/* int */)
0930: 3b 0a 76 6f 69 64 20 20 20 4f 70 74 45 72 72 28  ;.void   OptErr(
0940: 2f 2a 20 69 6e 74 20 2a 2f 29 3b 0a 76 6f 69 64  /* int */);.void
0950: 20 20 20 4f 70 74 50 72 69 6e 74 28 2f 2a 20 76     OptPrint(/* v
0960: 6f 69 64 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  oid */);../*****
0970: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
0980: 65 20 22 70 61 72 73 65 2e 68 22 20 2a 2a 2a 2a  e "parse.h" ****
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09b0: 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 50 61 72 73  *****/.void Pars
09c0: 65 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f  e(/* struct lemo
09d0: 6e 20 2a 6c 65 6d 70 20 2a 2f 29 3b 0a 0a 2f 2a  n *lemp */);../*
09e0: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
09f0: 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 68 22  e file "plink.h"
0a00: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
0a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a20: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63 74  ********/.struct
0a30: 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65   plink *Plink_ne
0a40: 77 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 76  w(/* void */);.v
0a50: 6f 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28 2f 2a  oid Plink_add(/*
0a60: 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a   struct plink **
0a70: 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
0a80: 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 50 6c 69 6e  * */);.void Plin
0a90: 6b 5f 63 6f 70 79 28 2f 2a 20 73 74 72 75 63 74  k_copy(/* struct
0aa0: 20 70 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75 63   plink **, struc
0ab0: 74 20 70 6c 69 6e 6b 20 2a 20 2a 2f 29 3b 0a 76  t plink * */);.v
0ac0: 6f 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65  oid Plink_delete
0ad0: 28 2f 2a 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  (/* struct plink
0ae0: 20 2a 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a   * */);../******
0af0: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
0b00: 6c 65 20 22 72 65 70 6f 72 74 2e 68 22 20 2a 2a  le "report.h" **
0b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b30: 2a 2a 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e  ***/.void Reprin
0b40: 74 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f  t(/* struct lemo
0b50: 6e 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 52 65  n * */);.void Re
0b60: 70 6f 72 74 4f 75 74 70 75 74 28 2f 2a 20 73 74  portOutput(/* st
0b70: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29  ruct lemon * */)
0b80: 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74 54 61 62  ;.void ReportTab
0b90: 6c 65 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d  le(/* struct lem
0ba0: 6f 6e 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 52  on * */);.void R
0bb0: 65 70 6f 72 74 48 65 61 64 65 72 28 2f 2a 20 73  eportHeader(/* s
0bc0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f  truct lemon * */
0bd0: 29 3b 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73 73  );.void Compress
0be0: 54 61 62 6c 65 73 28 2f 2a 20 73 74 72 75 63 74  Tables(/* struct
0bf0: 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a 76 6f   lemon * */);.vo
0c00: 69 64 20 52 65 73 6f 72 74 53 74 61 74 65 73 28  id ResortStates(
0c10: 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  /* struct lemon 
0c20: 2a 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  * */);../*******
0c30: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
0c40: 65 20 22 73 65 74 2e 68 22 20 2a 2a 2a 2a 2a 2a  e "set.h" ******
0c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c70: 2a 2a 2f 0a 76 6f 69 64 20 20 53 65 74 53 69 7a  **/.void  SetSiz
0c80: 65 28 2f 2a 20 69 6e 74 20 4e 20 2a 2f 29 3b 20  e(/* int N */); 
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
0ca0: 6c 6c 20 73 65 74 73 20 77 69 6c 6c 20 62 65 20  ll sets will be 
0cb0: 6f 66 20 73 69 7a 65 20 4e 20 2a 2f 0a 63 68 61  of size N */.cha
0cc0: 72 20 2a 53 65 74 4e 65 77 28 2f 2a 20 76 6f 69  r *SetNew(/* voi
0cd0: 64 20 2a 2f 29 3b 20 20 20 20 20 20 20 20 20 20  d */);          
0ce0: 20 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 65       /* A new se
0cf0: 74 20 66 6f 72 20 65 6c 65 6d 65 6e 74 20 30 2e  t for element 0.
0d00: 2e 4e 20 2a 2f 0a 76 6f 69 64 20 20 53 65 74 46  .N */.void  SetF
0d10: 72 65 65 28 2f 2a 20 63 68 61 72 2a 20 2a 2f 29  ree(/* char* */)
0d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0d30: 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65   Deallocate a se
0d40: 74 20 2a 2f 0a 0a 69 6e 74 20 53 65 74 41 64 64  t */..int SetAdd
0d50: 28 2f 2a 20 63 68 61 72 2a 2c 69 6e 74 20 2a 2f  (/* char*,int */
0d60: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  );            /*
0d70: 20 41 64 64 20 65 6c 65 6d 65 6e 74 20 74 6f 20   Add element to 
0d80: 61 20 73 65 74 20 2a 2f 0a 69 6e 74 20 53 65 74  a set */.int Set
0d90: 55 6e 69 6f 6e 28 2f 2a 20 63 68 61 72 20 2a 41  Union(/* char *A
0da0: 2c 63 68 61 72 20 2a 42 20 2a 2f 29 3b 20 20 20  ,char *B */);   
0db0: 20 2f 2a 20 41 20 3c 2d 20 41 20 55 20 42 2c 20   /* A <- A U B, 
0dc0: 74 68 72 75 20 65 6c 65 6d 65 6e 74 20 4e 20 2a  thru element N *
0dd0: 2f 0a 0a 23 64 65 66 69 6e 65 20 53 65 74 46 69  /..#define SetFi
0de0: 6e 64 28 58 2c 59 29 20 28 58 5b 59 5d 29 20 20  nd(X,Y) (X[Y])  
0df0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
0e00: 59 20 69 73 20 69 6e 20 73 65 74 20 58 20 2a 2f  Y is in set X */
0e10: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ../********** Fr
0e20: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73 74 72  om the file "str
0e30: 75 63 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  uct.h" *********
0e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
0e60: 0a 2a 2a 20 50 72 69 6e 63 69 70 61 6c 20 64 61  .** Principal da
0e70: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  ta structures fo
0e80: 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  r the LEMON pars
0e90: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
0ea0: 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d 20 7b  ..typedef enum {
0eb0: 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3d 30 2c 20 4c  LEMON_FALSE=0, L
0ec0: 45 4d 4f 4e 5f 54 52 55 45 7d 20 42 6f 6f 6c 65  EMON_TRUE} Boole
0ed0: 61 6e 3b 0a 0a 2f 2a 20 53 79 6d 62 6f 6c 73 20  an;../* Symbols 
0ee0: 28 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e  (terminals and n
0ef0: 6f 6e 74 65 72 6d 69 6e 61 6c 73 29 20 6f 66 20  onterminals) of 
0f00: 74 68 65 20 67 72 61 6d 6d 61 72 20 61 72 65 20  the grammar are 
0f10: 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65  stored.** in the
0f20: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 73   following: */.s
0f30: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 7b 0a 20  truct symbol {. 
0f40: 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20   char *name;    
0f50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
0f60: 65 20 6f 66 20 74 68 65 20 73 79 6d 62 6f 6c 20  e of the symbol 
0f70: 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20  */.  int index; 
0f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0f90: 20 49 6e 64 65 78 20 6e 75 6d 62 65 72 20 66 6f   Index number fo
0fa0: 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f  r this symbol */
0fb0: 0a 20 20 65 6e 75 6d 20 7b 0a 20 20 20 20 54 45  .  enum {.    TE
0fc0: 52 4d 49 4e 41 4c 2c 0a 20 20 20 20 4e 4f 4e 54  RMINAL,.    NONT
0fd0: 45 52 4d 49 4e 41 4c 2c 0a 20 20 20 20 4d 55 4c  ERMINAL,.    MUL
0fe0: 54 49 54 45 52 4d 49 4e 41 4c 0a 20 20 7d 20 74  TITERMINAL.  } t
0ff0: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ype;            
1000: 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 73        /* Symbols
1010: 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20   are all either 
1020: 54 45 52 4d 49 4e 41 4c 53 20 6f 72 20 4e 54 73  TERMINALS or NTs
1030: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
1040: 65 20 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f  e *rule;       /
1050: 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * Linked list of
1060: 20 72 75 6c 65 73 20 6f 66 20 74 68 69 73 20 28   rules of this (
1070: 69 66 20 61 6e 20 4e 54 29 20 2a 2f 0a 20 20 73  if an NT) */.  s
1080: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 66 61  truct symbol *fa
1090: 6c 6c 62 61 63 6b 3b 20 2f 2a 20 66 61 6c 6c 62  llback; /* fallb
10a0: 61 63 6b 20 74 6f 6b 65 6e 20 69 6e 20 63 61 73  ack token in cas
10b0: 65 20 74 68 69 73 20 74 6f 6b 65 6e 20 64 6f 65  e this token doe
10c0: 73 6e 27 74 20 70 61 72 73 65 20 2a 2f 0a 20 20  sn't parse */.  
10d0: 69 6e 74 20 70 72 65 63 3b 20 20 20 20 20 20 20  int prec;       
10e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63           /* Prec
10f0: 65 64 65 6e 63 65 20 69 66 20 64 65 66 69 6e 65  edence if define
1100: 64 20 28 2d 31 20 6f 74 68 65 72 77 69 73 65 29  d (-1 otherwise)
1110: 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73   */.  enum e_ass
1120: 6f 63 20 7b 0a 20 20 20 20 4c 45 46 54 2c 0a 20  oc {.    LEFT,. 
1130: 20 20 20 52 49 47 48 54 2c 0a 20 20 20 20 4e 4f     RIGHT,.    NO
1140: 4e 45 2c 0a 20 20 20 20 55 4e 4b 0a 20 20 7d 20  NE,.    UNK.  } 
1150: 61 73 73 6f 63 3b 20 20 20 20 20 20 20 20 20 20  assoc;          
1160: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69         /* Associ
1170: 61 74 69 76 69 74 79 20 69 66 20 70 72 65 63 65  ativity if prece
1180: 64 65 6e 63 65 20 69 73 20 64 65 66 69 6e 65 64  dence is defined
1190: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69 72 73   */.  char *firs
11a0: 74 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 2f  tset;          /
11b0: 2a 20 46 69 72 73 74 2d 73 65 74 20 66 6f 72 20  * First-set for 
11c0: 61 6c 6c 20 72 75 6c 65 73 20 6f 66 20 74 68 69  all rules of thi
11d0: 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 42 6f  s symbol */.  Bo
11e0: 6f 6c 65 61 6e 20 6c 61 6d 62 64 61 3b 20 20 20  olean lambda;   
11f0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1200: 66 20 4e 54 20 61 6e 64 20 63 61 6e 20 67 65 6e  f NT and can gen
1210: 65 72 61 74 65 20 61 6e 20 65 6d 70 74 79 20 73  erate an empty s
1220: 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 75  tring */.  int u
1230: 73 65 43 6e 74 3b 20 20 20 20 20 20 20 20 20 20  seCnt;          
1240: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1250: 20 74 69 6d 65 73 20 75 73 65 64 20 2a 2f 0a 20   times used */. 
1260: 20 63 68 61 72 20 2a 64 65 73 74 72 75 63 74 6f   char *destructo
1270: 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64  r;        /* Cod
1280: 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
1290: 20 77 68 65 6e 65 76 65 72 20 74 68 69 73 20 73   whenever this s
12a0: 79 6d 62 6f 6c 20 69 73 0a 20 20 20 20 20 20 20  ymbol is.       
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c0: 20 20 20 20 2a 2a 20 70 6f 70 70 65 64 20 66 72      ** popped fr
12d0: 6f 6d 20 74 68 65 20 73 74 61 63 6b 20 64 75 72  om the stack dur
12e0: 69 6e 67 20 65 72 72 6f 72 20 70 72 6f 63 65 73  ing error proces
12f0: 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65  sing */.  int de
1300: 73 74 4c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20  stLineno;       
1310: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
1320: 72 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20 64  r for start of d
1330: 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 63  estructor */.  c
1340: 68 61 72 20 2a 64 61 74 61 74 79 70 65 3b 20 20  har *datatype;  
1350: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
1360: 61 74 61 20 74 79 70 65 20 6f 66 20 69 6e 66 6f  ata type of info
1370: 72 6d 61 74 69 6f 6e 20 68 65 6c 64 20 62 79 20  rmation held by 
1380: 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  this.           
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a0: 2a 2a 20 6f 62 6a 65 63 74 2e 20 4f 6e 6c 79 20  ** object. Only 
13b0: 75 73 65 64 20 69 66 20 74 79 70 65 3d 3d 4e 4f  used if type==NO
13c0: 4e 54 45 52 4d 49 4e 41 4c 20 2a 2f 0a 20 20 69  NTERMINAL */.  i
13d0: 6e 74 20 64 74 6e 75 6d 3b 20 20 20 20 20 20 20  nt dtnum;       
13e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
13f0: 61 74 61 20 74 79 70 65 20 6e 75 6d 62 65 72 2e  ata type number.
1400: 20 20 49 6e 20 74 68 65 20 70 61 72 73 65 72 2c    In the parser,
1410: 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20   the value.     
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 20 20 20 2a 2a 20 73 74 61 63 6b 20 69        ** stack i
1440: 73 20 61 20 75 6e 69 6f 6e 2e 20 20 54 68 65 20  s a union.  The 
1450: 2e 79 79 25 64 20 65 6c 65 6d 65 6e 74 20 6f 66  .yy%d element of
1460: 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20   this.          
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1480: 20 2a 2a 20 75 6e 69 6f 6e 20 69 73 20 74 68 65   ** union is the
1490: 20 63 6f 72 72 65 63 74 20 64 61 74 61 20 74 79   correct data ty
14a0: 70 65 20 66 6f 72 20 74 68 69 73 20 6f 62 6a 65  pe for this obje
14b0: 63 74 20 2a 2f 0a 20 20 2f 2a 20 54 68 65 20 66  ct */.  /* The f
14c0: 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
14d0: 61 72 65 20 75 73 65 64 20 62 79 20 4d 55 4c 54  are used by MULT
14e0: 49 54 45 52 4d 49 4e 41 4c 73 20 6f 6e 6c 79 20  ITERMINALs only 
14f0: 2a 2f 0a 20 20 69 6e 74 20 6e 73 75 62 73 79 6d  */.  int nsubsym
1500: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
1510: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73 74   Number of const
1520: 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20 69  ituent symbols i
1530: 6e 20 74 68 65 20 4d 55 4c 54 49 20 2a 2f 0a 20  n the MULTI */. 
1540: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1550: 2a 73 75 62 73 79 6d 3b 20 20 2f 2a 20 41 72 72  *subsym;  /* Arr
1560: 61 79 20 6f 66 20 63 6f 6e 73 74 69 74 75 65 6e  ay of constituen
1570: 74 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 7d 3b 0a  t symbols */.};.
1580: 0a 2f 2a 20 45 61 63 68 20 70 72 6f 64 75 63 74  ./* Each product
1590: 69 6f 6e 20 72 75 6c 65 20 69 6e 20 74 68 65 20  ion rule in the 
15a0: 67 72 61 6d 6d 61 72 20 69 73 20 73 74 6f 72 65  grammar is store
15b0: 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  d in the followi
15c0: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
15d0: 20 20 2a 2f 0a 73 74 72 75 63 74 20 72 75 6c 65    */.struct rule
15e0: 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62   {.  struct symb
15f0: 6f 6c 20 2a 6c 68 73 3b 20 20 20 20 20 20 2f 2a  ol *lhs;      /*
1600: 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   Left-hand side 
1610: 6f 66 20 74 68 65 20 72 75 6c 65 20 2a 2f 0a 20  of the rule */. 
1620: 20 63 68 61 72 20 2a 6c 68 73 61 6c 69 61 73 3b   char *lhsalias;
1630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 69            /* Ali
1640: 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20 28  as for the LHS (
1650: 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a 2f  NULL if none) */
1660: 0a 20 20 69 6e 74 20 6c 68 73 53 74 61 72 74 3b  .  int lhsStart;
1670: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1680: 72 75 65 20 69 66 20 6c 65 66 74 2d 68 61 6e 64  rue if left-hand
1690: 20 73 69 64 65 20 69 73 20 74 68 65 20 73 74 61   side is the sta
16a0: 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69  rt symbol */.  i
16b0: 6e 74 20 72 75 6c 65 6c 69 6e 65 3b 20 20 20 20  nt ruleline;    
16c0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20          /* Line 
16d0: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72  number for the r
16e0: 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68  ule */.  int nrh
16f0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1700: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
1710: 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20  HS symbols */.  
1720: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
1730: 72 68 73 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  rhs;     /* The 
1740: 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  RHS symbols */. 
1750: 20 63 68 61 72 20 2a 2a 72 68 73 61 6c 69 61 73   char **rhsalias
1760: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  ;         /* An 
1770: 61 6c 69 61 73 20 66 6f 72 20 65 61 63 68 20 52  alias for each R
1780: 48 53 20 73 79 6d 62 6f 6c 20 28 4e 55 4c 4c 20  HS symbol (NULL 
1790: 69 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20 20 69 6e  if none) */.  in
17a0: 74 20 6c 69 6e 65 3b 20 20 20 20 20 20 20 20 20  t line;         
17b0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
17c0: 75 6d 62 65 72 20 61 74 20 77 68 69 63 68 20 63  umber at which c
17d0: 6f 64 65 20 62 65 67 69 6e 73 20 2a 2f 0a 20 20  ode begins */.  
17e0: 63 68 61 72 20 2a 63 6f 64 65 3b 20 20 20 20 20  char *code;     
17f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1800: 63 6f 64 65 20 65 78 65 63 75 74 65 64 20 77 68  code executed wh
1810: 65 6e 20 74 68 69 73 20 72 75 6c 65 20 69 73 20  en this rule is 
1820: 72 65 64 75 63 65 64 20 2a 2f 0a 20 20 73 74 72  reduced */.  str
1830: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 70 72 65 63  uct symbol *prec
1840: 73 79 6d 3b 20 20 2f 2a 20 50 72 65 63 65 64 65  sym;  /* Precede
1850: 6e 63 65 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74  nce symbol for t
1860: 68 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e  his rule */.  in
1870: 74 20 69 6e 64 65 78 3b 20 20 20 20 20 20 20 20  t index;        
1880: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 64         /* An ind
1890: 65 78 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ex number for th
18a0: 69 73 20 72 75 6c 65 20 2a 2f 0a 20 20 42 6f 6f  is rule */.  Boo
18b0: 6c 65 61 6e 20 63 61 6e 52 65 64 75 63 65 3b 20  lean canReduce; 
18c0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
18d0: 20 74 68 69 73 20 72 75 6c 65 20 69 73 20 65 76   this rule is ev
18e0: 65 72 20 72 65 64 75 63 65 64 20 2a 2f 0a 20 20  er reduced */.  
18f0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6e 65 78  struct rule *nex
1900: 74 6c 68 73 3b 20 20 20 20 2f 2a 20 4e 65 78 74  tlhs;    /* Next
1910: 20 72 75 6c 65 20 77 69 74 68 20 74 68 65 20 73   rule with the s
1920: 61 6d 65 20 4c 48 53 20 2a 2f 0a 20 20 73 74 72  ame LHS */.  str
1930: 75 63 74 20 72 75 6c 65 20 2a 6e 65 78 74 3b 20  uct rule *next; 
1940: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 72 75        /* Next ru
1950: 6c 65 20 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c  le in the global
1960: 20 6c 69 73 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20   list */.};../* 
1970: 41 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  A configuration 
1980: 69 73 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  is a production 
1990: 72 75 6c 65 20 6f 66 20 74 68 65 20 67 72 61 6d  rule of the gram
19a0: 6d 61 72 20 74 6f 67 65 74 68 65 72 20 77 69 74  mar together wit
19b0: 68 0a 2a 2a 20 61 20 6d 61 72 6b 20 28 64 6f 74  h.** a mark (dot
19c0: 29 20 73 68 6f 77 69 6e 67 20 68 6f 77 20 6d 75  ) showing how mu
19d0: 63 68 20 6f 66 20 74 68 61 74 20 72 75 6c 65 20  ch of that rule 
19e0: 68 61 73 20 62 65 65 6e 20 70 72 6f 63 65 73 73  has been process
19f0: 65 64 20 73 6f 20 66 61 72 2e 0a 2a 2a 20 43 6f  ed so far..** Co
1a00: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 61 6c 73  nfigurations als
1a10: 6f 20 63 6f 6e 74 61 69 6e 20 61 20 66 6f 6c 6c  o contain a foll
1a20: 6f 77 2d 73 65 74 20 77 68 69 63 68 20 69 73 20  ow-set which is 
1a30: 61 20 6c 69 73 74 20 6f 66 20 74 65 72 6d 69 6e  a list of termin
1a40: 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c 73 20 77 68  al.** symbols wh
1a50: 69 63 68 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  ich are allowed 
1a60: 74 6f 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 66  to immediately f
1a70: 6f 6c 6c 6f 77 20 74 68 65 20 65 6e 64 20 6f 66  ollow the end of
1a80: 20 74 68 65 20 72 75 6c 65 2e 0a 2a 2a 20 45 76   the rule..** Ev
1a90: 65 72 79 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ery configuratio
1aa0: 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20 61 73  n is recorded as
1ab0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
1ac0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a  the following: *
1ad0: 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  /.struct config 
1ae0: 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  {.  struct rule 
1af0: 2a 72 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  *rp;         /* 
1b00: 54 68 65 20 72 75 6c 65 20 75 70 6f 6e 20 77 68  The rule upon wh
1b10: 69 63 68 20 74 68 65 20 63 6f 6e 66 69 67 75 72  ich the configur
1b20: 61 74 69 6f 6e 20 69 73 20 62 61 73 65 64 20 2a  ation is based *
1b30: 2f 0a 20 20 69 6e 74 20 64 6f 74 3b 20 20 20 20  /.  int dot;    
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b50: 54 68 65 20 70 61 72 73 65 20 70 6f 69 6e 74 20  The parse point 
1b60: 2a 2f 0a 20 20 63 68 61 72 20 2a 66 77 73 3b 20  */.  char *fws; 
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b80: 20 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72 20   Follow-set for 
1b90: 74 68 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69  this configurati
1ba0: 6f 6e 20 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72  on only */.  str
1bb0: 75 63 74 20 70 6c 69 6e 6b 20 2a 66 70 6c 70 3b  uct plink *fplp;
1bc0: 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d        /* Follow-
1bd0: 73 65 74 20 66 6f 72 77 61 72 64 20 70 72 6f 70  set forward prop
1be0: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f  agation links */
1bf0: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
1c00: 2a 62 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20 46  *bplp;      /* F
1c10: 6f 6c 6c 6f 77 2d 73 65 74 20 62 61 63 6b 77 61  ollow-set backwa
1c20: 72 64 73 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  rds propagation 
1c30: 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75 63  links */.  struc
1c40: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20  t state *stp;   
1c50: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1c60: 6f 20 73 74 61 74 65 20 77 68 69 63 68 20 63 6f  o state which co
1c70: 6e 74 61 69 6e 73 20 74 68 69 73 20 2a 2f 0a 20  ntains this */. 
1c80: 20 65 6e 75 6d 20 7b 0a 20 20 20 20 43 4f 4d 50   enum {.    COMP
1c90: 4c 45 54 45 2c 20 20 20 20 20 20 20 20 20 20 20  LETE,           
1ca0: 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 75 73     /* The status
1cb0: 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67 20   is used during 
1cc0: 66 6f 6c 6c 6f 77 73 65 74 20 61 6e 64 20 2a 2f  followset and */
1cd0: 0a 20 20 20 20 49 4e 43 4f 4d 50 4c 45 54 45 20  .    INCOMPLETE 
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
1cf0: 20 20 73 68 69 66 74 20 63 6f 6d 70 75 74 61 74    shift computat
1d00: 69 6f 6e 73 20 2a 2f 0a 20 20 7d 20 73 74 61 74  ions */.  } stat
1d10: 75 73 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  us;.  struct con
1d20: 66 69 67 20 2a 6e 65 78 74 3b 20 20 20 20 20 2f  fig *next;     /
1d30: 2a 20 4e 65 78 74 20 63 6f 6e 66 69 67 75 72 61  * Next configura
1d40: 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74 61 74  tion in the stat
1d50: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f  e */.  struct co
1d60: 6e 66 69 67 20 2a 62 70 3b 20 20 20 20 20 20 20  nfig *bp;       
1d70: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 61 73 69  /* The next basi
1d80: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  s configuration 
1d90: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 76 65 72 79 20  */.};../* Every 
1da0: 73 68 69 66 74 20 6f 72 20 72 65 64 75 63 65 20  shift or reduce 
1db0: 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 73 74 6f  operation is sto
1dc0: 72 65 64 20 61 73 20 6f 6e 65 20 6f 66 20 74 68  red as one of th
1dd0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
1de0: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 7b 0a 20  truct action {. 
1df0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1e00: 73 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65  sp;       /* The
1e10: 20 6c 6f 6f 6b 2d 61 68 65 61 64 20 73 79 6d 62   look-ahead symb
1e20: 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61  ol */.  enum e_a
1e30: 63 74 69 6f 6e 20 7b 0a 20 20 20 20 53 48 49 46  ction {.    SHIF
1e40: 54 2c 0a 20 20 20 20 41 43 43 45 50 54 2c 0a 20  T,.    ACCEPT,. 
1e50: 20 20 20 52 45 44 55 43 45 2c 0a 20 20 20 20 45     REDUCE,.    E
1e60: 52 52 4f 52 2c 0a 20 20 20 20 53 53 43 4f 4e 46  RROR,.    SSCONF
1e70: 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20 20 20  LICT,           
1e80: 20 20 20 2f 2a 20 41 20 73 68 69 66 74 2f 73 68     /* A shift/sh
1e90: 69 66 74 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  ift conflict */.
1ea0: 20 20 20 20 53 52 43 4f 4e 46 4c 49 43 54 2c 20      SRCONFLICT, 
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ec0: 57 61 73 20 61 20 72 65 64 75 63 65 2c 20 62 75  Was a reduce, bu
1ed0: 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6e 66  t part of a conf
1ee0: 6c 69 63 74 20 2a 2f 0a 20 20 20 20 52 52 43 4f  lict */.    RRCO
1ef0: 4e 46 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20  NFLICT,         
1f00: 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 72 65       /* Was a re
1f10: 64 75 63 65 2c 20 62 75 74 20 70 61 72 74 20 6f  duce, but part o
1f20: 66 20 61 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a  f a conflict */.
1f30: 20 20 20 20 53 48 5f 52 45 53 4f 4c 56 45 44 2c      SH_RESOLVED,
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f50: 57 61 73 20 61 20 73 68 69 66 74 2e 20 20 50 72  Was a shift.  Pr
1f60: 65 63 65 64 65 6e 63 65 20 72 65 73 6f 6c 76 65  ecedence resolve
1f70: 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  d conflict */.  
1f80: 20 20 52 44 5f 52 45 53 4f 4c 56 45 44 2c 20 20    RD_RESOLVED,  
1f90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61             /* Wa
1fa0: 73 20 72 65 64 75 63 65 2e 20 20 50 72 65 63 65  s reduce.  Prece
1fb0: 64 65 6e 63 65 20 72 65 73 6f 6c 76 65 64 20 63  dence resolved c
1fc0: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20 4e  onflict */.    N
1fd0: 4f 54 5f 55 53 45 44 20 20 20 20 20 20 20 20 20  OT_USED         
1fe0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
1ff0: 65 64 20 62 79 20 63 6f 6d 70 72 65 73 73 69 6f  ed by compressio
2000: 6e 20 2a 2f 0a 20 20 7d 20 74 79 70 65 3b 0a 20  n */.  } type;. 
2010: 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 73 74 72   union {.    str
2020: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20  uct state *stp; 
2030: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 73      /* The new s
2040: 74 61 74 65 2c 20 69 66 20 61 20 73 68 69 66 74  tate, if a shift
2050: 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 72   */.    struct r
2060: 75 6c 65 20 2a 72 70 3b 20 20 20 20 20 20 20 2f  ule *rp;       /
2070: 2a 20 54 68 65 20 72 75 6c 65 2c 20 69 66 20 61  * The rule, if a
2080: 20 72 65 64 75 63 65 20 2a 2f 0a 20 20 7d 20 78   reduce */.  } x
2090: 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
20a0: 6e 20 2a 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20  n *next;     /* 
20b0: 4e 65 78 74 20 61 63 74 69 6f 6e 20 66 6f 72 20  Next action for 
20c0: 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20  this state */.  
20d0: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 63  struct action *c
20e0: 6f 6c 6c 69 64 65 3b 20 20 2f 2a 20 4e 65 78 74  ollide;  /* Next
20f0: 20 61 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65   action with the
2100: 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 7d 3b   same hash */.};
2110: 0a 0a 2f 2a 20 45 61 63 68 20 73 74 61 74 65 20  ../* Each state 
2120: 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
2130: 20 70 61 72 73 65 72 27 73 20 66 69 6e 69 74 65   parser's finite
2140: 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 0a 2a   state machine.*
2150: 2a 20 69 73 20 65 6e 63 6f 64 65 64 20 61 73 20  * is encoded as 
2160: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
2170: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
2180: 75 63 74 75 72 65 2e 20 2a 2f 0a 73 74 72 75 63  ucture. */.struc
2190: 74 20 73 74 61 74 65 20 7b 0a 20 20 73 74 72 75  t state {.  stru
21a0: 63 74 20 63 6f 6e 66 69 67 20 2a 62 70 3b 20 20  ct config *bp;  
21b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 62 61 73 69       /* The basi
21c0: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  s configurations
21d0: 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 20   for this state 
21e0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  */.  struct conf
21f0: 69 67 20 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a  ig *cfp;      /*
2200: 20 41 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69   All configurati
2210: 6f 6e 73 20 69 6e 20 74 68 69 73 20 73 65 74 20  ons in this set 
2220: 2a 2f 0a 20 20 69 6e 74 20 73 74 61 74 65 6e 75  */.  int statenu
2230: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  m;            /*
2240: 20 53 65 71 75 65 6e 74 69 61 6c 20 6e 75 6d 62   Sequential numb
2250: 65 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74  er for this stat
2260: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63  e */.  struct ac
2270: 74 69 6f 6e 20 2a 61 70 3b 20 20 20 20 20 20 20  tion *ap;       
2280: 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69  /* Array of acti
2290: 6f 6e 73 20 66 6f 72 20 74 68 69 73 20 73 74 61  ons for this sta
22a0: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6b 6e  te */.  int nTkn
22b0: 41 63 74 2c 20 6e 4e 74 41 63 74 3b 20 20 20 20  Act, nNtAct;    
22c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 63   /* Number of ac
22d0: 74 69 6f 6e 73 20 6f 6e 20 74 65 72 6d 69 6e 61  tions on termina
22e0: 6c 73 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e  ls and nontermin
22f0: 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 6b  als */.  int iTk
2300: 6e 4f 66 73 74 2c 20 69 4e 74 4f 66 73 74 3b 20  nOfst, iNtOfst; 
2310: 20 20 2f 2a 20 79 79 5f 61 63 74 69 6f 6e 5b 5d    /* yy_action[]
2320: 20 6f 66 66 73 65 74 20 66 6f 72 20 74 65 72 6d   offset for term
2330: 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74 65 72  inals and nonter
2340: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 69 44 66 6c  ms */.  int iDfl
2350: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2360: 20 2f 2a 20 44 65 66 61 75 6c 74 20 61 63 74 69   /* Default acti
2370: 6f 6e 20 2a 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65  on */.};.#define
2380: 20 4e 4f 5f 4f 46 46 53 45 54 20 28 2d 32 31 34   NO_OFFSET (-214
2390: 37 34 38 33 36 34 37 29 0a 0a 2f 2a 20 41 20 66  7483647)../* A f
23a0: 6f 6c 6c 6f 77 73 65 74 20 70 72 6f 70 61 67 61  ollowset propaga
23b0: 74 69 6f 6e 20 6c 69 6e 6b 20 69 6e 64 69 63 61  tion link indica
23c0: 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
23d0: 74 65 6e 74 73 20 6f 66 20 6f 6e 65 0a 2a 2a 20  tents of one.** 
23e0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6f  configuration fo
23f0: 6c 6c 6f 77 73 65 74 20 73 68 6f 75 6c 64 20 62  llowset should b
2400: 65 20 70 72 6f 70 61 67 61 74 65 64 20 74 6f 20  e propagated to 
2410: 61 6e 6f 74 68 65 72 20 77 68 65 6e 65 76 65 72  another whenever
2420: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 68  .** the first ch
2430: 61 6e 67 65 73 2e 20 2a 2f 0a 73 74 72 75 63 74  anges. */.struct
2440: 20 70 6c 69 6e 6b 20 7b 0a 20 20 73 74 72 75 63   plink {.  struc
2450: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20  t config *cfp;  
2460: 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 66 69      /* The confi
2470: 67 75 72 61 74 69 6f 6e 20 74 6f 20 77 68 69 63  guration to whic
2480: 68 20 6c 69 6e 6b 65 64 20 2a 2f 0a 20 20 73 74  h linked */.  st
2490: 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74  ruct plink *next
24a0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ;      /* The ne
24b0: 78 74 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e  xt propagate lin
24c0: 6b 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 20  k */.};../* The 
24d0: 73 74 61 74 65 20 76 65 63 74 6f 72 20 66 6f 72  state vector for
24e0: 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 72 73   the entire pars
24f0: 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69 73 20  er generator is 
2500: 72 65 63 6f 72 64 65 64 20 61 73 0a 2a 2a 20 66  recorded as.** f
2510: 6f 6c 6c 6f 77 73 2e 20 20 28 4c 45 4d 4f 4e 20  ollows.  (LEMON 
2520: 75 73 65 73 20 6e 6f 20 67 6c 6f 62 61 6c 20 76  uses no global v
2530: 61 72 69 61 62 6c 65 73 20 61 6e 64 20 6d 61 6b  ariables and mak
2540: 65 73 20 6c 69 74 74 6c 65 20 75 73 65 20 6f 66  es little use of
2550: 0a 2a 2a 20 73 74 61 74 69 63 20 76 61 72 69 61  .** static varia
2560: 62 6c 65 73 2e 20 20 46 69 65 6c 64 73 20 69 6e  bles.  Fields in
2570: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2580: 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20  tructure can be 
2590: 74 68 6f 75 67 68 74 0a 2a 2a 20 6f 66 20 61 73  thought.** of as
25a0: 20 62 65 67 69 6e 20 67 6c 6f 62 61 6c 20 76 61   begin global va
25b0: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 70  riables in the p
25c0: 72 6f 67 72 61 6d 2e 29 20 2a 2f 0a 73 74 72 75  rogram.) */.stru
25d0: 63 74 20 6c 65 6d 6f 6e 20 7b 0a 20 20 73 74 72  ct lemon {.  str
25e0: 75 63 74 20 73 74 61 74 65 20 2a 2a 73 6f 72 74  uct state **sort
25f0: 65 64 3b 20 20 20 2f 2a 20 54 61 62 6c 65 20 6f  ed;   /* Table o
2600: 66 20 73 74 61 74 65 73 20 73 6f 72 74 65 64 20  f states sorted 
2610: 62 79 20 73 74 61 74 65 20 6e 75 6d 62 65 72 20  by state number 
2620: 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  */.  struct rule
2630: 20 2a 72 75 6c 65 3b 20 20 20 20 20 20 20 2f 2a   *rule;       /*
2640: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 72 75 6c   List of all rul
2650: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 73 74 61  es */.  int nsta
2660: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
2670: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 74   /* Number of st
2680: 61 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 72  ates */.  int nr
2690: 75 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ule;            
26a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
26b0: 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  rules */.  int n
26c0: 73 79 6d 62 6f 6c 3b 20 20 20 20 20 20 20 20 20  symbol;         
26d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
26e0: 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f   terminal and no
26f0: 6e 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c  nterminal symbol
2700: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 74 65 72 6d  s */.  int nterm
2710: 69 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  inal;           
2720: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72  /* Number of ter
2730: 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f  minal symbols */
2740: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
2750: 20 2a 2a 73 79 6d 62 6f 6c 73 3b 20 2f 2a 20 53   **symbols; /* S
2760: 6f 72 74 65 64 20 61 72 72 61 79 20 6f 66 20 70  orted array of p
2770: 6f 69 6e 74 65 72 73 20 74 6f 20 73 79 6d 62 6f  ointers to symbo
2780: 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f  ls */.  int erro
2790: 72 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rcnt;           
27a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
27b0: 72 6f 72 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  rors */.  struct
27c0: 20 73 79 6d 62 6f 6c 20 2a 65 72 72 73 79 6d 3b   symbol *errsym;
27d0: 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20     /* The error 
27e0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 73 74 72 75  symbol */.  stru
27f0: 63 74 20 73 79 6d 62 6f 6c 20 2a 77 69 6c 64 63  ct symbol *wildc
2800: 61 72 64 3b 20 2f 2a 20 54 6f 6b 65 6e 20 74 68  ard; /* Token th
2810: 61 74 20 6d 61 74 63 68 65 73 20 61 6e 79 74 68  at matches anyth
2820: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6e  ing */.  char *n
2830: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
2840: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2850: 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65   generated parse
2860: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67  r */.  char *arg
2870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2880: 2f 2a 20 44 65 63 6c 61 72 61 74 69 6f 6e 20 6f  /* Declaration o
2890: 66 20 74 68 65 20 33 74 68 20 61 72 67 75 6d 65  f the 3th argume
28a0: 6e 74 20 74 6f 20 70 61 72 73 65 72 20 2a 2f 0a  nt to parser */.
28b0: 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 74 79 70    char *tokentyp
28c0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 79  e;         /* Ty
28d0: 70 65 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73  pe of terminal s
28e0: 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20 70 61  ymbols in the pa
28f0: 72 73 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20  rser stack */.  
2900: 63 68 61 72 20 2a 76 61 72 74 79 70 65 3b 20 20  char *vartype;  
2910: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2920: 64 65 66 61 75 6c 74 20 74 79 70 65 20 6f 66 20  default type of 
2930: 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 73 79 6d  non-terminal sym
2940: 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  bols */.  char *
2950: 73 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20  start;          
2960: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2970: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 66  e start symbol f
2980: 6f 72 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  or the grammar *
2990: 2f 0a 20 20 63 68 61 72 20 2a 73 74 61 63 6b 73  /.  char *stacks
29a0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ize;         /* 
29b0: 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 72 73  Size of the pars
29c0: 65 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68  er stack */.  ch
29d0: 61 72 20 2a 69 6e 63 6c 75 64 65 3b 20 20 20 20  ar *include;    
29e0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74         /* Code t
29f0: 6f 20 70 75 74 20 61 74 20 74 68 65 20 73 74 61  o put at the sta
2a00: 72 74 20 6f 66 20 74 68 65 20 43 20 66 69 6c 65  rt of the C file
2a10: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 72 72 6f   */.  char *erro
2a20: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
2a30: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
2a40: 65 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20  e when an error 
2a50: 69 73 20 73 65 65 6e 20 2a 2f 0a 20 20 63 68 61  is seen */.  cha
2a60: 72 20 2a 6f 76 65 72 66 6c 6f 77 3b 20 20 20 20  r *overflow;    
2a70: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f        /* Code to
2a80: 20 65 78 65 63 75 74 65 20 6f 6e 20 61 20 73 74   execute on a st
2a90: 61 63 6b 20 6f 76 65 72 66 6c 6f 77 20 2a 2f 0a  ack overflow */.
2aa0: 20 20 63 68 61 72 20 2a 66 61 69 6c 75 72 65 3b    char *failure;
2ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2ac0: 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f 6e  de to execute on
2ad0: 20 70 61 72 73 65 72 20 66 61 69 6c 75 72 65 20   parser failure 
2ae0: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 63 63 65 70  */.  char *accep
2af0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
2b00: 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65   Code to execute
2b10: 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   when the parser
2b20: 20 65 78 63 65 70 74 73 20 2a 2f 0a 20 20 63 68   excepts */.  ch
2b30: 61 72 20 2a 65 78 74 72 61 63 6f 64 65 3b 20 20  ar *extracode;  
2b40: 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 61         /* Code a
2b50: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 67  ppended to the g
2b60: 65 6e 65 72 61 74 65 64 20 66 69 6c 65 20 2a 2f  enerated file */
2b70: 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 64 65  .  char *tokende
2b80: 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43  st;         /* C
2b90: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 74  ode to execute t
2ba0: 6f 20 64 65 73 74 72 6f 79 20 74 6f 6b 65 6e 20  o destroy token 
2bb0: 64 61 74 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a  data */.  char *
2bc0: 76 61 72 64 65 73 74 3b 20 20 20 20 20 20 20 20  vardest;        
2bd0: 20 20 20 2f 2a 20 43 6f 64 65 20 66 6f 72 20 74     /* Code for t
2be0: 68 65 20 64 65 66 61 75 6c 74 20 6e 6f 6e 2d 74  he default non-t
2bf0: 65 72 6d 69 6e 61 6c 20 64 65 73 74 72 75 63 74  erminal destruct
2c00: 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 69  or */.  char *fi
2c10: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
2c20: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
2c30: 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20  input file */.  
2c40: 63 68 61 72 20 2a 6f 75 74 6e 61 6d 65 3b 20 20  char *outname;  
2c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2c60: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2c70: 6f 75 74 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20  output file */. 
2c80: 20 63 68 61 72 20 2a 74 6f 6b 65 6e 70 72 65 66   char *tokenpref
2c90: 69 78 3b 20 20 20 20 20 20 20 2f 2a 20 41 20 70  ix;       /* A p
2ca0: 72 65 66 69 78 20 61 64 64 65 64 20 74 6f 20 74  refix added to t
2cb0: 6f 6b 65 6e 20 6e 61 6d 65 73 20 69 6e 20 74 68  oken names in th
2cc0: 65 20 2e 68 20 66 69 6c 65 20 2a 2f 0a 20 20 69  e .h file */.  i
2cd0: 6e 74 20 6e 63 6f 6e 66 6c 69 63 74 3b 20 20 20  nt nconflict;   
2ce0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2cf0: 72 20 6f 66 20 70 61 72 73 69 6e 67 20 63 6f 6e  r of parsing con
2d00: 66 6c 69 63 74 73 20 2a 2f 0a 20 20 69 6e 74 20  flicts */.  int 
2d10: 74 61 62 6c 65 73 69 7a 65 3b 20 20 20 20 20 20  tablesize;      
2d20: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2d30: 74 68 65 20 70 61 72 73 65 20 74 61 62 6c 65 73  the parse tables
2d40: 20 2a 2f 0a 20 20 69 6e 74 20 62 61 73 69 73 66   */.  int basisf
2d50: 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f  lag;           /
2d60: 2a 20 50 72 69 6e 74 20 6f 6e 6c 79 20 62 61 73  * Print only bas
2d70: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
2d80: 73 20 2a 2f 0a 20 20 69 6e 74 20 68 61 73 5f 66  s */.  int has_f
2d90: 61 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  allback;        
2da0: 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 25  /* True if any %
2db0: 66 61 6c 6c 62 61 63 6b 20 69 73 20 73 65 65 6e  fallback is seen
2dc0: 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20   in the grammar 
2dd0: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e  */.  int nolinen
2de0: 6f 73 66 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a  osflag;       /*
2df0: 20 54 72 75 65 20 69 66 20 23 6c 69 6e 65 20 73   True if #line s
2e00: 74 61 74 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64  tatements should
2e10: 20 6e 6f 74 20 62 65 20 70 72 69 6e 74 65 64 20   not be printed 
2e20: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 72 67 76 30  */.  char *argv0
2e30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2e40: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f   Name of the pro
2e50: 67 72 61 6d 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  gram */.};..#def
2e60: 69 6e 65 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28  ine MemoryCheck(
2e70: 58 29 20 69 66 28 28 58 29 3d 3d 30 29 7b 20 5c  X) if((X)==0){ \
2e80: 0a 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d  .  extern void m
2e90: 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c  emory_error(); \
2ea0: 0a 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  .  memory_error(
2eb0: 29 3b 20 5c 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ); \.}../*******
2ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
2ed0: 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 68  he file "table.h
2ee0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
2ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f00: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63  ***/./*.** All c
2f10: 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ode in this file
2f20: 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d 61   has been automa
2f30: 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74 65  tically generate
2f40: 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65 63  d.** from a spec
2f50: 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68 65  ification in the
2f60: 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20   file.**        
2f70: 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22 0a        "table.q".
2f80: 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63 69  ** by the associ
2f90: 61 74 69 76 65 20 61 72 72 61 79 20 63 6f 64 65  ative array code
2fa0: 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72 61   building progra
2fb0: 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f  m "aagen"..** Do
2fc0: 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20 66   not edit this f
2fd0: 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20 65  ile!  Instead, e
2fe0: 64 69 74 20 74 68 65 20 73 70 65 63 69 66 69 63  dit the specific
2ff0: 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74  ation.** file, t
3000: 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e 2e  hen rerun aagen.
3010: 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66  .*/./*.** Code f
3020: 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74 61  or processing ta
3030: 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f  bles in the LEMO
3040: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
3050: 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 52 6f 75 74 69  or..*/../* Routi
3060: 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67  nes for handling
3070: 20 61 20 73 74 72 69 6e 67 73 20 2a 2f 0a 0a 63   a strings */..c
3080: 68 61 72 20 2a 53 74 72 73 61 66 65 28 29 3b 0a  har *Strsafe();.
3090: 0a 76 6f 69 64 20 53 74 72 73 61 66 65 5f 69 6e  .void Strsafe_in
30a0: 69 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a  it(/* void */);.
30b0: 69 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65  int Strsafe_inse
30c0: 72 74 28 2f 2a 20 63 68 61 72 20 2a 20 2a 2f 29  rt(/* char * */)
30d0: 3b 0a 63 68 61 72 20 2a 53 74 72 73 61 66 65 5f  ;.char *Strsafe_
30e0: 66 69 6e 64 28 2f 2a 20 63 68 61 72 20 2a 20 2a  find(/* char * *
30f0: 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73  /);../* Routines
3100: 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 73 79   for handling sy
3110: 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20 67 72 61  mbols of the gra
3120: 6d 6d 61 72 20 2a 2f 0a 0a 73 74 72 75 63 74 20  mmar */..struct 
3130: 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e  symbol *Symbol_n
3140: 65 77 28 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c  ew();.int Symbol
3150: 63 6d 70 70 28 2f 2a 20 73 74 72 75 63 74 20 73  cmpp(/* struct s
3160: 79 6d 62 6f 6c 20 2a 2a 2c 20 73 74 72 75 63 74  ymbol **, struct
3170: 20 73 79 6d 62 6f 6c 20 2a 2a 20 2a 2f 29 3b 0a   symbol ** */);.
3180: 76 6f 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74  void Symbol_init
3190: 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e  (/* void */);.in
31a0: 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28  t Symbol_insert(
31b0: 2f 2a 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  /* struct symbol
31c0: 20 2a 2c 20 63 68 61 72 20 2a 20 2a 2f 29 3b 0a   *, char * */);.
31d0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
31e0: 79 6d 62 6f 6c 5f 66 69 6e 64 28 2f 2a 20 63 68  ymbol_find(/* ch
31f0: 61 72 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74  ar * */);.struct
3200: 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f   symbol *Symbol_
3210: 4e 74 68 28 2f 2a 20 69 6e 74 20 2a 2f 29 3b 0a  Nth(/* int */);.
3220: 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74  int Symbol_count
3230: 28 2f 2a 20 20 2a 2f 29 3b 0a 73 74 72 75 63 74  (/*  */);.struct
3240: 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c   symbol **Symbol
3250: 5f 61 72 72 61 79 6f 66 28 2f 2a 20 20 2a 2f 29  _arrayof(/*  */)
3260: 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 74  ;../* Routines t
3270: 6f 20 6d 61 6e 61 67 65 20 74 68 65 20 73 74 61  o manage the sta
3280: 74 65 20 74 61 62 6c 65 20 2a 2f 0a 0a 69 6e 74  te table */..int
3290: 20 43 6f 6e 66 69 67 63 6d 70 28 2f 2a 20 73 74   Configcmp(/* st
32a0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2c 20 73  ruct config *, s
32b0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a  truct config * *
32c0: 2f 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65  /);.struct state
32d0: 20 2a 53 74 61 74 65 5f 6e 65 77 28 29 3b 0a 76   *State_new();.v
32e0: 6f 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28 2f  oid State_init(/
32f0: 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e 74 20  * void */);.int 
3300: 53 74 61 74 65 5f 69 6e 73 65 72 74 28 2f 2a 20  State_insert(/* 
3310: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2c 20  struct state *, 
3320: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
3330: 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74  */);.struct stat
3340: 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 2f 2a  e *State_find(/*
3350: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
3360: 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 74 61   */);.struct sta
3370: 74 65 20 2a 2a 53 74 61 74 65 5f 61 72 72 61 79  te **State_array
3380: 6f 66 28 2f 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a 20  of(/*  */);../* 
3390: 52 6f 75 74 69 6e 65 73 20 75 73 65 64 20 66 6f  Routines used fo
33a0: 72 20 65 66 66 69 63 69 65 6e 63 79 20 69 6e 20  r efficiency in 
33b0: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 20 2a  Configlist_add *
33c0: 2f 0a 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  /..void Configta
33d0: 62 6c 65 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64  ble_init(/* void
33e0: 20 2a 2f 29 3b 0a 69 6e 74 20 43 6f 6e 66 69 67   */);.int Config
33f0: 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 2f 2a 20  table_insert(/* 
3400: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
3410: 2a 2f 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  */);.struct conf
3420: 69 67 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f  ig *Configtable_
3430: 66 69 6e 64 28 2f 2a 20 73 74 72 75 63 74 20 63  find(/* struct c
3440: 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 76 6f 69  onfig * */);.voi
3450: 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c  d Configtable_cl
3460: 65 61 72 28 2f 2a 20 69 6e 74 28 2a 29 28 73 74  ear(/* int(*)(st
3470: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 20 2a  ruct config *) *
3480: 2f 29 3b 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /);./***********
3490: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
34a0: 20 66 69 6c 65 20 22 61 63 74 69 6f 6e 2e 63 22   file "action.c"
34b0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
34c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34d0: 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  /./*.** Routines
34e0: 20 70 72 6f 63 65 73 73 69 6e 67 20 70 61 72 73   processing pars
34f0: 65 72 20 61 63 74 69 6f 6e 73 20 69 6e 20 74 68  er actions in th
3500: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
3510: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
3520: 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
3530: 70 61 72 73 65 72 20 61 63 74 69 6f 6e 20 2a 2f  parser action */
3540: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
3550: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65  ction *Action_ne
3560: 77 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  w(void){.  stati
3570: 63 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  c struct action 
3580: 2a 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 20  *freelist = 0;. 
3590: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
35a0: 6e 65 77 3b 0a 0a 20 20 69 66 28 20 66 72 65 65  new;..  if( free
35b0: 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69  list==0 ){.    i
35c0: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d  nt i;.    int am
35d0: 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 66 72 65  t = 100;.    fre
35e0: 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74 20  elist = (struct 
35f0: 61 63 74 69 6f 6e 20 2a 29 63 61 6c 6c 6f 63 28  action *)calloc(
3600: 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75  amt, sizeof(stru
3610: 63 74 20 61 63 74 69 6f 6e 29 29 3b 0a 20 20 20  ct action));.   
3620: 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30   if( freelist==0
3630: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
3640: 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65  f(stderr,"Unable
3650: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
3660: 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 70 61  ory for a new pa
3670: 72 73 65 72 20 61 63 74 69 6f 6e 2e 22 29 3b 0a  rser action.");.
3680: 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
3690: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
36a0: 3b 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20  ; i<amt-1; i++) 
36b0: 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74  freelist[i].next
36c0: 20 3d 20 26 66 72 65 65 6c 69 73 74 5b 69 2b 31   = &freelist[i+1
36d0: 5d 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 5b  ];.    freelist[
36e0: 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b  amt-1].next = 0;
36f0: 0a 20 20 7d 0a 20 20 6e 65 77 20 3d 20 66 72 65  .  }.  new = fre
3700: 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73  elist;.  freelis
3710: 74 20 3d 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65  t = freelist->ne
3720: 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77  xt;.  return new
3730: 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20  ;.}../* Compare 
3740: 74 77 6f 20 61 63 74 69 6f 6e 73 20 66 6f 72 20  two actions for 
3750: 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73  sorting purposes
3760: 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
3770: 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 0a 2a 2a 20  ve, zero, or.** 
3780: 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20  positive if the 
3790: 66 69 72 73 74 20 61 63 74 69 6f 6e 20 69 73 20  first action is 
37a0: 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
37b0: 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20   to, or greater 
37c0: 74 68 61 6e 0a 2a 2a 20 74 68 65 20 66 69 72 73  than.** the firs
37d0: 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  t.*/.static int 
37e0: 61 63 74 69 6f 6e 63 6d 70 28 0a 20 20 73 74 72  actioncmp(.  str
37f0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 31 2c  uct action *ap1,
3800: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
3810: 20 2a 61 70 32 0a 29 7b 0a 20 20 69 6e 74 20 72   *ap2.){.  int r
3820: 63 3b 0a 20 20 72 63 20 3d 20 61 70 31 2d 3e 73  c;.  rc = ap1->s
3830: 70 2d 3e 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e  p->index - ap2->
3840: 73 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28  sp->index;.  if(
3850: 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63   rc==0 ){.    rc
3860: 20 3d 20 28 69 6e 74 29 61 70 31 2d 3e 74 79 70   = (int)ap1->typ
3870: 65 20 2d 20 28 69 6e 74 29 61 70 32 2d 3e 74 79  e - (int)ap2->ty
3880: 70 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  pe;.  }.  if( rc
3890: 3d 3d 30 20 26 26 20 61 70 31 2d 3e 74 79 70 65  ==0 && ap1->type
38a0: 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20  ==REDUCE ){.    
38b0: 72 63 20 3d 20 61 70 31 2d 3e 78 2e 72 70 2d 3e  rc = ap1->x.rp->
38c0: 69 6e 64 65 78 20 2d 20 61 70 32 2d 3e 78 2e 72  index - ap2->x.r
38d0: 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20  p->index;.  }.  
38e0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
38f0: 20 53 6f 72 74 20 70 61 72 73 65 72 20 61 63 74   Sort parser act
3900: 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73  ions */.static s
3910: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41 63  truct action *Ac
3920: 74 69 6f 6e 5f 73 6f 72 74 28 0a 20 20 73 74 72  tion_sort(.  str
3930: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 0a 29  uct action *ap.)
3940: 7b 0a 20 20 61 70 20 3d 20 28 73 74 72 75 63 74  {.  ap = (struct
3950: 20 61 63 74 69 6f 6e 20 2a 29 6d 73 6f 72 74 28   action *)msort(
3960: 28 63 68 61 72 20 2a 29 61 70 2c 28 63 68 61 72  (char *)ap,(char
3970: 20 2a 2a 29 26 61 70 2d 3e 6e 65 78 74 2c 0a 20   **)&ap->next,. 
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
39a0: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
39b0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 63  ,const char*))ac
39c0: 74 69 6f 6e 63 6d 70 29 3b 0a 20 20 72 65 74 75  tioncmp);.  retu
39d0: 72 6e 20 61 70 3b 0a 7d 0a 0a 76 6f 69 64 20 41  rn ap;.}..void A
39e0: 63 74 69 6f 6e 5f 61 64 64 28 61 70 70 2c 74 79  ction_add(app,ty
39f0: 70 65 2c 73 70 2c 61 72 67 29 0a 73 74 72 75 63  pe,sp,arg).struc
3a00: 74 20 61 63 74 69 6f 6e 20 2a 2a 61 70 70 3b 0a  t action **app;.
3a10: 65 6e 75 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79  enum e_action ty
3a20: 70 65 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  pe;.struct symbo
3a30: 6c 20 2a 73 70 3b 0a 63 68 61 72 20 2a 61 72 67  l *sp;.char *arg
3a40: 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 61 63 74  ;.{.  struct act
3a50: 69 6f 6e 20 2a 6e 65 77 3b 0a 20 20 6e 65 77 20  ion *new;.  new 
3a60: 3d 20 41 63 74 69 6f 6e 5f 6e 65 77 28 29 3b 0a  = Action_new();.
3a70: 20 20 6e 65 77 2d 3e 6e 65 78 74 20 3d 20 2a 61    new->next = *a
3a80: 70 70 3b 0a 20 20 2a 61 70 70 20 3d 20 6e 65 77  pp;.  *app = new
3a90: 3b 0a 20 20 6e 65 77 2d 3e 74 79 70 65 20 3d 20  ;.  new->type = 
3aa0: 74 79 70 65 3b 0a 20 20 6e 65 77 2d 3e 73 70 20  type;.  new->sp 
3ab0: 3d 20 73 70 3b 0a 20 20 69 66 28 20 74 79 70 65  = sp;.  if( type
3ac0: 3d 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20 6e  ==SHIFT ){.    n
3ad0: 65 77 2d 3e 78 2e 73 74 70 20 3d 20 28 73 74 72  ew->x.stp = (str
3ae0: 75 63 74 20 73 74 61 74 65 20 2a 29 61 72 67 3b  uct state *)arg;
3af0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 65  .  }else{.    ne
3b00: 77 2d 3e 78 2e 72 70 20 3d 20 28 73 74 72 75 63  w->x.rp = (struc
3b10: 74 20 72 75 6c 65 20 2a 29 61 72 67 3b 0a 20 20  t rule *)arg;.  
3b20: 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}./***********
3b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 65 77 20  *********** New 
3b40: 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  code to implemen
3b50: 74 20 74 68 65 20 22 61 63 74 74 61 62 22 20 6d  t the "acttab" m
3b60: 6f 64 75 6c 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  odule **********
3b70: 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 6f  */./*.** This mo
3b80: 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  dule implements 
3b90: 72 6f 75 74 69 6e 65 73 20 75 73 65 20 74 6f 20  routines use to 
3ba0: 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 79 79  construct the yy
3bb0: 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 2e  _action[] table.
3bc0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73  .*/../*.** The s
3bd0: 74 61 74 65 20 6f 66 20 74 68 65 20 79 79 5f 61  tate of the yy_a
3be0: 63 74 69 6f 6e 20 74 61 62 6c 65 20 75 6e 64 65  ction table unde
3bf0: 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69  r construction i
3c00: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
3c10: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
3c20: 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2f 0a 74  g structure.*/.t
3c30: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61 63  ypedef struct ac
3c40: 74 74 61 62 20 61 63 74 74 61 62 3b 0a 73 74 72  ttab acttab;.str
3c50: 75 63 74 20 61 63 74 74 61 62 20 7b 0a 20 20 69  uct acttab {.  i
3c60: 6e 74 20 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20  nt nAction;     
3c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3c80: 75 6d 62 65 72 20 6f 66 20 75 73 65 64 20 73 6c  umber of used sl
3c90: 6f 74 73 20 69 6e 20 61 41 63 74 69 6f 6e 5b 5d  ots in aAction[]
3ca0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f   */.  int nActio
3cb0: 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  nAlloc;         
3cc0: 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f     /* Slots allo
3cd0: 63 61 74 65 64 20 66 6f 72 20 61 41 63 74 69 6f  cated for aActio
3ce0: 6e 5b 5d 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  n[] */.  struct 
3cf0: 7b 0a 20 20 20 20 69 6e 74 20 6c 6f 6f 6b 61 68  {.    int lookah
3d00: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
3d10: 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 74 68 65   /* Value of the
3d20: 20 6c 6f 6f 6b 61 68 65 61 64 20 74 6f 6b 65 6e   lookahead token
3d30: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 61 63 74 69   */.    int acti
3d40: 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  on;             
3d50: 20 20 20 2f 2a 20 41 63 74 69 6f 6e 20 74 6f 20     /* Action to 
3d60: 74 61 6b 65 20 6f 6e 20 74 68 65 20 67 69 76 65  take on the give
3d70: 6e 20 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20  n lookahead */. 
3d80: 20 7d 20 2a 61 41 63 74 69 6f 6e 2c 20 20 20 20   } *aAction,    
3d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3da0: 20 54 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d   The yy_action[]
3db0: 20 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e   table under con
3dc0: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  struction */.   
3dd0: 20 2a 61 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20   *aLookahead;   
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
3df0: 20 73 69 6e 67 6c 65 20 6e 65 77 20 74 72 61 6e   single new tran
3e00: 73 61 63 74 69 6f 6e 20 73 65 74 20 2a 2f 0a 20  saction set */. 
3e10: 20 69 6e 74 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64   int mnLookahead
3e20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3e30: 20 4d 69 6e 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68   Minimum aLookah
3e40: 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20  ead[].lookahead 
3e50: 2a 2f 0a 20 20 69 6e 74 20 6d 6e 41 63 74 69 6f  */.  int mnActio
3e60: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3e70: 20 20 2f 2a 20 41 63 74 69 6f 6e 20 61 73 73 6f    /* Action asso
3e80: 63 69 61 74 65 64 20 77 69 74 68 20 6d 6e 4c 6f  ciated with mnLo
3e90: 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74  okahead */.  int
3ea0: 20 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20   mxLookahead;   
3eb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
3ec0: 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65 61 64 5b  imum aLookahead[
3ed0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20  ].lookahead */. 
3ee0: 20 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 3b   int nLookahead;
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3f00: 20 55 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61   Used slots in a
3f10: 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a 20  Lookahead[] */. 
3f20: 20 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 41   int nLookaheadA
3f30: 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  lloc;         /*
3f40: 20 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64   Slots allocated
3f50: 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d   in aLookahead[]
3f60: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52 65 74 75 72   */.};../* Retur
3f70: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
3f80: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 79  entries in the y
3f90: 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a  y_action table *
3fa0: 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61 62  /.#define acttab
3fb0: 5f 73 69 7a 65 28 58 29 20 28 28 58 29 2d 3e 6e  _size(X) ((X)->n
3fc0: 41 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20  Action)../* The 
3fd0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 4e 2d  value for the N-
3fe0: 74 68 20 65 6e 74 72 79 20 69 6e 20 79 79 5f 61  th entry in yy_a
3ff0: 63 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  ction */.#define
4000: 20 61 63 74 74 61 62 5f 79 79 61 63 74 69 6f 6e   acttab_yyaction
4010: 28 58 2c 4e 29 20 20 28 28 58 29 2d 3e 61 41 63  (X,N)  ((X)->aAc
4020: 74 69 6f 6e 5b 4e 5d 2e 61 63 74 69 6f 6e 29 0a  tion[N].action).
4030: 0a 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 66 6f  ./* The value fo
4040: 72 20 74 68 65 20 4e 2d 74 68 20 65 6e 74 72 79  r the N-th entry
4050: 20 69 6e 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64   in yy_lookahead
4060: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74   */.#define actt
4070: 61 62 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28 58  ab_yylookahead(X
4080: 2c 4e 29 20 20 28 28 58 29 2d 3e 61 41 63 74 69  ,N)  ((X)->aActi
4090: 6f 6e 5b 4e 5d 2e 6c 6f 6f 6b 61 68 65 61 64 29  on[N].lookahead)
40a0: 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65  ../* Free all me
40b0: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
40c0: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61  with the given a
40d0: 63 74 74 61 62 20 2a 2f 0a 76 6f 69 64 20 61 63  cttab */.void ac
40e0: 74 74 61 62 5f 66 72 65 65 28 61 63 74 74 61 62  ttab_free(acttab
40f0: 20 2a 70 29 7b 0a 20 20 66 72 65 65 28 20 70 2d   *p){.  free( p-
4100: 3e 61 41 63 74 69 6f 6e 20 29 3b 0a 20 20 66 72  >aAction );.  fr
4110: 65 65 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  ee( p->aLookahea
4120: 64 20 29 3b 0a 20 20 66 72 65 65 28 20 70 20 29  d );.  free( p )
4130: 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;.}../* Allocate
4140: 20 61 20 6e 65 77 20 61 63 74 74 61 62 20 73 74   a new acttab st
4150: 72 75 63 74 75 72 65 20 2a 2f 0a 61 63 74 74 61  ructure */.actta
4160: 62 20 2a 61 63 74 74 61 62 5f 61 6c 6c 6f 63 28  b *acttab_alloc(
4170: 76 6f 69 64 29 7b 0a 20 20 61 63 74 74 61 62 20  void){.  acttab 
4180: 2a 70 20 3d 20 63 61 6c 6c 6f 63 28 20 31 2c 20  *p = calloc( 1, 
4190: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
41a0: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
41b0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
41c0: 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  Unable to alloca
41d0: 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20  te memory for a 
41e0: 6e 65 77 20 61 63 74 74 61 62 2e 22 29 3b 0a 20  new acttab.");. 
41f0: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
4200: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
4210: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 72 65  izeof(*p));.  re
4220: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 20 41 64  turn p;.}../* Ad
4230: 64 20 61 20 6e 65 77 20 61 63 74 69 6f 6e 20 74  d a new action t
4240: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  o the current tr
4250: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 0a 2a 2f  ansaction set.*/
4260: 0a 76 6f 69 64 20 61 63 74 74 61 62 5f 61 63 74  .void acttab_act
4270: 69 6f 6e 28 61 63 74 74 61 62 20 2a 70 2c 20 69  ion(acttab *p, i
4280: 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 2c 20 69 6e  nt lookahead, in
4290: 74 20 61 63 74 69 6f 6e 29 7b 0a 20 20 69 66 28  t action){.  if(
42a0: 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e 3d   p->nLookahead>=
42b0: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c  p->nLookaheadAll
42c0: 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 6f  oc ){.    p->nLo
42d0: 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 2b 3d 20  okaheadAlloc += 
42e0: 32 35 3b 0a 20 20 20 20 70 2d 3e 61 4c 6f 6f 6b  25;.    p->aLook
42f0: 61 68 65 61 64 20 3d 20 72 65 61 6c 6c 6f 63 28  ahead = realloc(
4300: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 2c 0a   p->aLookahead,.
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4320: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
4330: 65 6f 66 28 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  eof(p->aLookahea
4340: 64 5b 30 5d 29 2a 70 2d 3e 6e 4c 6f 6f 6b 61 68  d[0])*p->nLookah
4350: 65 61 64 41 6c 6c 6f 63 20 29 3b 0a 20 20 20 20  eadAlloc );.    
4360: 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  if( p->aLookahea
4370: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  d==0 ){.      fp
4380: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d 61  rintf(stderr,"ma
4390: 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b  lloc failed\n");
43a0: 0a 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a  .      exit(1);.
43b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
43c0: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3d 3d 30  p->nLookahead==0
43d0: 20 29 7b 0a 20 20 20 20 70 2d 3e 6d 78 4c 6f 6f   ){.    p->mxLoo
43e0: 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65  kahead = lookahe
43f0: 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f  ad;.    p->mnLoo
4400: 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65  kahead = lookahe
4410: 61 64 3b 0a 20 20 20 20 70 2d 3e 6d 6e 41 63 74  ad;.    p->mnAct
4420: 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20  ion = action;.  
4430: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
4440: 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 3c 6c 6f  ->mxLookahead<lo
4450: 6f 6b 61 68 65 61 64 20 29 20 70 2d 3e 6d 78 4c  okahead ) p->mxL
4460: 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61  ookahead = looka
4470: 68 65 61 64 3b 0a 20 20 20 20 69 66 28 20 70 2d  head;.    if( p-
4480: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3e 6c 6f 6f  >mnLookahead>loo
4490: 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20  kahead ){.      
44a0: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d  p->mnLookahead =
44b0: 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20   lookahead;.    
44c0: 20 20 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20    p->mnAction = 
44d0: 61 63 74 69 6f 6e 3b 0a 20 20 20 20 7d 0a 20 20  action;.    }.  
44e0: 7d 0a 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  }.  p->aLookahea
44f0: 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d  d[p->nLookahead]
4500: 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f  .lookahead = loo
4510: 6b 61 68 65 61 64 3b 0a 20 20 70 2d 3e 61 4c 6f  kahead;.  p->aLo
4520: 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b  okahead[p->nLook
4530: 61 68 65 61 64 5d 2e 61 63 74 69 6f 6e 20 3d 20  ahead].action = 
4540: 61 63 74 69 6f 6e 3b 0a 20 20 70 2d 3e 6e 4c 6f  action;.  p->nLo
4550: 6f 6b 61 68 65 61 64 2b 2b 3b 0a 7d 0a 0a 2f 2a  okahead++;.}../*
4560: 0a 2a 2a 20 41 64 64 20 74 68 65 20 74 72 61 6e  .** Add the tran
4570: 73 61 63 74 69 6f 6e 20 73 65 74 20 62 75 69 6c  saction set buil
4580: 74 20 75 70 20 77 69 74 68 20 70 72 69 6f 72 20  t up with prior 
4590: 63 61 6c 6c 73 20 74 6f 20 61 63 74 74 61 62 5f  calls to acttab_
45a0: 61 63 74 69 6f 6e 28 29 0a 2a 2a 20 69 6e 74 6f  action().** into
45b0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 63 74   the current act
45c0: 69 6f 6e 20 74 61 62 6c 65 2e 20 20 54 68 65 6e  ion table.  Then
45d0: 20 72 65 73 65 74 20 74 68 65 20 74 72 61 6e 73   reset the trans
45e0: 61 63 74 69 6f 6e 20 73 65 74 20 62 61 63 6b 0a  action set back.
45f0: 2a 2a 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 73  ** to an empty s
4600: 65 74 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  et in preparatio
4610: 6e 20 66 6f 72 20 61 20 6e 65 77 20 72 6f 75 6e  n for a new roun
4620: 64 20 6f 66 20 61 63 74 74 61 62 5f 61 63 74 69  d of acttab_acti
4630: 6f 6e 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  on() calls..**.*
4640: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
4650: 73 65 74 20 69 6e 74 6f 20 74 68 65 20 61 63 74  set into the act
4660: 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74 68 65  ion table of the
4670: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
4680: 2e 0a 2a 2f 0a 69 6e 74 20 61 63 74 74 61 62 5f  ..*/.int acttab_
4690: 69 6e 73 65 72 74 28 61 63 74 74 61 62 20 2a 70  insert(acttab *p
46a0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b  ){.  int i, j, k
46b0: 2c 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  , n;.  assert( p
46c0: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e 30 20 29  ->nLookahead>0 )
46d0: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
46e0: 65 20 77 65 20 68 61 76 65 20 65 6e 6f 75 67 68  e we have enough
46f0: 20 73 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   space to hold t
4700: 68 65 20 65 78 70 61 6e 64 65 64 20 61 63 74 69  he expanded acti
4710: 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2a 20 69 6e  on table.  ** in
4720: 20 74 68 65 20 77 6f 72 73 74 20 63 61 73 65 2e   the worst case.
4730: 20 20 54 68 65 20 77 6f 72 73 74 20 63 61 73 65    The worst case
4740: 20 6f 63 63 75 72 73 20 69 66 20 74 68 65 20 74   occurs if the t
4750: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 0a 20  ransaction set. 
4760: 20 2a 2a 20 6d 75 73 74 20 62 65 20 61 70 70 65   ** must be appe
4770: 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72  nded to the curr
4780: 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  ent action table
4790: 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 70 2d 3e 6d  .  */.  n = p->m
47a0: 78 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 31 3b 0a  xLookahead + 1;.
47b0: 20 20 69 66 28 20 70 2d 3e 6e 41 63 74 69 6f 6e    if( p->nAction
47c0: 20 2b 20 6e 20 3e 3d 20 70 2d 3e 6e 41 63 74 69   + n >= p->nActi
47d0: 6f 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69  onAlloc ){.    i
47e0: 6e 74 20 6f 6c 64 41 6c 6c 6f 63 20 3d 20 70 2d  nt oldAlloc = p-
47f0: 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 0a 20  >nActionAlloc;. 
4800: 20 20 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c     p->nActionAll
4810: 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 20  oc = p->nAction 
4820: 2b 20 6e 20 2b 20 70 2d 3e 6e 41 63 74 69 6f 6e  + n + p->nAction
4830: 41 6c 6c 6f 63 20 2b 20 32 30 3b 0a 20 20 20 20  Alloc + 20;.    
4840: 70 2d 3e 61 41 63 74 69 6f 6e 20 3d 20 72 65 61  p->aAction = rea
4850: 6c 6c 6f 63 28 20 70 2d 3e 61 41 63 74 69 6f 6e  lloc( p->aAction
4860: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4870: 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a 65              size
4880: 6f 66 28 70 2d 3e 61 41 63 74 69 6f 6e 5b 30 5d  of(p->aAction[0]
4890: 29 2a 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f  )*p->nActionAllo
48a0: 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61  c);.    if( p->a
48b0: 41 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20  Action==0 ){.   
48c0: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
48d0: 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  r,"malloc failed
48e0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74  \n");.      exit
48f0: 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  (1);.    }.    f
4900: 6f 72 28 69 3d 6f 6c 64 41 6c 6c 6f 63 3b 20 69  or(i=oldAlloc; i
4910: 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63  <p->nActionAlloc
4920: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; i++){.      p-
4930: 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b  >aAction[i].look
4940: 61 68 65 61 64 20 3d 20 2d 31 3b 0a 20 20 20 20  ahead = -1;.    
4950: 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e    p->aAction[i].
4960: 61 63 74 69 6f 6e 20 3d 20 2d 31 3b 0a 20 20 20  action = -1;.   
4970: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 63 61   }.  }..  /* Sca
4980: 6e 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 61  n the existing a
4990: 63 74 69 6f 6e 20 74 61 62 6c 65 20 6c 6f 6f 6b  ction table look
49a0: 69 6e 67 20 66 6f 72 20 61 6e 20 6f 66 66 73 65  ing for an offse
49b0: 74 20 77 68 65 72 65 20 77 65 20 63 61 6e 0a 20  t where we can. 
49c0: 20 2a 2a 20 69 6e 73 65 72 74 20 74 68 65 20 63   ** insert the c
49d0: 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
49e0: 6f 6e 20 73 65 74 2e 20 20 46 61 6c 6c 20 6f 75  on set.  Fall ou
49f0: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 68  t of the loop wh
4a00: 65 6e 20 74 68 61 74 0a 20 20 2a 2a 20 6f 66 66  en that.  ** off
4a10: 73 65 74 20 69 73 20 66 6f 75 6e 64 2e 20 20 49  set is found.  I
4a20: 6e 20 74 68 65 20 77 6f 72 73 74 20 63 61 73 65  n the worst case
4a30: 2c 20 77 65 20 66 61 6c 6c 20 6f 75 74 20 6f 66  , we fall out of
4a40: 20 74 68 65 20 6c 6f 6f 70 20 77 68 65 6e 0a 20   the loop when. 
4a50: 20 2a 2a 20 69 20 72 65 61 63 68 65 73 20 70 2d   ** i reaches p-
4a60: 3e 6e 41 63 74 69 6f 6e 2c 20 77 68 69 63 68 20  >nAction, which 
4a70: 6d 65 61 6e 73 20 77 65 20 61 70 70 65 6e 64 20  means we append 
4a80: 74 68 65 20 6e 65 77 20 74 72 61 6e 73 61 63 74  the new transact
4a90: 69 6f 6e 20 73 65 74 2e 0a 20 20 2a 2a 0a 20 20  ion set..  **.  
4aa0: 2a 2a 20 69 20 69 73 20 74 68 65 20 69 6e 64 65  ** i is the inde
4ab0: 78 20 69 6e 20 70 2d 3e 61 41 63 74 69 6f 6e 5b  x in p->aAction[
4ac0: 5d 20 77 68 65 72 65 20 70 2d 3e 6d 6e 4c 6f 6f  ] where p->mnLoo
4ad0: 6b 61 68 65 61 64 20 69 73 20 69 6e 73 65 72 74  kahead is insert
4ae0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ed..  */.  for(i
4af0: 3d 30 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e  =0; i<p->nAction
4b00: 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b  +p->mnLookahead;
4b10: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
4b20: 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f  ->aAction[i].loo
4b30: 6b 61 68 65 61 64 3c 30 20 29 7b 0a 20 20 20 20  kahead<0 ){.    
4b40: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
4b50: 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b 29  nLookahead; j++)
4b60: 7b 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 70 2d  {.        k = p-
4b70: 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c  >aLookahead[j].l
4b80: 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e  ookahead - p->mn
4b90: 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20  Lookahead + i;. 
4ba0: 20 20 20 20 20 20 20 69 66 28 20 6b 3c 30 20 29         if( k<0 )
4bb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
4bc0: 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b  if( p->aAction[k
4bd0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3e 3d 30 20 29  ].lookahead>=0 )
4be0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4bf0: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e        if( j<p->n
4c00: 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74  Lookahead ) cont
4c10: 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
4c20: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f  j=0; j<p->nActio
4c30: 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; j++){.       
4c40: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
4c50: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a 2b  j].lookahead==j+
4c60: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d 69  p->mnLookahead-i
4c70: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
4c80: 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70  }.      if( j==p
4c90: 2d 3e 6e 41 63 74 69 6f 6e 20 29 7b 0a 20 20 20  ->nAction ){.   
4ca0: 20 20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20       break;  /* 
4cb0: 46 69 74 73 20 69 6e 20 65 6d 70 74 79 20 73 6c  Fits in empty sl
4cc0: 6f 74 73 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ots */.      }. 
4cd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
4ce0: 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61  aAction[i].looka
4cf0: 68 65 61 64 3d 3d 70 2d 3e 6d 6e 4c 6f 6f 6b 61  head==p->mnLooka
4d00: 68 65 61 64 20 29 7b 0a 20 20 20 20 20 20 69 66  head ){.      if
4d10: 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e  ( p->aAction[i].
4d20: 61 63 74 69 6f 6e 21 3d 70 2d 3e 6d 6e 41 63 74  action!=p->mnAct
4d30: 69 6f 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ion ) continue;.
4d40: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
4d50: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20  <p->nLookahead; 
4d60: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20  j++){.        k 
4d70: 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  = p->aLookahead[
4d80: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70  j].lookahead - p
4d90: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20  ->mnLookahead + 
4da0: 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b  i;.        if( k
4db0: 3c 30 20 7c 7c 20 6b 3e 3d 70 2d 3e 6e 41 63 74  <0 || k>=p->nAct
4dc0: 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ion ) break;.   
4dd0: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f       if( p->aLoo
4de0: 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68  kahead[j].lookah
4df0: 65 61 64 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b  ead!=p->aAction[
4e00: 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 29 20 62  k].lookahead ) b
4e10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  reak;.        if
4e20: 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  ( p->aLookahead[
4e30: 6a 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 61 41  j].action!=p->aA
4e40: 63 74 69 6f 6e 5b 6b 5d 2e 61 63 74 69 6f 6e 20  ction[k].action 
4e50: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
4e60: 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e  .      if( j<p->
4e70: 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e  nLookahead ) con
4e80: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 6e 20 3d  tinue;.      n =
4e90: 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d   0;.      for(j=
4ea0: 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74 69 6f 6e 3b  0; j<p->nAction;
4eb0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
4ec0: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d  f( p->aAction[j]
4ed0: 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29 20 63  .lookahead<0 ) c
4ee0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
4ef0: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
4f00: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a 2b  j].lookahead==j+
4f10: 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d 69  p->mnLookahead-i
4f20: 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a   ) n++;.      }.
4f30: 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 70 2d 3e        if( n==p->
4f40: 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20  nLookahead ){.  
4f50: 20 20 20 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a        break;  /*
4f60: 20 53 61 6d 65 20 61 73 20 61 20 70 72 69 6f 72   Same as a prior
4f70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74   transaction set
4f80: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
4f90: 7d 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  }.  }.  /* Inser
4fa0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  t transaction se
4fb0: 74 20 61 74 20 69 6e 64 65 78 20 69 2e 20 2a 2f  t at index i. */
4fc0: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d  .  for(j=0; j<p-
4fd0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20 6a 2b 2b  >nLookahead; j++
4fe0: 29 7b 0a 20 20 20 20 6b 20 3d 20 70 2d 3e 61 4c  ){.    k = p->aL
4ff0: 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b  ookahead[j].look
5000: 61 68 65 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f  ahead - p->mnLoo
5010: 6b 61 68 65 61 64 20 2b 20 69 3b 0a 20 20 20 20  kahead + i;.    
5020: 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 20 3d 20  p->aAction[k] = 
5030: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d  p->aLookahead[j]
5040: 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d 70 2d 3e  ;.    if( k>=p->
5050: 6e 41 63 74 69 6f 6e 20 29 20 70 2d 3e 6e 41 63  nAction ) p->nAc
5060: 74 69 6f 6e 20 3d 20 6b 2b 31 3b 0a 20 20 7d 0a  tion = k+1;.  }.
5070: 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20    p->nLookahead 
5080: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72  = 0;..  /* Retur
5090: 6e 20 74 68 65 20 6f 66 66 73 65 74 20 74 68 61  n the offset tha
50a0: 74 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  t is added to th
50b0: 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 6e 20 6f  e lookahead in o
50c0: 72 64 65 72 20 74 6f 20 67 65 74 20 74 68 65 0a  rder to get the.
50d0: 20 20 2a 2a 20 69 6e 64 65 78 20 69 6e 74 6f 20    ** index into 
50e0: 79 79 5f 61 63 74 69 6f 6e 20 6f 66 20 74 68 65  yy_action of the
50f0: 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 65 74   action */.  ret
5100: 75 72 6e 20 69 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f  urn i - p->mnLoo
5110: 6b 61 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  kahead;.}../****
5120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5130: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
5140: 20 22 62 75 69 6c 64 2e 63 22 20 2a 2a 2a 2a 2a   "build.c" *****
5150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5160: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
5170: 52 6f 75 74 69 6e 65 73 20 74 6f 20 63 6f 6e 73  Routines to cons
5180: 74 72 75 63 74 69 6f 6e 20 74 68 65 20 66 69 6e  truction the fin
5190: 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e  ite state machin
51a0: 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 0a  e for the LEMON.
51b0: 2a 2a 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ** parser genera
51c0: 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e 64  tor..*/../* Find
51d0: 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73 79   a precedence sy
51e0: 6d 62 6f 6c 20 6f 66 20 65 76 65 72 79 20 72 75  mbol of every ru
51f0: 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61  le in the gramma
5200: 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 6f 73 65 20  r..** .** Those 
5210: 72 75 6c 65 73 20 77 68 69 63 68 20 68 61 76 65  rules which have
5220: 20 61 20 70 72 65 63 65 64 65 6e 63 65 20 73 79   a precedence sy
5230: 6d 62 6f 6c 20 63 6f 64 65 64 20 69 6e 20 74 68  mbol coded in th
5240: 65 20 69 6e 70 75 74 0a 2a 2a 20 67 72 61 6d 6d  e input.** gramm
5250: 61 72 20 75 73 69 6e 67 20 74 68 65 20 22 5b 73  ar using the "[s
5260: 79 6d 62 6f 6c 5d 22 20 63 6f 6e 73 74 72 75 63  ymbol]" construc
5270: 74 20 77 69 6c 6c 20 61 6c 72 65 61 64 79 20 68  t will already h
5280: 61 76 65 20 74 68 65 0a 2a 2a 20 72 70 2d 3e 70  ave the.** rp->p
5290: 72 65 63 73 79 6d 20 66 69 65 6c 64 20 66 69 6c  recsym field fil
52a0: 6c 65 64 2e 20 20 4f 74 68 65 72 20 72 75 6c 65  led.  Other rule
52b0: 73 20 74 61 6b 65 20 61 73 20 74 68 65 69 72 20  s take as their 
52c0: 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a 20 73 79  precedence.** sy
52d0: 6d 62 6f 6c 20 74 68 65 20 66 69 72 73 74 20 52  mbol the first R
52e0: 48 53 20 73 79 6d 62 6f 6c 20 77 69 74 68 20 61  HS symbol with a
52f0: 20 64 65 66 69 6e 65 64 20 70 72 65 63 65 64 65   defined precede
5300: 6e 63 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  nce.  If there.*
5310: 2a 20 61 72 65 20 6e 6f 74 20 52 48 53 20 73 79  * are not RHS sy
5320: 6d 62 6f 6c 73 20 77 69 74 68 20 61 20 64 65 66  mbols with a def
5330: 69 6e 65 64 20 70 72 65 63 65 64 65 6e 63 65 2c  ined precedence,
5340: 20 74 68 65 20 70 72 65 63 65 64 65 6e 63 65 0a   the precedence.
5350: 2a 2a 20 73 79 6d 62 6f 6c 20 66 69 65 6c 64 20  ** symbol field 
5360: 69 73 20 6c 65 66 74 20 62 6c 61 6e 6b 2e 0a 2a  is left blank..*
5370: 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75 6c 65 50  /.void FindRuleP
5380: 72 65 63 65 64 65 6e 63 65 73 28 78 70 29 0a 73  recedences(xp).s
5390: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 78 70 3b  truct lemon *xp;
53a0: 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  .{.  struct rule
53b0: 20 2a 72 70 3b 0a 20 20 66 6f 72 28 72 70 3d 78   *rp;.  for(rp=x
53c0: 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
53d0: 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69  rp->next){.    i
53e0: 66 28 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d  f( rp->precsym==
53f0: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
5400: 2c 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  , j;.      for(i
5410: 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 20 26  =0; i<rp->nrhs &
5420: 26 20 72 70 2d 3e 70 72 65 63 73 79 6d 3d 3d 30  & rp->precsym==0
5430: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
5440: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
5450: 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a  p = rp->rhs[i];.
5460: 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e          if( sp->
5470: 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
5480: 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NAL ){.         
5490: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73 70 2d 3e   for(j=0; j<sp->
54a0: 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20  nsubsym; j++){. 
54b0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
54c0: 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 70 72  p->subsym[j]->pr
54d0: 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ec>=0 ){.       
54e0: 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73         rp->precs
54f0: 79 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b  ym = sp->subsym[
5500: 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  j];.            
5510: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5520: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5530: 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
5540: 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e 3d 30   if( sp->prec>=0
5550: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 70   ){.          rp
5560: 2d 3e 70 72 65 63 73 79 6d 20 3d 20 72 70 2d 3e  ->precsym = rp->
5570: 72 68 73 5b 69 5d 3b 0a 09 7d 0a 20 20 20 20 20  rhs[i];..}.     
5580: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
5590: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 46 69 6e  eturn;.}../* Fin
55a0: 64 20 61 6c 6c 20 6e 6f 6e 74 65 72 6d 69 6e 61  d all nontermina
55b0: 6c 73 20 77 68 69 63 68 20 77 69 6c 6c 20 67 65  ls which will ge
55c0: 6e 65 72 61 74 65 20 74 68 65 20 65 6d 70 74 79  nerate the empty
55d0: 20 73 74 72 69 6e 67 2e 0a 2a 2a 20 54 68 65 6e   string..** Then
55e0: 20 67 6f 20 62 61 63 6b 20 61 6e 64 20 63 6f 6d   go back and com
55f0: 70 75 74 65 20 74 68 65 20 66 69 72 73 74 20 73  pute the first s
5600: 65 74 73 20 6f 66 20 65 76 65 72 79 20 6e 6f 6e  ets of every non
5610: 74 65 72 6d 69 6e 61 6c 2e 0a 2a 2a 20 54 68 65  terminal..** The
5620: 20 66 69 72 73 74 20 73 65 74 20 69 73 20 74 68   first set is th
5630: 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 74 65 72  e set of all ter
5640: 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 77 68  minal symbols wh
5650: 69 63 68 20 63 61 6e 20 62 65 67 69 6e 0a 2a 2a  ich can begin.**
5660: 20 61 20 73 74 72 69 6e 67 20 67 65 6e 65 72 61   a string genera
5670: 74 65 64 20 62 79 20 74 68 61 74 20 6e 6f 6e 74  ted by that nont
5680: 65 72 6d 69 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64  erminal..*/.void
5690: 20 46 69 6e 64 46 69 72 73 74 53 65 74 73 28 6c   FindFirstSets(l
56a0: 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
56b0: 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74  n *lemp;.{.  int
56c0: 20 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74 20   i, j;.  struct 
56d0: 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e 74 20  rule *rp;.  int 
56e0: 70 72 6f 67 72 65 73 73 3b 0a 0a 20 20 66 6f 72  progress;..  for
56f0: 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
5700: 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
5710: 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
5720: 5d 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f  ]->lambda = LEMO
5730: 4e 5f 46 41 4c 53 45 3b 0a 20 20 7d 0a 20 20 66  N_FALSE;.  }.  f
5740: 6f 72 28 69 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d  or(i=lemp->nterm
5750: 69 6e 61 6c 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  inal; i<lemp->ns
5760: 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
5770: 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
5780: 5d 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 53 65  ]->firstset = Se
5790: 74 4e 65 77 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f  tNew();.  }..  /
57a0: 2a 20 46 69 72 73 74 20 63 6f 6d 70 75 74 65 20  * First compute 
57b0: 61 6c 6c 20 6c 61 6d 62 64 61 73 20 2a 2f 0a 20  all lambdas */. 
57c0: 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73   do{.    progres
57d0: 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 72  s = 0;.    for(r
57e0: 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
57f0: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
5800: 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68        if( rp->lh
5810: 73 2d 3e 6c 61 6d 62 64 61 20 29 20 63 6f 6e 74  s->lambda ) cont
5820: 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
5830: 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  i=0; i<rp->nrhs;
5840: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
5850: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
5860: 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a  p = rp->rhs[i];.
5870: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d           if( sp-
5880: 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 20  >type!=TERMINAL 
5890: 7c 7c 20 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c  || sp->lambda==L
58a0: 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65  EMON_FALSE ) bre
58b0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
58c0: 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68    if( i==rp->nrh
58d0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72 70 2d  s ){.        rp-
58e0: 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c  >lhs->lambda = L
58f0: 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20 20  EMON_TRUE;.     
5900: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
5910: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5920: 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73   }while( progres
5930: 73 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63  s );..  /* Now c
5940: 6f 6d 70 75 74 65 20 61 6c 6c 20 66 69 72 73 74  ompute all first
5950: 20 73 65 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20   sets */.  do{. 
5960: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
5970: 20 2a 73 31 2c 20 2a 73 32 3b 0a 20 20 20 20 70   *s1, *s2;.    p
5980: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
5990: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
59a0: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
59b0: 65 78 74 29 7b 0a 20 20 20 20 20 20 73 31 20 3d  ext){.      s1 =
59c0: 20 72 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20   rp->lhs;.      
59d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
59e0: 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
59f0: 20 20 20 73 32 20 3d 20 72 70 2d 3e 72 68 73 5b     s2 = rp->rhs[
5a00: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
5a10: 73 32 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  s2->type==TERMIN
5a20: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
5a30: 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41  progress += SetA
5a40: 64 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c  dd(s1->firstset,
5a50: 73 32 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  s2->index);.    
5a60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5a70: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
5a80: 32 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  2->type==MULTITE
5a90: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
5aa0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
5ab0: 32 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29  2->nsubsym; j++)
5ac0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  {.            pr
5ad0: 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41 64 64  ogress += SetAdd
5ae0: 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32  (s1->firstset,s2
5af0: 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 69 6e 64  ->subsym[j]->ind
5b00: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ex);.          }
5b10: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
5b20: 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 31 3d  ;..}else if( s1=
5b30: 3d 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =s2 ){.         
5b40: 20 69 66 28 20 73 31 2d 3e 6c 61 6d 62 64 61 3d   if( s1->lambda=
5b50: 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62  =LEMON_FALSE ) b
5b60: 72 65 61 6b 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20  reak;..}else{.  
5b70: 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73          progress
5b80: 20 2b 3d 20 53 65 74 55 6e 69 6f 6e 28 73 31 2d   += SetUnion(s1-
5b90: 3e 66 69 72 73 74 73 65 74 2c 73 32 2d 3e 66 69  >firstset,s2->fi
5ba0: 72 73 74 73 65 74 29 3b 0a 20 20 20 20 20 20 20  rstset);.       
5bb0: 20 20 20 69 66 28 20 73 32 2d 3e 6c 61 6d 62 64     if( s2->lambd
5bc0: 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29  a==LEMON_FALSE )
5bd0: 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 20   break;..}.     
5be0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c   }.    }.  }whil
5bf0: 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 20  e( progress );. 
5c00: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 43   return;.}../* C
5c10: 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30 29  ompute all LR(0)
5c20: 20 73 74 61 74 65 73 20 66 6f 72 20 74 68 65 20   states for the 
5c30: 67 72 61 6d 6d 61 72 2e 20 20 4c 69 6e 6b 73 0a  grammar.  Links.
5c40: 2a 2a 20 61 72 65 20 61 64 64 65 64 20 74 6f 20  ** are added to 
5c50: 62 65 74 77 65 65 6e 20 73 6f 6d 65 20 73 74 61  between some sta
5c60: 74 65 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  tes so that the 
5c70: 4c 52 28 31 29 20 66 6f 6c 6c 6f 77 20 73 65 74  LR(1) follow set
5c80: 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63 6f 6d 70  s.** can be comp
5c90: 75 74 65 64 20 6c 61 74 65 72 2e 0a 2a 2f 0a 50  uted later..*/.P
5ca0: 52 49 56 41 54 45 20 73 74 72 75 63 74 20 73 74  RIVATE struct st
5cb0: 61 74 65 20 2a 67 65 74 73 74 61 74 65 28 2f 2a  ate *getstate(/*
5cc0: 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20   struct lemon * 
5cd0: 2a 2f 29 3b 20 20 2f 2a 20 66 6f 72 77 61 72 64  */);  /* forward
5ce0: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 76 6f   reference */.vo
5cf0: 69 64 20 46 69 6e 64 53 74 61 74 65 73 28 6c 65  id FindStates(le
5d00: 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
5d10: 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75   *lemp;.{.  stru
5d20: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20  ct symbol *sp;. 
5d30: 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
5d40: 3b 0a 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  ;..  Configlist_
5d50: 69 6e 69 74 28 29 3b 0a 0a 20 20 2f 2a 20 46 69  init();..  /* Fi
5d60: 6e 64 20 74 68 65 20 73 74 61 72 74 20 73 79 6d  nd the start sym
5d70: 62 6f 6c 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d  bol */.  if( lem
5d80: 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20 20 20 20  p->start ){.    
5d90: 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64  sp = Symbol_find
5da0: 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20  (lemp->start);. 
5db0: 20 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a     if( sp==0 ){.
5dc0: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c        ErrorMsg(l
5dd0: 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c  emp->filename,0,
5de0: 0a 22 54 68 65 20 73 70 65 63 69 66 69 65 64 20  ."The specified 
5df0: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c 22 25  start symbol \"%
5e00: 73 5c 22 20 69 73 20 6e 6f 74 20 5c 0a 69 6e 20  s\" is not \.in 
5e10: 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6f 66  a nonterminal of
5e20: 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 5c   the grammar.  \
5e30: 22 25 73 5c 22 20 77 69 6c 6c 20 62 65 20 75 73  "%s\" will be us
5e40: 65 64 20 61 73 20 74 68 65 20 73 74 61 72 74 20  ed as the start 
5e50: 5c 0a 73 79 6d 62 6f 6c 20 69 6e 73 74 65 61 64  \.symbol instead
5e60: 2e 22 2c 6c 65 6d 70 2d 3e 73 74 61 72 74 2c 6c  .",lemp->start,l
5e70: 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 2d 3e  emp->rule->lhs->
5e80: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d  name);.      lem
5e90: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
5ea0: 20 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e       sp = lemp->
5eb0: 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 20 20 7d  rule->lhs;.    }
5ec0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70  .  }else{.    sp
5ed0: 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c   = lemp->rule->l
5ee0: 68 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  hs;.  }..  /* Ma
5ef0: 6b 65 20 73 75 72 65 20 74 68 65 20 73 74 61 72  ke sure the star
5f00: 74 20 73 79 6d 62 6f 6c 20 64 6f 65 73 6e 27 74  t symbol doesn't
5f10: 20 6f 63 63 75 72 20 6f 6e 20 74 68 65 20 72 69   occur on the ri
5f20: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
5f30: 0a 20 20 2a 2a 20 61 6e 79 20 72 75 6c 65 2e 20  .  ** any rule. 
5f40: 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   Report an error
5f50: 20 69 66 20 69 74 20 64 6f 65 73 2e 20 20 28 59   if it does.  (Y
5f60: 41 43 43 20 77 6f 75 6c 64 20 67 65 6e 65 72 61  ACC would genera
5f70: 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a 20 73 74  te a new.  ** st
5f80: 61 72 74 20 73 79 6d 62 6f 6c 20 69 6e 20 74 68  art symbol in th
5f90: 69 73 20 63 61 73 65 2e 29 20 2a 2f 0a 20 20 66  is case.) */.  f
5fa0: 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
5fb0: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
5fc0: 74 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  t){.    int i;. 
5fd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
5fe0: 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
5ff0: 20 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73 5b      if( rp->rhs[
6000: 69 5d 3d 3d 73 70 20 29 7b 20 20 20 2f 2a 20 46  i]==sp ){   /* F
6010: 49 58 20 4d 45 3a 20 20 44 65 61 6c 20 77 69 74  IX ME:  Deal wit
6020: 68 20 6d 75 6c 74 69 74 65 72 6d 69 6e 61 6c 73  h multiterminals
6030: 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 72 72 6f   */.        Erro
6040: 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
6050: 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73 74 61 72  ame,0,."The star
6060: 74 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20  t symbol \"%s\" 
6070: 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 5c 0a  occurs on the \.
6080: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
6090: 6f 66 20 61 20 72 75 6c 65 2e 20 54 68 69 73 20  of a rule. This 
60a0: 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20 61  will result in a
60b0: 20 70 61 72 73 65 72 20 77 68 69 63 68 20 5c 0a   parser which \.
60c0: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 70 72  does not work pr
60d0: 6f 70 65 72 6c 79 2e 22 2c 73 70 2d 3e 6e 61 6d  operly.",sp->nam
60e0: 65 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 70  e);.        lemp
60f0: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
6100: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
6110: 0a 20 20 2f 2a 20 54 68 65 20 62 61 73 69 73 20  .  /* The basis 
6120: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  configuration se
6130: 74 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  t for the first 
6140: 73 74 61 74 65 0a 20 20 2a 2a 20 69 73 20 61 6c  state.  ** is al
6150: 6c 20 72 75 6c 65 73 20 77 68 69 63 68 20 68 61  l rules which ha
6160: 76 65 20 74 68 65 20 73 74 61 72 74 20 73 79 6d  ve the start sym
6170: 62 6f 6c 20 61 73 20 74 68 65 69 72 0a 20 20 2a  bol as their.  *
6180: 2a 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65  * left-hand side
6190: 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 73 70 2d   */.  for(rp=sp-
61a0: 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
61b0: 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20 20  ->nextlhs){.    
61c0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
61d0: 65 77 63 66 70 3b 0a 20 20 20 20 72 70 2d 3e 6c  ewcfp;.    rp->l
61e0: 68 73 53 74 61 72 74 20 3d 20 31 3b 0a 20 20 20  hsStart = 1;.   
61f0: 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e 66 69 67   newcfp = Config
6200: 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 72 70  list_addbasis(rp
6210: 2c 30 29 3b 0a 20 20 20 20 53 65 74 41 64 64 28  ,0);.    SetAdd(
6220: 6e 65 77 63 66 70 2d 3e 66 77 73 2c 30 29 3b 0a  newcfp->fws,0);.
6230: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74    }..  /* Comput
6240: 65 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74  e the first stat
6250: 65 2e 20 20 41 6c 6c 20 6f 74 68 65 72 20 73 74  e.  All other st
6260: 61 74 65 73 20 77 69 6c 6c 20 62 65 0a 20 20 2a  ates will be.  *
6270: 2a 20 63 6f 6d 70 75 74 65 64 20 61 75 74 6f 6d  * computed autom
6280: 61 74 69 63 61 6c 6c 79 20 64 75 72 69 6e 67 20  atically during 
6290: 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
62a0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65  of the first one
62b0: 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72  ..  ** The retur
62c0: 6e 65 64 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ned pointer to t
62d0: 68 65 20 66 69 72 73 74 20 73 74 61 74 65 20 69  he first state i
62e0: 73 20 6e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20  s not used. */. 
62f0: 20 28 76 6f 69 64 29 67 65 74 73 74 61 74 65 28   (void)getstate(
6300: 6c 65 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b  lemp);.  return;
6310: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
6320: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61  pointer to a sta
6330: 74 65 20 77 68 69 63 68 20 69 73 20 64 65 73 63  te which is desc
6340: 72 69 62 65 64 20 62 79 20 74 68 65 20 63 6f 6e  ribed by the con
6350: 66 69 67 75 72 61 74 69 6f 6e 0a 2a 2a 20 6c 69  figuration.** li
6360: 73 74 20 77 68 69 63 68 20 68 61 73 20 62 65 65  st which has bee
6370: 6e 20 62 75 69 6c 74 20 66 72 6f 6d 20 63 61 6c  n built from cal
6380: 6c 73 20 74 6f 20 43 6f 6e 66 69 67 6c 69 73 74  ls to Configlist
6390: 5f 61 64 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  _add..*/.PRIVATE
63a0: 20 76 6f 69 64 20 62 75 69 6c 64 73 68 69 66 74   void buildshift
63b0: 73 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f  s(/* struct lemo
63c0: 6e 20 2a 2c 20 73 74 72 75 63 74 20 73 74 61 74  n *, struct stat
63d0: 65 20 2a 20 2a 2f 29 3b 20 2f 2a 20 46 6f 72 77  e * */); /* Forw
63e0: 64 20 72 65 66 20 2a 2f 0a 50 52 49 56 41 54 45  d ref */.PRIVATE
63f0: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 67   struct state *g
6400: 65 74 73 74 61 74 65 28 6c 65 6d 70 29 0a 73 74  etstate(lemp).st
6410: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
6420: 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  ;.{.  struct con
6430: 66 69 67 20 2a 63 66 70 2c 20 2a 62 70 3b 0a 20  fig *cfp, *bp;. 
6440: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
6450: 74 70 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63  tp;..  /* Extrac
6460: 74 20 74 68 65 20 73 6f 72 74 65 64 20 62 61 73  t the sorted bas
6470: 69 73 20 6f 66 20 74 68 65 20 6e 65 77 20 73 74  is of the new st
6480: 61 74 65 2e 20 20 54 68 65 20 62 61 73 69 73 20  ate.  The basis 
6490: 77 61 73 20 63 6f 6e 73 74 72 75 63 74 65 64 0a  was constructed.
64a0: 20 20 2a 2a 20 62 79 20 70 72 69 6f 72 20 63 61    ** by prior ca
64b0: 6c 6c 73 20 74 6f 20 22 43 6f 6e 66 69 67 6c 69  lls to "Configli
64c0: 73 74 5f 61 64 64 62 61 73 69 73 28 29 22 2e 20  st_addbasis()". 
64d0: 2a 2f 0a 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f  */.  Configlist_
64e0: 73 6f 72 74 62 61 73 69 73 28 29 3b 0a 20 20 62  sortbasis();.  b
64f0: 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 62  p = Configlist_b
6500: 61 73 69 73 28 29 3b 0a 0a 20 20 2f 2a 20 47 65  asis();..  /* Ge
6510: 74 20 61 20 73 74 61 74 65 20 77 69 74 68 20 74  t a state with t
6520: 68 65 20 73 61 6d 65 20 62 61 73 69 73 20 2a 2f  he same basis */
6530: 0a 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f 66  .  stp = State_f
6540: 69 6e 64 28 62 70 29 3b 0a 20 20 69 66 28 20 73  ind(bp);.  if( s
6550: 74 70 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 73  tp ){.    /* A s
6560: 74 61 74 65 20 77 69 74 68 20 74 68 65 20 73 61  tate with the sa
6570: 6d 65 20 62 61 73 69 73 20 61 6c 72 65 61 64 79  me basis already
6580: 20 65 78 69 73 74 73 21 20 20 43 6f 70 79 20 61   exists!  Copy a
6590: 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65  ll the follow-se
65a0: 74 0a 20 20 20 20 2a 2a 20 70 72 6f 70 61 67 61  t.    ** propaga
65b0: 74 69 6f 6e 20 6c 69 6e 6b 73 20 66 72 6f 6d 20  tion links from 
65c0: 74 68 65 20 73 74 61 74 65 20 75 6e 64 65 72 20  the state under 
65d0: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 74  construction int
65e0: 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 65  o the.    ** pre
65f0: 65 78 69 73 74 69 6e 67 20 73 74 61 74 65 2c 20  existing state, 
6600: 74 68 65 6e 20 72 65 74 75 72 6e 20 61 20 70 6f  then return a po
6610: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 72 65  inter to the pre
6620: 65 78 69 73 74 69 6e 67 20 73 74 61 74 65 20 2a  existing state *
6630: 2f 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e  /.    struct con
6640: 66 69 67 20 2a 78 2c 20 2a 79 3b 0a 20 20 20 20  fig *x, *y;.    
6650: 66 6f 72 28 78 3d 62 70 2c 20 79 3d 73 74 70 2d  for(x=bp, y=stp-
6660: 3e 62 70 3b 20 78 20 26 26 20 79 3b 20 78 3d 78  >bp; x && y; x=x
6670: 2d 3e 62 70 2c 20 79 3d 79 2d 3e 62 70 29 7b 0a  ->bp, y=y->bp){.
6680: 20 20 20 20 20 20 50 6c 69 6e 6b 5f 63 6f 70 79        Plink_copy
6690: 28 26 79 2d 3e 62 70 6c 70 2c 78 2d 3e 62 70 6c  (&y->bplp,x->bpl
66a0: 70 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f  p);.      Plink_
66b0: 64 65 6c 65 74 65 28 78 2d 3e 66 70 6c 70 29 3b  delete(x->fplp);
66c0: 0a 20 20 20 20 20 20 78 2d 3e 66 70 6c 70 20 3d  .      x->fplp =
66d0: 20 78 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20   x->bplp = 0;.  
66e0: 20 20 7d 0a 20 20 20 20 63 66 70 20 3d 20 43 6f    }.    cfp = Co
66f0: 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28  nfiglist_return(
6700: 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73  );.    Configlis
6710: 74 5f 65 61 74 28 63 66 70 29 3b 0a 20 20 7d 65  t_eat(cfp);.  }e
6720: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  lse{.    /* This
6730: 20 72 65 61 6c 6c 79 20 69 73 20 61 20 6e 65 77   really is a new
6740: 20 73 74 61 74 65 2e 20 20 43 6f 6e 73 74 72 75   state.  Constru
6750: 63 74 20 61 6c 6c 20 74 68 65 20 64 65 74 61 69  ct all the detai
6760: 6c 73 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67  ls */.    Config
6770: 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 6c 65 6d  list_closure(lem
6780: 70 29 3b 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  p);    /* Comput
6790: 65 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  e the configurat
67a0: 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20  ion closure */. 
67b0: 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f     Configlist_so
67c0: 72 74 28 29 3b 20 20 20 20 20 20 20 20 20 20 20  rt();           
67d0: 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f 6e 66  /* Sort the conf
67e0: 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72  iguration closur
67f0: 65 20 2a 2f 0a 20 20 20 20 63 66 70 20 3d 20 43  e */.    cfp = C
6800: 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e  onfiglist_return
6810: 28 29 3b 20 20 20 2f 2a 20 47 65 74 20 61 20 70  ();   /* Get a p
6820: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f  ointer to the co
6830: 6e 66 69 67 20 6c 69 73 74 20 2a 2f 0a 20 20 20  nfig list */.   
6840: 20 73 74 70 20 3d 20 53 74 61 74 65 5f 6e 65 77   stp = State_new
6850: 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ();           /*
6860: 20 41 20 6e 65 77 20 73 74 61 74 65 20 73 74 72   A new state str
6870: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 4d 65  ucture */.    Me
6880: 6d 6f 72 79 43 68 65 63 6b 28 73 74 70 29 3b 0a  moryCheck(stp);.
6890: 20 20 20 20 73 74 70 2d 3e 62 70 20 3d 20 62 70      stp->bp = bp
68a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
68b0: 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65   /* Remember the
68c0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 62   configuration b
68d0: 61 73 69 73 20 2a 2f 0a 20 20 20 20 73 74 70 2d  asis */.    stp-
68e0: 3e 63 66 70 20 3d 20 63 66 70 3b 20 20 20 20 20  >cfp = cfp;     
68f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65           /* Reme
6900: 6d 62 65 72 20 74 68 65 20 63 6f 6e 66 69 67 75  mber the configu
6910: 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a  ration closure *
6920: 2f 0a 20 20 20 20 73 74 70 2d 3e 73 74 61 74 65  /.    stp->state
6930: 6e 75 6d 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  num = lemp->nsta
6940: 74 65 2b 2b 3b 20 2f 2a 20 45 76 65 72 79 20 73  te++; /* Every s
6950: 74 61 74 65 20 67 65 74 73 20 61 20 73 65 71 75  tate gets a sequ
6960: 65 6e 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ence number */. 
6970: 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 30 3b 20     stp->ap = 0; 
6980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6990: 2f 2a 20 4e 6f 20 61 63 74 69 6f 6e 73 2c 20 79  /* No actions, y
69a0: 65 74 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65  et. */.    State
69b0: 5f 69 6e 73 65 72 74 28 73 74 70 2c 73 74 70 2d  _insert(stp,stp-
69c0: 3e 62 70 29 3b 20 20 20 2f 2a 20 41 64 64 20 74  >bp);   /* Add t
69d0: 6f 20 74 68 65 20 73 74 61 74 65 20 74 61 62 6c  o the state tabl
69e0: 65 20 2a 2f 0a 20 20 20 20 62 75 69 6c 64 73 68  e */.    buildsh
69f0: 69 66 74 73 28 6c 65 6d 70 2c 73 74 70 29 3b 20  ifts(lemp,stp); 
6a00: 20 20 20 20 20 20 2f 2a 20 52 65 63 75 72 73 69        /* Recursi
6a10: 76 65 6c 79 20 63 6f 6d 70 75 74 65 20 73 75 63  vely compute suc
6a20: 63 65 73 73 6f 72 20 73 74 61 74 65 73 20 2a 2f  cessor states */
6a30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 74  .  }.  return st
6a40: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
6a50: 72 6e 20 74 72 75 65 20 69 66 20 74 77 6f 20 73  rn true if two s
6a60: 79 6d 62 6f 6c 73 20 61 72 65 20 74 68 65 20 73  ymbols are the s
6a70: 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 61 6d 65  ame..*/.int same
6a80: 5f 73 79 6d 62 6f 6c 28 61 2c 62 29 0a 73 74 72  _symbol(a,b).str
6a90: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 61 3b 0a 73  uct symbol *a;.s
6aa0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62 3b  truct symbol *b;
6ab0: 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  .{.  int i;.  if
6ac0: 28 20 61 3d 3d 62 20 29 20 72 65 74 75 72 6e 20  ( a==b ) return 
6ad0: 31 3b 0a 20 20 69 66 28 20 61 2d 3e 74 79 70 65  1;.  if( a->type
6ae0: 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  !=MULTITERMINAL 
6af0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
6b00: 28 20 62 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49  ( b->type!=MULTI
6b10: 54 45 52 4d 49 4e 41 4c 20 29 20 72 65 74 75 72  TERMINAL ) retur
6b20: 6e 20 30 3b 0a 20 20 69 66 28 20 61 2d 3e 6e 73  n 0;.  if( a->ns
6b30: 75 62 73 79 6d 21 3d 62 2d 3e 6e 73 75 62 73 79  ubsym!=b->nsubsy
6b40: 6d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  m ) return 0;.  
6b50: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 2d 3e 6e 73  for(i=0; i<a->ns
6b60: 75 62 73 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ubsym; i++){.   
6b70: 20 69 66 28 20 61 2d 3e 73 75 62 73 79 6d 5b 69   if( a->subsym[i
6b80: 5d 21 3d 62 2d 3e 73 75 62 73 79 6d 5b 69 5d 20  ]!=b->subsym[i] 
6b90: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
6ba0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
6bb0: 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 6c 6c 20  * Construct all 
6bc0: 73 75 63 63 65 73 73 6f 72 20 73 74 61 74 65 73  successor states
6bd0: 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 73 74   to the given st
6be0: 61 74 65 2e 20 20 41 20 22 73 75 63 63 65 73 73  ate.  A "success
6bf0: 6f 72 22 0a 2a 2a 20 73 74 61 74 65 20 69 73 20  or".** state is 
6c00: 61 6e 79 20 73 74 61 74 65 20 77 68 69 63 68 20  any state which 
6c10: 63 61 6e 20 62 65 20 72 65 61 63 68 65 64 20 62  can be reached b
6c20: 79 20 61 20 73 68 69 66 74 20 61 63 74 69 6f 6e  y a shift action
6c30: 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  ..*/.PRIVATE voi
6c40: 64 20 62 75 69 6c 64 73 68 69 66 74 73 28 6c 65  d buildshifts(le
6c50: 6d 70 2c 73 74 70 29 0a 73 74 72 75 63 74 20 6c  mp,stp).struct l
6c60: 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 73 74 72 75  emon *lemp;.stru
6c70: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 20 20  ct state *stp;  
6c80: 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 20     /* The state 
6c90: 66 72 6f 6d 20 77 68 69 63 68 20 73 75 63 63 65  from which succe
6ca0: 73 73 6f 72 73 20 61 72 65 20 63 6f 6d 70 75 74  ssors are comput
6cb0: 65 64 20 2a 2f 0a 7b 0a 20 20 73 74 72 75 63 74  ed */.{.  struct
6cc0: 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20 2f   config *cfp;  /
6cd0: 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 74 68  * For looping th
6ce0: 72 75 20 74 68 65 20 63 6f 6e 66 69 67 20 63 6c  ru the config cl
6cf0: 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22 20 2a  osure of "stp" *
6d00: 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  /.  struct confi
6d10: 67 20 2a 62 63 66 70 3b 20 2f 2a 20 46 6f 72 20  g *bcfp; /* For 
6d20: 74 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 6f  the inner loop o
6d30: 6e 20 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72 65  n config closure
6d40: 20 6f 66 20 22 73 74 70 22 20 2a 2f 0a 20 20 73   of "stp" */.  s
6d50: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65  truct config *ne
6d60: 77 3b 20 20 2f 2a 20 2a 2f 0a 20 20 73 74 72 75  w;  /* */.  stru
6d70: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20 20  ct symbol *sp;  
6d80: 20 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f   /* Symbol follo
6d90: 77 69 6e 67 20 74 68 65 20 64 6f 74 20 69 6e 20  wing the dot in 
6da0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22 63  configuration "c
6db0: 66 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  fp" */.  struct 
6dc0: 73 79 6d 62 6f 6c 20 2a 62 73 70 3b 20 20 2f 2a  symbol *bsp;  /*
6dd0: 20 53 79 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e   Symbol followin
6de0: 67 20 74 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e  g the dot in con
6df0: 66 69 67 75 72 61 74 69 6f 6e 20 22 62 63 66 70  figuration "bcfp
6e00: 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  " */.  struct st
6e10: 61 74 65 20 2a 6e 65 77 73 74 70 3b 20 2f 2a 20  ate *newstp; /* 
6e20: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  A pointer to a s
6e30: 75 63 63 65 73 73 6f 72 20 73 74 61 74 65 20 2a  uccessor state *
6e40: 2f 0a 0a 20 20 2f 2a 20 45 61 63 68 20 63 6f 6e  /..  /* Each con
6e50: 66 69 67 75 72 61 74 69 6f 6e 20 62 65 63 6f 6d  figuration becom
6e60: 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 66 74 65  es complete afte
6e70: 72 20 69 74 20 63 6f 6e 74 69 62 75 74 65 73 20  r it contibutes 
6e80: 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72 0a 20  to a successor. 
6e90: 20 2a 2a 20 73 74 61 74 65 2e 20 20 49 6e 69 74   ** state.  Init
6ea0: 69 61 6c 6c 79 2c 20 61 6c 6c 20 63 6f 6e 66 69  ially, all confi
6eb0: 67 75 72 61 74 69 6f 6e 73 20 61 72 65 20 69 6e  gurations are in
6ec0: 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20 66 6f  complete */.  fo
6ed0: 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20  r(cfp=stp->cfp; 
6ee0: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
6ef0: 78 74 29 20 63 66 70 2d 3e 73 74 61 74 75 73 20  xt) cfp->status 
6f00: 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 0a 20  = INCOMPLETE;.. 
6f10: 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
6f20: 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69   all configurati
6f30: 6f 6e 73 20 6f 66 20 74 68 65 20 73 74 61 74 65  ons of the state
6f40: 20 22 73 74 70 22 20 2a 2f 0a 20 20 66 6f 72 28   "stp" */.  for(
6f50: 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66  cfp=stp->cfp; cf
6f60: 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74  p; cfp=cfp->next
6f70: 29 7b 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e  ){.    if( cfp->
6f80: 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45 54 45  status==COMPLETE
6f90: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20   ) continue;    
6fa0: 2f 2a 20 41 6c 72 65 61 64 79 20 75 73 65 64 20  /* Already used 
6fb0: 62 79 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 2a 2f  by inner loop */
6fc0: 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e 64 6f  .    if( cfp->do
6fd0: 74 3e 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73  t>=cfp->rp->nrhs
6fe0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a   ) continue;  /*
6ff0: 20 43 61 6e 27 74 20 73 68 69 66 74 20 74 68 69   Can't shift thi
7000: 73 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20 20  s config */.    
7010: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74  Configlist_reset
7020: 28 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ();             
7030: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 65           /* Rese
7040: 74 20 74 68 65 20 6e 65 77 20 63 6f 6e 66 69 67  t the new config
7050: 20 73 65 74 20 2a 2f 0a 20 20 20 20 73 70 20 3d   set */.    sp =
7060: 20 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 63 66   cfp->rp->rhs[cf
7070: 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20  p->dot];        
7080: 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 61       /* Symbol a
7090: 66 74 65 72 20 74 68 65 20 64 6f 74 20 2a 2f 0a  fter the dot */.
70a0: 0a 20 20 20 20 2f 2a 20 46 6f 72 20 65 76 65 72  .    /* For ever
70b0: 79 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  y configuration 
70c0: 69 6e 20 74 68 65 20 73 74 61 74 65 20 22 73 74  in the state "st
70d0: 70 22 20 77 68 69 63 68 20 68 61 73 20 74 68 65  p" which has the
70e0: 20 73 79 6d 62 6f 6c 20 22 73 70 22 0a 20 20 20   symbol "sp".   
70f0: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74   ** following it
7100: 73 20 64 6f 74 2c 20 61 64 64 20 74 68 65 20 73  s dot, add the s
7110: 61 6d 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ame configuratio
7120: 6e 20 74 6f 20 74 68 65 20 62 61 73 69 73 20 73  n to the basis s
7130: 65 74 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20  et under.    ** 
7140: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 62 75 74  construction but
7150: 20 77 69 74 68 20 74 68 65 20 64 6f 74 20 73 68   with the dot sh
7160: 69 66 74 65 64 20 6f 6e 65 20 73 79 6d 62 6f 6c  ifted one symbol
7170: 20 74 6f 20 74 68 65 20 72 69 67 68 74 2e 20 2a   to the right. *
7180: 2f 0a 20 20 20 20 66 6f 72 28 62 63 66 70 3d 63  /.    for(bcfp=c
7190: 66 70 3b 20 62 63 66 70 3b 20 62 63 66 70 3d 62  fp; bcfp; bcfp=b
71a0: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
71b0: 20 20 69 66 28 20 62 63 66 70 2d 3e 73 74 61 74    if( bcfp->stat
71c0: 75 73 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63  us==COMPLETE ) c
71d0: 6f 6e 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41  ontinue;    /* A
71e0: 6c 72 65 61 64 79 20 75 73 65 64 20 2a 2f 0a 20  lready used */. 
71f0: 20 20 20 20 20 69 66 28 20 62 63 66 70 2d 3e 64       if( bcfp->d
7200: 6f 74 3e 3d 62 63 66 70 2d 3e 72 70 2d 3e 6e 72  ot>=bcfp->rp->nr
7210: 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2f  hs ) continue; /
7220: 2a 20 43 61 6e 27 74 20 73 68 69 66 74 20 74 68  * Can't shift th
7230: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 20 20  is one */.      
7240: 62 73 70 20 3d 20 62 63 66 70 2d 3e 72 70 2d 3e  bsp = bcfp->rp->
7250: 72 68 73 5b 62 63 66 70 2d 3e 64 6f 74 5d 3b 20  rhs[bcfp->dot]; 
7260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74            /* Get
7270: 20 73 79 6d 62 6f 6c 20 61 66 74 65 72 20 64 6f   symbol after do
7280: 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21  t */.      if( !
7290: 73 61 6d 65 5f 73 79 6d 62 6f 6c 28 62 73 70 2c  same_symbol(bsp,
72a0: 73 70 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  sp) ) continue; 
72b0: 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
72c0: 73 61 6d 65 20 61 73 20 66 6f 72 20 22 63 66 70  same as for "cfp
72d0: 22 20 2a 2f 0a 20 20 20 20 20 20 62 63 66 70 2d  " */.      bcfp-
72e0: 3e 73 74 61 74 75 73 20 3d 20 43 4f 4d 50 4c 45  >status = COMPLE
72f0: 54 45 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  TE;             
7300: 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68 69       /* Mark thi
7310: 73 20 63 6f 6e 66 69 67 20 61 73 20 75 73 65 64  s config as used
7320: 20 2a 2f 0a 20 20 20 20 20 20 6e 65 77 20 3d 20   */.      new = 
7330: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61  Configlist_addba
7340: 73 69 73 28 62 63 66 70 2d 3e 72 70 2c 62 63 66  sis(bcfp->rp,bcf
7350: 70 2d 3e 64 6f 74 2b 31 29 3b 0a 20 20 20 20 20  p->dot+1);.     
7360: 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6e 65 77 2d   Plink_add(&new-
7370: 3e 62 70 6c 70 2c 62 63 66 70 29 3b 0a 20 20 20  >bplp,bcfp);.   
7380: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 61   }..    /* Get a
7390: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
73a0: 73 74 61 74 65 20 64 65 73 63 72 69 62 65 64 20  state described 
73b0: 62 79 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e  by the basis con
73c0: 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 0a 20  figuration set. 
73d0: 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65     ** constructe
73e0: 64 20 69 6e 20 74 68 65 20 70 72 65 63 65 64 69  d in the precedi
73f0: 6e 67 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 6e  ng loop */.    n
7400: 65 77 73 74 70 20 3d 20 67 65 74 73 74 61 74 65  ewstp = getstate
7410: 28 6c 65 6d 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  (lemp);..    /* 
7420: 54 68 65 20 73 74 61 74 65 20 22 6e 65 77 73 74  The state "newst
7430: 70 22 20 69 73 20 72 65 61 63 68 65 64 20 66 72  p" is reached fr
7440: 6f 6d 20 74 68 65 20 73 74 61 74 65 20 22 73 74  om the state "st
7450: 70 22 20 62 79 20 61 20 73 68 69 66 74 20 61 63  p" by a shift ac
7460: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  tion.    ** on t
7470: 68 65 20 73 79 6d 62 6f 6c 20 22 73 70 22 20 2a  he symbol "sp" *
7480: 2f 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  /.    if( sp->ty
7490: 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
74a0: 4c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  L ){.      int i
74b0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
74c0: 20 69 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20   i<sp->nsubsym; 
74d0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 41 63  i++){.        Ac
74e0: 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61  tion_add(&stp->a
74f0: 70 2c 53 48 49 46 54 2c 73 70 2d 3e 73 75 62 73  p,SHIFT,sp->subs
7500: 79 6d 5b 69 5d 2c 28 63 68 61 72 2a 29 6e 65 77  ym[i],(char*)new
7510: 73 74 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  stp);.      }.  
7520: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 41    }else{.      A
7530: 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e  ction_add(&stp->
7540: 61 70 2c 53 48 49 46 54 2c 73 70 2c 28 63 68 61  ap,SHIFT,sp,(cha
7550: 72 20 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20 20  r *)newstp);.   
7560: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
7570: 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 70 72  Construct the pr
7580: 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a  opagation links.
7590: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b  */.void FindLink
75a0: 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  s(lemp).struct l
75b0: 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
75c0: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
75d0: 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6f 74  config *cfp, *ot
75e0: 68 65 72 3b 0a 20 20 73 74 72 75 63 74 20 73 74  her;.  struct st
75f0: 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
7600: 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 0a  ct plink *plp;..
7610: 20 20 2f 2a 20 48 6f 75 73 65 6b 65 65 70 69 6e    /* Housekeepin
7620: 67 20 64 65 74 61 69 6c 3a 0a 20 20 2a 2a 20 41  g detail:.  ** A
7630: 64 64 20 74 6f 20 65 76 65 72 79 20 70 72 6f 70  dd to every prop
7640: 61 67 61 74 65 20 6c 69 6e 6b 20 61 20 70 6f 69  agate link a poi
7650: 6e 74 65 72 20 62 61 63 6b 20 74 6f 20 74 68 65  nter back to the
7660: 20 73 74 61 74 65 20 74 6f 0a 20 20 2a 2a 20 77   state to.  ** w
7670: 68 69 63 68 20 74 68 65 20 6c 69 6e 6b 20 69 73  hich the link is
7680: 20 61 74 74 61 63 68 65 64 2e 20 2a 2f 0a 20 20   attached. */.  
7690: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
76a0: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
76b0: 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
76c0: 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f  orted[i];.    fo
76d0: 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20  r(cfp=stp->cfp; 
76e0: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
76f0: 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e  xt){.      cfp->
7700: 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 7d  stp = stp;.    }
7710: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  .  }..  /* Conve
7720: 72 74 20 61 6c 6c 20 62 61 63 6b 6c 69 6e 6b 73  rt all backlinks
7730: 20 69 6e 74 6f 20 66 6f 72 77 61 72 64 20 6c 69   into forward li
7740: 6e 6b 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66  nks.  Only the f
7750: 6f 72 77 61 72 64 0a 20 20 2a 2a 20 6c 69 6e 6b  orward.  ** link
7760: 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  s are used in th
7770: 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 6f 6d  e follow-set com
7780: 70 75 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66  putation. */.  f
7790: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
77a0: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
77b0: 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
77c0: 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  rted[i];.    for
77d0: 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63  (cfp=stp->cfp; c
77e0: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
77f0: 74 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 6c  t){.      for(pl
7800: 70 3d 63 66 70 2d 3e 62 70 6c 70 3b 20 70 6c 70  p=cfp->bplp; plp
7810: 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29  ; plp=plp->next)
7820: 7b 0a 20 20 20 20 20 20 20 20 6f 74 68 65 72 20  {.        other 
7830: 3d 20 70 6c 70 2d 3e 63 66 70 3b 0a 20 20 20 20  = plp->cfp;.    
7840: 20 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6f      Plink_add(&o
7850: 74 68 65 72 2d 3e 66 70 6c 70 2c 63 66 70 29 3b  ther->fplp,cfp);
7860: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7870: 20 7d 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65   }.}../* Compute
7880: 20 61 6c 6c 20 66 6f 6c 6c 6f 77 73 65 74 73 2e   all followsets.
7890: 0a 2a 2a 0a 2a 2a 20 41 20 66 6f 6c 6c 6f 77 73  .**.** A follows
78a0: 65 74 20 69 73 20 74 68 65 20 73 65 74 20 6f 66  et is the set of
78b0: 20 61 6c 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69   all symbols whi
78c0: 63 68 20 63 61 6e 20 63 6f 6d 65 20 69 6d 6d 65  ch can come imme
78d0: 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72  diately.** after
78e0: 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
78f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46 6f  ..*/.void FindFo
7900: 6c 6c 6f 77 53 65 74 73 28 6c 65 6d 70 29 0a 73  llowSets(lemp).s
7910: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
7920: 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p;.{.  int i;.  
7930: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
7940: 66 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  fp;.  struct pli
7950: 6e 6b 20 2a 70 6c 70 3b 0a 20 20 69 6e 74 20 70  nk *plp;.  int p
7960: 72 6f 67 72 65 73 73 3b 0a 20 20 69 6e 74 20 63  rogress;.  int c
7970: 68 61 6e 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d  hange;..  for(i=
7980: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
7990: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  e; i++){.    for
79a0: 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65  (cfp=lemp->sorte
79b0: 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b 20  d[i]->cfp; cfp; 
79c0: 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a  cfp=cfp->next){.
79d0: 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61 74 75        cfp->statu
79e0: 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a  s = INCOMPLETE;.
79f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 64      }.  }.  .  d
7a00: 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20  o{.    progress 
7a10: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
7a20: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
7a30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; i++){.      fo
7a40: 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74  r(cfp=lemp->sort
7a50: 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b  ed[i]->cfp; cfp;
7a60: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b   cfp=cfp->next){
7a70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 66 70  .        if( cfp
7a80: 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45  ->status==COMPLE
7a90: 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  TE ) continue;. 
7aa0: 20 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d 63         for(plp=c
7ab0: 66 70 2d 3e 66 70 6c 70 3b 20 70 6c 70 3b 20 70  fp->fplp; plp; p
7ac0: 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20  lp=plp->next){. 
7ad0: 20 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 20           change 
7ae0: 3d 20 53 65 74 55 6e 69 6f 6e 28 70 6c 70 2d 3e  = SetUnion(plp->
7af0: 63 66 70 2d 3e 66 77 73 2c 63 66 70 2d 3e 66 77  cfp->fws,cfp->fw
7b00: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
7b10: 28 20 63 68 61 6e 67 65 20 29 7b 0a 20 20 20 20  ( change ){.    
7b20: 20 20 20 20 20 20 20 20 70 6c 70 2d 3e 63 66 70          plp->cfp
7b30: 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d  ->status = INCOM
7b40: 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20 20  PLETE;.         
7b50: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
7b60: 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 20  ..  }..}.       
7b70: 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 43   cfp->status = C
7b80: 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d  OMPLETE;.      }
7b90: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
7ba0: 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 7d 0a 0a   progress );.}..
7bb0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
7bc0: 76 65 5f 63 6f 6e 66 6c 69 63 74 28 29 3b 0a 0a  ve_conflict();..
7bd0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 72  /* Compute the r
7be0: 65 64 75 63 65 20 61 63 74 69 6f 6e 73 2c 20 61  educe actions, a
7bf0: 6e 64 20 72 65 73 6f 6c 76 65 20 63 6f 6e 66 6c  nd resolve confl
7c00: 69 63 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69  icts..*/.void Fi
7c10: 6e 64 41 63 74 69 6f 6e 73 28 6c 65 6d 70 29 0a  ndActions(lemp).
7c20: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
7c30: 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 6a 3b  mp;.{.  int i,j;
7c40: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
7c50: 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20   *cfp;.  struct 
7c60: 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
7c70: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
7c80: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
7c90: 72 70 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c  rp;..  /* Add al
7ca0: 6c 20 6f 66 20 74 68 65 20 72 65 64 75 63 65 20  l of the reduce 
7cb0: 61 63 74 69 6f 6e 73 20 0a 20 20 2a 2a 20 41 20  actions .  ** A 
7cc0: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 69 73  reduce action is
7cd0: 20 61 64 64 65 64 20 66 6f 72 20 65 61 63 68 20   added for each 
7ce0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 66  element of the f
7cf0: 6f 6c 6c 6f 77 73 65 74 20 6f 66 0a 20 20 2a 2a  ollowset of.  **
7d00: 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
7d10: 20 77 68 69 63 68 20 68 61 73 20 69 74 73 20 64   which has its d
7d20: 6f 74 20 61 74 20 74 68 65 20 65 78 74 72 65 6d  ot at the extrem
7d30: 65 20 72 69 67 68 74 2e 0a 20 20 2a 2f 0a 20 20  e right..  */.  
7d40: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
7d50: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 20 20  >nstate; i++){  
7d60: 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
7d70: 6c 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 20 20  l states */.    
7d80: 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
7d90: 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63  ed[i];.    for(c
7da0: 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70  fp=stp->cfp; cfp
7db0: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
7dc0: 7b 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  {  /* Loop over 
7dd0: 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  all configuratio
7de0: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ns */.      if( 
7df0: 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 3d 3d 63  cfp->rp->nrhs==c
7e00: 66 70 2d 3e 64 6f 74 20 29 7b 20 20 20 20 20 20  fp->dot ){      
7e10: 20 20 2f 2a 20 49 73 20 64 6f 74 20 61 74 20 65    /* Is dot at e
7e20: 78 74 72 65 6d 65 20 72 69 67 68 74 3f 20 2a 2f  xtreme right? */
7e30: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
7e40: 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; j<lemp->ntermi
7e50: 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nal; j++){.     
7e60: 20 20 20 20 20 69 66 28 20 53 65 74 46 69 6e 64       if( SetFind
7e70: 28 63 66 70 2d 3e 66 77 73 2c 6a 29 20 29 7b 0a  (cfp->fws,j) ){.
7e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
7e90: 64 64 20 61 20 72 65 64 75 63 65 20 61 63 74 69  dd a reduce acti
7ea0: 6f 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  on to the state 
7eb0: 22 73 74 70 22 20 77 68 69 63 68 20 77 69 6c 6c  "stp" which will
7ec0: 20 72 65 64 75 63 65 20 62 79 20 74 68 65 0a 20   reduce by the. 
7ed0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 75             ** ru
7ee0: 6c 65 20 22 63 66 70 2d 3e 72 70 22 20 69 66 20  le "cfp->rp" if 
7ef0: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 73 79  the lookahead sy
7f00: 6d 62 6f 6c 20 69 73 20 22 6c 65 6d 70 2d 3e 73  mbol is "lemp->s
7f10: 79 6d 62 6f 6c 73 5b 6a 5d 22 20 2a 2f 0a 20 20  ymbols[j]" */.  
7f20: 20 20 20 20 20 20 20 20 20 20 41 63 74 69 6f 6e            Action
7f30: 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 52 45  _add(&stp->ap,RE
7f40: 44 55 43 45 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  DUCE,lemp->symbo
7f50: 6c 73 5b 6a 5d 2c 28 63 68 61 72 20 2a 29 63 66  ls[j],(char *)cf
7f60: 70 2d 3e 72 70 29 3b 0a 20 20 20 20 20 20 20 20  p->rp);.        
7f70: 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20    }..}.      }. 
7f80: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
7f90: 64 64 20 74 68 65 20 61 63 63 65 70 74 69 6e 67  dd the accepting
7fa0: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 66 28 20   token */.  if( 
7fb0: 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20  lemp->start ){. 
7fc0: 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66     sp = Symbol_f
7fd0: 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29  ind(lemp->start)
7fe0: 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20  ;.    if( sp==0 
7ff0: 29 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c  ) sp = lemp->rul
8000: 65 2d 3e 6c 68 73 3b 0a 20 20 7d 65 6c 73 65 7b  e->lhs;.  }else{
8010: 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e  .    sp = lemp->
8020: 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 20  rule->lhs;.  }. 
8030: 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65 20 66   /* Add to the f
8040: 69 72 73 74 20 73 74 61 74 65 20 28 77 68 69 63  irst state (whic
8050: 68 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  h is always the 
8060: 73 74 61 72 74 69 6e 67 20 73 74 61 74 65 20 6f  starting state o
8070: 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e 69 74  f the.  ** finit
8080: 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e 65 29  e state machine)
8090: 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20 41 43   an action to AC
80a0: 43 45 50 54 20 69 66 20 74 68 65 20 6c 6f 6f 6b  CEPT if the look
80b0: 61 68 65 61 64 20 69 73 20 74 68 65 0a 20 20 2a  ahead is the.  *
80c0: 2a 20 73 74 61 72 74 20 6e 6f 6e 74 65 72 6d 69  * start nontermi
80d0: 6e 61 6c 2e 20 20 2a 2f 0a 20 20 41 63 74 69 6f  nal.  */.  Actio
80e0: 6e 5f 61 64 64 28 26 6c 65 6d 70 2d 3e 73 6f 72  n_add(&lemp->sor
80f0: 74 65 64 5b 30 5d 2d 3e 61 70 2c 41 43 43 45 50  ted[0]->ap,ACCEP
8100: 54 2c 73 70 2c 30 29 3b 0a 0a 20 20 2f 2a 20 52  T,sp,0);..  /* R
8110: 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63 74 73  esolve conflicts
8120: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
8130: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
8140: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
8150: 61 63 74 69 6f 6e 20 2a 61 70 2c 20 2a 6e 61 70  action *ap, *nap
8160: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  ;.    struct sta
8170: 74 65 20 2a 73 74 70 3b 0a 20 20 20 20 73 74 70  te *stp;.    stp
8180: 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
8190: 69 5d 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72  i];.    /* asser
81a0: 74 28 20 73 74 70 2d 3e 61 70 20 29 3b 20 2a 2f  t( stp->ap ); */
81b0: 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 41  .    stp->ap = A
81c0: 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d 3e  ction_sort(stp->
81d0: 61 70 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  ap);.    for(ap=
81e0: 73 74 70 2d 3e 61 70 3b 20 61 70 20 26 26 20 61  stp->ap; ap && a
81f0: 70 2d 3e 6e 65 78 74 3b 20 61 70 3d 61 70 2d 3e  p->next; ap=ap->
8200: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66 6f 72  next){.      for
8210: 28 6e 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 6e  (nap=ap->next; n
8220: 61 70 20 26 26 20 6e 61 70 2d 3e 73 70 3d 3d 61  ap && nap->sp==a
8230: 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e 61 70 2d 3e  p->sp; nap=nap->
8240: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20  next){.         
8250: 2f 2a 20 54 68 65 20 74 77 6f 20 61 63 74 69 6f  /* The two actio
8260: 6e 73 20 22 61 70 22 20 61 6e 64 20 22 6e 61 70  ns "ap" and "nap
8270: 22 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  " have the same 
8280: 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20 20 20  lookahead..     
8290: 20 20 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75      ** Figure ou
82a0: 74 20 77 68 69 63 68 20 6f 6e 65 20 73 68 6f 75  t which one shou
82b0: 6c 64 20 62 65 20 75 73 65 64 20 2a 2f 0a 20 20  ld be used */.  
82c0: 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 6e 63 6f         lemp->nco
82d0: 6e 66 6c 69 63 74 20 2b 3d 20 72 65 73 6f 6c 76  nflict += resolv
82e0: 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70 2c 6e 61  e_conflict(ap,na
82f0: 70 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 29 3b  p,lemp->errsym);
8300: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
8310: 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72 74 20   }..  /* Report 
8320: 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 65 61 63  an error for eac
8330: 68 20 72 75 6c 65 20 74 68 61 74 20 63 61 6e 20  h rule that can 
8340: 6e 65 76 65 72 20 62 65 20 72 65 64 75 63 65 64  never be reduced
8350: 2e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65  . */.  for(rp=le
8360: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
8370: 3d 72 70 2d 3e 6e 65 78 74 29 20 72 70 2d 3e 63  =rp->next) rp->c
8380: 61 6e 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e  anReduce = LEMON
8390: 5f 46 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d  _FALSE;.  for(i=
83a0: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
83b0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  e; i++){.    str
83c0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
83d0: 20 20 20 20 66 6f 72 28 61 70 3d 6c 65 6d 70 2d      for(ap=lemp-
83e0: 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 61 70 3b 20  >sorted[i]->ap; 
83f0: 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
8400: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  {.      if( ap->
8410: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 20 61  type==REDUCE ) a
8420: 70 2d 3e 78 2e 72 70 2d 3e 63 61 6e 52 65 64 75  p->x.rp->canRedu
8430: 63 65 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45 3b  ce = LEMON_TRUE;
8440: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
8450: 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
8460: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
8470: 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 63 61  {.    if( rp->ca
8480: 6e 52 65 64 75 63 65 20 29 20 63 6f 6e 74 69 6e  nReduce ) contin
8490: 75 65 3b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67  ue;.    ErrorMsg
84a0: 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
84b0: 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 22 54 68  rp->ruleline,"Th
84c0: 69 73 20 72 75 6c 65 20 63 61 6e 20 6e 6f 74 20  is rule can not 
84d0: 62 65 20 72 65 64 75 63 65 64 2e 5c 6e 22 29 3b  be reduced.\n");
84e0: 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72  .    lemp->error
84f0: 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  cnt++;.  }.}../*
8500: 20 52 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c   Resolve a confl
8510: 69 63 74 20 62 65 74 77 65 65 6e 20 74 68 65 20  ict between the 
8520: 74 77 6f 20 67 69 76 65 6e 20 61 63 74 69 6f 6e  two given action
8530: 73 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 63 6f  s.  If the.** co
8540: 6e 66 6c 69 63 74 20 63 61 6e 27 74 20 62 65 20  nflict can't be 
8550: 72 65 73 6f 6c 76 65 64 2c 20 72 65 74 75 72 6e  resolved, return
8560: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
8570: 20 4e 4f 20 4c 4f 4e 47 45 52 20 54 52 55 45 3a   NO LONGER TRUE:
8580: 0a 2a 2a 20 20 20 54 6f 20 72 65 73 6f 6c 76 65  .**   To resolve
8590: 20 61 20 63 6f 6e 66 6c 69 63 74 2c 20 66 69 72   a conflict, fir
85a0: 73 74 20 6c 6f 6f 6b 20 74 6f 20 73 65 65 20 69  st look to see i
85b0: 66 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e 0a  f either action.
85c0: 2a 2a 20 20 20 69 73 20 6f 6e 20 61 6e 20 65 72  **   is on an er
85d0: 72 6f 72 20 72 75 6c 65 2e 20 20 49 6e 20 74 68  ror rule.  In th
85e0: 61 74 20 63 61 73 65 2c 20 74 61 6b 65 20 74 68  at case, take th
85f0: 65 20 61 63 74 69 6f 6e 20 77 68 69 63 68 0a 2a  e action which.*
8600: 2a 20 20 20 69 73 20 6e 6f 74 20 61 73 73 6f 63  *   is not assoc
8610: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 65  iated with the e
8620: 72 72 6f 72 20 72 75 6c 65 2e 20 20 49 66 20 6e  rror rule.  If n
8630: 65 69 74 68 65 72 20 6f 72 20 62 6f 74 68 0a 2a  either or both.*
8640: 2a 20 20 20 61 63 74 69 6f 6e 73 20 61 72 65 20  *   actions are 
8650: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
8660: 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2c 20 74  an error rule, t
8670: 68 65 6e 20 74 72 79 20 74 6f 0a 2a 2a 20 20 20  hen try to.**   
8680: 75 73 65 20 70 72 65 63 65 64 65 6e 63 65 20 74  use precedence t
8690: 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 63 6f  o resolve the co
86a0: 6e 66 6c 69 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  nflict..**.** If
86b0: 20 65 69 74 68 65 72 20 61 63 74 69 6f 6e 20 69   either action i
86c0: 73 20 61 20 53 48 49 46 54 2c 20 74 68 65 6e 20  s a SHIFT, then 
86d0: 69 74 20 6d 75 73 74 20 62 65 20 61 70 78 2e 20  it must be apx. 
86e0: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
86f0: 6e 20 77 6f 6e 27 74 20 77 6f 72 6b 20 69 66 20  n won't work if 
8700: 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43  apx->type==REDUC
8710: 45 20 61 6e 64 20 61 70 79 2d 3e 74 79 70 65 3d  E and apy->type=
8720: 3d 53 48 49 46 54 2e 0a 2a 2f 0a 73 74 61 74 69  =SHIFT..*/.stati
8730: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 5f 63 6f  c int resolve_co
8740: 6e 66 6c 69 63 74 28 61 70 78 2c 61 70 79 2c 65  nflict(apx,apy,e
8750: 72 72 73 79 6d 29 0a 73 74 72 75 63 74 20 61 63  rrsym).struct ac
8760: 74 69 6f 6e 20 2a 61 70 78 3b 0a 73 74 72 75 63  tion *apx;.struc
8770: 74 20 61 63 74 69 6f 6e 20 2a 61 70 79 3b 0a 73  t action *apy;.s
8780: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 65 72  truct symbol *er
8790: 72 73 79 6d 3b 20 20 20 2f 2a 20 54 68 65 20 65  rsym;   /* The e
87a0: 72 72 6f 72 20 73 79 6d 62 6f 6c 20 28 69 66 20  rror symbol (if 
87b0: 64 65 66 69 6e 65 64 2e 20 20 4e 55 4c 4c 20 6f  defined.  NULL o
87c0: 74 68 65 72 77 69 73 65 29 20 2a 2f 0a 7b 0a 20  therwise) */.{. 
87d0: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
87e0: 73 70 78 2c 20 2a 73 70 79 3b 0a 20 20 69 6e 74  spx, *spy;.  int
87f0: 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61   errcnt = 0;.  a
8800: 73 73 65 72 74 28 20 61 70 78 2d 3e 73 70 3d 3d  ssert( apx->sp==
8810: 61 70 79 2d 3e 73 70 20 29 3b 20 20 2f 2a 20 4f  apy->sp );  /* O
8820: 74 68 65 72 77 69 73 65 20 74 68 65 72 65 20 77  therwise there w
8830: 6f 75 6c 64 20 62 65 20 6e 6f 20 63 6f 6e 66 6c  ould be no confl
8840: 69 63 74 20 2a 2f 0a 20 20 69 66 28 20 61 70 78  ict */.  if( apx
8850: 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26 26  ->type==SHIFT &&
8860: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46   apy->type==SHIF
8870: 54 20 29 7b 0a 20 20 20 20 61 70 79 2d 3e 74 79  T ){.    apy->ty
8880: 70 65 20 3d 20 53 53 43 4f 4e 46 4c 49 43 54 3b  pe = SSCONFLICT;
8890: 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20  .    errcnt++;. 
88a0: 20 7d 0a 20 20 69 66 28 20 61 70 78 2d 3e 74 79   }.  if( apx->ty
88b0: 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70 79  pe==SHIFT && apy
88c0: 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29  ->type==REDUCE )
88d0: 7b 0a 20 20 20 20 73 70 78 20 3d 20 61 70 78 2d  {.    spx = apx-
88e0: 3e 73 70 3b 0a 20 20 20 20 73 70 79 20 3d 20 61  >sp;.    spy = a
88f0: 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79  py->x.rp->precsy
8900: 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 79 3d 3d  m;.    if( spy==
8910: 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30  0 || spx->prec<0
8920: 20 7c 7c 20 73 70 79 2d 3e 70 72 65 63 3c 30 20   || spy->prec<0 
8930: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  ){.      /* Not 
8940: 65 6e 6f 75 67 68 20 70 72 65 63 65 64 65 6e 63  enough precedenc
8950: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a  e information. *
8960: 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  /.      apy->typ
8970: 65 20 3d 20 53 52 43 4f 4e 46 4c 49 43 54 3b 0a  e = SRCONFLICT;.
8980: 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a        errcnt++;.
8990: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
89a0: 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72 65  x->prec>spy->pre
89b0: 63 20 29 7b 20 20 20 20 2f 2a 20 4c 6f 77 65 72  c ){    /* Lower
89c0: 20 70 72 65 63 65 64 65 6e 63 65 20 77 69 6e 73   precedence wins
89d0: 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74   */.      apy->t
89e0: 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45  ype = RD_RESOLVE
89f0: 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  D;.    }else if(
8a00: 20 73 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e   spx->prec<spy->
8a10: 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70  prec ){.      ap
8a20: 78 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52 45 53  x->type = SH_RES
8a30: 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65  OLVED;.    }else
8a40: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d   if( spx->prec==
8a50: 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78  spy->prec && spx
8a60: 2d 3e 61 73 73 6f 63 3d 3d 52 49 47 48 54 20 29  ->assoc==RIGHT )
8a70: 7b 20 2f 2a 20 55 73 65 20 6f 70 65 72 61 74 6f  { /* Use operato
8a80: 72 20 2a 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e  r */.      apy->
8a90: 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56  type = RD_RESOLV
8aa0: 45 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ED;             
8ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ac0: 2f 2a 20 61 73 73 6f 63 69 61 74 69 76 69 74 79  /* associativity
8ad0: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   */.    }else if
8ae0: 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79  ( spx->prec==spy
8af0: 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61  ->prec && spx->a
8b00: 73 73 6f 63 3d 3d 4c 45 46 54 20 29 7b 20 20 2f  ssoc==LEFT ){  /
8b10: 2a 20 74 6f 20 62 72 65 61 6b 20 74 69 65 20 2a  * to break tie *
8b20: 2f 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  /.      apx->typ
8b30: 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b  e = SH_RESOLVED;
8b40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8b50: 20 20 61 73 73 65 72 74 28 20 73 70 78 2d 3e 70    assert( spx->p
8b60: 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26  rec==spy->prec &
8b70: 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 4e 4f  & spx->assoc==NO
8b80: 4e 45 20 29 3b 0a 20 20 20 20 20 20 61 70 79 2d  NE );.      apy-
8b90: 3e 74 79 70 65 20 3d 20 53 52 43 4f 4e 46 4c 49  >type = SRCONFLI
8ba0: 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63 6e 74  CT;.      errcnt
8bb0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ++;.    }.  }els
8bc0: 65 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d  e if( apx->type=
8bd0: 3d 52 45 44 55 43 45 20 26 26 20 61 70 79 2d 3e  =REDUCE && apy->
8be0: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a  type==REDUCE ){.
8bf0: 20 20 20 20 73 70 78 20 3d 20 61 70 78 2d 3e 78      spx = apx->x
8c00: 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20  .rp->precsym;.  
8c10: 20 20 73 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72    spy = apy->x.r
8c20: 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20  p->precsym;.    
8c30: 69 66 28 20 73 70 78 3d 3d 30 20 7c 7c 20 73 70  if( spx==0 || sp
8c40: 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65  y==0 || spx->pre
8c50: 63 3c 30 20 7c 7c 0a 20 20 20 20 73 70 79 2d 3e  c<0 ||.    spy->
8c60: 70 72 65 63 3c 30 20 7c 7c 20 73 70 78 2d 3e 70  prec<0 || spx->p
8c70: 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 29  rec==spy->prec )
8c80: 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  {.      apy->typ
8c90: 65 20 3d 20 52 52 43 4f 4e 46 4c 49 43 54 3b 0a  e = RRCONFLICT;.
8ca0: 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a        errcnt++;.
8cb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
8cc0: 78 2d 3e 70 72 65 63 3e 73 70 79 2d 3e 70 72 65  x->prec>spy->pre
8cd0: 63 20 29 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e  c ){.      apy->
8ce0: 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56  type = RD_RESOLV
8cf0: 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ED;.    }else if
8d00: 28 20 73 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d  ( spx->prec<spy-
8d10: 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61  >prec ){.      a
8d20: 70 78 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45  px->type = RD_RE
8d30: 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SOLVED;.    }.  
8d40: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
8d50: 74 28 20 0a 20 20 20 20 20 20 61 70 78 2d 3e 74  t( .      apx->t
8d60: 79 70 65 3d 3d 53 48 5f 52 45 53 4f 4c 56 45 44  ype==SH_RESOLVED
8d70: 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   ||.      apx->t
8d80: 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44  ype==RD_RESOLVED
8d90: 20 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74   ||.      apx->t
8da0: 79 70 65 3d 3d 53 53 43 4f 4e 46 4c 49 43 54 20  ype==SSCONFLICT 
8db0: 7c 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79  ||.      apx->ty
8dc0: 70 65 3d 3d 53 52 43 4f 4e 46 4c 49 43 54 20 7c  pe==SRCONFLICT |
8dd0: 7c 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  |.      apx->typ
8de0: 65 3d 3d 52 52 43 4f 4e 46 4c 49 43 54 20 7c 7c  e==RRCONFLICT ||
8df0: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
8e00: 3d 3d 53 48 5f 52 45 53 4f 4c 56 45 44 20 7c 7c  ==SH_RESOLVED ||
8e10: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
8e20: 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c  ==RD_RESOLVED ||
8e30: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
8e40: 3d 3d 53 53 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a  ==SSCONFLICT ||.
8e50: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d        apy->type=
8e60: 3d 53 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20  =SRCONFLICT ||. 
8e70: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d       apy->type==
8e80: 52 52 43 4f 4e 46 4c 49 43 54 0a 20 20 20 20 29  RRCONFLICT.    )
8e90: 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 52 45 44  ;.    /* The RED
8ea0: 55 43 45 2f 53 48 49 46 54 20 63 61 73 65 20 63  UCE/SHIFT case c
8eb0: 61 6e 6e 6f 74 20 68 61 70 70 65 6e 20 62 65 63  annot happen bec
8ec0: 61 75 73 65 20 53 48 49 46 54 73 20 63 6f 6d 65  ause SHIFTs come
8ed0: 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 52   before.    ** R
8ee0: 45 44 55 43 45 73 20 6f 6e 20 74 68 65 20 6c 69  EDUCEs on the li
8ef0: 73 74 2e 20 20 49 66 20 77 65 20 72 65 61 63 68  st.  If we reach
8f00: 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 6d   this point it m
8f10: 75 73 74 20 62 65 20 62 65 63 61 75 73 65 0a 20  ust be because. 
8f20: 20 20 20 2a 2a 20 74 68 65 20 70 61 72 73 65 72     ** the parser
8f30: 20 63 6f 6e 66 6c 69 63 74 20 68 61 64 20 61 6c   conflict had al
8f40: 72 65 61 64 79 20 62 65 65 6e 20 72 65 73 6f 6c  ready been resol
8f50: 76 65 64 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  ved. */.  }.  re
8f60: 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 2f  turn errcnt;.}./
8f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f80: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
8f90: 69 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e  ile "configlist.
8fa0: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
8fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
8fc0: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  .** Routines to 
8fd0: 70 72 6f 63 65 73 73 69 6e 67 20 61 20 63 6f 6e  processing a con
8fe0: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
8ff0: 61 6e 64 20 62 75 69 6c 64 69 6e 67 20 61 20 73  and building a s
9000: 74 61 74 65 0a 2a 2a 20 69 6e 20 74 68 65 20 4c  tate.** in the L
9010: 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65  EMON parser gene
9020: 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69  rator..*/..stati
9030: 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  c struct config 
9040: 2a 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 20 20  *freelist = 0;  
9050: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
9060: 72 65 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ree configuratio
9070: 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ns */.static str
9080: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 75 72 72  uct config *curr
9090: 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ent = 0;       /
90a0: 2a 20 54 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66  * Top of list of
90b0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
90c0: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
90d0: 20 63 6f 6e 66 69 67 20 2a 2a 63 75 72 72 65 6e   config **curren
90e0: 74 65 6e 64 20 3d 20 30 3b 20 20 20 2f 2a 20 4c  tend = 0;   /* L
90f0: 61 73 74 20 6f 6e 20 6c 69 73 74 20 6f 66 20 63  ast on list of c
9100: 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61 74 69 63  onfigs */.static
9110: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
9120: 62 61 73 69 73 20 3d 20 30 3b 20 20 20 20 20 20  basis = 0;      
9130: 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6c 69 73     /* Top of lis
9140: 74 20 6f 66 20 62 61 73 69 73 20 63 6f 6e 66 69  t of basis confi
9150: 67 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  gs */.static str
9160: 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a 62 61 73  uct config **bas
9170: 69 73 65 6e 64 20 3d 20 30 3b 20 20 20 20 20 2f  isend = 0;     /
9180: 2a 20 45 6e 64 20 6f 66 20 6c 69 73 74 20 6f 66  * End of list of
9190: 20 62 61 73 69 73 20 63 6f 6e 66 69 67 73 20 2a   basis configs *
91a0: 2f 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  /../* Return a p
91b0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 20  ointer to a new 
91c0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f  configuration */
91d0: 0a 50 52 49 56 41 54 45 20 73 74 72 75 63 74 20  .PRIVATE struct 
91e0: 63 6f 6e 66 69 67 20 2a 6e 65 77 63 6f 6e 66 69  config *newconfi
91f0: 67 28 29 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  g(){.  struct co
9200: 6e 66 69 67 20 2a 6e 65 77 3b 0a 20 20 69 66 28  nfig *new;.  if(
9210: 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a   freelist==0 ){.
9220: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
9230: 6e 74 20 61 6d 74 20 3d 20 33 3b 0a 20 20 20 20  nt amt = 3;.    
9240: 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75  freelist = (stru
9250: 63 74 20 63 6f 6e 66 69 67 20 2a 29 63 61 6c 6c  ct config *)call
9260: 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28  oc( amt, sizeof(
9270: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 29 20 29  struct config) )
9280: 3b 0a 20 20 20 20 69 66 28 20 66 72 65 65 6c 69  ;.    if( freeli
9290: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  st==0 ){.      f
92a0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55  printf(stderr,"U
92b0: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
92c0: 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e  e memory for a n
92d0: 65 77 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ew configuration
92e0: 2e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  .");.      exit(
92f0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  1);.    }.    fo
9300: 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20  r(i=0; i<amt-1; 
9310: 69 2b 2b 29 20 66 72 65 65 6c 69 73 74 5b 69 5d  i++) freelist[i]
9320: 2e 6e 65 78 74 20 3d 20 26 66 72 65 65 6c 69 73  .next = &freelis
9330: 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65  t[i+1];.    free
9340: 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74  list[amt-1].next
9350: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 20   = 0;.  }.  new 
9360: 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72  = freelist;.  fr
9370: 65 65 6c 69 73 74 20 3d 20 66 72 65 65 6c 69 73  eelist = freelis
9380: 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72  t->next;.  retur
9390: 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  n new;.}../* The
93a0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 22   configuration "
93b0: 6f 6c 64 22 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  old" is no longe
93c0: 72 20 75 73 65 64 20 2a 2f 0a 50 52 49 56 41 54  r used */.PRIVAT
93d0: 45 20 76 6f 69 64 20 64 65 6c 65 74 65 63 6f 6e  E void deletecon
93e0: 66 69 67 28 6f 6c 64 29 0a 73 74 72 75 63 74 20  fig(old).struct 
93f0: 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 7b 0a 20  config *old;.{. 
9400: 20 6f 6c 64 2d 3e 6e 65 78 74 20 3d 20 66 72 65   old->next = fre
9410: 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69 73  elist;.  freelis
9420: 74 20 3d 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 49  t = old;.}../* I
9430: 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20 63  nitialized the c
9440: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
9450: 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69  t builder */.voi
9460: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69  d Configlist_ini
9470: 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d  t(){.  current =
9480: 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64   0;.  currentend
9490: 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20 20 62   = &current;.  b
94a0: 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69  asis = 0;.  basi
94b0: 73 65 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a 20  send = &basis;. 
94c0: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69   Configtable_ini
94d0: 74 28 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  t();.  return;.}
94e0: 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64  ../* Initialized
94f0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
9500: 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65 72 20  on list builder 
9510: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
9520: 73 74 5f 72 65 73 65 74 28 29 7b 0a 20 20 63 75  st_reset(){.  cu
9530: 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72  rrent = 0;.  cur
9540: 72 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65  rentend = &curre
9550: 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b  nt;.  basis = 0;
9560: 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62  .  basisend = &b
9570: 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61  asis;.  Configta
9580: 62 6c 65 5f 63 6c 65 61 72 28 30 29 3b 0a 20 20  ble_clear(0);.  
9590: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41 64  return;.}../* Ad
95a0: 64 20 61 6e 6f 74 68 65 72 20 63 6f 6e 66 69 67  d another config
95b0: 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63  uration to the c
95c0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
95d0: 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  t */.struct conf
95e0: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61  ig *Configlist_a
95f0: 64 64 28 72 70 2c 64 6f 74 29 0a 73 74 72 75 63  dd(rp,dot).struc
9600: 74 20 72 75 6c 65 20 2a 72 70 3b 20 20 20 20 2f  t rule *rp;    /
9610: 2a 20 54 68 65 20 72 75 6c 65 20 2a 2f 0a 69 6e  * The rule */.in
9620: 74 20 64 6f 74 3b 20 20 20 20 20 20 20 20 20 20  t dot;          
9630: 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20    /* Index into 
9640: 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20 72  the RHS of the r
9650: 75 6c 65 20 77 68 65 72 65 20 74 68 65 20 64 6f  ule where the do
9660: 74 20 67 6f 65 73 20 2a 2f 0a 7b 0a 20 20 73 74  t goes */.{.  st
9670: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
9680: 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73 65  , model;..  asse
9690: 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d  rt( currentend!=
96a0: 30 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20  0 );.  model.rp 
96b0: 3d 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f  = rp;.  model.do
96c0: 74 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d  t = dot;.  cfp =
96d0: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e   Configtable_fin
96e0: 64 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28  d(&model);.  if(
96f0: 20 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63   cfp==0 ){.    c
9700: 66 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29  fp = newconfig()
9710: 3b 0a 20 20 20 20 63 66 70 2d 3e 72 70 20 3d 20  ;.    cfp->rp = 
9720: 72 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74  rp;.    cfp->dot
9730: 20 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d   = dot;.    cfp-
9740: 3e 66 77 73 20 3d 20 53 65 74 4e 65 77 28 29 3b  >fws = SetNew();
9750: 0a 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20  .    cfp->stp = 
9760: 30 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c 70  0;.    cfp->fplp
9770: 20 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30   = cfp->bplp = 0
9780: 3b 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78 74 20  ;.    cfp->next 
9790: 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70  = 0;.    cfp->bp
97a0: 20 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72 72 65   = 0;.    *curre
97b0: 6e 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20  ntend = cfp;.   
97c0: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63   currentend = &c
97d0: 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 43 6f  fp->next;.    Co
97e0: 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74  nfigtable_insert
97f0: 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (cfp);.  }.  ret
9800: 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 41  urn cfp;.}../* A
9810: 64 64 20 61 20 62 61 73 69 73 20 63 6f 6e 66 69  dd a basis confi
9820: 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  guration to the 
9830: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
9840: 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e  st */.struct con
9850: 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f  fig *Configlist_
9860: 61 64 64 62 61 73 69 73 28 72 70 2c 64 6f 74 29  addbasis(rp,dot)
9870: 0a 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70  .struct rule *rp
9880: 3b 0a 69 6e 74 20 64 6f 74 3b 0a 7b 0a 20 20 73  ;.int dot;.{.  s
9890: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
98a0: 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73  p, model;..  ass
98b0: 65 72 74 28 20 62 61 73 69 73 65 6e 64 21 3d 30  ert( basisend!=0
98c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75   );.  assert( cu
98d0: 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20  rrentend!=0 );. 
98e0: 20 6d 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a   model.rp = rp;.
98f0: 20 20 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f    model.dot = do
9900: 74 3b 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69  t;.  cfp = Confi
9910: 67 74 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64  gtable_find(&mod
9920: 65 6c 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d  el);.  if( cfp==
9930: 30 20 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e  0 ){.    cfp = n
9940: 65 77 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20  ewconfig();.    
9950: 63 66 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20  cfp->rp = rp;.  
9960: 20 20 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74    cfp->dot = dot
9970: 3b 0a 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d  ;.    cfp->fws =
9980: 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63   SetNew();.    c
9990: 66 70 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20  fp->stp = 0;.   
99a0: 20 63 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70   cfp->fplp = cfp
99b0: 2d 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20  ->bplp = 0;.    
99c0: 63 66 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20  cfp->next = 0;. 
99d0: 20 20 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a     cfp->bp = 0;.
99e0: 20 20 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20      *currentend 
99f0: 3d 20 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65  = cfp;.    curre
9a00: 6e 74 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65  ntend = &cfp->ne
9a10: 78 74 3b 0a 20 20 20 20 2a 62 61 73 69 73 65 6e  xt;.    *basisen
9a20: 64 20 3d 20 63 66 70 3b 0a 20 20 20 20 62 61 73  d = cfp;.    bas
9a30: 69 73 65 6e 64 20 3d 20 26 63 66 70 2d 3e 62 70  isend = &cfp->bp
9a40: 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c  ;.    Configtabl
9a50: 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20  e_insert(cfp);. 
9a60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b   }.  return cfp;
9a70: 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74  .}../* Compute t
9a80: 68 65 20 63 6c 6f 73 75 72 65 20 6f 66 20 74 68  he closure of th
9a90: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
9aa0: 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  list */.void Con
9ab0: 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28  figlist_closure(
9ac0: 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
9ad0: 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74  on *lemp;.{.  st
9ae0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
9af0: 2c 20 2a 6e 65 77 63 66 70 3b 0a 20 20 73 74 72  , *newcfp;.  str
9b00: 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a 6e  uct rule *rp, *n
9b10: 65 77 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73  ewrp;.  struct s
9b20: 79 6d 62 6f 6c 20 2a 73 70 2c 20 2a 78 73 70 3b  ymbol *sp, *xsp;
9b30: 0a 20 20 69 6e 74 20 69 2c 20 64 6f 74 3b 0a 0a  .  int i, dot;..
9b40: 20 20 61 73 73 65 72 74 28 20 63 75 72 72 65 6e    assert( curren
9b50: 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 66 6f 72  tend!=0 );.  for
9b60: 28 63 66 70 3d 63 75 72 72 65 6e 74 3b 20 63 66  (cfp=current; cf
9b70: 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74  p; cfp=cfp->next
9b80: 29 7b 0a 20 20 20 20 72 70 20 3d 20 63 66 70 2d  ){.    rp = cfp-
9b90: 3e 72 70 3b 0a 20 20 20 20 64 6f 74 20 3d 20 63  >rp;.    dot = c
9ba0: 66 70 2d 3e 64 6f 74 3b 0a 20 20 20 20 69 66 28  fp->dot;.    if(
9bb0: 20 64 6f 74 3e 3d 72 70 2d 3e 6e 72 68 73 20 29   dot>=rp->nrhs )
9bc0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73   continue;.    s
9bd0: 70 20 3d 20 72 70 2d 3e 72 68 73 5b 64 6f 74 5d  p = rp->rhs[dot]
9be0: 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  ;.    if( sp->ty
9bf0: 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20  pe==NONTERMINAL 
9c00: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 70 2d  ){.      if( sp-
9c10: 3e 72 75 6c 65 3d 3d 30 20 26 26 20 73 70 21 3d  >rule==0 && sp!=
9c20: 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a  lemp->errsym ){.
9c30: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
9c40: 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
9c50: 72 70 2d 3e 6c 69 6e 65 2c 22 4e 6f 6e 74 65 72  rp->line,"Nonter
9c60: 6d 69 6e 61 6c 20 5c 22 25 73 5c 22 20 68 61 73  minal \"%s\" has
9c70: 20 6e 6f 20 72 75 6c 65 73 2e 22 2c 0a 20 20 20   no rules.",.   
9c80: 20 20 20 20 20 20 20 73 70 2d 3e 6e 61 6d 65 29         sp->name)
9c90: 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e  ;.        lemp->
9ca0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
9cb0: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e 65    }.      for(ne
9cc0: 77 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 6e 65  wrp=sp->rule; ne
9cd0: 77 72 70 3b 20 6e 65 77 72 70 3d 6e 65 77 72 70  wrp; newrp=newrp
9ce0: 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20 20  ->nextlhs){.    
9cf0: 20 20 20 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e      newcfp = Con
9d00: 66 69 67 6c 69 73 74 5f 61 64 64 28 6e 65 77 72  figlist_add(newr
9d10: 70 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  p,0);.        fo
9d20: 72 28 69 3d 64 6f 74 2b 31 3b 20 69 3c 72 70 2d  r(i=dot+1; i<rp-
9d30: 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
9d40: 20 20 20 20 20 20 20 78 73 70 20 3d 20 72 70 2d         xsp = rp-
9d50: 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20  >rhs[i];.       
9d60: 20 20 20 69 66 28 20 78 73 70 2d 3e 74 79 70 65     if( xsp->type
9d70: 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  ==TERMINAL ){.  
9d80: 20 20 20 20 20 20 20 20 20 20 53 65 74 41 64 64            SetAdd
9d90: 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78 73 70  (newcfp->fws,xsp
9da0: 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
9db0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9dc0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
9dd0: 20 78 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54   xsp->type==MULT
9de0: 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  ITERMINAL ){.   
9df0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a           int k;.
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 28              for(
9e10: 6b 3d 30 3b 20 6b 3c 78 73 70 2d 3e 6e 73 75 62  k=0; k<xsp->nsub
9e20: 73 79 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  sym; k++){.     
9e30: 20 20 20 20 20 20 20 20 20 53 65 74 41 64 64 28           SetAdd(
9e40: 6e 65 77 63 66 70 2d 3e 66 77 73 2c 20 78 73 70  newcfp->fws, xsp
9e50: 2d 3e 73 75 62 73 79 6d 5b 6b 5d 2d 3e 69 6e 64  ->subsym[k]->ind
9e60: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ex);.           
9e70: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 62   }.            b
9e80: 72 65 61 6b 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a  reak;..  }else{.
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74 55              SetU
9ea0: 6e 69 6f 6e 28 6e 65 77 63 66 70 2d 3e 66 77 73  nion(newcfp->fws
9eb0: 2c 78 73 70 2d 3e 66 69 72 73 74 73 65 74 29 3b  ,xsp->firstset);
9ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
9ed0: 20 78 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c 45   xsp->lambda==LE
9ee0: 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65 61  MON_FALSE ) brea
9ef0: 6b 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20  k;..  }..}.     
9f00: 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72     if( i==rp->nr
9f10: 68 73 20 29 20 50 6c 69 6e 6b 5f 61 64 64 28 26  hs ) Plink_add(&
9f20: 63 66 70 2d 3e 66 70 6c 70 2c 6e 65 77 63 66 70  cfp->fplp,newcfp
9f30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9f40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
9f50: 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20 63 6f  ../* Sort the co
9f60: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
9f70: 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c   */.void Configl
9f80: 69 73 74 5f 73 6f 72 74 28 29 7b 0a 20 20 63 75  ist_sort(){.  cu
9f90: 72 72 65 6e 74 20 3d 20 28 73 74 72 75 63 74 20  rrent = (struct 
9fa0: 63 6f 6e 66 69 67 20 2a 29 6d 73 6f 72 74 28 28  config *)msort((
9fb0: 63 68 61 72 20 2a 29 63 75 72 72 65 6e 74 2c 28  char *)current,(
9fc0: 63 68 61 72 20 2a 2a 29 26 28 63 75 72 72 65 6e  char **)&(curren
9fd0: 74 2d 3e 6e 65 78 74 29 2c 43 6f 6e 66 69 67 63  t->next),Configc
9fe0: 6d 70 29 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e  mp);.  currenten
9ff0: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  d = 0;.  return;
a000: 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74 68 65 20  .}../* Sort the 
a010: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
a020: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64  ion list */.void
a030: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74   Configlist_sort
a040: 62 61 73 69 73 28 29 7b 0a 20 20 62 61 73 69 73  basis(){.  basis
a050: 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69   = (struct confi
a060: 67 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20  g *)msort((char 
a070: 2a 29 63 75 72 72 65 6e 74 2c 28 63 68 61 72 20  *)current,(char 
a080: 2a 2a 29 26 28 63 75 72 72 65 6e 74 2d 3e 62 70  **)&(current->bp
a090: 29 2c 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20  ),Configcmp);.  
a0a0: 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20  basisend = 0;.  
a0b0: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65  return;.}../* Re
a0c0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
a0d0: 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
a0e0: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
a0f0: 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65  list and.** rese
a100: 74 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74  t the list */.st
a110: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
a120: 66 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29  figlist_return()
a130: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
a140: 67 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20  g *old;.  old = 
a150: 63 75 72 72 65 6e 74 3b 0a 20 20 63 75 72 72 65  current;.  curre
a160: 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e  nt = 0;.  curren
a170: 74 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  tend = 0;.  retu
a180: 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 52 65  rn old;.}../* Re
a190: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
a1a0: 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
a1b0: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
a1c0: 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 73 65  list and.** rese
a1d0: 74 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 73 74  t the list */.st
a1e0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
a1f0: 66 69 67 6c 69 73 74 5f 62 61 73 69 73 28 29 7b  figlist_basis(){
a200: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
a210: 20 2a 6f 6c 64 3b 0a 20 20 6f 6c 64 20 3d 20 62   *old;.  old = b
a220: 61 73 69 73 3b 0a 20 20 62 61 73 69 73 20 3d 20  asis;.  basis = 
a230: 30 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20  0;.  basisend = 
a240: 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b  0;.  return old;
a250: 0a 7d 0a 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20  .}../* Free all 
a260: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20  elements of the 
a270: 67 69 76 65 6e 20 63 6f 6e 66 69 67 75 72 61 74  given configurat
a280: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64  ion list */.void
a290: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28   Configlist_eat(
a2a0: 63 66 70 29 0a 73 74 72 75 63 74 20 63 6f 6e 66  cfp).struct conf
a2b0: 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72  ig *cfp;.{.  str
a2c0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 78 74  uct config *next
a2d0: 63 66 70 3b 0a 20 20 66 6f 72 28 3b 20 63 66 70  cfp;.  for(; cfp
a2e0: 3b 20 63 66 70 3d 6e 65 78 74 63 66 70 29 7b 0a  ; cfp=nextcfp){.
a2f0: 20 20 20 20 6e 65 78 74 63 66 70 20 3d 20 63 66      nextcfp = cf
a300: 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 61 73 73  p->next;.    ass
a310: 65 72 74 28 20 63 66 70 2d 3e 66 70 6c 70 3d 3d  ert( cfp->fplp==
a320: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
a330: 20 63 66 70 2d 3e 62 70 6c 70 3d 3d 30 20 29 3b   cfp->bplp==0 );
a340: 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e 66 77  .    if( cfp->fw
a350: 73 20 29 20 53 65 74 46 72 65 65 28 63 66 70 2d  s ) SetFree(cfp-
a360: 3e 66 77 73 29 3b 0a 20 20 20 20 64 65 6c 65 74  >fws);.    delet
a370: 65 63 6f 6e 66 69 67 28 63 66 70 29 3b 0a 20 20  econfig(cfp);.  
a380: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 2f 2a  }.  return;.}./*
a390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3a0: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
a3b0: 65 72 72 6f 72 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  error.c" *******
a3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
a3e0: 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 69 6e 74  * Code for print
a3f0: 69 6e 67 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ing error messag
a400: 65 2e 0a 2a 2f 0a 0a 2f 2a 20 46 69 6e 64 20 61  e..*/../* Find a
a410: 20 67 6f 6f 64 20 70 6c 61 63 65 20 74 6f 20 62   good place to b
a420: 72 65 61 6b 20 22 6d 73 67 22 20 73 6f 20 74 68  reak "msg" so th
a430: 61 74 20 69 74 73 20 6c 65 6e 67 74 68 20 69 73  at its length is
a440: 20 61 74 20 6c 65 61 73 74 20 22 6d 69 6e 22 0a   at least "min".
a450: 2a 2a 20 62 75 74 20 6e 6f 20 6d 6f 72 65 20 74  ** but no more t
a460: 68 61 6e 20 22 6d 61 78 22 2e 20 20 4d 61 6b 65  han "max".  Make
a470: 20 74 68 65 20 70 6f 69 6e 74 20 61 73 20 63 6c   the point as cl
a480: 6f 73 65 20 74 6f 20 6d 61 78 20 61 73 20 70 6f  ose to max as po
a490: 73 73 69 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  ssible..*/.stati
a4a0: 63 20 69 6e 74 20 66 69 6e 64 62 72 65 61 6b 28  c int findbreak(
a4b0: 6d 73 67 2c 6d 69 6e 2c 6d 61 78 29 0a 63 68 61  msg,min,max).cha
a4c0: 72 20 2a 6d 73 67 3b 0a 69 6e 74 20 6d 69 6e 3b  r *msg;.int min;
a4d0: 0a 69 6e 74 20 6d 61 78 3b 0a 7b 0a 20 20 69 6e  .int max;.{.  in
a4e0: 74 20 69 2c 73 70 6f 74 3b 0a 20 20 63 68 61 72  t i,spot;.  char
a4f0: 20 63 3b 0a 20 20 66 6f 72 28 69 3d 73 70 6f 74   c;.  for(i=spot
a500: 3d 6d 69 6e 3b 20 69 3c 3d 6d 61 78 3b 20 69 2b  =min; i<=max; i+
a510: 2b 29 7b 0a 20 20 20 20 63 20 3d 20 6d 73 67 5b  +){.    c = msg[
a520: 69 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27  i];.    if( c=='
a530: 5c 74 27 20 29 20 6d 73 67 5b 69 5d 20 3d 20 27  \t' ) msg[i] = '
a540: 20 27 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   ';.    if( c=='
a550: 5c 6e 27 20 29 7b 20 6d 73 67 5b 69 5d 20 3d 20  \n' ){ msg[i] = 
a560: 27 20 27 3b 20 73 70 6f 74 20 3d 20 69 3b 20 62  ' '; spot = i; b
a570: 72 65 61 6b 3b 20 7d 0a 20 20 20 20 69 66 28 20  reak; }.    if( 
a580: 63 3d 3d 30 20 29 7b 20 73 70 6f 74 20 3d 20 69  c==0 ){ spot = i
a590: 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20 20 69  ; break; }.    i
a5a0: 66 28 20 63 3d 3d 27 2d 27 20 26 26 20 69 3c 6d  f( c=='-' && i<m
a5b0: 61 78 2d 31 20 29 20 73 70 6f 74 20 3d 20 69 2b  ax-1 ) spot = i+
a5c0: 31 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 20  1;.    if( c==' 
a5d0: 27 20 29 20 73 70 6f 74 20 3d 20 69 3b 0a 20 20  ' ) spot = i;.  
a5e0: 7d 0a 20 20 72 65 74 75 72 6e 20 73 70 6f 74 3b  }.  return spot;
a5f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 65 72  .}../*.** The er
a600: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 73  ror message is s
a610: 70 6c 69 74 20 61 63 72 6f 73 73 20 6d 75 6c 74  plit across mult
a620: 69 70 6c 65 20 6c 69 6e 65 73 20 69 66 20 6e 65  iple lines if ne
a630: 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a  cessary.  The.**
a640: 20 73 70 6c 69 74 73 20 6f 63 63 75 72 20 61 74   splits occur at
a650: 20 61 20 73 70 61 63 65 2c 20 69 66 20 74 68 65   a space, if the
a660: 72 65 20 69 73 20 61 20 73 70 61 63 65 20 61 76  re is a space av
a670: 61 69 6c 61 62 6c 65 20 6e 65 61 72 20 74 68 65  ailable near the
a680: 20 65 6e 64 0a 2a 2a 20 6f 66 20 74 68 65 20 6c   end.** of the l
a690: 69 6e 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ine..*/.#define 
a6a0: 45 52 52 4d 53 47 53 49 5a 45 20 20 31 30 30 30  ERRMSGSIZE  1000
a6b0: 30 20 2f 2a 20 48 6f 70 65 20 74 68 69 73 20 69  0 /* Hope this i
a6c0: 73 20 62 69 67 20 65 6e 6f 75 67 68 2e 20 20 4e  s big enough.  N
a6d0: 6f 20 77 61 79 20 74 6f 20 65 72 72 6f 72 20 63  o way to error c
a6e0: 68 65 63 6b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  heck */.#define 
a6f0: 4c 49 4e 45 57 49 44 54 48 20 20 20 20 20 20 37  LINEWIDTH      7
a700: 39 20 2f 2a 20 4d 61 78 20 77 69 64 74 68 20 6f  9 /* Max width o
a710: 66 20 61 6e 79 20 6f 75 74 70 75 74 20 6c 69 6e  f any output lin
a720: 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 45  e */.#define PRE
a730: 46 49 58 4c 49 4d 49 54 20 20 20 20 33 30 20 2f  FIXLIMIT    30 /
a740: 2a 20 4d 61 78 20 77 69 64 74 68 20 6f 66 20 74  * Max width of t
a750: 68 65 20 70 72 65 66 69 78 20 6f 6e 20 65 61 63  he prefix on eac
a760: 68 20 6c 69 6e 65 20 2a 2f 0a 76 6f 69 64 20 45  h line */.void E
a770: 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63 68  rrorMsg(const ch
a780: 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 69 6e  ar *filename, in
a790: 74 20 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20  t lineno, const 
a7a0: 63 68 61 72 20 2a 66 6f 72 6d 61 74 2c 20 2e 2e  char *format, ..
a7b0: 2e 29 7b 0a 20 20 63 68 61 72 20 65 72 72 6d 73  .){.  char errms
a7c0: 67 5b 45 52 52 4d 53 47 53 49 5a 45 5d 3b 0a 20  g[ERRMSGSIZE];. 
a7d0: 20 63 68 61 72 20 70 72 65 66 69 78 5b 50 52 45   char prefix[PRE
a7e0: 46 49 58 4c 49 4d 49 54 2b 31 30 5d 3b 0a 20 20  FIXLIMIT+10];.  
a7f0: 69 6e 74 20 65 72 72 6d 73 67 73 69 7a 65 3b 0a  int errmsgsize;.
a800: 20 20 69 6e 74 20 70 72 65 66 69 78 73 69 7a 65    int prefixsize
a810: 3b 0a 20 20 69 6e 74 20 61 76 61 69 6c 61 62 6c  ;.  int availabl
a820: 65 77 69 64 74 68 3b 0a 20 20 76 61 5f 6c 69 73  ewidth;.  va_lis
a830: 74 20 61 70 3b 0a 20 20 69 6e 74 20 65 6e 64 2c  t ap;.  int end,
a840: 20 72 65 73 74 61 72 74 2c 20 62 61 73 65 3b 0a   restart, base;.
a850: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
a860: 66 6f 72 6d 61 74 29 3b 0a 20 20 2f 2a 20 50 72  format);.  /* Pr
a870: 65 70 61 72 65 20 61 20 70 72 65 66 69 78 20 74  epare a prefix t
a880: 6f 20 62 65 20 70 72 65 70 65 6e 64 65 64 20 74  o be prepended t
a890: 6f 20 65 76 65 72 79 20 6f 75 74 70 75 74 20 6c  o every output l
a8a0: 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 6c 69 6e  ine */.  if( lin
a8b0: 65 6e 6f 3e 30 20 29 7b 0a 20 20 20 20 73 70 72  eno>0 ){.    spr
a8c0: 69 6e 74 66 28 70 72 65 66 69 78 2c 22 25 2e 2a  intf(prefix,"%.*
a8d0: 73 3a 25 64 3a 20 22 2c 50 52 45 46 49 58 4c 49  s:%d: ",PREFIXLI
a8e0: 4d 49 54 2d 31 30 2c 66 69 6c 65 6e 61 6d 65 2c  MIT-10,filename,
a8f0: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 65 6c 73 65  lineno);.  }else
a900: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 70 72  {.    sprintf(pr
a910: 65 66 69 78 2c 22 25 2e 2a 73 3a 20 22 2c 50 52  efix,"%.*s: ",PR
a920: 45 46 49 58 4c 49 4d 49 54 2d 31 30 2c 66 69 6c  EFIXLIMIT-10,fil
a930: 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 72  ename);.  }.  pr
a940: 65 66 69 78 73 69 7a 65 20 3d 20 6c 65 6d 6f 6e  efixsize = lemon
a950: 53 74 72 6c 65 6e 28 70 72 65 66 69 78 29 3b 0a  Strlen(prefix);.
a960: 20 20 61 76 61 69 6c 61 62 6c 65 77 69 64 74 68    availablewidth
a970: 20 3d 20 4c 49 4e 45 57 49 44 54 48 20 2d 20 70   = LINEWIDTH - p
a980: 72 65 66 69 78 73 69 7a 65 3b 0a 0a 20 20 2f 2a  refixsize;..  /*
a990: 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 72   Generate the er
a9a0: 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20  ror message */. 
a9b0: 20 76 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67   vsprintf(errmsg
a9c0: 2c 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20 20 76  ,format,ap);.  v
a9d0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 65 72 72  a_end(ap);.  err
a9e0: 6d 73 67 73 69 7a 65 20 3d 20 6c 65 6d 6f 6e 53  msgsize = lemonS
a9f0: 74 72 6c 65 6e 28 65 72 72 6d 73 67 29 3b 0a 20  trlen(errmsg);. 
aa00: 20 2f 2a 20 52 65 6d 6f 76 65 20 74 72 61 69 6c   /* Remove trail
aa10: 69 6e 67 20 27 5c 6e 27 73 20 66 72 6f 6d 20 74  ing '\n's from t
aa20: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
aa30: 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 65 72  . */.  while( er
aa40: 72 6d 73 67 73 69 7a 65 3e 30 20 26 26 20 65 72  rmsgsize>0 && er
aa50: 72 6d 73 67 5b 65 72 72 6d 73 67 73 69 7a 65 2d  rmsg[errmsgsize-
aa60: 31 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20  1]=='\n' ){.    
aa70: 20 65 72 72 6d 73 67 5b 2d 2d 65 72 72 6d 73 67   errmsg[--errmsg
aa80: 73 69 7a 65 5d 20 3d 20 30 3b 0a 20 20 7d 0a 0a  size] = 0;.  }..
aa90: 20 20 2f 2a 20 50 72 69 6e 74 20 74 68 65 20 65    /* Print the e
aaa0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a  rror message */.
aab0: 20 20 62 61 73 65 20 3d 20 30 3b 0a 20 20 77 68    base = 0;.  wh
aac0: 69 6c 65 28 20 65 72 72 6d 73 67 5b 62 61 73 65  ile( errmsg[base
aad0: 5d 21 3d 30 20 29 7b 0a 20 20 20 20 65 6e 64 20  ]!=0 ){.    end 
aae0: 3d 20 72 65 73 74 61 72 74 20 3d 20 66 69 6e 64  = restart = find
aaf0: 62 72 65 61 6b 28 26 65 72 72 6d 73 67 5b 62 61  break(&errmsg[ba
ab00: 73 65 5d 2c 30 2c 61 76 61 69 6c 61 62 6c 65 77  se],0,availablew
ab10: 69 64 74 68 29 3b 0a 20 20 20 20 72 65 73 74 61  idth);.    resta
ab20: 72 74 20 2b 3d 20 62 61 73 65 3b 0a 20 20 20 20  rt += base;.    
ab30: 77 68 69 6c 65 28 20 65 72 72 6d 73 67 5b 72 65  while( errmsg[re
ab40: 73 74 61 72 74 5d 3d 3d 27 20 27 20 29 20 72 65  start]==' ' ) re
ab50: 73 74 61 72 74 2b 2b 3b 0a 20 20 20 20 66 70 72  start++;.    fpr
ab60: 69 6e 74 66 28 73 74 64 6f 75 74 2c 22 25 73 25  intf(stdout,"%s%
ab70: 2e 2a 73 5c 6e 22 2c 70 72 65 66 69 78 2c 65 6e  .*s\n",prefix,en
ab80: 64 2c 26 65 72 72 6d 73 67 5b 62 61 73 65 5d 29  d,&errmsg[base])
ab90: 3b 0a 20 20 20 20 62 61 73 65 20 3d 20 72 65 73  ;.    base = res
aba0: 74 61 72 74 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a  tart;.  }.}./***
abb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
abc0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6d 61 69  om the file "mai
abd0: 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n.c" ***********
abe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
abf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
ac00: 20 4d 61 69 6e 20 70 72 6f 67 72 61 6d 20 66 69   Main program fi
ac10: 6c 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e  le for the LEMON
ac20: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
ac30: 72 2e 0a 2a 2f 0a 0a 2f 2a 20 52 65 70 6f 72 74  r..*/../* Report
ac40: 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72   an out-of-memor
ac50: 79 20 63 6f 6e 64 69 74 69 6f 6e 20 61 6e 64 20  y condition and 
ac60: 61 62 6f 72 74 2e 20 20 54 68 69 73 20 66 75 6e  abort.  This fun
ac70: 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64  ction.** is used
ac80: 20 6d 6f 73 74 6c 79 20 62 79 20 74 68 65 20 22   mostly by the "
ac90: 4d 65 6d 6f 72 79 43 68 65 63 6b 22 20 6d 61 63  MemoryCheck" mac
aca0: 72 6f 20 69 6e 20 73 74 72 75 63 74 2e 68 0a 2a  ro in struct.h.*
acb0: 2f 0a 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72  /.void memory_er
acc0: 72 6f 72 28 29 7b 0a 20 20 66 70 72 69 6e 74 66  ror(){.  fprintf
acd0: 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20  (stderr,"Out of 
ace0: 6d 65 6d 6f 72 79 2e 20 20 41 62 6f 72 74 69 6e  memory.  Abortin
acf0: 67 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 65 78 69 74  g...\n");.  exit
ad00: 28 31 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  (1);.}..static i
ad10: 6e 74 20 6e 44 65 66 69 6e 65 20 3d 20 30 3b 20  nt nDefine = 0; 
ad20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ad30: 66 20 2d 44 20 6f 70 74 69 6f 6e 73 20 6f 6e 20  f -D options on 
ad40: 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
ad50: 20 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20   */.static char 
ad60: 2a 2a 61 7a 44 65 66 69 6e 65 20 3d 20 30 3b 20  **azDefine = 0; 
ad70: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
ad80: 2d 44 20 6d 61 63 72 6f 73 20 2a 2f 0a 0a 2f 2a  -D macros */../*
ad90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
ada0: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
adb0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 65 61 63   argument to eac
adc0: 68 20 2d 44 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  h -D command-lin
add0: 65 20 6f 70 74 69 6f 6e 2e 0a 2a 2a 20 41 64 64  e option..** Add
ade0: 20 74 68 65 20 6d 61 63 72 6f 20 64 65 66 69 6e   the macro defin
adf0: 65 64 20 74 6f 20 74 68 65 20 61 7a 44 65 66 69  ed to the azDefi
ae00: 6e 65 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61  ne array..*/.sta
ae10: 74 69 63 20 76 6f 69 64 20 68 61 6e 64 6c 65 5f  tic void handle_
ae20: 44 5f 6f 70 74 69 6f 6e 28 63 68 61 72 20 2a 7a  D_option(char *z
ae30: 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70 61 7a 3b  ){.  char **paz;
ae40: 0a 20 20 6e 44 65 66 69 6e 65 2b 2b 3b 0a 20 20  .  nDefine++;.  
ae50: 61 7a 44 65 66 69 6e 65 20 3d 20 72 65 61 6c 6c  azDefine = reall
ae60: 6f 63 28 61 7a 44 65 66 69 6e 65 2c 20 73 69 7a  oc(azDefine, siz
ae70: 65 6f 66 28 61 7a 44 65 66 69 6e 65 5b 30 5d 29  eof(azDefine[0])
ae80: 2a 6e 44 65 66 69 6e 65 29 3b 0a 20 20 69 66 28  *nDefine);.  if(
ae90: 20 61 7a 44 65 66 69 6e 65 3d 3d 30 20 29 7b 0a   azDefine==0 ){.
aea0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
aeb0: 72 72 2c 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  rr,"out of memor
aec0: 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  y\n");.    exit(
aed0: 31 29 3b 0a 20 20 7d 0a 20 20 70 61 7a 20 3d 20  1);.  }.  paz = 
aee0: 26 61 7a 44 65 66 69 6e 65 5b 6e 44 65 66 69 6e  &azDefine[nDefin
aef0: 65 2d 31 5d 3b 0a 20 20 2a 70 61 7a 20 3d 20 6d  e-1];.  *paz = m
af00: 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c  alloc( lemonStrl
af10: 65 6e 28 7a 29 2b 31 20 29 3b 0a 20 20 69 66 28  en(z)+1 );.  if(
af20: 20 2a 70 61 7a 3d 3d 30 20 29 7b 0a 20 20 20 20   *paz==0 ){.    
af30: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
af40: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22  out of memory\n"
af50: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
af60: 20 20 7d 0a 20 20 73 74 72 63 70 79 28 2a 70 61    }.  strcpy(*pa
af70: 7a 2c 20 7a 29 3b 0a 20 20 66 6f 72 28 7a 3d 2a  z, z);.  for(z=*
af80: 70 61 7a 3b 20 2a 7a 20 26 26 20 2a 7a 21 3d 27  paz; *z && *z!='
af90: 3d 27 3b 20 7a 2b 2b 29 7b 7d 0a 20 20 2a 7a 20  ='; z++){}.  *z 
afa0: 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 20 54 68 65 20  = 0;.}.../* The 
afb0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 20 50  main program.  P
afc0: 61 72 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64  arse the command
afd0: 20 6c 69 6e 65 20 61 6e 64 20 64 6f 20 69 74 2e   line and do it.
afe0: 2e 2e 20 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28 61  .. */.int main(a
aff0: 72 67 63 2c 61 72 67 76 29 0a 69 6e 74 20 61 72  rgc,argv).int ar
b000: 67 63 3b 0a 63 68 61 72 20 2a 2a 61 72 67 76 3b  gc;.char **argv;
b010: 0a 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  .{.  static int 
b020: 76 65 72 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73  version = 0;.  s
b030: 74 61 74 69 63 20 69 6e 74 20 72 70 66 6c 61 67  tatic int rpflag
b040: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
b050: 6e 74 20 62 61 73 69 73 66 6c 61 67 20 3d 20 30  nt basisflag = 0
b060: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63  ;.  static int c
b070: 6f 6d 70 72 65 73 73 20 3d 20 30 3b 0a 20 20 73  ompress = 0;.  s
b080: 74 61 74 69 63 20 69 6e 74 20 71 75 69 65 74 20  tatic int quiet 
b090: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
b0a0: 74 20 73 74 61 74 69 73 74 69 63 73 20 3d 20 30  t statistics = 0
b0b0: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6d  ;.  static int m
b0c0: 68 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61  hflag = 0;.  sta
b0d0: 74 69 63 20 69 6e 74 20 6e 6f 6c 69 6e 65 6e 6f  tic int nolineno
b0e0: 73 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61  sflag = 0;.  sta
b0f0: 74 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74  tic struct s_opt
b100: 69 6f 6e 73 20 6f 70 74 69 6f 6e 73 5b 5d 20 3d  ions options[] =
b110: 20 7b 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47   {.    {OPT_FLAG
b120: 2c 20 22 62 22 2c 20 28 63 68 61 72 2a 29 26 62  , "b", (char*)&b
b130: 61 73 69 73 66 6c 61 67 2c 20 22 50 72 69 6e 74  asisflag, "Print
b140: 20 6f 6e 6c 79 20 74 68 65 20 62 61 73 69 73 20   only the basis 
b150: 69 6e 20 72 65 70 6f 72 74 2e 22 7d 2c 0a 20 20  in report."},.  
b160: 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 63 22    {OPT_FLAG, "c"
b170: 2c 20 28 63 68 61 72 2a 29 26 63 6f 6d 70 72 65  , (char*)&compre
b180: 73 73 2c 20 22 44 6f 6e 27 74 20 63 6f 6d 70 72  ss, "Don't compr
b190: 65 73 73 20 74 68 65 20 61 63 74 69 6f 6e 20 74  ess the action t
b1a0: 61 62 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  able."},.    {OP
b1b0: 54 5f 46 53 54 52 2c 20 22 44 22 2c 20 28 63 68  T_FSTR, "D", (ch
b1c0: 61 72 2a 29 68 61 6e 64 6c 65 5f 44 5f 6f 70 74  ar*)handle_D_opt
b1d0: 69 6f 6e 2c 20 22 44 65 66 69 6e 65 20 61 6e 20  ion, "Define an 
b1e0: 25 69 66 64 65 66 20 6d 61 63 72 6f 2e 22 7d 2c  %ifdef macro."},
b1f0: 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20  .    {OPT_FLAG, 
b200: 22 67 22 2c 20 28 63 68 61 72 2a 29 26 72 70 66  "g", (char*)&rpf
b210: 6c 61 67 2c 20 22 50 72 69 6e 74 20 67 72 61 6d  lag, "Print gram
b220: 6d 61 72 20 77 69 74 68 6f 75 74 20 61 63 74 69  mar without acti
b230: 6f 6e 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ons."},.    {OPT
b240: 5f 46 4c 41 47 2c 20 22 6d 22 2c 20 28 63 68 61  _FLAG, "m", (cha
b250: 72 2a 29 26 6d 68 66 6c 61 67 2c 20 22 4f 75 74  r*)&mhflag, "Out
b260: 70 75 74 20 61 20 6d 61 6b 65 68 65 61 64 65 72  put a makeheader
b270: 73 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c  s compatible fil
b280: 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  e."},.    {OPT_F
b290: 4c 41 47 2c 20 22 6c 22 2c 20 28 63 68 61 72 2a  LAG, "l", (char*
b2a0: 29 26 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 2c  )&nolinenosflag,
b2b0: 20 22 44 6f 20 6e 6f 74 20 70 72 69 6e 74 20 23   "Do not print #
b2c0: 6c 69 6e 65 20 73 74 61 74 65 6d 65 6e 74 73 2e  line statements.
b2d0: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
b2e0: 47 2c 20 22 71 22 2c 20 28 63 68 61 72 2a 29 26  G, "q", (char*)&
b2f0: 71 75 69 65 74 2c 20 22 28 51 75 69 65 74 29 20  quiet, "(Quiet) 
b300: 44 6f 6e 27 74 20 70 72 69 6e 74 20 74 68 65 20  Don't print the 
b310: 72 65 70 6f 72 74 20 66 69 6c 65 2e 22 7d 2c 0a  report file."},.
b320: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
b330: 73 22 2c 20 28 63 68 61 72 2a 29 26 73 74 61 74  s", (char*)&stat
b340: 69 73 74 69 63 73 2c 0a 20 20 20 20 20 20 20 20  istics,.        
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b360: 20 20 20 20 20 20 20 20 20 20 20 22 50 72 69 6e             "Prin
b370: 74 20 70 61 72 73 65 72 20 73 74 61 74 73 20 74  t parser stats t
b380: 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75  o standard outpu
b390: 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  t."},.    {OPT_F
b3a0: 4c 41 47 2c 20 22 78 22 2c 20 28 63 68 61 72 2a  LAG, "x", (char*
b3b0: 29 26 76 65 72 73 69 6f 6e 2c 20 22 50 72 69 6e  )&version, "Prin
b3c0: 74 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75  t the version nu
b3d0: 6d 62 65 72 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  mber."},.    {OP
b3e0: 54 5f 46 4c 41 47 2c 30 2c 30 2c 30 7d 0a 20 20  T_FLAG,0,0,0}.  
b3f0: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  };.  int i;.  st
b400: 72 75 63 74 20 6c 65 6d 6f 6e 20 6c 65 6d 3b 0a  ruct lemon lem;.
b410: 0a 20 20 4f 70 74 49 6e 69 74 28 61 72 67 76 2c  .  OptInit(argv,
b420: 6f 70 74 69 6f 6e 73 2c 73 74 64 65 72 72 29 3b  options,stderr);
b430: 0a 20 20 69 66 28 20 76 65 72 73 69 6f 6e 20 29  .  if( version )
b440: 7b 0a 20 20 20 20 20 70 72 69 6e 74 66 28 22 4c  {.     printf("L
b450: 65 6d 6f 6e 20 76 65 72 73 69 6f 6e 20 31 2e 30  emon version 1.0
b460: 5c 6e 22 29 3b 0a 20 20 20 20 20 65 78 69 74 28  \n");.     exit(
b470: 30 29 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20 4f  0); .  }.  if( O
b480: 70 74 4e 41 72 67 73 28 29 21 3d 31 20 29 7b 0a  ptNArgs()!=1 ){.
b490: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
b4a0: 72 72 2c 22 45 78 61 63 74 6c 79 20 6f 6e 65 20  rr,"Exactly one 
b4b0: 66 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  filename argumen
b4c0: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 5c 6e  t is required.\n
b4d0: 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
b4e0: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6c  .  }.  memset(&l
b4f0: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c 65  em, 0, sizeof(le
b500: 6d 29 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 6f 72  m));.  lem.error
b510: 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  cnt = 0;..  /* I
b520: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 61  nitialize the ma
b530: 63 68 69 6e 65 20 2a 2f 0a 20 20 53 74 72 73 61  chine */.  Strsa
b540: 66 65 5f 69 6e 69 74 28 29 3b 0a 20 20 53 79 6d  fe_init();.  Sym
b550: 62 6f 6c 5f 69 6e 69 74 28 29 3b 0a 20 20 53 74  bol_init();.  St
b560: 61 74 65 5f 69 6e 69 74 28 29 3b 0a 20 20 6c 65  ate_init();.  le
b570: 6d 2e 61 72 67 76 30 20 3d 20 61 72 67 76 5b 30  m.argv0 = argv[0
b580: 5d 3b 0a 20 20 6c 65 6d 2e 66 69 6c 65 6e 61 6d  ];.  lem.filenam
b590: 65 20 3d 20 4f 70 74 41 72 67 28 30 29 3b 0a 20  e = OptArg(0);. 
b5a0: 20 6c 65 6d 2e 62 61 73 69 73 66 6c 61 67 20 3d   lem.basisflag =
b5b0: 20 62 61 73 69 73 66 6c 61 67 3b 0a 20 20 6c 65   basisflag;.  le
b5c0: 6d 2e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20  m.nolinenosflag 
b5d0: 3d 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 3b  = nolinenosflag;
b5e0: 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 24  .  Symbol_new("$
b5f0: 22 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d  ");.  lem.errsym
b600: 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 65   = Symbol_new("e
b610: 72 72 6f 72 22 29 3b 0a 20 20 6c 65 6d 2e 65 72  rror");.  lem.er
b620: 72 73 79 6d 2d 3e 75 73 65 43 6e 74 20 3d 20 30  rsym->useCnt = 0
b630: 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68  ;..  /* Parse th
b640: 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
b650: 20 20 50 61 72 73 65 28 26 6c 65 6d 29 3b 0a 20    Parse(&lem);. 
b660: 20 69 66 28 20 6c 65 6d 2e 65 72 72 6f 72 63 6e   if( lem.errorcn
b670: 74 20 29 20 65 78 69 74 28 6c 65 6d 2e 65 72 72  t ) exit(lem.err
b680: 6f 72 63 6e 74 29 3b 0a 20 20 69 66 28 20 6c 65  orcnt);.  if( le
b690: 6d 2e 6e 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20  m.nrule==0 ){.  
b6a0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
b6b0: 2c 22 45 6d 70 74 79 20 67 72 61 6d 6d 61 72 2e  ,"Empty grammar.
b6c0: 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
b6d0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 75  );.  }..  /* Cou
b6e0: 6e 74 20 61 6e 64 20 69 6e 64 65 78 20 74 68 65  nt and index the
b6f0: 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20   symbols of the 
b700: 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 6c 65 6d  grammar */.  lem
b710: 2e 6e 73 79 6d 62 6f 6c 20 3d 20 53 79 6d 62 6f  .nsymbol = Symbo
b720: 6c 5f 63 6f 75 6e 74 28 29 3b 0a 20 20 53 79 6d  l_count();.  Sym
b730: 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c  bol_new("{defaul
b740: 74 7d 22 29 3b 0a 20 20 6c 65 6d 2e 73 79 6d 62  t}");.  lem.symb
b750: 6f 6c 73 20 3d 20 53 79 6d 62 6f 6c 5f 61 72 72  ols = Symbol_arr
b760: 61 79 6f 66 28 29 3b 0a 20 20 66 6f 72 28 69 3d  ayof();.  for(i=
b770: 30 3b 20 69 3c 3d 6c 65 6d 2e 6e 73 79 6d 62 6f  0; i<=lem.nsymbo
b780: 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e 73 79 6d 62  l; i++) lem.symb
b790: 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65 78 20 3d 20  ols[i]->index = 
b7a0: 69 3b 0a 20 20 71 73 6f 72 74 28 6c 65 6d 2e 73  i;.  qsort(lem.s
b7b0: 79 6d 62 6f 6c 73 2c 6c 65 6d 2e 6e 73 79 6d 62  ymbols,lem.nsymb
b7c0: 6f 6c 2b 31 2c 73 69 7a 65 6f 66 28 73 74 72 75  ol+1,sizeof(stru
b7d0: 63 74 20 73 79 6d 62 6f 6c 2a 29 2c 0a 20 20 20  ct symbol*),.   
b7e0: 20 20 20 20 20 28 69 6e 74 28 2a 29 28 29 29 53       (int(*)())S
b7f0: 79 6d 62 6f 6c 63 6d 70 70 29 3b 0a 20 20 66 6f  ymbolcmpp);.  fo
b800: 72 28 69 3d 30 3b 20 69 3c 3d 6c 65 6d 2e 6e 73  r(i=0; i<=lem.ns
b810: 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e  ymbol; i++) lem.
b820: 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65  symbols[i]->inde
b830: 78 20 3d 20 69 3b 0a 20 20 66 6f 72 28 69 3d 31  x = i;.  for(i=1
b840: 3b 20 69 73 75 70 70 65 72 28 6c 65 6d 2e 73 79  ; isupper(lem.sy
b850: 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 5b 30  mbols[i]->name[0
b860: 5d 29 3b 20 69 2b 2b 29 3b 0a 20 20 6c 65 6d 2e  ]); i++);.  lem.
b870: 6e 74 65 72 6d 69 6e 61 6c 20 3d 20 69 3b 0a 0a  nterminal = i;..
b880: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
b890: 72 65 70 72 69 6e 74 20 6f 66 20 74 68 65 20 67  reprint of the g
b8a0: 72 61 6d 6d 61 72 2c 20 69 66 20 72 65 71 75 65  rammar, if reque
b8b0: 73 74 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d  sted on the comm
b8c0: 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 66  and line */.  if
b8d0: 28 20 72 70 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( rpflag ){.    
b8e0: 52 65 70 72 69 6e 74 28 26 6c 65 6d 29 3b 0a 20  Reprint(&lem);. 
b8f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
b900: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 73 69  nitialize the si
b910: 7a 65 20 66 6f 72 20 61 6c 6c 20 66 6f 6c 6c 6f  ze for all follo
b920: 77 20 61 6e 64 20 66 69 72 73 74 20 73 65 74 73  w and first sets
b930: 20 2a 2f 0a 20 20 20 20 53 65 74 53 69 7a 65 28   */.    SetSize(
b940: 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2b 31 29  lem.nterminal+1)
b950: 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74  ;..    /* Find t
b960: 68 65 20 70 72 65 63 65 64 65 6e 63 65 20 66 6f  he precedence fo
b970: 72 20 65 76 65 72 79 20 70 72 6f 64 75 63 74 69  r every producti
b980: 6f 6e 20 72 75 6c 65 20 28 74 68 61 74 20 68 61  on rule (that ha
b990: 73 20 6f 6e 65 29 20 2a 2f 0a 20 20 20 20 46 69  s one) */.    Fi
b9a0: 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65  ndRulePrecedence
b9b0: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
b9c0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c 61 6d   Compute the lam
b9d0: 62 64 61 2d 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73  bda-nonterminals
b9e0: 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 2d 73   and the first-s
b9f0: 65 74 73 20 66 6f 72 20 65 76 65 72 79 0a 20 20  ets for every.  
ba00: 20 20 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c    ** nonterminal
ba10: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46 69 72 73   */.    FindFirs
ba20: 74 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  tSets(&lem);..  
ba30: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c    /* Compute all
ba40: 20 4c 52 28 30 29 20 73 74 61 74 65 73 2e 20 20   LR(0) states.  
ba50: 41 6c 73 6f 20 72 65 63 6f 72 64 20 66 6f 6c 6c  Also record foll
ba60: 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69  ow-set propagati
ba70: 6f 6e 0a 20 20 20 20 2a 2a 20 6c 69 6e 6b 73 20  on.    ** links 
ba80: 73 6f 20 74 68 61 74 20 74 68 65 20 66 6f 6c 6c  so that the foll
ba90: 6f 77 2d 73 65 74 20 63 61 6e 20 62 65 20 63 6f  ow-set can be co
baa0: 6d 70 75 74 65 64 20 6c 61 74 65 72 20 2a 2f 0a  mputed later */.
bab0: 20 20 20 20 6c 65 6d 2e 6e 73 74 61 74 65 20 3d      lem.nstate =
bac0: 20 30 3b 0a 20 20 20 20 46 69 6e 64 53 74 61 74   0;.    FindStat
bad0: 65 73 28 26 6c 65 6d 29 3b 0a 20 20 20 20 6c 65  es(&lem);.    le
bae0: 6d 2e 73 6f 72 74 65 64 20 3d 20 53 74 61 74 65  m.sorted = State
baf0: 5f 61 72 72 61 79 6f 66 28 29 3b 0a 0a 20 20 20  _arrayof();..   
bb00: 20 2f 2a 20 54 69 65 20 75 70 20 6c 6f 6f 73 65   /* Tie up loose
bb10: 20 65 6e 64 73 20 6f 6e 20 74 68 65 20 70 72 6f   ends on the pro
bb20: 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a  pagation links *
bb30: 2f 0a 20 20 20 20 46 69 6e 64 4c 69 6e 6b 73 28  /.    FindLinks(
bb40: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  &lem);..    /* C
bb50: 6f 6d 70 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f  ompute the follo
bb60: 77 20 73 65 74 20 6f 66 20 65 76 65 72 79 20 72  w set of every r
bb70: 65 64 75 63 69 62 6c 65 20 63 6f 6e 66 69 67 75  educible configu
bb80: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 46 69  ration */.    Fi
bb90: 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28 26 6c 65  ndFollowSets(&le
bba0: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  m);..    /* Comp
bbb0: 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74  ute the action t
bbc0: 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 46 69 6e  ables */.    Fin
bbd0: 64 41 63 74 69 6f 6e 73 28 26 6c 65 6d 29 3b 0a  dActions(&lem);.
bbe0: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73  .    /* Compress
bbf0: 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
bc00: 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f  es */.    if( co
bc10: 6d 70 72 65 73 73 3d 3d 30 20 29 20 43 6f 6d 70  mpress==0 ) Comp
bc20: 72 65 73 73 54 61 62 6c 65 73 28 26 6c 65 6d 29  ressTables(&lem)
bc30: 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6f 72 64 65  ;..    /* Reorde
bc40: 72 20 61 6e 64 20 72 65 6e 75 6d 62 65 72 20 74  r and renumber t
bc50: 68 65 20 73 74 61 74 65 73 20 73 6f 20 74 68 61  he states so tha
bc60: 74 20 73 74 61 74 65 73 20 77 69 74 68 20 66 65  t states with fe
bc70: 77 65 72 20 63 68 6f 69 63 65 73 0a 20 20 20 20  wer choices.    
bc80: 2a 2a 20 6f 63 63 75 72 20 61 74 20 74 68 65 20  ** occur at the 
bc90: 65 6e 64 2e 20 2a 2f 0a 20 20 20 20 52 65 73 6f  end. */.    Reso
bca0: 72 74 53 74 61 74 65 73 28 26 6c 65 6d 29 3b 0a  rtStates(&lem);.
bcb0: 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  .    /* Generate
bcc0: 20 61 20 72 65 70 6f 72 74 20 6f 66 20 74 68 65   a report of the
bcd0: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 65   parser generate
bce0: 64 2e 20 20 28 74 68 65 20 22 79 2e 6f 75 74 70  d.  (the "y.outp
bcf0: 75 74 22 20 66 69 6c 65 29 20 2a 2f 0a 20 20 20  ut" file) */.   
bd00: 20 69 66 28 20 21 71 75 69 65 74 20 29 20 52 65   if( !quiet ) Re
bd10: 70 6f 72 74 4f 75 74 70 75 74 28 26 6c 65 6d 29  portOutput(&lem)
bd20: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
bd30: 74 65 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f  te the source co
bd40: 64 65 20 66 6f 72 20 74 68 65 20 70 61 72 73 65  de for the parse
bd50: 72 20 2a 2f 0a 20 20 20 20 52 65 70 6f 72 74 54  r */.    ReportT
bd60: 61 62 6c 65 28 26 6c 65 6d 2c 20 6d 68 66 6c 61  able(&lem, mhfla
bd70: 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 64  g);..    /* Prod
bd80: 75 63 65 20 61 20 68 65 61 64 65 72 20 66 69 6c  uce a header fil
bd90: 65 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 65  e for use by the
bda0: 20 73 63 61 6e 6e 65 72 2e 20 20 28 54 68 69 73   scanner.  (This
bdb0: 20 73 74 65 70 20 69 73 0a 20 20 20 20 2a 2a 20   step is.    ** 
bdc0: 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65 20 22  omitted if the "
bdd0: 2d 6d 22 20 6f 70 74 69 6f 6e 20 69 73 20 75 73  -m" option is us
bde0: 65 64 20 62 65 63 61 75 73 65 20 6d 61 6b 65 68  ed because makeh
bdf0: 65 61 64 65 72 73 20 77 69 6c 6c 0a 20 20 20 20  eaders will.    
be00: 2a 2a 20 67 65 6e 65 72 61 74 65 20 74 68 65 20  ** generate the 
be10: 66 69 6c 65 20 66 6f 72 20 75 73 2e 29 20 2a 2f  file for us.) */
be20: 0a 20 20 20 20 69 66 28 20 21 6d 68 66 6c 61 67  .    if( !mhflag
be30: 20 29 20 52 65 70 6f 72 74 48 65 61 64 65 72 28   ) ReportHeader(
be40: 26 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20 69 66 28  &lem);.  }.  if(
be50: 20 73 74 61 74 69 73 74 69 63 73 20 29 7b 0a 20   statistics ){. 
be60: 20 20 20 70 72 69 6e 74 66 28 22 50 61 72 73 65     printf("Parse
be70: 72 20 73 74 61 74 69 73 74 69 63 73 3a 20 25 64  r statistics: %d
be80: 20 74 65 72 6d 69 6e 61 6c 73 2c 20 25 64 20 6e   terminals, %d n
be90: 6f 6e 74 65 72 6d 69 6e 61 6c 73 2c 20 25 64 20  onterminals, %d 
bea0: 72 75 6c 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  rules\n",.      
beb0: 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2c 20 6c  lem.nterminal, l
bec0: 65 6d 2e 6e 73 79 6d 62 6f 6c 20 2d 20 6c 65 6d  em.nsymbol - lem
bed0: 2e 6e 74 65 72 6d 69 6e 61 6c 2c 20 6c 65 6d 2e  .nterminal, lem.
bee0: 6e 72 75 6c 65 29 3b 0a 20 20 20 20 70 72 69 6e  nrule);.    prin
bef0: 74 66 28 22 20 20 20 20 20 20 20 20 20 20 20 20  tf("            
bf00: 20 20 20 20 20 20 20 25 64 20 73 74 61 74 65 73         %d states
bf10: 2c 20 25 64 20 70 61 72 73 65 72 20 74 61 62 6c  , %d parser tabl
bf20: 65 20 65 6e 74 72 69 65 73 2c 20 25 64 20 63 6f  e entries, %d co
bf30: 6e 66 6c 69 63 74 73 5c 6e 22 2c 0a 20 20 20 20  nflicts\n",.    
bf40: 20 20 6c 65 6d 2e 6e 73 74 61 74 65 2c 20 6c 65    lem.nstate, le
bf50: 6d 2e 74 61 62 6c 65 73 69 7a 65 2c 20 6c 65 6d  m.tablesize, lem
bf60: 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20 7d  .nconflict);.  }
bf70: 0a 20 20 69 66 28 20 6c 65 6d 2e 6e 63 6f 6e 66  .  if( lem.nconf
bf80: 6c 69 63 74 20 29 7b 0a 20 20 20 20 66 70 72 69  lict ){.    fpri
bf90: 6e 74 66 28 73 74 64 65 72 72 2c 22 25 64 20 70  ntf(stderr,"%d p
bfa0: 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73  arsing conflicts
bfb0: 2e 5c 6e 22 2c 6c 65 6d 2e 6e 63 6f 6e 66 6c 69  .\n",lem.nconfli
bfc0: 63 74 29 3b 0a 20 20 7d 0a 20 20 65 78 69 74 28  ct);.  }.  exit(
bfd0: 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 2b 20 6c  lem.errorcnt + l
bfe0: 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20  em.nconflict);. 
bff0: 20 72 65 74 75 72 6e 20 28 6c 65 6d 2e 65 72 72   return (lem.err
c000: 6f 72 63 6e 74 20 2b 20 6c 65 6d 2e 6e 63 6f 6e  orcnt + lem.ncon
c010: 66 6c 69 63 74 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  flict);.}./*****
c020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
c030: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6d  From the file "m
c040: 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  sort.c" ********
c050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c060: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41  *******/./*.** A
c070: 20 67 65 6e 65 72 69 63 20 6d 65 72 67 65 2d 73   generic merge-s
c080: 6f 72 74 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a  ort program..**.
c090: 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a 20 4c 65 74  ** USAGE:.** Let
c0a0: 20 22 70 74 72 22 20 62 65 20 61 20 70 6f 69 6e   "ptr" be a poin
c0b0: 74 65 72 20 74 6f 20 73 6f 6d 65 20 73 74 72 75  ter to some stru
c0c0: 63 74 75 72 65 20 77 68 69 63 68 20 69 73 20 61  cture which is a
c0d0: 74 20 74 68 65 20 68 65 61 64 20 6f 66 0a 2a 2a  t the head of.**
c0e0: 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74   a null-terminat
c0f0: 65 64 20 6c 69 73 74 2e 20 20 54 68 65 6e 20 74  ed list.  Then t
c100: 6f 20 73 6f 72 74 20 74 68 65 20 6c 69 73 74 20  o sort the list 
c110: 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  call:.**.**     
c120: 70 74 72 20 3d 20 6d 73 6f 72 74 28 70 74 72 2c  ptr = msort(ptr,
c130: 26 28 70 74 72 2d 3e 6e 65 78 74 29 2c 63 6d 70  &(ptr->next),cmp
c140: 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  fnc);.**.** In t
c150: 68 65 20 61 62 6f 76 65 2c 20 22 63 6d 70 66 6e  he above, "cmpfn
c160: 63 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  c" is a pointer 
c170: 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 68  to a function wh
c180: 69 63 68 20 63 6f 6d 70 61 72 65 73 0a 2a 2a 20  ich compares.** 
c190: 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  two instances of
c1a0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 61   the structure a
c1b0: 6e 64 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e  nd returns an in
c1c0: 74 65 67 65 72 2c 20 61 73 20 69 6e 0a 2a 2a 20  teger, as in.** 
c1d0: 73 74 72 63 6d 70 2e 20 20 54 68 65 20 73 65 63  strcmp.  The sec
c1e0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
c1f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
c200: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a   pointer to the.
c210: 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  ** second elemen
c220: 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20  t of the linked 
c230: 6c 69 73 74 2e 20 20 54 68 69 73 20 61 64 64 72  list.  This addr
c240: 65 73 73 20 69 73 20 75 73 65 64 20 74 6f 20 63  ess is used to c
c250: 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 6f 66  ompute.** the of
c260: 66 73 65 74 20 74 6f 20 74 68 65 20 22 6e 65 78  fset to the "nex
c270: 74 22 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20  t" field within 
c280: 74 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  the structure.  
c290: 54 68 65 20 6f 66 66 73 65 74 20 74 6f 0a 2a 2a  The offset to.**
c2a0: 20 74 68 65 20 22 6e 65 78 74 22 20 66 69 65 6c   the "next" fiel
c2b0: 64 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61  d must be consta
c2c0: 6e 74 20 66 6f 72 20 61 6c 6c 20 73 74 72 75 63  nt for all struc
c2d0: 74 75 72 65 73 20 69 6e 20 74 68 65 20 6c 69 73  tures in the lis
c2e0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 75 6e  t..**.** The fun
c2f0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
c300: 6e 65 77 20 70 6f 69 6e 74 65 72 20 77 68 69 63  new pointer whic
c310: 68 20 69 73 20 74 68 65 20 68 65 61 64 20 6f 66  h is the head of
c320: 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 61 66 74   the list.** aft
c330: 65 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a 0a 2a  er sorting..**.*
c340: 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a 20  * ALGORITHM:.** 
c350: 4d 65 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f 0a 0a  Merge-sort..*/..
c360: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
c370: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65  ointer to the ne
c380: 78 74 20 73 74 72 75 63 74 75 72 65 20 69 6e 20  xt structure in 
c390: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  the linked list.
c3a0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 45 58 54  .*/.#define NEXT
c3b0: 28 41 29 20 28 2a 28 63 68 61 72 2a 2a 29 28 28  (A) (*(char**)((
c3c0: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 41  (unsigned long)A
c3d0: 29 2b 6f 66 66 73 65 74 29 29 0a 0a 2f 2a 0a 2a  )+offset))../*.*
c3e0: 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 61  * Inputs:.**   a
c3f0: 3a 20 20 20 20 20 20 20 41 20 73 6f 72 74 65 64  :       A sorted
c400: 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65  , null-terminate
c410: 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20  d linked list.  
c420: 28 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a  (May be null)..*
c430: 2a 20 20 20 62 3a 20 20 20 20 20 20 20 41 20 73  *   b:       A s
c440: 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d  orted, null-term
c450: 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69  inated linked li
c460: 73 74 2e 20 20 28 4d 61 79 20 62 65 20 6e 75 6c  st.  (May be nul
c470: 6c 29 2e 0a 2a 2a 20 20 20 63 6d 70 3a 20 20 20  l)..**   cmp:   
c480: 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74    A pointer to t
c490: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  he comparison fu
c4a0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 20 20 6f 66 66  nction..**   off
c4b0: 73 65 74 3a 20 20 4f 66 66 73 65 74 20 69 6e 20  set:  Offset in 
c4c0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 74 6f  the structure to
c4d0: 20 74 68 65 20 22 6e 65 78 74 22 20 66 69 65 6c   the "next" fiel
c4e0: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
c4f0: 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41 20 70 6f  Value:.**   A po
c500: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
c510: 64 20 6f 66 20 61 20 73 6f 72 74 65 64 20 6c 69  d of a sorted li
c520: 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  st containing th
c530: 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20 20  e elements.**   
c540: 6f 66 20 62 6f 74 68 20 61 20 61 6e 64 20 62 2e  of both a and b.
c550: 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66 66 65  .**.** Side effe
c560: 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20 22 6e  cts:.**   The "n
c570: 65 78 74 22 20 70 6f 69 6e 74 65 72 73 20 66 6f  ext" pointers fo
c580: 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  r elements in th
c590: 65 20 6c 69 73 74 73 20 61 20 61 6e 64 20 62 20  e lists a and b 
c5a0: 61 72 65 0a 2a 2a 20 20 20 63 68 61 6e 67 65 64  are.**   changed
c5b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
c5c0: 20 2a 6d 65 72 67 65 28 0a 20 20 63 68 61 72 20   *merge(.  char 
c5d0: 2a 61 2c 0a 20 20 63 68 61 72 20 2a 62 2c 0a 20  *a,.  char *b,. 
c5e0: 20 69 6e 74 20 28 2a 63 6d 70 29 28 63 6f 6e 73   int (*cmp)(cons
c5f0: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
c600: 61 72 2a 29 2c 0a 20 20 69 6e 74 20 6f 66 66 73  ar*),.  int offs
c610: 65 74 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 74  et.){.  char *pt
c620: 72 2c 20 2a 68 65 61 64 3b 0a 0a 20 20 69 66 28  r, *head;..  if(
c630: 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 68 65 61   a==0 ){.    hea
c640: 64 20 3d 20 62 3b 0a 20 20 7d 65 6c 73 65 20 69  d = b;.  }else i
c650: 66 28 20 62 3d 3d 30 20 29 7b 0a 20 20 20 20 68  f( b==0 ){.    h
c660: 65 61 64 20 3d 20 61 3b 0a 20 20 7d 65 6c 73 65  ead = a;.  }else
c670: 7b 0a 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29  {.    if( (*cmp)
c680: 28 61 2c 62 29 3c 30 20 29 7b 0a 20 20 20 20 20  (a,b)<0 ){.     
c690: 20 70 74 72 20 3d 20 61 3b 0a 20 20 20 20 20 20   ptr = a;.      
c6a0: 61 20 3d 20 4e 45 58 54 28 61 29 3b 0a 20 20 20  a = NEXT(a);.   
c6b0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 74   }else{.      pt
c6c0: 72 20 3d 20 62 3b 0a 20 20 20 20 20 20 62 20 3d  r = b;.      b =
c6d0: 20 4e 45 58 54 28 62 29 3b 0a 20 20 20 20 7d 0a   NEXT(b);.    }.
c6e0: 20 20 20 20 68 65 61 64 20 3d 20 70 74 72 3b 0a      head = ptr;.
c6f0: 20 20 20 20 77 68 69 6c 65 28 20 61 20 26 26 20      while( a && 
c700: 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  b ){.      if( (
c710: 2a 63 6d 70 29 28 61 2c 62 29 3c 30 20 29 7b 0a  *cmp)(a,b)<0 ){.
c720: 20 20 20 20 20 20 20 20 4e 45 58 54 28 70 74 72          NEXT(ptr
c730: 29 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 70  ) = a;.        p
c740: 74 72 20 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  tr = a;.        
c750: 61 20 3d 20 4e 45 58 54 28 61 29 3b 0a 20 20 20  a = NEXT(a);.   
c760: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c770: 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 62 3b    NEXT(ptr) = b;
c780: 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d 20 62  .        ptr = b
c790: 3b 0a 20 20 20 20 20 20 20 20 62 20 3d 20 4e 45  ;.        b = NE
c7a0: 58 54 28 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  XT(b);.      }. 
c7b0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61 20 29     }.    if( a )
c7c0: 20 4e 45 58 54 28 70 74 72 29 20 3d 20 61 3b 0a   NEXT(ptr) = a;.
c7d0: 20 20 20 20 65 6c 73 65 20 20 20 20 4e 45 58 54      else    NEXT
c7e0: 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 7d 0a 20  (ptr) = b;.  }. 
c7f0: 20 72 65 74 75 72 6e 20 68 65 61 64 3b 0a 7d 0a   return head;.}.
c800: 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a  ./*.** Inputs:.*
c810: 2a 20 20 20 6c 69 73 74 3a 20 20 20 20 20 20 50  *   list:      P
c820: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69 6e 67  ointer to a sing
c830: 6c 79 2d 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  ly-linked list o
c840: 66 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2a  f structures..**
c850: 20 20 20 6e 65 78 74 3a 20 20 20 20 20 20 50 6f     next:      Po
c860: 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 65 72  inter to pointer
c870: 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64 20 65   to the second e
c880: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 6c 69  lement of the li
c890: 73 74 2e 0a 2a 2a 20 20 20 63 6d 70 3a 20 20 20  st..**   cmp:   
c8a0: 20 20 20 20 41 20 63 6f 6d 70 61 72 69 73 6f 6e      A comparison
c8b0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
c8c0: 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a   Return Value:.*
c8d0: 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  *   A pointer to
c8e0: 20 74 68 65 20 68 65 61 64 20 6f 66 20 61 20 73   the head of a s
c8f0: 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e 74 61  orted list conta
c900: 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e  ining the elemen
c910: 74 73 0a 2a 2a 20 20 20 6f 72 67 69 6e 61 6c 6c  ts.**   orginall
c920: 79 20 69 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  y in list..**.**
c930: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 2a   Side effects:.*
c940: 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22 20 70  *   The "next" p
c950: 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65 6d  ointers for elem
c960: 65 6e 74 73 20 69 6e 20 6c 69 73 74 20 61 72 65  ents in list are
c970: 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23 64 65   changed..*/.#de
c980: 66 69 6e 65 20 4c 49 53 54 53 49 5a 45 20 33 30  fine LISTSIZE 30
c990: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6d 73  .static char *ms
c9a0: 6f 72 74 28 0a 20 20 63 68 61 72 20 2a 6c 69 73  ort(.  char *lis
c9b0: 74 2c 0a 20 20 63 68 61 72 20 2a 2a 6e 65 78 74  t,.  char **next
c9c0: 2c 0a 20 20 69 6e 74 20 28 2a 63 6d 70 29 28 63  ,.  int (*cmp)(c
c9d0: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
c9e0: 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20 75 6e 73   char*).){.  uns
c9f0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 66 66 73 65  igned long offse
ca00: 74 3b 0a 20 20 63 68 61 72 20 2a 65 70 3b 0a 20  t;.  char *ep;. 
ca10: 20 63 68 61 72 20 2a 73 65 74 5b 4c 49 53 54 53   char *set[LISTS
ca20: 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  IZE];.  int i;. 
ca30: 20 6f 66 66 73 65 74 20 3d 20 28 75 6e 73 69 67   offset = (unsig
ca40: 6e 65 64 20 6c 6f 6e 67 29 6e 65 78 74 20 2d 20  ned long)next - 
ca50: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 6c  (unsigned long)l
ca60: 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ist;.  for(i=0; 
ca70: 69 3c 4c 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29  i<LISTSIZE; i++)
ca80: 20 73 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 77   set[i] = 0;.  w
ca90: 68 69 6c 65 28 20 6c 69 73 74 20 29 7b 0a 20 20  hile( list ){.  
caa0: 20 20 65 70 20 3d 20 6c 69 73 74 3b 0a 20 20 20    ep = list;.   
cab0: 20 6c 69 73 74 20 3d 20 4e 45 58 54 28 6c 69 73   list = NEXT(lis
cac0: 74 29 3b 0a 20 20 20 20 4e 45 58 54 28 65 70 29  t);.    NEXT(ep)
cad0: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
cae0: 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 2d 31 20  0; i<LISTSIZE-1 
caf0: 26 26 20 73 65 74 5b 69 5d 21 3d 30 3b 20 69 2b  && set[i]!=0; i+
cb00: 2b 29 7b 0a 20 20 20 20 20 20 65 70 20 3d 20 6d  +){.      ep = m
cb10: 65 72 67 65 28 65 70 2c 73 65 74 5b 69 5d 2c 63  erge(ep,set[i],c
cb20: 6d 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  mp,offset);.    
cb30: 20 20 73 65 74 5b 69 5d 20 3d 20 30 3b 0a 20 20    set[i] = 0;.  
cb40: 20 20 7d 0a 20 20 20 20 73 65 74 5b 69 5d 20 3d    }.    set[i] =
cb50: 20 65 70 3b 0a 20 20 7d 0a 20 20 65 70 20 3d 20   ep;.  }.  ep = 
cb60: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
cb70: 4c 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 69  LISTSIZE; i++) i
cb80: 66 28 20 73 65 74 5b 69 5d 20 29 20 65 70 20 3d  f( set[i] ) ep =
cb90: 20 6d 65 72 67 65 28 65 70 2c 73 65 74 5b 69 5d   merge(ep,set[i]
cba0: 2c 63 6d 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20  ,cmp,offset);.  
cbb0: 72 65 74 75 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a  return ep;.}./**
cbc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cbd0: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
cbe0: 66 69 6c 65 20 22 6f 70 74 69 6f 6e 2e 63 22 20  file "option.c" 
cbf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cc00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74  **********/.stat
cc10: 69 63 20 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a  ic char **argv;.
cc20: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f  static struct s_
cc30: 6f 70 74 69 6f 6e 73 20 2a 6f 70 3b 0a 73 74 61  options *op;.sta
cc40: 74 69 63 20 46 49 4c 45 20 2a 65 72 72 73 74 72  tic FILE *errstr
cc50: 65 61 6d 3b 0a 0a 23 64 65 66 69 6e 65 20 49 53  eam;..#define IS
cc60: 4f 50 54 28 58 29 20 28 28 58 29 5b 30 5d 3d 3d  OPT(X) ((X)[0]==
cc70: 27 2d 27 7c 7c 28 58 29 5b 30 5d 3d 3d 27 2b 27  '-'||(X)[0]=='+'
cc80: 7c 7c 73 74 72 63 68 72 28 28 58 29 2c 27 3d 27  ||strchr((X),'='
cc90: 29 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  )!=0)../*.** Pri
cca0: 6e 74 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  nt the command l
ccb0: 69 6e 65 20 77 69 74 68 20 61 20 63 61 72 72 6f  ine with a carro
ccc0: 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  t pointing to th
ccd0: 65 20 6b 2d 74 68 20 63 68 61 72 61 63 74 65 72  e k-th character
cce0: 0a 2a 2a 20 6f 66 20 74 68 65 20 6e 2d 74 68 20  .** of the n-th 
ccf0: 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  field..*/.static
cd00: 20 76 6f 69 64 20 65 72 72 6c 69 6e 65 28 6e 2c   void errline(n,
cd10: 6b 2c 65 72 72 29 0a 69 6e 74 20 6e 3b 0a 69 6e  k,err).int n;.in
cd20: 74 20 6b 3b 0a 46 49 4c 45 20 2a 65 72 72 3b 0a  t k;.FILE *err;.
cd30: 7b 0a 20 20 69 6e 74 20 73 70 63 6e 74 2c 20 69  {.  int spcnt, i
cd40: 3b 0a 20 20 69 66 28 20 61 72 67 76 5b 30 5d 20  ;.  if( argv[0] 
cd50: 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25  ) fprintf(err,"%
cd60: 73 22 2c 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73  s",argv[0]);.  s
cd70: 70 63 6e 74 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c  pcnt = lemonStrl
cd80: 65 6e 28 61 72 67 76 5b 30 5d 29 20 2b 20 31 3b  en(argv[0]) + 1;
cd90: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20  .  for(i=1; i<n 
cda0: 26 26 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29  && argv[i]; i++)
cdb0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72  {.    fprintf(er
cdc0: 72 2c 22 20 25 73 22 2c 61 72 67 76 5b 69 5d 29  r," %s",argv[i])
cdd0: 3b 0a 20 20 20 20 73 70 63 6e 74 20 2b 3d 20 6c  ;.    spcnt += l
cde0: 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67 76 5b  emonStrlen(argv[
cdf0: 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20 20 73 70 63  i])+1;.  }.  spc
ce00: 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66 6f 72 28 3b  nt += k;.  for(;
ce10: 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 20 66   argv[i]; i++) f
ce20: 70 72 69 6e 74 66 28 65 72 72 2c 22 20 25 73 22  printf(err," %s"
ce30: 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20 69 66 28  ,argv[i]);.  if(
ce40: 20 73 70 63 6e 74 3c 32 30 20 29 7b 0a 20 20 20   spcnt<20 ){.   
ce50: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e   fprintf(err,"\n
ce60: 25 2a 73 5e 2d 2d 20 68 65 72 65 5c 6e 22 2c 73  %*s^-- here\n",s
ce70: 70 63 6e 74 2c 22 22 29 3b 0a 20 20 7d 65 6c 73  pcnt,"");.  }els
ce80: 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65  e{.    fprintf(e
ce90: 72 72 2c 22 5c 6e 25 2a 73 68 65 72 65 20 2d 2d  rr,"\n%*shere --
cea0: 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37 2c 22 22 29  ^\n",spcnt-7,"")
ceb0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
cec0: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
ced0: 6f 66 20 74 68 65 20 4e 2d 74 68 20 6e 6f 6e 2d  of the N-th non-
cee0: 73 77 69 74 63 68 20 61 72 67 75 6d 65 6e 74 2e  switch argument.
cef0: 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69    Return -1.** i
cf00: 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f N is out of ra
cf10: 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nge..*/.static i
cf20: 6e 74 20 61 72 67 69 6e 64 65 78 28 6e 29 0a 69  nt argindex(n).i
cf30: 6e 74 20 6e 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b  nt n;.{.  int i;
cf40: 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73 68 20  .  int dashdash 
cf50: 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 76 21  = 0;.  if( argv!
cf60: 3d 30 20 26 26 20 2a 61 72 67 76 21 3d 30 20 29  =0 && *argv!=0 )
cf70: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61  {.    for(i=1; a
cf80: 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  rgv[i]; i++){.  
cf90: 20 20 20 20 69 66 28 20 64 61 73 68 64 61 73 68      if( dashdash
cfa0: 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b   || !ISOPT(argv[
cfb0: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i]) ){.        i
cfc0: 66 28 20 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( n==0 ) return
cfd0: 20 69 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b   i;.        n--;
cfe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
cff0: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69  f( strcmp(argv[i
d000: 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73  ],"--")==0 ) das
d010: 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d  hdash = 1;.    }
d020: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31  .  }.  return -1
d030: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72  ;.}..static char
d040: 20 65 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61   emsg[] = "Comma
d050: 6e 64 20 6c 69 6e 65 20 73 79 6e 74 61 78 20 65  nd line syntax e
d060: 72 72 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20  rror: ";../*.** 
d070: 50 72 6f 63 65 73 73 20 61 20 66 6c 61 67 20 63  Process a flag c
d080: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67 75  ommand line argu
d090: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
d0a0: 69 6e 74 20 68 61 6e 64 6c 65 66 6c 61 67 73 28  int handleflags(
d0b0: 69 2c 65 72 72 29 0a 69 6e 74 20 69 3b 0a 46 49  i,err).int i;.FI
d0c0: 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74  LE *err;.{.  int
d0d0: 20 76 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74   v;.  int errcnt
d0e0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20   = 0;.  int j;. 
d0f0: 20 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e   for(j=0; op[j].
d100: 6c 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  label; j++){.   
d110: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 26 61 72   if( strncmp(&ar
d120: 67 76 5b 69 5d 5b 31 5d 2c 6f 70 5b 6a 5d 2e 6c  gv[i][1],op[j].l
d130: 61 62 65 6c 2c 6c 65 6d 6f 6e 53 74 72 6c 65 6e  abel,lemonStrlen
d140: 28 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 29 3d 3d  (op[j].label))==
d150: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  0 ) break;.  }. 
d160: 20 76 20 3d 20 61 72 67 76 5b 69 5d 5b 30 5d 3d   v = argv[i][0]=
d170: 3d 27 2d 27 20 3f 20 31 20 3a 20 30 3b 0a 20 20  ='-' ? 1 : 0;.  
d180: 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d  if( op[j].label=
d190: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72  =0 ){.    if( er
d1a0: 72 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  r ){.      fprin
d1b0: 74 66 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69  tf(err,"%sundefi
d1c0: 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65  ned option.\n",e
d1d0: 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c  msg);.      errl
d1e0: 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b 0a 20 20  ine(i,1,err);.  
d1f0: 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b    }.    errcnt++
d200: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
d210: 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 4c  [j].type==OPT_FL
d220: 41 47 20 29 7b 0a 20 20 20 20 2a 28 28 69 6e 74  AG ){.    *((int
d230: 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 76  *)op[j].arg) = v
d240: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
d250: 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 46  [j].type==OPT_FF
d260: 4c 41 47 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f  LAG ){.    (*(vo
d270: 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61  id(*)())(op[j].a
d280: 72 67 29 29 28 76 29 3b 0a 20 20 7d 65 6c 73 65  rg))(v);.  }else
d290: 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d   if( op[j].type=
d2a0: 3d 4f 50 54 5f 46 53 54 52 20 29 7b 0a 20 20 20  =OPT_FSTR ){.   
d2b0: 20 28 2a 28 76 6f 69 64 28 2a 29 28 29 29 28 6f   (*(void(*)())(o
d2c0: 70 5b 6a 5d 2e 61 72 67 29 29 28 26 61 72 67 76  p[j].arg))(&argv
d2d0: 5b 69 5d 5b 32 5d 29 3b 0a 20 20 7d 65 6c 73 65  [i][2]);.  }else
d2e0: 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20 29 7b  {.    if( err ){
d2f0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65  .      fprintf(e
d300: 72 72 2c 22 25 73 6d 69 73 73 69 6e 67 20 61 72  rr,"%smissing ar
d310: 67 75 6d 65 6e 74 20 6f 6e 20 73 77 69 74 63 68  gument on switch
d320: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
d330: 20 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72    errline(i,1,er
d340: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72  r);.    }.    er
d350: 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  rcnt++;.  }.  re
d360: 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a  turn errcnt;.}..
d370: 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20  /*.** Process a 
d380: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 73 77 69  command line swi
d390: 74 63 68 20 77 68 69 63 68 20 68 61 73 20 61 6e  tch which has an
d3a0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
d3b0: 61 74 69 63 20 69 6e 74 20 68 61 6e 64 6c 65 73  atic int handles
d3c0: 77 69 74 63 68 28 69 2c 65 72 72 29 0a 69 6e 74  witch(i,err).int
d3d0: 20 69 3b 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b   i;.FILE *err;.{
d3e0: 0a 20 20 69 6e 74 20 6c 76 20 3d 20 30 3b 0a 20  .  int lv = 0;. 
d3f0: 20 64 6f 75 62 6c 65 20 64 76 20 3d 20 30 2e 30   double dv = 0.0
d400: 3b 0a 20 20 63 68 61 72 20 2a 73 76 20 3d 20 30  ;.  char *sv = 0
d410: 2c 20 2a 65 6e 64 3b 0a 20 20 63 68 61 72 20 2a  , *end;.  char *
d420: 63 70 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69  cp;.  int j;.  i
d430: 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20  nt errcnt = 0;. 
d440: 20 63 70 20 3d 20 73 74 72 63 68 72 28 61 72 67   cp = strchr(arg
d450: 76 5b 69 5d 2c 27 3d 27 29 3b 0a 20 20 61 73 73  v[i],'=');.  ass
d460: 65 72 74 28 20 63 70 21 3d 30 20 29 3b 0a 20 20  ert( cp!=0 );.  
d470: 2a 63 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6a  *cp = 0;.  for(j
d480: 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b  =0; op[j].label;
d490: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   j++){.    if( s
d4a0: 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 6f 70  trcmp(argv[i],op
d4b0: 5b 6a 5d 2e 6c 61 62 65 6c 29 3d 3d 30 20 29 20  [j].label)==0 ) 
d4c0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 2a 63 70  break;.  }.  *cp
d4d0: 20 3d 20 27 3d 27 3b 0a 20 20 69 66 28 20 6f 70   = '=';.  if( op
d4e0: 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a  [j].label==0 ){.
d4f0: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
d500: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
d510: 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20 6f 70  ,"%sundefined op
d520: 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  tion.\n",emsg);.
d530: 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c        errline(i,
d540: 30 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20  0,err);.    }.  
d550: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65    errcnt++;.  }e
d560: 6c 73 65 7b 0a 20 20 20 20 63 70 2b 2b 3b 0a 20  lse{.    cp++;. 
d570: 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a 5d     switch( op[j]
d580: 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63  .type ){.      c
d590: 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20  ase OPT_FLAG:.  
d5a0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c      case OPT_FFL
d5b0: 41 47 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20  AG:.        if( 
d5c0: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  err ){.         
d5d0: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
d5e0: 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
d5f0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c  an argument.\n",
d600: 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  emsg);.         
d610: 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72   errline(i,0,err
d620: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d630: 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20       errcnt++;. 
d640: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d650: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c      case OPT_DBL
d660: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
d670: 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 64  _FDBL:.        d
d680: 76 20 3d 20 73 74 72 74 6f 64 28 63 70 2c 26 65  v = strtod(cp,&e
d690: 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nd);.        if(
d6a0: 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20   *end ){.       
d6b0: 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20     if( err ){.  
d6c0: 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
d6d0: 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c  f(err,"%sillegal
d6e0: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 66 6c   character in fl
d6f0: 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 61 72 67  oating-point arg
d700: 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b  ument.\n",emsg);
d710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72  .            err
d720: 6c 69 6e 65 28 69 2c 28 28 75 6e 73 69 67 6e 65  line(i,((unsigne
d730: 64 20 6c 6f 6e 67 29 65 6e 64 29 2d 28 75 6e 73  d long)end)-(uns
d740: 69 67 6e 65 64 20 6c 6f 6e 67 29 61 72 67 76 5b  igned long)argv[
d750: 69 5d 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20  i],err);.       
d760: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65     }.          e
d770: 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  rrcnt++;.       
d780: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
d790: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
d7a0: 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65  _INT:.      case
d7b0: 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20   OPT_FINT:.     
d7c0: 20 20 20 6c 76 20 3d 20 73 74 72 74 6f 6c 28 63     lv = strtol(c
d7d0: 70 2c 26 65 6e 64 2c 30 29 3b 0a 20 20 20 20 20  p,&end,0);.     
d7e0: 20 20 20 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20     if( *end ){. 
d7f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72 72           if( err
d800: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d810: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 69  fprintf(err,"%si
d820: 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72  llegal character
d830: 20 69 6e 20 69 6e 74 65 67 65 72 20 61 72 67 75   in integer argu
d840: 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a  ment.\n",emsg);.
d850: 20 20 20 20 20 20 20 20 20 20 20 20 65 72 72 6c              errl
d860: 69 6e 65 28 69 2c 28 28 75 6e 73 69 67 6e 65 64  ine(i,((unsigned
d870: 20 6c 6f 6e 67 29 65 6e 64 29 2d 28 75 6e 73 69   long)end)-(unsi
d880: 67 6e 65 64 20 6c 6f 6e 67 29 61 72 67 76 5b 69  gned long)argv[i
d890: 5d 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20  ],err);.        
d8a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65 72    }.          er
d8b0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
d8c0: 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
d8d0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
d8e0: 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20  STR:.      case 
d8f0: 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20  OPT_FSTR:.      
d900: 20 20 73 76 20 3d 20 63 70 3b 0a 20 20 20 20 20    sv = cp;.     
d910: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d920: 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b 6a      switch( op[j
d930: 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  ].type ){.      
d940: 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20  case OPT_FLAG:. 
d950: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 46       case OPT_FF
d960: 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72 65  LAG:.        bre
d970: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
d980: 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 20 20  PT_DBL:.        
d990: 2a 28 64 6f 75 62 6c 65 2a 29 28 6f 70 5b 6a 5d  *(double*)(op[j]
d9a0: 2e 61 72 67 29 20 3d 20 64 76 3b 0a 20 20 20 20  .arg) = dv;.    
d9b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d9c0: 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a   case OPT_FDBL:.
d9d0: 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28          (*(void(
d9e0: 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  *)())(op[j].arg)
d9f0: 29 28 64 76 29 3b 0a 20 20 20 20 20 20 20 20 62  )(dv);.        b
da00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
da10: 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20   OPT_INT:.      
da20: 20 20 2a 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d 2e    *(int*)(op[j].
da30: 61 72 67 29 20 3d 20 6c 76 3b 0a 20 20 20 20 20  arg) = lv;.     
da40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
da50: 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20  case OPT_FINT:. 
da60: 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a         (*(void(*
da70: 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29  )())(op[j].arg))
da80: 28 28 69 6e 74 29 6c 76 29 3b 0a 20 20 20 20 20  ((int)lv);.     
da90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
daa0: 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20  case OPT_STR:.  
dab0: 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 28        *(char**)(
dac0: 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 73 76 3b  op[j].arg) = sv;
dad0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
dae0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
daf0: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 28 2a 28  STR:.        (*(
db00: 76 6f 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d  void(*)())(op[j]
db10: 2e 61 72 67 29 29 28 73 76 29 3b 0a 20 20 20 20  .arg))(sv);.    
db20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
db30: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72  .  }.  return er
db40: 72 63 6e 74 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74  rcnt;.}..int Opt
db50: 49 6e 69 74 28 61 2c 6f 2c 65 72 72 29 0a 63 68  Init(a,o,err).ch
db60: 61 72 20 2a 2a 61 3b 0a 73 74 72 75 63 74 20 73  ar **a;.struct s
db70: 5f 6f 70 74 69 6f 6e 73 20 2a 6f 3b 0a 46 49 4c  _options *o;.FIL
db80: 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20  E *err;.{.  int 
db90: 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61 72  errcnt = 0;.  ar
dba0: 67 76 20 3d 20 61 3b 0a 20 20 6f 70 20 3d 20 6f  gv = a;.  op = o
dbb0: 3b 0a 20 20 65 72 72 73 74 72 65 61 6d 20 3d 20  ;.  errstream = 
dbc0: 65 72 72 3b 0a 20 20 69 66 28 20 61 72 67 76 20  err;.  if( argv 
dbd0: 26 26 20 2a 61 72 67 76 20 26 26 20 6f 70 20 29  && *argv && op )
dbe0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
dbf0: 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69   for(i=1; argv[i
dc00: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
dc10: 66 28 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27  f( argv[i][0]=='
dc20: 2b 27 20 7c 7c 20 61 72 67 76 5b 69 5d 5b 30 5d  +' || argv[i][0]
dc30: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
dc40: 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c   errcnt += handl
dc50: 65 66 6c 61 67 73 28 69 2c 65 72 72 29 3b 0a 20  eflags(i,err);. 
dc60: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
dc70: 74 72 63 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d  trchr(argv[i],'=
dc80: 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72  ') ){.        er
dc90: 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 73 77  rcnt += handlesw
dca0: 69 74 63 68 28 69 2c 65 72 72 29 3b 0a 20 20 20  itch(i,err);.   
dcb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
dcc0: 20 69 66 28 20 65 72 72 63 6e 74 3e 30 20 29 7b   if( errcnt>0 ){
dcd0: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72  .    fprintf(err
dce0: 2c 22 56 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 20  ,"Valid command 
dcf0: 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72  line options for
dd00: 20 5c 22 25 73 5c 22 20 61 72 65 3a 5c 6e 22 2c   \"%s\" are:\n",
dd10: 2a 61 29 3b 0a 20 20 20 20 4f 70 74 50 72 69 6e  *a);.    OptPrin
dd20: 74 28 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  t();.    exit(1)
dd30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
dd40: 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 4e 41 72 67  ;.}..int OptNArg
dd50: 73 28 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d  s(){.  int cnt =
dd60: 20 30 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61   0;.  int dashda
dd70: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
dd80: 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30 20 26  .  if( argv!=0 &
dd90: 26 20 61 72 67 76 5b 30 5d 21 3d 30 20 29 7b 0a  & argv[0]!=0 ){.
dda0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67      for(i=1; arg
ddb0: 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  v[i]; i++){.    
ddc0: 20 20 69 66 28 20 64 61 73 68 64 61 73 68 20 7c    if( dashdash |
ddd0: 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d  | !ISOPT(argv[i]
dde0: 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  ) ) cnt++;.     
ddf0: 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
de00: 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64  [i],"--")==0 ) d
de10: 61 73 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20  ashdash = 1;.   
de20: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
de30: 63 6e 74 3b 0a 7d 0a 0a 63 68 61 72 20 2a 4f 70  cnt;.}..char *Op
de40: 74 41 72 67 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b  tArg(n).int n;.{
de50: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20  .  int i;.  i = 
de60: 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 72  argindex(n);.  r
de70: 65 74 75 72 6e 20 69 3e 3d 30 20 3f 20 61 72 67  eturn i>=0 ? arg
de80: 76 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a 76 6f 69  v[i] : 0;.}..voi
de90: 64 20 4f 70 74 45 72 72 28 6e 29 0a 69 6e 74 20  d OptErr(n).int 
dea0: 6e 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  n;.{.  int i;.  
deb0: 69 20 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b  i = argindex(n);
dec0: 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20 65 72  .  if( i>=0 ) er
ded0: 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 73 74 72  rline(i,0,errstr
dee0: 65 61 6d 29 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70  eam);.}..void Op
def0: 74 50 72 69 6e 74 28 29 7b 0a 20 20 69 6e 74 20  tPrint(){.  int 
df00: 69 3b 0a 20 20 69 6e 74 20 6d 61 78 2c 20 6c 65  i;.  int max, le
df10: 6e 3b 0a 20 20 6d 61 78 20 3d 20 30 3b 0a 20 20  n;.  max = 0;.  
df20: 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c  for(i=0; op[i].l
df30: 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  abel; i++){.    
df40: 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  len = lemonStrle
df50: 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 20 2b  n(op[i].label) +
df60: 20 31 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20   1;.    switch( 
df70: 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20  op[i].type ){.  
df80: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41      case OPT_FLA
df90: 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  G:.      case OP
dfa0: 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20  T_FFLAG:.       
dfb0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
dfc0: 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20  se OPT_INT:.    
dfd0: 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a    case OPT_FINT:
dfe0: 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20  .        len += 
dff0: 39 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67  9;       /* leng
e000: 74 68 20 6f 66 20 22 3c 69 6e 74 65 67 65 72 3e  th of "<integer>
e010: 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65  " */.        bre
e020: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
e030: 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61  PT_DBL:.      ca
e040: 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20  se OPT_FDBL:.   
e050: 20 20 20 20 20 6c 65 6e 20 2b 3d 20 36 3b 20 20       len += 6;  
e060: 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f       /* length o
e070: 66 20 22 3c 72 65 61 6c 3e 22 20 2a 2f 0a 20 20  f "<real>" */.  
e080: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e090: 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a     case OPT_STR:
e0a0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
e0b0: 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 6c 65  FSTR:.        le
e0c0: 6e 20 2b 3d 20 38 3b 20 20 20 20 20 20 20 2f 2a  n += 8;       /*
e0d0: 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 73 74 72   length of "<str
e0e0: 69 6e 67 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20  ing>" */.       
e0f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e100: 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 20 29 20    if( len>max ) 
e110: 6d 61 78 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20  max = len;.  }. 
e120: 20 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e   for(i=0; op[i].
e130: 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  label; i++){.   
e140: 20 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74   switch( op[i].t
e150: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ype ){.      cas
e160: 65 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20  e OPT_FLAG:.    
e170: 20 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47    case OPT_FFLAG
e180: 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  :.        fprint
e190: 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d  f(errstream,"  -
e1a0: 25 2d 2a 73 20 20 25 73 5c 6e 22 2c 6d 61 78 2c  %-*s  %s\n",max,
e1b0: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 6f 70 5b 69  op[i].label,op[i
e1c0: 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20  ].message);.    
e1d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e1e0: 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20   case OPT_INT:. 
e1f0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49       case OPT_FI
e200: 4e 54 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69  NT:.        fpri
e210: 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20  ntf(errstream," 
e220: 20 25 73 3d 3c 69 6e 74 65 67 65 72 3e 25 2a 73   %s=<integer>%*s
e230: 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61    %s\n",op[i].la
e240: 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28  bel,.          (
e250: 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74  int)(max-lemonSt
e260: 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c  rlen(op[i].label
e270: 29 2d 39 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65  )-9),"",op[i].me
e280: 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  ssage);.        
e290: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
e2a0: 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20  e OPT_DBL:.     
e2b0: 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a   case OPT_FDBL:.
e2c0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
e2d0: 65 72 72 73 74 72 65 61 6d 2c 22 20 20 25 73 3d  errstream,"  %s=
e2e0: 3c 72 65 61 6c 3e 25 2a 73 20 20 25 73 5c 6e 22  <real>%*s  %s\n"
e2f0: 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20  ,op[i].label,.  
e300: 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61          (int)(ma
e310: 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70  x-lemonStrlen(op
e320: 5b 69 5d 2e 6c 61 62 65 6c 29 2d 36 29 2c 22 22  [i].label)-6),""
e330: 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b  ,op[i].message);
e340: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e350: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 53        case OPT_S
e360: 54 52 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  TR:.      case O
e370: 50 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20  PT_FSTR:.       
e380: 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65   fprintf(errstre
e390: 61 6d 2c 22 20 20 25 73 3d 3c 73 74 72 69 6e 67  am,"  %s=<string
e3a0: 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69  >%*s  %s\n",op[i
e3b0: 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20  ].label,.       
e3c0: 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d     (int)(max-lem
e3d0: 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c  onStrlen(op[i].l
e3e0: 61 62 65 6c 29 2d 38 29 2c 22 22 2c 6f 70 5b 69  abel)-8),"",op[i
e3f0: 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20  ].message);.    
e400: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e410: 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  .  }.}./********
e420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
e430: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70  From the file "p
e440: 61 72 73 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  arse.c" ********
e450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e460: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 70 75  ****/./*.** Inpu
e470: 74 20 66 69 6c 65 20 70 61 72 73 65 72 20 66 6f  t file parser fo
e480: 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  r the LEMON pars
e490: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
e4a0: 0a 0a 2f 2a 20 54 68 65 20 73 74 61 74 65 20 6f  ../* The state o
e4b0: 66 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a  f the parser */.
e4c0: 73 74 72 75 63 74 20 70 73 74 61 74 65 20 7b 0a  struct pstate {.
e4d0: 20 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65    char *filename
e4e0: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
e4f0: 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  of the input fil
e500: 65 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 6b 65 6e  e */.  int token
e510: 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 2f 2a 20  lineno;      /* 
e520: 4c 69 6e 65 6e 75 6d 62 65 72 20 61 74 20 77 68  Linenumber at wh
e530: 69 63 68 20 63 75 72 72 65 6e 74 20 74 6f 6b 65  ich current toke
e540: 6e 20 73 74 61 72 74 73 20 2a 2f 0a 20 20 69 6e  n starts */.  in
e550: 74 20 65 72 72 6f 72 63 6e 74 3b 20 20 20 20 20  t errorcnt;     
e560: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e570: 20 65 72 72 6f 72 73 20 73 6f 20 66 61 72 20 2a   errors so far *
e580: 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 73  /.  char *tokens
e590: 74 61 72 74 3b 20 20 20 20 20 2f 2a 20 54 65 78  tart;     /* Tex
e5a0: 74 20 6f 66 20 63 75 72 72 65 6e 74 20 74 6f 6b  t of current tok
e5b0: 65 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c  en */.  struct l
e5c0: 65 6d 6f 6e 20 2a 67 70 3b 20 20 20 20 20 2f 2a  emon *gp;     /*
e5d0: 20 47 6c 6f 62 61 6c 20 73 74 61 74 65 20 76 65   Global state ve
e5e0: 63 74 6f 72 20 2a 2f 0a 20 20 65 6e 75 6d 20 65  ctor */.  enum e
e5f0: 5f 73 74 61 74 65 20 7b 0a 20 20 20 20 49 4e 49  _state {.    INI
e600: 54 49 41 4c 49 5a 45 2c 0a 20 20 20 20 57 41 49  TIALIZE,.    WAI
e610: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
e620: 5f 52 55 4c 45 2c 0a 20 20 20 20 57 41 49 54 49  _RULE,.    WAITI
e630: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57  NG_FOR_DECL_KEYW
e640: 4f 52 44 2c 0a 20 20 20 20 57 41 49 54 49 4e 47  ORD,.    WAITING
e650: 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 2c 0a 20  _FOR_DECL_ARG,. 
e660: 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50     WAITING_FOR_P
e670: 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c  RECEDENCE_SYMBOL
e680: 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f  ,.    WAITING_FO
e690: 52 5f 41 52 52 4f 57 2c 0a 20 20 20 20 49 4e 5f  R_ARROW,.    IN_
e6a0: 52 48 53 2c 0a 20 20 20 20 4c 48 53 5f 41 4c 49  RHS,.    LHS_ALI
e6b0: 41 53 5f 31 2c 0a 20 20 20 20 4c 48 53 5f 41 4c  AS_1,.    LHS_AL
e6c0: 49 41 53 5f 32 2c 0a 20 20 20 20 4c 48 53 5f 41  IAS_2,.    LHS_A
e6d0: 4c 49 41 53 5f 33 2c 0a 20 20 20 20 52 48 53 5f  LIAS_3,.    RHS_
e6e0: 41 4c 49 41 53 5f 31 2c 0a 20 20 20 20 52 48 53  ALIAS_1,.    RHS
e6f0: 5f 41 4c 49 41 53 5f 32 2c 0a 20 20 20 20 50 52  _ALIAS_2,.    PR
e700: 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 2c  ECEDENCE_MARK_1,
e710: 0a 20 20 20 20 50 52 45 43 45 44 45 4e 43 45 5f  .    PRECEDENCE_
e720: 4d 41 52 4b 5f 32 2c 0a 20 20 20 20 52 45 53 59  MARK_2,.    RESY
e730: 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
e740: 52 4f 52 2c 0a 20 20 20 20 52 45 53 59 4e 43 5f  ROR,.    RESYNC_
e750: 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
e760: 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f  ,.    WAITING_FO
e770: 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d  R_DESTRUCTOR_SYM
e780: 42 4f 4c 2c 0a 20 20 20 20 57 41 49 54 49 4e 47  BOL,.    WAITING
e790: 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59  _FOR_DATATYPE_SY
e7a0: 4d 42 4f 4c 2c 0a 20 20 20 20 57 41 49 54 49 4e  MBOL,.    WAITIN
e7b0: 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49  G_FOR_FALLBACK_I
e7c0: 44 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46  D,.    WAITING_F
e7d0: 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 0a 20  OR_WILDCARD_ID. 
e7e0: 20 7d 20 73 74 61 74 65 3b 20 20 20 20 20 20 20   } state;       
e7f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e800: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
e810: 70 61 72 73 65 72 20 2a 2f 0a 20 20 73 74 72 75  parser */.  stru
e820: 63 74 20 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62  ct symbol *fallb
e830: 61 63 6b 3b 20 20 20 2f 2a 20 54 68 65 20 66 61  ack;   /* The fa
e840: 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20 2a 2f 0a  llback token */.
e850: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
e860: 2a 6c 68 73 3b 20 20 20 20 20 20 20 20 2f 2a 20  *lhs;        /* 
e870: 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f  Left-hand side o
e880: 66 20 63 75 72 72 65 6e 74 20 72 75 6c 65 20 2a  f current rule *
e890: 2f 0a 20 20 63 68 61 72 20 2a 6c 68 73 61 6c 69  /.  char *lhsali
e8a0: 61 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  as;            /
e8b0: 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20  * Alias for the 
e8c0: 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68  LHS */.  int nrh
e8d0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
e8e0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e8f0: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
e900: 20 73 79 6d 62 6f 6c 73 20 73 65 65 6e 20 2a 2f   symbols seen */
e910: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
e920: 20 2a 72 68 73 5b 4d 41 58 52 48 53 5d 3b 20 20   *rhs[MAXRHS];  
e930: 2f 2a 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a  /* RHS symbols *
e940: 2f 0a 20 20 63 68 61 72 20 2a 61 6c 69 61 73 5b  /.  char *alias[
e950: 4d 41 58 52 48 53 5d 3b 20 20 20 20 20 20 20 2f  MAXRHS];       /
e960: 2a 20 41 6c 69 61 73 65 73 20 66 6f 72 20 65 61  * Aliases for ea
e970: 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 6f  ch RHS symbol (o
e980: 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73 74 72  r NULL) */.  str
e990: 75 63 74 20 72 75 6c 65 20 2a 70 72 65 76 72 75  uct rule *prevru
e9a0: 6c 65 3b 20 20 20 20 20 2f 2a 20 50 72 65 76 69  le;     /* Previ
e9b0: 6f 75 73 20 72 75 6c 65 20 70 61 72 73 65 64 20  ous rule parsed 
e9c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 64 65 63 6c 6b  */.  char *declk
e9d0: 65 79 77 6f 72 64 3b 20 20 20 20 20 20 20 20 20  eyword;         
e9e0: 2f 2a 20 4b 65 79 77 6f 72 64 20 6f 66 20 61 20  /* Keyword of a 
e9f0: 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 20  declaration */. 
ea00: 20 63 68 61 72 20 2a 2a 64 65 63 6c 61 72 67 73   char **declargs
ea10: 6c 6f 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  lot;        /* W
ea20: 68 65 72 65 20 74 68 65 20 64 65 63 6c 61 72 61  here the declara
ea30: 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20 73 68  tion argument sh
ea40: 6f 75 6c 64 20 62 65 20 70 75 74 20 2a 2f 0a 20  ould be put */. 
ea50: 20 69 6e 74 20 69 6e 73 65 72 74 4c 69 6e 65 4d   int insertLineM
ea60: 61 63 72 6f 3b 20 20 20 20 20 20 20 2f 2a 20 41  acro;       /* A
ea70: 64 64 20 23 6c 69 6e 65 20 62 65 66 6f 72 65 20  dd #line before 
ea80: 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e 73 65  declaration inse
ea90: 72 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 64 65 63  rt */.  int *dec
eaa0: 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3b 20 20 20 20  llinenoslot;    
eab0: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77     /* Where to w
eac0: 72 69 74 65 20 64 65 63 6c 61 72 61 74 69 6f 6e  rite declaration
ead0: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
eae0: 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 64    enum e_assoc d
eaf0: 65 63 6c 61 73 73 6f 63 3b 20 20 20 20 2f 2a 20  eclassoc;    /* 
eb00: 41 73 73 69 67 6e 20 74 68 69 73 20 61 73 73 6f  Assign this asso
eb10: 63 69 61 74 69 6f 6e 20 74 6f 20 64 65 63 6c 20  ciation to decl 
eb20: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69  arguments */.  i
eb30: 6e 74 20 70 72 65 63 63 6f 75 6e 74 65 72 3b 20  nt preccounter; 
eb40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
eb50: 69 67 6e 20 74 68 69 73 20 70 72 65 63 65 64 65  ign this precede
eb60: 6e 63 65 20 74 6f 20 64 65 63 6c 20 61 72 67 75  nce to decl argu
eb70: 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75 63  ments */.  struc
eb80: 74 20 72 75 6c 65 20 2a 66 69 72 73 74 72 75 6c  t rule *firstrul
eb90: 65 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  e;    /* Pointer
eba0: 20 74 6f 20 66 69 72 73 74 20 72 75 6c 65 20 69   to first rule i
ebb0: 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f  n the grammar */
ebc0: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
ebd0: 6c 61 73 74 72 75 6c 65 3b 20 20 20 20 20 2f 2a  lastrule;     /*
ebe0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
ebf0: 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61  most recently pa
ec00: 72 73 65 64 20 72 75 6c 65 20 2a 2f 0a 7d 3b 0a  rsed rule */.};.
ec10: 0a 2f 2a 20 50 61 72 73 65 20 61 20 73 69 6e 67  ./* Parse a sing
ec20: 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73 74 61 74  le token */.stat
ec30: 69 63 20 76 6f 69 64 20 70 61 72 73 65 6f 6e 65  ic void parseone
ec40: 74 6f 6b 65 6e 28 70 73 70 29 0a 73 74 72 75 63  token(psp).struc
ec50: 74 20 70 73 74 61 74 65 20 2a 70 73 70 3b 0a 7b  t pstate *psp;.{
ec60: 0a 20 20 63 68 61 72 20 2a 78 3b 0a 20 20 78 20  .  char *x;.  x 
ec70: 3d 20 53 74 72 73 61 66 65 28 70 73 70 2d 3e 74  = Strsafe(psp->t
ec80: 6f 6b 65 6e 73 74 61 72 74 29 3b 20 20 20 20 20  okenstart);     
ec90: 2f 2a 20 53 61 76 65 20 74 68 65 20 74 6f 6b 65  /* Save the toke
eca0: 6e 20 70 65 72 6d 61 6e 65 6e 74 6c 79 20 2a 2f  n permanently */
ecb0: 0a 23 69 66 20 30 0a 20 20 70 72 69 6e 74 66 28  .#if 0.  printf(
ecc0: 22 25 73 3a 25 64 3a 20 54 6f 6b 65 6e 3d 5b 25  "%s:%d: Token=[%
ecd0: 73 5d 20 73 74 61 74 65 3d 25 64 5c 6e 22 2c 70  s] state=%d\n",p
ece0: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
ecf0: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
ed00: 20 20 20 78 2c 70 73 70 2d 3e 73 74 61 74 65 29     x,psp->state)
ed10: 3b 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63  ;.#endif.  switc
ed20: 68 28 20 70 73 70 2d 3e 73 74 61 74 65 20 29 7b  h( psp->state ){
ed30: 0a 20 20 20 20 63 61 73 65 20 49 4e 49 54 49 41  .    case INITIA
ed40: 4c 49 5a 45 3a 0a 20 20 20 20 20 20 70 73 70 2d  LIZE:.      psp-
ed50: 3e 70 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20  >prevrule = 0;. 
ed60: 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f       psp->precco
ed70: 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  unter = 0;.     
ed80: 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20   psp->firstrule 
ed90: 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20  = psp->lastrule 
eda0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e  = 0;.      psp->
edb0: 67 70 2d 3e 6e 72 75 6c 65 20 3d 20 30 3b 0a 20  gp->nrule = 0;. 
edc0: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
edd0: 75 20 74 6f 20 6e 65 78 74 20 63 61 73 65 20 2a  u to next case *
ede0: 2f 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  /.    case WAITI
edf0: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
ee00: 55 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20 78  ULE:.      if( x
ee10: 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20 20  [0]=='%' ){.    
ee20: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
ee30: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
ee40: 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20  L_KEYWORD;.     
ee50: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 6c 6f 77   }else if( islow
ee60: 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20  er(x[0]) ){.    
ee70: 20 20 20 20 70 73 70 2d 3e 6c 68 73 20 3d 20 53      psp->lhs = S
ee80: 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
ee90: 20 20 20 20 20 20 70 73 70 2d 3e 6e 72 68 73 20        psp->nrhs 
eea0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = 0;.        psp
eeb0: 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 30 3b 0a  ->lhsalias = 0;.
eec0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
eed0: 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
eee0: 5f 41 52 52 4f 57 3b 0a 20 20 20 20 20 20 7d 65  _ARROW;.      }e
eef0: 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b  lse if( x[0]=='{
ef00: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
ef10: 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d   psp->prevrule==
ef20: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
ef30: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
ef40: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
ef50: 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65 72 65 20 69  lineno,."There i
ef60: 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65 20  s no prior rule 
ef70: 6f 70 6f 6e 20 77 68 69 63 68 20 74 6f 20 61 74  opon which to at
ef80: 74 61 63 68 20 74 68 65 20 63 6f 64 65 20 5c 0a  tach the code \.
ef90: 66 72 61 67 6d 65 6e 74 20 77 68 69 63 68 20 62  fragment which b
efa0: 65 67 69 6e 73 20 6f 6e 20 74 68 69 73 20 6c 69  egins on this li
efb0: 6e 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ne.");.         
efc0: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
efd0: 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 70 73 70  ;..}else if( psp
efe0: 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64 65  ->prevrule->code
eff0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
f000: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
f010: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
f020: 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 6f 64 65 20  enlineno,."Code 
f030: 66 72 61 67 6d 65 6e 74 20 62 65 67 69 6e 6e 69  fragment beginni
f040: 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20  ng on this line 
f050: 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  is not the first
f060: 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65   \.to follow the
f070: 20 70 72 65 76 69 6f 75 73 20 72 75 6c 65 2e 22   previous rule."
f080: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
f090: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
f0a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f0b0: 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76         psp->prev
f0c0: 72 75 6c 65 2d 3e 6c 69 6e 65 20 3d 20 70 73 70  rule->line = psp
f0d0: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20  ->tokenlineno;. 
f0e0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
f0f0: 65 76 72 75 6c 65 2d 3e 63 6f 64 65 20 3d 20 26  evrule->code = &
f100: 78 5b 31 5d 3b 0a 09 7d 0a 20 20 20 20 20 20 7d  x[1];..}.      }
f110: 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27  else if( x[0]=='
f120: 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  [' ){.        ps
f130: 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43 45  p->state = PRECE
f140: 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3b 0a 20 20  DENCE_MARK_1;.  
f150: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f160: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
f170: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
f180: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
f190: 20 20 20 20 20 20 22 54 6f 6b 65 6e 20 5c 22 25        "Token \"%
f1a0: 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 65 69  s\" should be ei
f1b0: 74 68 65 72 20 5c 22 25 25 5c 22 20 6f 72 20 61  ther \"%%\" or a
f1c0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6e 61 6d   nonterminal nam
f1d0: 65 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78  e.",.          x
f1e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
f1f0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
f200: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
f210: 0a 20 20 20 20 63 61 73 65 20 50 52 45 43 45 44  .    case PRECED
f220: 45 4e 43 45 5f 4d 41 52 4b 5f 31 3a 0a 20 20 20  ENCE_MARK_1:.   
f230: 20 20 20 69 66 28 20 21 69 73 75 70 70 65 72 28     if( !isupper(
f240: 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
f250: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
f260: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
f270: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
f280: 20 20 20 20 22 54 68 65 20 70 72 65 63 65 64 65      "The precede
f290: 6e 63 65 20 73 79 6d 62 6f 6c 20 6d 75 73 74 20  nce symbol must 
f2a0: 62 65 20 61 20 74 65 72 6d 69 6e 61 6c 2e 22 29  be a terminal.")
f2b0: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
f2c0: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
f2d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e   }else if( psp->
f2e0: 70 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a 20  prevrule==0 ){. 
f2f0: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
f300: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
f310: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
f320: 20 20 20 20 20 20 20 20 20 20 22 54 68 65 72 65            "There
f330: 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c   is no prior rul
f340: 65 20 74 6f 20 61 73 73 69 67 6e 20 70 72 65 63  e to assign prec
f350: 65 64 65 6e 63 65 20 5c 22 5b 25 73 5d 5c 22 2e  edence \"[%s]\".
f360: 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ",x);.        ps
f370: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
f380: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
f390: 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72  sp->prevrule->pr
f3a0: 65 63 73 79 6d 21 3d 30 20 29 7b 0a 20 20 20 20  ecsym!=0 ){.    
f3b0: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
f3c0: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
f3d0: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 50 72  tokenlineno,."Pr
f3e0: 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 20 6f 6e  ecedence mark on
f3f0: 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f   this line is no
f400: 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f  t the first \.to
f410: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76   follow the prev
f420: 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20  ious rule.");.  
f430: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
f440: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  cnt++;.      }el
f450: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  se{.        psp-
f460: 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63 73  >prevrule->precs
f470: 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  ym = Symbol_new(
f480: 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
f490: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50    psp->state = P
f4a0: 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32  RECEDENCE_MARK_2
f4b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f4c0: 20 20 20 63 61 73 65 20 50 52 45 43 45 44 45 4e     case PRECEDEN
f4d0: 43 45 5f 4d 41 52 4b 5f 32 3a 0a 20 20 20 20 20  CE_MARK_2:.     
f4e0: 20 69 66 28 20 78 5b 30 5d 21 3d 27 5d 27 20 29   if( x[0]!=']' )
f4f0: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
f500: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
f510: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
f520: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69  o,.          "Mi
f530: 73 73 69 6e 67 20 5c 22 5d 5c 22 20 6f 6e 20 70  ssing \"]\" on p
f540: 72 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 2e 22  recedence mark."
f550: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
f560: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
f570: 20 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73    }.      psp->s
f580: 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
f590: 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
f5a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f5b0: 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
f5c0: 4f 52 5f 41 52 52 4f 57 3a 0a 20 20 20 20 20 20  OR_ARROW:.      
f5d0: 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26 26  if( x[0]==':' &&
f5e0: 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78 5b   x[1]==':' && x[
f5f0: 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20  2]=='=' ){.     
f600: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f610: 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65  IN_RHS;.      }e
f620: 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28  lse if( x[0]=='(
f630: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
f640: 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c  ->state = LHS_AL
f650: 49 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c  IAS_1;.      }el
f660: 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
f670: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
f680: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
f690: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
f6a0: 45 78 70 65 63 74 65 64 20 74 6f 20 73 65 65 20  Expected to see 
f6b0: 61 20 5c 22 3a 5c 22 20 66 6f 6c 6c 6f 77 69 6e  a \":\" followin
f6c0: 67 20 74 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c  g the LHS symbol
f6d0: 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20   \"%s\".",.     
f6e0: 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e       psp->lhs->n
f6f0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ame);.        ps
f700: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
f710: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
f720: 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
f730: 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20  _RULE_ERROR;.   
f740: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
f750: 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41  ;.    case LHS_A
f760: 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66  LIAS_1:.      if
f770: 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20  ( isalpha(x[0]) 
f780: 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
f790: 6c 68 73 61 6c 69 61 73 20 3d 20 78 3b 0a 20 20  lhsalias = x;.  
f7a0: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
f7b0: 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3b 0a   = LHS_ALIAS_2;.
f7c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f7d0: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
f7e0: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
f7f0: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
f800: 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20          "\"%s\" 
f810: 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61  is not a valid a
f820: 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53  lias for the LHS
f830: 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20   \"%s\"\n",.    
f840: 20 20 20 20 20 20 78 2c 70 73 70 2d 3e 6c 68 73        x,psp->lhs
f850: 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
f860: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
f870: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
f880: 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
f890: 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
f8a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
f8b0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48  eak;.    case LH
f8c0: 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20  S_ALIAS_2:.     
f8d0: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29   if( x[0]==')' )
f8e0: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
f8f0: 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53  tate = LHS_ALIAS
f900: 5f 33 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _3;.      }else{
f910: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
f920: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
f930: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
f940: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73  ,.          "Mis
f950: 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f  sing \")\" follo
f960: 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e  wing LHS alias n
f970: 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70  ame \"%s\".",psp
f980: 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->lhsalias);.   
f990: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
f9a0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
f9b0: 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
f9c0: 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
f9d0: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
f9e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
f9f0: 65 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3a 0a 20  e LHS_ALIAS_3:. 
fa00: 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
fa10: 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20  :' && x[1]==':' 
fa20: 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a  && x[2]=='=' ){.
fa30: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
fa40: 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20  te = IN_RHS;.   
fa50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fa60: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
fa70: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
fa80: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
fa90: 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22       "Missing \"
faa0: 2d 3e 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20  ->\" following: 
fab0: 5c 22 25 73 28 25 73 29 5c 22 2e 22 2c 0a 20 20  \"%s(%s)\".",.  
fac0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68           psp->lh
fad0: 73 2d 3e 6e 61 6d 65 2c 70 73 70 2d 3e 6c 68 73  s->name,psp->lhs
fae0: 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20  alias);.        
faf0: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
fb00: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
fb10: 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
fb20: 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20  ER_RULE_ERROR;. 
fb30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
fb40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 49 4e 5f  ak;.    case IN_
fb50: 52 48 53 3a 0a 20 20 20 20 20 20 69 66 28 20 78  RHS:.      if( x
fb60: 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]=='.' ){.    
fb70: 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65 20      struct rule 
fb80: 2a 72 70 3b 0a 20 20 20 20 20 20 20 20 72 70 20  *rp;.        rp 
fb90: 3d 20 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a  = (struct rule *
fba0: 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )calloc( sizeof(
fbb0: 73 74 72 75 63 74 20 72 75 6c 65 29 20 2b 20 0a  struct rule) + .
fbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
fbd0: 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
fbe0: 6c 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 20 2b 20  l*)*psp->nrhs + 
fbf0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 73  sizeof(char*)*ps
fc00: 70 2d 3e 6e 72 68 73 2c 20 31 29 3b 0a 20 20 20  p->nrhs, 1);.   
fc10: 20 20 20 20 20 69 66 28 20 72 70 3d 3d 30 20 29       if( rp==0 )
fc20: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
fc30: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
fc40: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
fc50: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
fc60: 20 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65   "Can't allocate
fc70: 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 66   enough memory f
fc80: 6f 72 20 74 68 69 73 20 72 75 6c 65 2e 22 29 3b  or this rule.");
fc90: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
fca0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
fcb0: 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72        psp->prevr
fcc0: 75 6c 65 20 3d 20 30 3b 0a 09 7d 65 6c 73 65 7b  ule = 0;..}else{
fcd0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
fce0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
fcf0: 72 75 6c 65 6c 69 6e 65 20 3d 20 70 73 70 2d 3e  ruleline = psp->
fd00: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20  tokenlineno;.   
fd10: 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 20 3d         rp->rhs =
fd20: 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a   (struct symbol*
fd30: 2a 29 26 72 70 5b 31 5d 3b 0a 20 20 20 20 20 20  *)&rp[1];.      
fd40: 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73      rp->rhsalias
fd50: 20 3d 20 28 63 68 61 72 2a 2a 29 26 28 72 70 2d   = (char**)&(rp-
fd60: 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 29  >rhs[psp->nrhs])
fd70: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
fd80: 69 3d 30 3b 20 69 3c 70 73 70 2d 3e 6e 72 68 73  i=0; i<psp->nrhs
fd90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
fda0: 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 20 3d      rp->rhs[i] =
fdb0: 20 70 73 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20   psp->rhs[i];.  
fdc0: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
fdd0: 73 61 6c 69 61 73 5b 69 5d 20 3d 20 70 73 70 2d  salias[i] = psp-
fde0: 3e 61 6c 69 61 73 5b 69 5d 3b 0a 09 20 20 7d 0a  >alias[i];..  }.
fdf0: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68            rp->lh
fe00: 73 20 3d 20 70 73 70 2d 3e 6c 68 73 3b 0a 20 20  s = psp->lhs;.  
fe10: 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61          rp->lhsa
fe20: 6c 69 61 73 20 3d 20 70 73 70 2d 3e 6c 68 73 61  lias = psp->lhsa
fe30: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
fe40: 72 70 2d 3e 6e 72 68 73 20 3d 20 70 73 70 2d 3e  rp->nrhs = psp->
fe50: 6e 72 68 73 3b 0a 20 20 20 20 20 20 20 20 20 20  nrhs;.          
fe60: 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20 20  rp->code = 0;.  
fe70: 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63          rp->prec
fe80: 73 79 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  sym = 0;.       
fe90: 20 20 20 72 70 2d 3e 69 6e 64 65 78 20 3d 20 70     rp->index = p
fea0: 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 2b 2b 3b  sp->gp->nrule++;
feb0: 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e  .          rp->n
fec0: 65 78 74 6c 68 73 20 3d 20 72 70 2d 3e 6c 68 73  extlhs = rp->lhs
fed0: 2d 3e 72 75 6c 65 3b 0a 20 20 20 20 20 20 20 20  ->rule;.        
fee0: 20 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65 20    rp->lhs->rule 
fef0: 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20  = rp;.          
ff00: 72 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  rp->next = 0;.  
ff10: 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d          if( psp-
ff20: 3e 66 69 72 73 74 72 75 6c 65 3d 3d 30 20 29 7b  >firstrule==0 ){
ff30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 73 70  .            psp
ff40: 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20 70 73  ->firstrule = ps
ff50: 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72 70  p->lastrule = rp
ff60: 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ;..  }else{.    
ff70: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61 73          psp->las
ff80: 74 72 75 6c 65 2d 3e 6e 65 78 74 20 3d 20 72 70  trule->next = rp
ff90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 73  ;.            ps
ffa0: 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72 70  p->lastrule = rp
ffb0: 3b 0a 09 20 20 7d 0a 20 20 20 20 20 20 20 20 20  ;..  }.         
ffc0: 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d   psp->prevrule =
ffd0: 20 72 70 3b 0a 09 7d 0a 20 20 20 20 20 20 20 20   rp;..}.        
ffe0: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
fff0: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
10000 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  _RULE;.      }el
10010 73 65 20 69 66 28 20 69 73 61 6c 70 68 61 28 78  se if( isalpha(x
10020 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
10030 69 66 28 20 70 73 70 2d 3e 6e 72 68 73 3e 3d 4d  if( psp->nrhs>=M
10040 41 58 52 48 53 20 29 7b 0a 20 20 20 20 20 20 20  AXRHS ){.       
10050 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
10060 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
10070 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
10080 20 20 20 20 20 20 20 20 22 54 6f 6f 20 6d 61 6e          "Too man
10090 79 20 73 79 6d 62 6f 6c 73 20 6f 6e 20 52 48 53  y symbols on RHS
100a0 20 6f 66 20 72 75 6c 65 20 62 65 67 69 6e 6e 69   of rule beginni
100b0 6e 67 20 61 74 20 5c 22 25 73 5c 22 2e 22 2c 0a  ng at \"%s\".",.
100c0 20 20 20 20 20 20 20 20 20 20 20 20 78 29 3b 0a              x);.
100d0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
100e0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
100f0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10100 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
10110 55 4c 45 5f 45 52 52 4f 52 3b 0a 09 7d 65 6c 73  ULE_ERROR;..}els
10120 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  e{.          psp
10130 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d  ->rhs[psp->nrhs]
10140 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
10150 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
10160 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73  >alias[psp->nrhs
10170 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
10180 20 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 09 7d   psp->nrhs++;..}
10190 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
101a0 20 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c 7c 20 78   (x[0]=='|' || x
101b0 5b 30 5d 3d 3d 27 2f 27 29 20 26 26 20 70 73 70  [0]=='/') && psp
101c0 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20 20 20 20  ->nrhs>0 ){.    
101d0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
101e0 6c 20 2a 6d 73 70 20 3d 20 70 73 70 2d 3e 72 68  l *msp = psp->rh
101f0 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 3b 0a  s[psp->nrhs-1];.
10200 20 20 20 20 20 20 20 20 69 66 28 20 6d 73 70 2d          if( msp-
10210 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d  >type!=MULTITERM
10220 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
10230 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
10240 2a 6f 72 69 67 73 70 20 3d 20 6d 73 70 3b 0a 20  *origsp = msp;. 
10250 20 20 20 20 20 20 20 20 20 6d 73 70 20 3d 20 63           msp = c
10260 61 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f 66 28 2a  alloc(1,sizeof(*
10270 6d 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20 20  msp));.         
10280 20 6d 65 6d 73 65 74 28 6d 73 70 2c 20 30 2c 20   memset(msp, 0, 
10290 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20  sizeof(*msp));. 
102a0 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 74 79           msp->ty
102b0 70 65 20 3d 20 4d 55 4c 54 49 54 45 52 4d 49 4e  pe = MULTITERMIN
102c0 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73  AL;.          ms
102d0 70 2d 3e 6e 73 75 62 73 79 6d 20 3d 20 31 3b 0a  p->nsubsym = 1;.
102e0 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73            msp->s
102f0 75 62 73 79 6d 20 3d 20 63 61 6c 6c 6f 63 28 31  ubsym = calloc(1
10300 2c 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73  ,sizeof(struct s
10310 79 6d 62 6f 6c 2a 29 29 3b 0a 20 20 20 20 20 20  ymbol*));.      
10320 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b      msp->subsym[
10330 30 5d 20 3d 20 6f 72 69 67 73 70 3b 0a 20 20 20  0] = origsp;.   
10340 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 61 6d 65         msp->name
10350 20 3d 20 6f 72 69 67 73 70 2d 3e 6e 61 6d 65 3b   = origsp->name;
10360 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10370 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d  rhs[psp->nrhs-1]
10380 20 3d 20 6d 73 70 3b 0a 20 20 20 20 20 20 20 20   = msp;.        
10390 7d 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e  }.        msp->n
103a0 73 75 62 73 79 6d 2b 2b 3b 0a 20 20 20 20 20 20  subsym++;.      
103b0 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20    msp->subsym = 
103c0 72 65 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62  realloc(msp->sub
103d0 73 79 6d 2c 20 73 69 7a 65 6f 66 28 73 74 72 75  sym, sizeof(stru
103e0 63 74 20 73 79 6d 62 6f 6c 2a 29 2a 6d 73 70 2d  ct symbol*)*msp-
103f0 3e 6e 73 75 62 73 79 6d 29 3b 0a 20 20 20 20 20  >nsubsym);.     
10400 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 6d     msp->subsym[m
10410 73 70 2d 3e 6e 73 75 62 73 79 6d 2d 31 5d 20 3d  sp->nsubsym-1] =
10420 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 26 78 5b 31   Symbol_new(&x[1
10430 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
10440 69 73 6c 6f 77 65 72 28 78 5b 31 5d 29 20 7c 7c  islower(x[1]) ||
10450 20 69 73 6c 6f 77 65 72 28 6d 73 70 2d 3e 73 75   islower(msp->su
10460 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 5b 30 5d  bsym[0]->name[0]
10470 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ) ){.          E
10480 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
10490 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
104a0 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
104b0 20 20 20 20 22 43 61 6e 6e 6f 74 20 66 6f 72 6d      "Cannot form
104c0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 63 6f 6e 74   a compound cont
104d0 61 69 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 65 72  aining a non-ter
104e0 6d 69 6e 61 6c 22 29 3b 0a 20 20 20 20 20 20 20  minal");.       
104f0 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
10500 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
10510 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b      }else if( x[
10520 30 5d 3d 3d 27 28 27 20 26 26 20 70 73 70 2d 3e  0]=='(' && psp->
10530 6e 72 68 73 3e 30 20 29 7b 0a 20 20 20 20 20 20  nrhs>0 ){.      
10540 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
10550 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20  HS_ALIAS_1;.    
10560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10570 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
10580 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
10590 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
105a0 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 63 68 61      "Illegal cha
105b0 72 61 63 74 65 72 20 6f 6e 20 52 48 53 20 6f 66  racter on RHS of
105c0 20 72 75 6c 65 3a 20 5c 22 25 73 5c 22 2e 22 2c   rule: \"%s\".",
105d0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
105e0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
105f0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10600 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
10610 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
10620 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
10630 20 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c 49      case RHS_ALI
10640 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20  AS_1:.      if( 
10650 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b  isalpha(x[0]) ){
10660 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61 6c  .        psp->al
10670 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d  ias[psp->nrhs-1]
10680 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73   = x;.        ps
10690 70 2d 3e 73 74 61 74 65 20 3d 20 52 48 53 5f 41  p->state = RHS_A
106a0 4c 49 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65  LIAS_2;.      }e
106b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
106c0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
106d0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
106e0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
106f0 22 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61  "\"%s\" is not a
10700 20 76 61 6c 69 64 20 61 6c 69 61 73 20 66 6f 72   valid alias for
10710 20 74 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 20   the RHS symbol 
10720 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20  \"%s\"\n",.     
10730 20 20 20 20 20 78 2c 70 73 70 2d 3e 72 68 73 5b       x,psp->rhs[
10740 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 2d 3e 6e 61  psp->nrhs-1]->na
10750 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  me);.        psp
10760 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
10770 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10780 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
10790 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
107a0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
107b0 0a 20 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c  .    case RHS_AL
107c0 49 41 53 5f 32 3a 0a 20 20 20 20 20 20 69 66 28  IAS_2:.      if(
107d0 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20 20   x[0]==')' ){.  
107e0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
107f0 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20   = IN_RHS;.     
10800 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10810 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
10820 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
10830 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
10840 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c     "Missing \")\
10850 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20  " following LHS 
10860 61 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c  alias name \"%s\
10870 22 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61  ".",psp->lhsalia
10880 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  s);.        psp-
10890 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
108a0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
108b0 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
108c0 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
108d0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
108e0 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
108f0 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52  _FOR_DECL_KEYWOR
10900 44 3a 0a 20 20 20 20 20 20 69 66 28 20 69 73 61  D:.      if( isa
10910 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20  lpha(x[0]) ){.  
10920 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6b        psp->declk
10930 65 79 77 6f 72 64 20 3d 20 78 3b 0a 20 20 20 20  eyword = x;.    
10940 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
10950 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  slot = 0;.      
10960 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e    psp->decllinen
10970 6f 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20  oslot = 0;.     
10980 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
10990 6e 65 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20 20  neMacro = 1;.   
109a0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
109b0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
109c0 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 20 20  CL_ARG;.        
109d0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 61  if( strcmp(x,"na
109e0 6d 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  me")==0 ){.     
109f0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10a00 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10a10 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p->name);.      
10a20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c      psp->insertL
10a30 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 09 7d  ineMacro = 0;..}
10a40 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10a50 78 2c 22 69 6e 63 6c 75 64 65 22 29 3d 3d 30 20  x,"include")==0 
10a60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
10a70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
10a80 26 28 70 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75  &(psp->gp->inclu
10a90 64 65 29 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  de);..}else if( 
10aa0 73 74 72 63 6d 70 28 78 2c 22 63 6f 64 65 22 29  strcmp(x,"code")
10ab0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10ac0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10ad0 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65  t = &(psp->gp->e
10ae0 78 74 72 61 63 6f 64 65 29 3b 0a 09 7d 65 6c 73  xtracode);..}els
10af0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
10b00 74 6f 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f 72  token_destructor
10b10 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10b20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
10b30 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e  lot = &psp->gp->
10b40 74 6f 6b 65 6e 64 65 73 74 3b 0a 09 7d 65 6c 73  tokendest;..}els
10b50 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
10b60 64 65 66 61 75 6c 74 5f 64 65 73 74 72 75 63 74  default_destruct
10b70 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  or")==0 ){.     
10b80 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10b90 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70  gslot = &psp->gp
10ba0 2d 3e 76 61 72 64 65 73 74 3b 0a 09 7d 65 6c 73  ->vardest;..}els
10bb0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
10bc0 74 6f 6b 65 6e 5f 70 72 65 66 69 78 22 29 3d 3d  token_prefix")==
10bd0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
10be0 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
10bf0 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65  = &psp->gp->toke
10c00 6e 70 72 65 66 69 78 3b 0a 20 20 20 20 20 20 20  nprefix;.       
10c10 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
10c20 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 09 7d 65  neMacro = 0;..}e
10c30 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
10c40 2c 22 73 79 6e 74 61 78 5f 65 72 72 6f 72 22 29  ,"syntax_error")
10c50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10c60 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10c70 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65  t = &(psp->gp->e
10c80 72 72 6f 72 29 3b 0a 09 7d 65 6c 73 65 20 69 66  rror);..}else if
10c90 28 20 73 74 72 63 6d 70 28 78 2c 22 70 61 72 73  ( strcmp(x,"pars
10ca0 65 5f 61 63 63 65 70 74 22 29 3d 3d 30 20 29 7b  e_accept")==0 ){
10cb0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10cc0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
10cd0 70 73 70 2d 3e 67 70 2d 3e 61 63 63 65 70 74 29  psp->gp->accept)
10ce0 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72  ;..}else if( str
10cf0 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 66 61 69  cmp(x,"parse_fai
10d00 6c 75 72 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  lure")==0 ){.   
10d10 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
10d20 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
10d30 3e 67 70 2d 3e 66 61 69 6c 75 72 65 29 3b 0a 09  >gp->failure);..
10d40 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10d50 28 78 2c 22 73 74 61 63 6b 5f 6f 76 65 72 66 6c  (x,"stack_overfl
10d60 6f 77 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ow")==0 ){.     
10d70 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10d80 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10d90 70 2d 3e 6f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  p->overflow);.  
10da0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10db0 73 74 72 63 6d 70 28 78 2c 22 65 78 74 72 61 5f  strcmp(x,"extra_
10dc0 61 72 67 75 6d 65 6e 74 22 29 3d 3d 30 20 29 7b  argument")==0 ){
10dd0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10de0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
10df0 70 73 70 2d 3e 67 70 2d 3e 61 72 67 29 3b 0a 20  psp->gp->arg);. 
10e00 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e           psp->in
10e10 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
10e20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
10e30 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74   if( strcmp(x,"t
10e40 6f 6b 65 6e 5f 74 79 70 65 22 29 3d 3d 30 20 29  oken_type")==0 )
10e50 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
10e60 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
10e70 28 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 74  (psp->gp->tokent
10e80 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ype);.          
10e90 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d  psp->insertLineM
10ea0 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  acro = 0;.      
10eb0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
10ec0 6d 70 28 78 2c 22 64 65 66 61 75 6c 74 5f 74 79  mp(x,"default_ty
10ed0 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pe")==0 ){.     
10ee0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10ef0 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10f00 70 2d 3e 76 61 72 74 79 70 65 29 3b 0a 20 20 20  p->vartype);.   
10f10 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
10f20 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b  rtLineMacro = 0;
10f30 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
10f40 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61  f( strcmp(x,"sta
10f50 63 6b 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a  ck_size")==0 ){.
10f60 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
10f70 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
10f80 73 70 2d 3e 67 70 2d 3e 73 74 61 63 6b 73 69 7a  sp->gp->stacksiz
10f90 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  e);.          ps
10fa0 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
10fb0 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
10fc0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10fd0 28 78 2c 22 73 74 61 72 74 5f 73 79 6d 62 6f 6c  (x,"start_symbol
10fe0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10ff0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
11000 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
11010 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20  >start);.       
11020 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
11030 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20  neMacro = 0;.   
11040 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
11050 74 72 63 6d 70 28 78 2c 22 6c 65 66 74 22 29 3d  trcmp(x,"left")=
11060 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
11070 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72  psp->preccounter
11080 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
11090 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 4c  p->declassoc = L
110a0 45 46 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70  EFT;.          p
110b0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
110c0 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
110d0 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20  CE_SYMBOL;.     
110e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
110f0 63 6d 70 28 78 2c 22 72 69 67 68 74 22 29 3d 3d  cmp(x,"right")==
11100 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
11110 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b  sp->preccounter+
11120 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  +;.          psp
11130 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 52 49  ->declassoc = RI
11140 47 48 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70  GHT;.          p
11150 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
11160 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
11170 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20  CE_SYMBOL;.     
11180 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
11190 63 6d 70 28 78 2c 22 6e 6f 6e 61 73 73 6f 63 22  cmp(x,"nonassoc"
111a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
111b0 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74    psp->preccount
111c0 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  er++;.          
111d0 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d  psp->declassoc =
111e0 20 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 20   NONE;.         
111f0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
11200 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44  ITING_FOR_PRECED
11210 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65  ENCE_SYMBOL;..}e
11220 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
11230 2c 22 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d  ,"destructor")==
11240 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
11250 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
11260 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54  ING_FOR_DESTRUCT
11270 4f 52 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73  OR_SYMBOL;..}els
11280 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
11290 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  type")==0 ){.   
112a0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
112b0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
112c0 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3b  DATATYPE_SYMBOL;
112d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
112e0 66 28 20 73 74 72 63 6d 70 28 78 2c 22 66 61 6c  f( strcmp(x,"fal
112f0 6c 62 61 63 6b 22 29 3d 3d 30 20 29 7b 0a 20 20  lback")==0 ){.  
11300 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66 61 6c          psp->fal
11310 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20  lback = 0;.     
11320 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11330 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41  = WAITING_FOR_FA
11340 4c 4c 42 41 43 4b 5f 49 44 3b 0a 20 20 20 20 20  LLBACK_ID;.     
11350 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
11360 63 6d 70 28 78 2c 22 77 69 6c 64 63 61 72 64 22  cmp(x,"wildcard"
11370 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
11380 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
11390 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43  AITING_FOR_WILDC
113a0 41 52 44 5f 49 44 3b 0a 20 20 20 20 20 20 20 20  ARD_ID;.        
113b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
113c0 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
113d0 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
113e0 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
113f0 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20 64        "Unknown d
11400 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f  eclaration keywo
11410 72 64 3a 20 5c 22 25 25 25 73 5c 22 2e 22 2c 78  rd: \"%%%s\".",x
11420 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
11430 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
11440 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11450 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
11460 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  R_DECL_ERROR;..}
11470 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11480 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11490 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
114a0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
114b0 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61           "Illega
114c0 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65  l declaration ke
114d0 79 77 6f 72 64 3a 20 5c 22 25 73 5c 22 2e 22 2c  yword: \"%s\".",
114e0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
114f0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11500 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11510 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
11520 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
11530 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
11540 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
11550 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f  _FOR_DESTRUCTOR_
11560 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66  SYMBOL:.      if
11570 28 20 21 69 73 61 6c 70 68 61 28 78 5b 30 5d 29  ( !isalpha(x[0])
11580 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
11590 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
115a0 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
115b0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
115c0 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73  Symbol name miss
115d0 69 6e 67 20 61 66 74 65 72 20 25 64 65 73 74 72  ing after %destr
115e0 75 63 74 6f 72 20 6b 65 79 77 6f 72 64 22 29 3b  uctor keyword");
115f0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
11600 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
11610 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
11620 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
11630 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
11640 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72  lse{.        str
11650 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
11660 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
11670 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
11680 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e  largslot = &sp->
11690 64 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 20 20  destructor;.    
116a0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e      psp->decllin
116b0 65 6e 6f 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64  enoslot = &sp->d
116c0 65 73 74 4c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20  estLineno;.     
116d0 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
116e0 6e 65 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20 20  neMacro = 1;.   
116f0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11700 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
11710 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 7d 0a  CL_ARG;.      }.
11720 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11730 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
11740 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f  R_DATATYPE_SYMBO
11750 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  L:.      if( !is
11760 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20  alpha(x[0]) ){. 
11770 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
11780 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
11790 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
117a0 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f            "Symbo
117b0 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61  l name missing a
117c0 66 74 65 72 20 25 64 65 73 74 72 75 63 74 6f 72  fter %destructor
117d0 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20   keyword");.    
117e0 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
117f0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
11800 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
11810 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
11820 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
11830 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
11840 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62  ymbol *sp = Symb
11850 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
11860 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
11870 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 61 74 61 74  lot = &sp->datat
11880 79 70 65 3b 0a 20 20 20 20 20 20 20 20 70 73 70  ype;.        psp
11890 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
118a0 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  o = 0;.        p
118b0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
118c0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47  ING_FOR_DECL_ARG
118d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
118e0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
118f0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43  WAITING_FOR_PREC
11900 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3a 0a 20  EDENCE_SYMBOL:. 
11910 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
11920 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  .' ){.        ps
11930 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
11940 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
11950 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
11960 20 69 66 28 20 69 73 75 70 70 65 72 28 78 5b 30   if( isupper(x[0
11970 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  ]) ){.        st
11980 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
11990 0a 20 20 20 20 20 20 20 20 73 70 20 3d 20 53 79  .        sp = Sy
119a0 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
119b0 20 20 20 20 20 69 66 28 20 73 70 2d 3e 70 72 65       if( sp->pre
119c0 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c>=0 ){.        
119d0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
119e0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
119f0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
11a00 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 5c         "Symbol \
11a10 22 25 73 5c 22 20 68 61 73 20 61 6c 72 65 61 64  "%s\" has alread
11a20 79 20 62 65 20 67 69 76 65 6e 20 61 20 70 72 65  y be given a pre
11a30 63 65 64 65 6e 63 65 2e 22 2c 78 29 3b 0a 20 20  cedence.",x);.  
11a40 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
11a50 6f 72 63 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65 7b  orcnt++;..}else{
11a60 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 70  .          sp->p
11a70 72 65 63 20 3d 20 70 73 70 2d 3e 70 72 65 63 63  rec = psp->precc
11a80 6f 75 6e 74 65 72 3b 0a 20 20 20 20 20 20 20 20  ounter;.        
11a90 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20 70 73    sp->assoc = ps
11aa0 70 2d 3e 64 65 63 6c 61 73 73 6f 63 3b 0a 09 7d  p->declassoc;..}
11ab0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11ac0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11ad0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
11ae0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
11af0 20 20 20 20 20 20 20 20 20 22 43 61 6e 27 74 20           "Can't 
11b00 61 73 73 69 67 6e 20 61 20 70 72 65 63 65 64 65  assign a precede
11b10 6e 63 65 20 74 6f 20 5c 22 25 73 5c 22 2e 22 2c  nce to \"%s\".",
11b20 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
11b30 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11b40 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
11b50 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  ;.    case WAITI
11b60 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3a  NG_FOR_DECL_ARG:
11b70 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
11b80 3d 27 7b 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c  ='{' || x[0]=='\
11b90 22 27 20 7c 7c 20 69 73 61 6c 6e 75 6d 28 78 5b  "' || isalnum(x[
11ba0 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  0]) ){.        c
11bb0 68 61 72 20 2a 7a 4f 6c 64 2c 20 2a 7a 4e 65 77  har *zOld, *zNew
11bc0 2c 20 2a 7a 42 75 66 2c 20 2a 7a 3b 0a 20 20 20  , *zBuf, *z;.   
11bd0 20 20 20 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 6e       int nOld, n
11be0 2c 20 6e 4c 69 6e 65 2c 20 6e 4e 65 77 2c 20 6e  , nLine, nNew, n
11bf0 42 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 69 6e  Back;.        in
11c00 74 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 3b 0a  t addLineMacro;.
11c10 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 4c 69          char zLi
11c20 6e 65 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20  ne[50];.        
11c30 7a 4e 65 77 20 3d 20 78 3b 0a 20 20 20 20 20 20  zNew = x;.      
11c40 20 20 69 66 28 20 7a 4e 65 77 5b 30 5d 3d 3d 27    if( zNew[0]=='
11c50 22 27 20 7c 7c 20 7a 4e 65 77 5b 30 5d 3d 3d 27  "' || zNew[0]=='
11c60 7b 27 20 29 20 7a 4e 65 77 2b 2b 3b 0a 20 20 20  {' ) zNew++;.   
11c70 20 20 20 20 20 6e 4e 65 77 20 3d 20 6c 65 6d 6f       nNew = lemo
11c80 6e 53 74 72 6c 65 6e 28 7a 4e 65 77 29 3b 0a 20  nStrlen(zNew);. 
11c90 20 20 20 20 20 20 20 69 66 28 20 2a 70 73 70 2d         if( *psp-
11ca0 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 29 7b 0a  >declargslot ){.
11cb0 20 20 20 20 20 20 20 20 20 20 7a 4f 6c 64 20 3d            zOld =
11cc0 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c   *psp->declargsl
11cd0 6f 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ot;.        }els
11ce0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c  e{.          zOl
11cf0 64 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  d = "";.        
11d00 7d 0a 20 20 20 20 20 20 20 20 6e 4f 6c 64 20 3d  }.        nOld =
11d10 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4f 6c   lemonStrlen(zOl
11d20 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20  d);.        n = 
11d30 6e 4f 6c 64 20 2b 20 6e 4e 65 77 20 2b 20 32 30  nOld + nNew + 20
11d40 3b 0a 20 20 20 20 20 20 20 20 61 64 64 4c 69 6e  ;.        addLin
11d50 65 4d 61 63 72 6f 20 3d 20 21 70 73 70 2d 3e 67  eMacro = !psp->g
11d60 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  p->nolinenosflag
11d70 20 26 26 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c   && psp->insertL
11d80 69 6e 65 4d 61 63 72 6f 20 26 26 0a 20 20 20 20  ineMacro &&.    
11d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11da0 20 20 20 20 28 70 73 70 2d 3e 64 65 63 6c 6c 69      (psp->declli
11db0 6e 65 6e 6f 73 6c 6f 74 3d 3d 30 20 7c 7c 20 70  nenoslot==0 || p
11dc0 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c  sp->decllinenosl
11dd0 6f 74 5b 30 5d 21 3d 30 29 3b 0a 20 20 20 20 20  ot[0]!=0);.     
11de0 20 20 20 69 66 28 20 61 64 64 4c 69 6e 65 4d 61     if( addLineMa
11df0 63 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  cro ){.         
11e00 20 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65   for(z=psp->file
11e10 6e 61 6d 65 2c 20 6e 42 61 63 6b 3d 30 3b 20 2a  name, nBack=0; *
11e20 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  z; z++){.       
11e30 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c       if( *z=='\\
11e40 27 20 29 20 6e 42 61 63 6b 2b 2b 3b 0a 20 20 20  ' ) nBack++;.   
11e50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11e60 20 20 20 73 70 72 69 6e 74 66 28 7a 4c 69 6e 65     sprintf(zLine
11e70 2c 20 22 23 6c 69 6e 65 20 25 64 20 22 2c 20 70  , "#line %d ", p
11e80 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 29  sp->tokenlineno)
11e90 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e  ;.          nLin
11ea0 65 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  e = lemonStrlen(
11eb0 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  zLine);.        
11ec0 20 20 6e 20 2b 3d 20 6e 4c 69 6e 65 20 2b 20 6c    n += nLine + l
11ed0 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 73 70 2d 3e  emonStrlen(psp->
11ee0 66 69 6c 65 6e 61 6d 65 29 20 2b 20 6e 42 61 63  filename) + nBac
11ef0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
11f00 20 20 20 20 20 2a 70 73 70 2d 3e 64 65 63 6c 61       *psp->decla
11f10 72 67 73 6c 6f 74 20 3d 20 7a 42 75 66 20 3d 20  rgslot = zBuf = 
11f20 72 65 61 6c 6c 6f 63 28 2a 70 73 70 2d 3e 64 65  realloc(*psp->de
11f30 63 6c 61 72 67 73 6c 6f 74 2c 20 6e 29 3b 0a 20  clargslot, n);. 
11f40 20 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 6e         zBuf += n
11f50 4f 6c 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Old;.        if(
11f60 20 61 64 64 4c 69 6e 65 4d 61 63 72 6f 20 29 7b   addLineMacro ){
11f70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
11f80 4f 6c 64 20 26 26 20 7a 42 75 66 5b 2d 31 5d 21  Old && zBuf[-1]!
11f90 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\n' ){.       
11fa0 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
11fb0 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20   '\n';.         
11fc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
11fd0 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c  cpy(zBuf, zLine,
11fe0 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20   nLine);.       
11ff0 20 20 20 7a 42 75 66 20 2b 3d 20 6e 4c 69 6e 65     zBuf += nLine
12000 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42  ;.          *(zB
12010 75 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20  uf++) = '"';.   
12020 20 20 20 20 20 20 20 66 6f 72 28 7a 3d 70 73 70         for(z=psp
12030 2d 3e 66 69 6c 65 6e 61 6d 65 3b 20 2a 7a 3b 20  ->filename; *z; 
12040 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  z++){.          
12050 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c 27 20 29    if( *z=='\\' )
12060 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
12070 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 5c 27  *(zBuf++) = '\\'
12080 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
12090 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42              *(zB
120a0 75 66 2b 2b 29 20 3d 20 2a 7a 3b 0a 20 20 20 20  uf++) = *z;.    
120b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
120c0 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 22    *(zBuf++) = '"
120d0 27 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a  ';.          *(z
120e0 42 75 66 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a 20  Buf++) = '\n';. 
120f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12100 20 69 66 28 20 70 73 70 2d 3e 64 65 63 6c 6c 69   if( psp->declli
12110 6e 65 6e 6f 73 6c 6f 74 20 26 26 20 70 73 70 2d  nenoslot && psp-
12120 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b  >decllinenoslot[
12130 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0]==0 ){.       
12140 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65     psp->declline
12150 6e 6f 73 6c 6f 74 5b 30 5d 20 3d 20 70 73 70 2d  noslot[0] = psp-
12160 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20  >tokenlineno;.  
12170 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12180 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4e 65  memcpy(zBuf, zNe
12190 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20  w, nNew);.      
121a0 20 20 7a 42 75 66 20 2b 3d 20 6e 4e 65 77 3b 0a    zBuf += nNew;.
121b0 20 20 20 20 20 20 20 20 2a 7a 42 75 66 20 3d 20          *zBuf = 
121c0 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
121d0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
121e0 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
121f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
12200 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
12210 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
12220 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
12230 20 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67            "Illeg
12240 61 6c 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 25  al argument to %
12250 25 25 73 3a 20 25 73 22 2c 70 73 70 2d 3e 64 65  %%s: %s",psp->de
12260 63 6c 6b 65 79 77 6f 72 64 2c 78 29 3b 0a 20 20  clkeyword,x);.  
12270 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
12280 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
12290 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
122a0 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
122b0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
122c0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
122d0 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46  se WAITING_FOR_F
122e0 41 4c 4c 42 41 43 4b 5f 49 44 3a 0a 20 20 20 20  ALLBACK_ID:.    
122f0 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20    if( x[0]=='.' 
12300 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
12310 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
12320 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45  FOR_DECL_OR_RULE
12330 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
12340 28 20 21 69 73 75 70 70 65 72 28 78 5b 30 5d 29  ( !isupper(x[0])
12350 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
12360 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
12370 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
12380 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
12390 22 25 25 66 61 6c 6c 62 61 63 6b 20 61 72 67 75  "%%fallback argu
123a0 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73 68 6f 75  ment \"%s\" shou
123b0 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20  ld be a token", 
123c0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
123d0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
123e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
123f0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
12400 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77  *sp = Symbol_new
12410 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (x);.        if(
12420 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d   psp->fallback==
12430 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
12440 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 73  sp->fallback = s
12450 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  p;.        }else
12460 20 69 66 28 20 73 70 2d 3e 66 61 6c 6c 62 61 63   if( sp->fallbac
12470 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  k ){.          E
12480 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
12490 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65  ename, psp->toke
124a0 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
124b0 20 20 20 20 20 22 4d 6f 72 65 20 74 68 61 6e 20       "More than 
124c0 6f 6e 65 20 66 61 6c 6c 62 61 63 6b 20 61 73 73  one fallback ass
124d0 69 67 6e 65 64 20 74 6f 20 74 6f 6b 65 6e 20 25  igned to token %
124e0 73 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  s", x);.        
124f0 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
12500 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
12510 7b 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e  {.          sp->
12520 66 61 6c 6c 62 61 63 6b 20 3d 20 70 73 70 2d 3e  fallback = psp->
12530 66 61 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20  fallback;.      
12540 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 68 61 73      psp->gp->has
12550 5f 66 61 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  _fallback = 1;. 
12560 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12570 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12580 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
12590 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 3a 0a  OR_WILDCARD_ID:.
125a0 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
125b0 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '.' ){.        p
125c0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
125d0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
125e0 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RULE;.      }els
125f0 65 20 69 66 28 20 21 69 73 75 70 70 65 72 28 78  e if( !isupper(x
12600 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
12610 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
12620 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b  lename, psp->tok
12630 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
12640 20 20 20 20 22 25 25 77 69 6c 64 63 61 72 64 20      "%%wildcard 
12650 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20  argument \"%s\" 
12660 73 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65  should be a toke
12670 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  n", x);.        
12680 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
12690 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
126a0 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
126b0 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c  bol *sp = Symbol
126c0 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
126d0 20 69 66 28 20 70 73 70 2d 3e 67 70 2d 3e 77 69   if( psp->gp->wi
126e0 6c 64 63 61 72 64 3d 3d 30 20 29 7b 0a 20 20 20  ldcard==0 ){.   
126f0 20 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e         psp->gp->
12700 77 69 6c 64 63 61 72 64 20 3d 20 73 70 3b 0a 20  wildcard = sp;. 
12710 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
12720 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
12730 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  (psp->filename, 
12740 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
12750 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 45  ,.            "E
12760 78 74 72 61 20 77 69 6c 64 63 61 72 64 20 74 6f  xtra wildcard to
12770 20 74 6f 6b 65 6e 3a 20 25 73 22 2c 20 78 29 3b   token: %s", x);
12780 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12790 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
127a0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
127b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
127c0 61 73 65 20 52 45 53 59 4e 43 5f 41 46 54 45 52  ase RESYNC_AFTER
127d0 5f 52 55 4c 45 5f 45 52 52 4f 52 3a 0a 2f 2a 20  _RULE_ERROR:./* 
127e0 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
127f0 2e 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20  .' ) psp->state 
12800 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
12810 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 2a 2a 20 20  CL_OR_RULE;.**  
12820 20 20 20 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20      break; */.  
12830 20 20 63 61 73 65 20 52 45 53 59 4e 43 5f 41 46    case RESYNC_AF
12840 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3a 0a  TER_DECL_ERROR:.
12850 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
12860 27 2e 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65  '.' ) psp->state
12870 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
12880 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20  ECL_OR_RULE;.   
12890 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 25 27     if( x[0]=='%'
128a0 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20   ) psp->state = 
128b0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
128c0 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20 20  _KEYWORD;.      
128d0 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  break;.  }.}../*
128e0 20 52 75 6e 20 74 68 65 20 70 72 65 70 72 6f 63   Run the preproc
128f0 65 73 73 6f 72 20 6f 76 65 72 20 74 68 65 20 69  essor over the i
12900 6e 70 75 74 20 66 69 6c 65 20 74 65 78 74 2e 20  nput file text. 
12910 20 54 68 65 20 67 6c 6f 62 61 6c 20 76 61 72 69   The global vari
12920 61 62 6c 65 73 0a 2a 2a 20 61 7a 44 65 66 69 6e  ables.** azDefin
12930 65 5b 30 5d 20 74 68 72 6f 75 67 68 20 61 7a 44  e[0] through azD
12940 65 66 69 6e 65 5b 6e 44 65 66 69 6e 65 2d 31 5d  efine[nDefine-1]
12950 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61   contains the na
12960 6d 65 73 20 6f 66 20 61 6c 6c 20 64 65 66 69 6e  mes of all defin
12970 65 64 0a 2a 2a 20 6d 61 63 72 6f 73 2e 20 20 54  ed.** macros.  T
12980 68 69 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b  his routine look
12990 73 20 66 6f 72 20 22 25 69 66 64 65 66 22 20 61  s for "%ifdef" a
129a0 6e 64 20 22 25 69 66 6e 64 65 66 22 20 61 6e 64  nd "%ifndef" and
129b0 20 22 25 65 6e 64 69 66 22 20 61 6e 64 0a 2a 2a   "%endif" and.**
129c0 20 63 6f 6d 6d 65 6e 74 73 20 74 68 65 6d 20 6f   comments them o
129d0 75 74 2e 20 20 54 65 78 74 20 69 6e 20 62 65 74  ut.  Text in bet
129e0 77 65 65 6e 20 69 73 20 61 6c 73 6f 20 63 6f 6d  ween is also com
129f0 6d 65 6e 74 65 64 20 6f 75 74 20 61 73 20 61 70  mented out as ap
12a00 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74  propriate..*/.st
12a10 61 74 69 63 20 76 6f 69 64 20 70 72 65 70 72 6f  atic void prepro
12a20 63 65 73 73 5f 69 6e 70 75 74 28 63 68 61 72 20  cess_input(char 
12a30 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  *z){.  int i, j,
12a40 20 6b 2c 20 6e 3b 0a 20 20 69 6e 74 20 65 78 63   k, n;.  int exc
12a50 6c 75 64 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lude = 0;.  int 
12a60 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74  start = 0;.  int
12a70 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 69   lineno = 1;.  i
12a80 6e 74 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 20  nt start_lineno 
12a90 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 1;.  for(i=0; 
12aa0 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
12ab0 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29  if( z[i]=='\n' )
12ac0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69   lineno++;.    i
12ad0 66 28 20 7a 5b 69 5d 21 3d 27 25 27 20 7c 7c 20  f( z[i]!='%' || 
12ae0 28 69 3e 30 20 26 26 20 7a 5b 69 2d 31 5d 21 3d  (i>0 && z[i-1]!=
12af0 27 5c 6e 27 29 20 29 20 63 6f 6e 74 69 6e 75 65  '\n') ) continue
12b00 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  ;.    if( strncm
12b10 70 28 26 7a 5b 69 5d 2c 22 25 65 6e 64 69 66 22  p(&z[i],"%endif"
12b20 2c 36 29 3d 3d 30 20 26 26 20 69 73 73 70 61 63  ,6)==0 && isspac
12b30 65 28 7a 5b 69 2b 36 5d 29 20 29 7b 0a 20 20 20  e(z[i+6]) ){.   
12b40 20 20 20 69 66 28 20 65 78 63 6c 75 64 65 20 29     if( exclude )
12b50 7b 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75 64  {.        exclud
12b60 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e--;.        if(
12b70 20 65 78 63 6c 75 64 65 3d 3d 30 20 29 7b 0a 20   exclude==0 ){. 
12b80 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 73           for(j=s
12b90 74 61 72 74 3b 20 6a 3c 69 3b 20 6a 2b 2b 29 20  tart; j<i; j++) 
12ba0 69 66 28 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 20 29  if( z[j]!='\n' )
12bb0 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20   z[j] = ' ';.   
12bc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12bd0 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b       for(j=i; z[
12be0 6a 5d 20 26 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27  j] && z[j]!='\n'
12bf0 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20  ; j++) z[j] = ' 
12c00 27 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ';.    }else if(
12c10 20 28 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c   (strncmp(&z[i],
12c20 22 25 69 66 64 65 66 22 2c 36 29 3d 3d 30 20 26  "%ifdef",6)==0 &
12c30 26 20 69 73 73 70 61 63 65 28 7a 5b 69 2b 36 5d  & isspace(z[i+6]
12c40 29 29 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  )).          || 
12c50 28 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22  (strncmp(&z[i],"
12c60 25 69 66 6e 64 65 66 22 2c 37 29 3d 3d 30 20 26  %ifndef",7)==0 &
12c70 26 20 69 73 73 70 61 63 65 28 7a 5b 69 2b 37 5d  & isspace(z[i+7]
12c80 29 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  )) ){.      if( 
12c90 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20  exclude ){.     
12ca0 20 20 20 65 78 63 6c 75 64 65 2b 2b 3b 0a 20 20     exclude++;.  
12cb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12cc0 20 20 20 66 6f 72 28 6a 3d 69 2b 37 3b 20 69 73     for(j=i+7; is
12cd0 73 70 61 63 65 28 7a 5b 6a 5d 29 3b 20 6a 2b 2b  space(z[j]); j++
12ce0 29 7b 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ){}.        for(
12cf0 6e 3d 30 3b 20 7a 5b 6a 2b 6e 5d 20 26 26 20 21  n=0; z[j+n] && !
12d00 69 73 73 70 61 63 65 28 7a 5b 6a 2b 6e 5d 29 3b  isspace(z[j+n]);
12d10 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20   n++){}.        
12d20 65 78 63 6c 75 64 65 20 3d 20 31 3b 0a 20 20 20  exclude = 1;.   
12d30 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c       for(k=0; k<
12d40 6e 44 65 66 69 6e 65 3b 20 6b 2b 2b 29 7b 0a 20  nDefine; k++){. 
12d50 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72           if( str
12d60 6e 63 6d 70 28 61 7a 44 65 66 69 6e 65 5b 6b 5d  ncmp(azDefine[k]
12d70 2c 26 7a 5b 6a 5d 2c 6e 29 3d 3d 30 20 26 26 20  ,&z[j],n)==0 && 
12d80 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 7a 44 65  lemonStrlen(azDe
12d90 66 69 6e 65 5b 6b 5d 29 3d 3d 6e 20 29 7b 0a 20  fine[k])==n ){. 
12da0 20 20 20 20 20 20 20 20 20 20 20 65 78 63 6c 75             exclu
12db0 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
12dc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
12dd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
12de0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
12df0 2b 33 5d 3d 3d 27 6e 27 20 29 20 65 78 63 6c 75  +3]=='n' ) exclu
12e00 64 65 20 3d 20 21 65 78 63 6c 75 64 65 3b 0a 20  de = !exclude;. 
12e10 20 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75         if( exclu
12e20 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
12e30 73 74 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20  start = i;.     
12e40 20 20 20 20 20 73 74 61 72 74 5f 6c 69 6e 65 6e       start_linen
12e50 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20  o = lineno;.    
12e60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
12e70 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a      for(j=i; z[j
12e80 5d 20 26 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b  ] && z[j]!='\n';
12e90 20 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20 27   j++) z[j] = ' '
12ea0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
12eb0 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20  ( exclude ){.   
12ec0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
12ed0 22 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 25 25  "unterminated %%
12ee0 69 66 64 65 66 20 73 74 61 72 74 69 6e 67 20 6f  ifdef starting o
12ef0 6e 20 6c 69 6e 65 20 25 64 5c 6e 22 2c 20 73 74  n line %d\n", st
12f00 61 72 74 5f 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20  art_lineno);.   
12f10 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a   exit(1);.  }.}.
12f20 0a 2f 2a 20 49 6e 20 73 70 69 74 65 20 6f 66 20  ./* In spite of 
12f30 69 74 73 20 6e 61 6d 65 2c 20 74 68 69 73 20 66  its name, this f
12f40 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 61 6c 6c  unction is reall
12f50 79 20 61 20 73 63 61 6e 6e 65 72 2e 20 20 49 74  y a scanner.  It
12f60 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20   read.** in the 
12f70 65 6e 74 69 72 65 20 69 6e 70 75 74 20 66 69 6c  entire input fil
12f80 65 20 28 61 6c 6c 20 61 74 20 6f 6e 63 65 29 20  e (all at once) 
12f90 74 68 65 6e 20 74 6f 6b 65 6e 69 7a 65 73 20 69  then tokenizes i
12fa0 74 2e 20 20 45 61 63 68 0a 2a 2a 20 74 6f 6b 65  t.  Each.** toke
12fb0 6e 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 74  n is passed to t
12fc0 68 65 20 66 75 6e 63 74 69 6f 6e 20 22 70 61 72  he function "par
12fd0 73 65 6f 6e 65 74 6f 6b 65 6e 22 20 77 68 69 63  seonetoken" whic
12fe0 68 20 62 75 69 6c 64 73 20 61 6c 6c 0a 2a 2a 20  h builds all.** 
12ff0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
13000 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
13010 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c 20 73 74  in the global st
13020 61 74 65 20 76 65 63 74 6f 72 20 22 67 70 22 2e  ate vector "gp".
13030 0a 2a 2f 0a 76 6f 69 64 20 50 61 72 73 65 28 67  .*/.void Parse(g
13040 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
13050 2a 67 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  *gp;.{.  struct 
13060 70 73 74 61 74 65 20 70 73 3b 0a 20 20 46 49 4c  pstate ps;.  FIL
13070 45 20 2a 66 70 3b 0a 20 20 63 68 61 72 20 2a 66  E *fp;.  char *f
13080 69 6c 65 62 75 66 3b 0a 20 20 69 6e 74 20 66 69  ilebuf;.  int fi
13090 6c 65 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 69  lesize;.  int li
130a0 6e 65 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a 20  neno;.  int c;. 
130b0 20 63 68 61 72 20 2a 63 70 2c 20 2a 6e 65 78 74   char *cp, *next
130c0 63 70 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 6c  cp;.  int startl
130d0 69 6e 65 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73  ine = 0;..  mems
130e0 65 74 28 26 70 73 2c 20 27 5c 30 27 2c 20 73 69  et(&ps, '\0', si
130f0 7a 65 6f 66 28 70 73 29 29 3b 0a 20 20 70 73 2e  zeof(ps));.  ps.
13100 67 70 20 3d 20 67 70 3b 0a 20 20 70 73 2e 66 69  gp = gp;.  ps.fi
13110 6c 65 6e 61 6d 65 20 3d 20 67 70 2d 3e 66 69 6c  lename = gp->fil
13120 65 6e 61 6d 65 3b 0a 20 20 70 73 2e 65 72 72 6f  ename;.  ps.erro
13130 72 63 6e 74 20 3d 20 30 3b 0a 20 20 70 73 2e 73  rcnt = 0;.  ps.s
13140 74 61 74 65 20 3d 20 49 4e 49 54 49 41 4c 49 5a  tate = INITIALIZ
13150 45 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62  E;..  /* Begin b
13160 79 20 72 65 61 64 69 6e 67 20 74 68 65 20 69 6e  y reading the in
13170 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 66 70  put file */.  fp
13180 20 3d 20 66 6f 70 65 6e 28 70 73 2e 66 69 6c 65   = fopen(ps.file
13190 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69 66  name,"rb");.  if
131a0 28 20 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 45  ( fp==0 ){.    E
131b0 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e  rrorMsg(ps.filen
131c0 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20 6f 70 65  ame,0,"Can't ope
131d0 6e 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20  n this file for 
131e0 72 65 61 64 69 6e 67 2e 22 29 3b 0a 20 20 20 20  reading.");.    
131f0 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  gp->errorcnt++;.
13200 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
13210 20 20 66 73 65 65 6b 28 66 70 2c 30 2c 32 29 3b    fseek(fp,0,2);
13220 0a 20 20 66 69 6c 65 73 69 7a 65 20 3d 20 66 74  .  filesize = ft
13230 65 6c 6c 28 66 70 29 3b 0a 20 20 72 65 77 69 6e  ell(fp);.  rewin
13240 64 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66  d(fp);.  filebuf
13250 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f   = (char *)mallo
13260 63 28 20 66 69 6c 65 73 69 7a 65 2b 31 20 29 3b  c( filesize+1 );
13270 0a 20 20 69 66 28 20 66 69 6c 65 62 75 66 3d 3d  .  if( filebuf==
13280 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73  0 ){.    ErrorMs
13290 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c  g(ps.filename,0,
132a0 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20  "Can't allocate 
132b0 25 64 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  %d of memory to 
132c0 68 6f 6c 64 20 74 68 69 73 20 66 69 6c 65 2e 22  hold this file."
132d0 2c 0a 20 20 20 20 20 20 66 69 6c 65 73 69 7a 65  ,.      filesize
132e0 2b 31 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72  +1);.    gp->err
132f0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  orcnt++;.    ret
13300 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  urn;.  }.  if( f
13310 72 65 61 64 28 66 69 6c 65 62 75 66 2c 31 2c 66  read(filebuf,1,f
13320 69 6c 65 73 69 7a 65 2c 66 70 29 21 3d 66 69 6c  ilesize,fp)!=fil
13330 65 73 69 7a 65 20 29 7b 0a 20 20 20 20 45 72 72  esize ){.    Err
13340 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d  orMsg(ps.filenam
13350 65 2c 30 2c 22 43 61 6e 27 74 20 72 65 61 64 20  e,0,"Can't read 
13360 69 6e 20 61 6c 6c 20 25 64 20 62 79 74 65 73 20  in all %d bytes 
13370 6f 66 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a  of this file.",.
13380 20 20 20 20 20 20 66 69 6c 65 73 69 7a 65 29 3b        filesize);
13390 0a 20 20 20 20 66 72 65 65 28 66 69 6c 65 62 75  .    free(filebu
133a0 66 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f  f);.    gp->erro
133b0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  rcnt++;.    retu
133c0 72 6e 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  rn;.  }.  fclose
133d0 28 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 5b  (fp);.  filebuf[
133e0 66 69 6c 65 73 69 7a 65 5d 20 3d 20 30 3b 0a 0a  filesize] = 0;..
133f0 20 20 2f 2a 20 4d 61 6b 65 20 61 6e 20 69 6e 69    /* Make an ini
13400 74 69 61 6c 20 70 61 73 73 20 74 68 72 6f 75 67  tial pass throug
13410 68 20 74 68 65 20 66 69 6c 65 20 74 6f 20 68 61  h the file to ha
13420 6e 64 6c 65 20 25 69 66 64 65 66 20 61 6e 64 20  ndle %ifdef and 
13430 25 69 66 6e 64 65 66 20 2a 2f 0a 20 20 70 72 65  %ifndef */.  pre
13440 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 66 69  process_input(fi
13450 6c 65 62 75 66 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  lebuf);..  /* No
13460 77 20 73 63 61 6e 20 74 68 65 20 74 65 78 74 20  w scan the text 
13470 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  of the input fil
13480 65 20 2a 2f 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20  e */.  lineno = 
13490 31 3b 0a 20 20 66 6f 72 28 63 70 3d 66 69 6c 65  1;.  for(cp=file
134a0 62 75 66 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30  buf; (c= *cp)!=0
134b0 3b 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d  ; ){.    if( c==
134c0 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
134d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
134e0 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74   Keep track of t
134f0 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a  he line number *
13500 2f 0a 20 20 20 20 69 66 28 20 69 73 73 70 61 63  /.    if( isspac
13510 65 28 63 29 20 29 7b 20 63 70 2b 2b 3b 20 63 6f  e(c) ){ cp++; co
13520 6e 74 69 6e 75 65 3b 20 7d 20 20 2f 2a 20 53 6b  ntinue; }  /* Sk
13530 69 70 20 61 6c 6c 20 77 68 69 74 65 20 73 70 61  ip all white spa
13540 63 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d  ce */.    if( c=
13550 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='/' && cp[1]=='
13560 2f 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f  /' ){          /
13570 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65  * Skip C++ style
13580 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   comments */.   
13590 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20     cp+=2;.      
135a0 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
135b0 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20  =0 && c!='\n' ) 
135c0 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74  cp++;.      cont
135d0 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
135e0 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70  if( c=='/' && cp
135f0 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 20 20 20  [1]=='*' ){     
13600 20 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 20 73       /* Skip C s
13610 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f  tyle comments */
13620 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20  .      cp+=2;.  
13630 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a      while( (c= *
13640 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d 27 2f  cp)!=0 && (c!='/
13650 27 20 7c 7c 20 63 70 5b 2d 31 5d 21 3d 27 2a 27  ' || cp[-1]!='*'
13660 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
13670 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e   c=='\n' ) linen
13680 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 70 2b  o++;.        cp+
13690 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
136a0 20 69 66 28 20 63 20 29 20 63 70 2b 2b 3b 0a 20   if( c ) cp++;. 
136b0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
136c0 20 20 20 7d 0a 20 20 20 20 70 73 2e 74 6f 6b 65     }.    ps.toke
136d0 6e 73 74 61 72 74 20 3d 20 63 70 3b 20 20 20 20  nstart = cp;    
136e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
136f0 61 72 6b 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  ark the beginnin
13700 67 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 2a  g of the token *
13710 2f 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e 6c 69  /.    ps.tokenli
13720 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 20 20  neno = lineno;  
13730 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
13740 6e 75 6d 62 65 72 20 6f 6e 20 77 68 69 63 68 20  number on which 
13750 74 6f 6b 65 6e 20 62 65 67 69 6e 73 20 2a 2f 0a  token begins */.
13760 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 22 27 20      if( c=='\"' 
13770 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
13780 20 20 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67         /* String
13790 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20   literals */.   
137a0 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 77     cp++;.      w
137b0 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d  hile( (c= *cp)!=
137c0 30 20 26 26 20 63 21 3d 27 5c 22 27 20 29 7b 0a  0 && c!='\"' ){.
137d0 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
137e0 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n' ) lineno++;.
137f0 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20          cp++;.  
13800 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13810 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
13820 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65  ErrorMsg(ps.file
13830 6e 61 6d 65 2c 73 74 61 72 74 6c 69 6e 65 2c 0a  name,startline,.
13840 22 53 74 72 69 6e 67 20 73 74 61 72 74 69 6e 67  "String starting
13850 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73   on this line is
13860 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20   not terminated 
13870 62 65 66 6f 72 65 20 74 68 65 20 65 6e 64 20 6f  before the end o
13880 66 20 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20  f the file.");. 
13890 20 20 20 20 20 20 20 70 73 2e 65 72 72 6f 72 63         ps.errorc
138a0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65  nt++;.        ne
138b0 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 20  xtcp = cp;.     
138c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
138d0 6e 65 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20  nextcp = cp+1;. 
138e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
138f0 20 69 66 28 20 63 3d 3d 27 7b 27 20 29 7b 20 20   if( c=='{' ){  
13900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13910 41 20 62 6c 6f 63 6b 20 6f 66 20 43 20 63 6f 64  A block of C cod
13920 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c  e */.      int l
13930 65 76 65 6c 3b 0a 20 20 20 20 20 20 63 70 2b 2b  evel;.      cp++
13940 3b 0a 20 20 20 20 20 20 66 6f 72 28 6c 65 76 65  ;.      for(leve
13950 6c 3d 31 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30  l=1; (c= *cp)!=0
13960 20 26 26 20 28 6c 65 76 65 6c 3e 31 20 7c 7c 20   && (level>1 || 
13970 63 21 3d 27 7d 27 29 3b 20 63 70 2b 2b 29 7b 0a  c!='}'); cp++){.
13980 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
13990 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n' ) lineno++;.
139a0 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
139b0 20 63 3d 3d 27 7b 27 20 29 20 6c 65 76 65 6c 2b   c=='{' ) level+
139c0 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20  +;.        else 
139d0 69 66 28 20 63 3d 3d 27 7d 27 20 29 20 6c 65 76  if( c=='}' ) lev
139e0 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 20 20 65 6c  el--;.        el
139f0 73 65 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26  se if( c=='/' &&
13a00 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20   cp[1]=='*' ){  
13a10 2f 2a 20 53 6b 69 70 20 63 6f 6d 6d 65 6e 74 73  /* Skip comments
13a20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e   */.          in
13a30 74 20 70 72 65 76 63 3b 0a 20 20 20 20 20 20 20  t prevc;.       
13a40 20 20 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a     cp = &cp[2];.
13a50 20 20 20 20 20 20 20 20 20 20 70 72 65 76 63 20            prevc 
13a60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 77  = 0;.          w
13a70 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d  hile( (c= *cp)!=
13a80 30 20 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20  0 && (c!='/' || 
13a90 70 72 65 76 63 21 3d 27 2a 27 29 20 29 7b 0a 20  prevc!='*') ){. 
13aa0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63             if( c
13ab0 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
13ac0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  +;.            p
13ad0 72 65 76 63 20 3d 20 63 3b 0a 20 20 20 20 20 20  revc = c;.      
13ae0 20 20 20 20 20 20 63 70 2b 2b 3b 0a 09 20 20 7d        cp++;..  }
13af0 0a 09 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27  ..}else if( c=='
13b00 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27  /' && cp[1]=='/'
13b10 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b   ){  /* Skip C++
13b20 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20   style comments 
13b30 74 6f 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  too */.         
13b40 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20   cp = &cp[2];.  
13b50 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
13b60 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21  c= *cp)!=0 && c!
13b70 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20  ='\n' ) cp++;.  
13b80 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 20          if( c ) 
13b90 6c 69 6e 65 6e 6f 2b 2b 3b 0a 09 7d 65 6c 73 65  lineno++;..}else
13ba0 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c 20   if( c=='\'' || 
13bb0 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20 2f 2a  c=='\"' ){    /*
13bc0 20 53 74 72 69 6e 67 20 61 20 63 68 61 72 61 63   String a charac
13bd0 74 65 72 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a  ter literals */.
13be0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 73 74            int st
13bf0 61 72 74 63 68 61 72 2c 20 70 72 65 76 63 3b 0a  artchar, prevc;.
13c00 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 63            startc
13c10 68 61 72 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  har = c;.       
13c20 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20     prevc = 0;.  
13c30 20 20 20 20 20 20 20 20 66 6f 72 28 63 70 2b 2b          for(cp++
13c40 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ; (c= *cp)!=0 &&
13c50 20 28 63 21 3d 73 74 61 72 74 63 68 61 72 20 7c   (c!=startchar |
13c60 7c 20 70 72 65 76 63 3d 3d 27 5c 5c 27 29 3b 20  | prevc=='\\'); 
13c70 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  cp++){.         
13c80 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
13c90 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
13ca0 20 20 20 20 20 20 20 69 66 28 20 70 72 65 76 63         if( prevc
13cb0 3d 3d 27 5c 5c 27 20 29 20 70 72 65 76 63 20 3d  =='\\' ) prevc =
13cc0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
13cd0 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
13ce0 20 20 70 72 65 76 63 20 3d 20 63 3b 0a 09 20 20    prevc = c;..  
13cf0 7d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20  }..}.      }.   
13d00 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
13d10 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
13d20 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 70 73 2e 74  ps.filename,ps.t
13d30 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20 63  okenlineno,."C c
13d40 6f 64 65 20 73 74 61 72 74 69 6e 67 20 6f 6e 20  ode starting on 
13d50 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74  this line is not
13d60 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f   terminated befo
13d70 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  re the end of th
13d80 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20  e file.");.     
13d90 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b     ps.errorcnt++
13da0 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70  ;.        nextcp
13db0 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c   = cp;.      }el
13dc0 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74  se{.        next
13dd0 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20  cp = cp+1;.     
13de0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
13df0 20 69 73 61 6c 6e 75 6d 28 63 29 20 29 7b 20 20   isalnum(c) ){  
13e00 20 20 20 20 20 20 20 20 2f 2a 20 49 64 65 6e 74          /* Ident
13e10 69 66 69 65 72 73 20 2a 2f 0a 20 20 20 20 20 20  ifiers */.      
13e20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21  while( (c= *cp)!
13e30 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 63  =0 && (isalnum(c
13e40 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63  ) || c=='_') ) c
13e50 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63  p++;.      nextc
13e60 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73  p = cp;.    }els
13e70 65 20 69 66 28 20 63 3d 3d 27 3a 27 20 26 26 20  e if( c==':' && 
13e80 63 70 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 63 70  cp[1]==':' && cp
13e90 5b 32 5d 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20 54  [2]=='=' ){ /* T
13ea0 68 65 20 6f 70 65 72 61 74 6f 72 20 22 3a 3a 3d  he operator "::=
13eb0 22 20 2a 2f 0a 20 20 20 20 20 20 63 70 20 2b 3d  " */.      cp +=
13ec0 20 33 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70   3;.      nextcp
13ed0 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65   = cp;.    }else
13ee0 20 69 66 28 20 28 63 3d 3d 27 2f 27 20 7c 7c 20   if( (c=='/' || 
13ef0 63 3d 3d 27 7c 27 29 20 26 26 20 69 73 61 6c 70  c=='|') && isalp
13f00 68 61 28 63 70 5b 31 5d 29 20 29 7b 0a 20 20 20  ha(cp[1]) ){.   
13f10 20 20 20 63 70 20 2b 3d 20 32 3b 0a 20 20 20 20     cp += 2;.    
13f20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 63    while( (c = *c
13f30 70 29 21 3d 30 20 26 26 20 28 69 73 61 6c 6e 75  p)!=0 && (isalnu
13f40 6d 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20  m(c) || c=='_') 
13f50 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65  ) cp++;.      ne
13f60 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d  xtcp = cp;.    }
13f70 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20  else{           
13f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13f90 2a 20 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65  * All other (one
13fa0 20 63 68 61 72 61 63 74 65 72 29 20 6f 70 65 72   character) oper
13fb0 61 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 63  ators */.      c
13fc0 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63  p++;.      nextc
13fd0 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20  p = cp;.    }.  
13fe0 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a    c = *cp;.    *
13ff0 63 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  cp = 0;         
14000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14010 2a 20 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65  * Null terminate
14020 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20   the token */.  
14030 20 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28    parseonetoken(
14040 26 70 73 29 3b 20 20 20 20 20 20 20 20 20 20 20  &ps);           
14050 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 74    /* Parse the t
14060 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20  oken */.    *cp 
14070 3d 20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  = c;            
14080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
14090 65 73 74 6f 72 65 20 74 68 65 20 62 75 66 66 65  estore the buffe
140a0 72 20 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65  r */.    cp = ne
140b0 78 74 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65  xtcp;.  }.  free
140c0 28 66 69 6c 65 62 75 66 29 3b 20 20 20 20 20 20  (filebuf);      
140d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
140e0 20 52 65 6c 65 61 73 65 20 74 68 65 20 62 75 66   Release the buf
140f0 66 65 72 20 61 66 74 65 72 20 70 61 72 73 69 6e  fer after parsin
14100 67 20 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20  g */.  gp->rule 
14110 3d 20 70 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a  = ps.firstrule;.
14120 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d    gp->errorcnt =
14130 20 70 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a   ps.errorcnt;.}.
14140 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
14150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
14160 6d 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69 6e  m the file "plin
14170 6b 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  k.c" ***********
14180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a  **********/./*.*
14190 2a 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65  * Routines proce
141a0 73 73 69 6e 67 20 63 6f 6e 66 69 67 75 72 61 74  ssing configurat
141b0 69 6f 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70  ion follow-set p
141c0 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73  ropagation links
141d0 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e  .** in the LEMON
141e0 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
141f0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  r..*/.static str
14200 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b  uct plink *plink
14210 5f 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a  _freelist = 0;..
14220 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
14230 77 20 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63  w plink */.struc
14240 74 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e  t plink *Plink_n
14250 65 77 28 29 7b 0a 20 20 73 74 72 75 63 74 20 70  ew(){.  struct p
14260 6c 69 6e 6b 20 2a 6e 65 77 3b 0a 0a 20 20 69 66  link *new;..  if
14270 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74  ( plink_freelist
14280 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
14290 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20  ;.    int amt = 
142a0 31 30 30 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66  100;.    plink_f
142b0 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63  reelist = (struc
142c0 74 20 70 6c 69 6e 6b 20 2a 29 63 61 6c 6c 6f 63  t plink *)calloc
142d0 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74  ( amt, sizeof(st
142e0 72 75 63 74 20 70 6c 69 6e 6b 29 20 29 3b 0a 20  ruct plink) );. 
142f0 20 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65     if( plink_fre
14300 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  elist==0 ){.    
14310 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
14320 2c 0a 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20  ,.      "Unable 
14330 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
14340 72 79 20 66 6f 72 20 61 20 6e 65 77 20 66 6f 6c  ry for a new fol
14350 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74  low-set propagat
14360 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20  ion link.\n");. 
14370 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
14380 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
14390 20 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 70   i<amt-1; i++) p
143a0 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 5d  link_freelist[i]
143b0 2e 6e 65 78 74 20 3d 20 26 70 6c 69 6e 6b 5f 66  .next = &plink_f
143c0 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20  reelist[i+1];.  
143d0 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74    plink_freelist
143e0 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30  [amt-1].next = 0
143f0 3b 0a 20 20 7d 0a 20 20 6e 65 77 20 3d 20 70 6c  ;.  }.  new = pl
14400 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20  ink_freelist;.  
14410 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d  plink_freelist =
14420 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 2d   plink_freelist-
14430 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20  >next;.  return 
14440 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61  new;.}../* Add a
14450 20 70 6c 69 6e 6b 20 74 6f 20 61 20 70 6c 69 6e   plink to a plin
14460 6b 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50  k list */.void P
14470 6c 69 6e 6b 5f 61 64 64 28 70 6c 70 70 2c 63 66  link_add(plpp,cf
14480 70 29 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  p).struct plink 
14490 2a 2a 70 6c 70 70 3b 0a 73 74 72 75 63 74 20 63  **plpp;.struct c
144a0 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20  onfig *cfp;.{.  
144b0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
144c0 77 3b 0a 20 20 6e 65 77 20 3d 20 50 6c 69 6e 6b  w;.  new = Plink
144d0 5f 6e 65 77 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e  _new();.  new->n
144e0 65 78 74 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a  ext = *plpp;.  *
144f0 70 6c 70 70 20 3d 20 6e 65 77 3b 0a 20 20 6e 65  plpp = new;.  ne
14500 77 2d 3e 63 66 70 20 3d 20 63 66 70 3b 0a 7d 0a  w->cfp = cfp;.}.
14510 0a 2f 2a 20 54 72 61 6e 73 66 65 72 20 65 76 65  ./* Transfer eve
14520 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20  ry plink on the 
14530 6c 69 73 74 20 22 66 72 6f 6d 22 20 74 6f 20 74  list "from" to t
14540 68 65 20 6c 69 73 74 20 22 74 6f 22 20 2a 2f 0a  he list "to" */.
14550 76 6f 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28  void Plink_copy(
14560 74 6f 2c 66 72 6f 6d 29 0a 73 74 72 75 63 74 20  to,from).struct 
14570 70 6c 69 6e 6b 20 2a 2a 74 6f 3b 0a 73 74 72 75  plink **to;.stru
14580 63 74 20 70 6c 69 6e 6b 20 2a 66 72 6f 6d 3b 0a  ct plink *from;.
14590 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  {.  struct plink
145a0 20 2a 6e 65 78 74 70 6c 3b 0a 20 20 77 68 69 6c   *nextpl;.  whil
145b0 65 28 20 66 72 6f 6d 20 29 7b 0a 20 20 20 20 6e  e( from ){.    n
145c0 65 78 74 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65  extpl = from->ne
145d0 78 74 3b 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e 65  xt;.    from->ne
145e0 78 74 20 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a 74  xt = *to;.    *t
145f0 6f 20 3d 20 66 72 6f 6d 3b 0a 20 20 20 20 66 72  o = from;.    fr
14600 6f 6d 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d  om = nextpl;.  }
14610 0a 7d 0a 0a 2f 2a 20 44 65 6c 65 74 65 20 65 76  .}../* Delete ev
14620 65 72 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65  ery plink on the
14630 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c   list */.void Pl
14640 69 6e 6b 5f 64 65 6c 65 74 65 28 70 6c 70 29 0a  ink_delete(plp).
14650 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c  struct plink *pl
14660 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c  p;.{.  struct pl
14670 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20  ink *nextpl;..  
14680 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20  while( plp ){.  
14690 20 20 6e 65 78 74 70 6c 20 3d 20 70 6c 70 2d 3e    nextpl = plp->
146a0 6e 65 78 74 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e  next;.    plp->n
146b0 65 78 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65  ext = plink_free
146c0 6c 69 73 74 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f  list;.    plink_
146d0 66 72 65 65 6c 69 73 74 20 3d 20 70 6c 70 3b 0a  freelist = plp;.
146e0 20 20 20 20 70 6c 70 20 3d 20 6e 65 78 74 70 6c      plp = nextpl
146f0 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  ;.  }.}./*******
14700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14710 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
14720 72 65 70 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  report.c" ******
14730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14740 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  ****/./*.** Proc
14750 65 64 75 72 65 73 20 66 6f 72 20 67 65 6e 65 72  edures for gener
14760 61 74 69 6e 67 20 72 65 70 6f 72 74 73 20 61 6e  ating reports an
14770 64 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  d tables in the 
14780 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
14790 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47  erator..*/../* G
147a0 65 6e 65 72 61 74 65 20 61 20 66 69 6c 65 6e 61  enerate a filena
147b0 6d 65 20 77 69 74 68 20 74 68 65 20 67 69 76 65  me with the give
147c0 6e 20 73 75 66 66 69 78 2e 20 20 53 70 61 63 65  n suffix.  Space
147d0 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
147e0 6e 61 6d 65 20 63 6f 6d 65 73 20 66 72 6f 6d 20  name comes from 
147f0 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  malloc() and mus
14800 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
14810 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
14820 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54  ction..*/.PRIVAT
14830 45 20 63 68 61 72 20 2a 66 69 6c 65 5f 6d 61 6b  E char *file_mak
14840 65 6e 61 6d 65 28 6c 65 6d 70 2c 73 75 66 66 69  ename(lemp,suffi
14850 78 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  x).struct lemon 
14860 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73 75 66  *lemp;.char *suf
14870 66 69 78 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 6e  fix;.{.  char *n
14880 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b  ame;.  char *cp;
14890 0a 0a 20 20 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f  ..  name = mallo
148a0 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c  c( lemonStrlen(l
148b0 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 20 2b  emp->filename) +
148c0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 75 66   lemonStrlen(suf
148d0 66 69 78 29 20 2b 20 35 20 29 3b 0a 20 20 69 66  fix) + 5 );.  if
148e0 28 20 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  ( name==0 ){.   
148f0 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14900 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20  "Can't allocate 
14910 73 70 61 63 65 20 66 6f 72 20 61 20 66 69 6c 65  space for a file
14920 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20 20 20 20 65  name.\n");.    e
14930 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 73 74  xit(1);.  }.  st
14940 72 63 70 79 28 6e 61 6d 65 2c 6c 65 6d 70 2d 3e  rcpy(name,lemp->
14950 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 63 70 20  filename);.  cp 
14960 3d 20 73 74 72 72 63 68 72 28 6e 61 6d 65 2c 27  = strrchr(name,'
14970 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20 29 20  .');.  if( cp ) 
14980 2a 63 70 20 3d 20 30 3b 0a 20 20 73 74 72 63 61  *cp = 0;.  strca
14990 74 28 6e 61 6d 65 2c 73 75 66 66 69 78 29 3b 0a  t(name,suffix);.
149a0 20 20 72 65 74 75 72 6e 20 6e 61 6d 65 3b 0a 7d    return name;.}
149b0 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  ../* Open a file
149c0 20 77 69 74 68 20 61 20 6e 61 6d 65 20 62 61 73   with a name bas
149d0 65 64 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20 6f  ed on the name o
149e0 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
149f0 2c 0a 2a 2a 20 62 75 74 20 77 69 74 68 20 61 20  ,.** but with a 
14a00 64 69 66 66 65 72 65 6e 74 20 28 73 70 65 63 69  different (speci
14a10 66 69 65 64 29 20 73 75 66 66 69 78 2c 20 61 6e  fied) suffix, an
14a20 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
14a30 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 72  er.** to the str
14a40 65 61 6d 20 2a 2f 0a 50 52 49 56 41 54 45 20 46  eam */.PRIVATE F
14a50 49 4c 45 20 2a 66 69 6c 65 5f 6f 70 65 6e 28 6c  ILE *file_open(l
14a60 65 6d 70 2c 73 75 66 66 69 78 2c 6d 6f 64 65 29  emp,suffix,mode)
14a70 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
14a80 65 6d 70 3b 0a 63 68 61 72 20 2a 73 75 66 66 69  emp;.char *suffi
14a90 78 3b 0a 63 68 61 72 20 2a 6d 6f 64 65 3b 0a 7b  x;.char *mode;.{
14aa0 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20 20  .  FILE *fp;..  
14ab0 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  if( lemp->outnam
14ac0 65 20 29 20 66 72 65 65 28 6c 65 6d 70 2d 3e 6f  e ) free(lemp->o
14ad0 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d 70 2d  utname);.  lemp-
14ae0 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c 65 5f  >outname = file_
14af0 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 73  makename(lemp, s
14b00 75 66 66 69 78 29 3b 0a 20 20 66 70 20 3d 20 66  uffix);.  fp = f
14b10 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61  open(lemp->outna
14b20 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66 28 20  me,mode);.  if( 
14b30 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65 3d 3d  fp==0 && *mode==
14b40 27 77 27 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  'w' ){.    fprin
14b50 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74  tf(stderr,"Can't
14b60 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25 73 5c   open file \"%s\
14b70 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75 74 6e  ".\n",lemp->outn
14b80 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e  ame);.    lemp->
14b90 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
14ba0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
14bb0 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a 2f 2a  return fp;.}../*
14bc0 20 44 75 70 6c 69 63 61 74 65 20 74 68 65 20 69   Duplicate the i
14bd0 6e 70 75 74 20 66 69 6c 65 20 77 69 74 68 6f 75  nput file withou
14be0 74 20 63 6f 6d 6d 65 6e 74 73 20 61 6e 64 20 77  t comments and w
14bf0 69 74 68 6f 75 74 20 61 63 74 69 6f 6e 73 20 0a  ithout actions .
14c00 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a 2f 0a 76  ** on rules */.v
14c10 6f 69 64 20 52 65 70 72 69 6e 74 28 6c 65 6d 70  oid Reprint(lemp
14c20 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
14c30 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74  lemp;.{.  struct
14c40 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74 72   rule *rp;.  str
14c50 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
14c60 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6d 61 78 6c    int i, j, maxl
14c70 65 6e 2c 20 6c 65 6e 2c 20 6e 63 6f 6c 75 6d 6e  en, len, ncolumn
14c80 73 2c 20 73 6b 69 70 3b 0a 20 20 70 72 69 6e 74  s, skip;.  print
14c90 66 28 22 2f 2f 20 52 65 70 72 69 6e 74 20 6f 66  f("// Reprint of
14ca0 20 69 6e 70 75 74 20 66 69 6c 65 20 5c 22 25 73   input file \"%s
14cb0 5c 22 2e 5c 6e 2f 2f 20 53 79 6d 62 6f 6c 73 3a  \".\n// Symbols:
14cc0 5c 6e 22 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  \n",lemp->filena
14cd0 6d 65 29 3b 0a 20 20 6d 61 78 6c 65 6e 20 3d 20  me);.  maxlen = 
14ce0 31 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  10;.  for(i=0; i
14cf0 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
14d00 69 2b 2b 29 7b 0a 20 20 20 20 73 70 20 3d 20 6c  i++){.    sp = l
14d10 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
14d20 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f 6e  .    len = lemon
14d30 53 74 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29  Strlen(sp->name)
14d40 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61  ;.    if( len>ma
14d50 78 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20  xlen ) maxlen = 
14d60 6c 65 6e 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75  len;.  }.  ncolu
14d70 6d 6e 73 20 3d 20 37 36 2f 28 6d 61 78 6c 65 6e  mns = 76/(maxlen
14d80 2b 35 29 3b 0a 20 20 69 66 28 20 6e 63 6f 6c 75  +5);.  if( ncolu
14d90 6d 6e 73 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e 73  mns<1 ) ncolumns
14da0 20 3d 20 31 3b 0a 20 20 73 6b 69 70 20 3d 20 28   = 1;.  skip = (
14db0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20  lemp->nsymbol + 
14dc0 6e 63 6f 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e 63  ncolumns - 1)/nc
14dd0 6f 6c 75 6d 6e 73 3b 0a 20 20 66 6f 72 28 69 3d  olumns;.  for(i=
14de0 30 3b 20 69 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b  0; i<skip; i++){
14df0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2f 2f 22  .    printf("//"
14e00 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20  );.    for(j=i; 
14e10 6a 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  j<lemp->nsymbol;
14e20 20 6a 2b 3d 73 6b 69 70 29 7b 0a 20 20 20 20 20   j+=skip){.     
14e30 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62   sp = lemp->symb
14e40 6f 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73  ols[j];.      as
14e50 73 65 72 74 28 20 73 70 2d 3e 69 6e 64 65 78 3d  sert( sp->index=
14e60 3d 6a 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6e  =j );.      prin
14e70 74 66 28 22 20 25 33 64 20 25 2d 2a 2e 2a 73 22  tf(" %3d %-*.*s"
14e80 2c 6a 2c 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e  ,j,maxlen,maxlen
14e90 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  ,sp->name);.    
14ea0 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e  }.    printf("\n
14eb0 22 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70  ");.  }.  for(rp
14ec0 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
14ed0 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
14ee0 20 20 20 70 72 69 6e 74 66 28 22 25 73 22 2c 72     printf("%s",r
14ef0 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20  p->lhs->name);. 
14f00 20 20 20 2f 2a 20 20 20 20 69 66 28 20 72 70 2d     /*    if( rp-
14f10 3e 6c 68 73 61 6c 69 61 73 20 29 20 70 72 69 6e  >lhsalias ) prin
14f20 74 66 28 22 28 25 73 29 22 2c 72 70 2d 3e 6c 68  tf("(%s)",rp->lh
14f30 73 61 6c 69 61 73 29 3b 20 2a 2f 0a 20 20 20 20  salias); */.    
14f40 70 72 69 6e 74 66 28 22 20 3a 3a 3d 22 29 3b 0a  printf(" ::=");.
14f50 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72      for(i=0; i<r
14f60 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
14f70 20 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68       sp = rp->rh
14f80 73 5b 69 5d 3b 0a 20 20 20 20 20 20 70 72 69 6e  s[i];.      prin
14f90 74 66 28 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61  tf(" %s", sp->na
14fa0 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  me);.      if( s
14fb0 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  p->type==MULTITE
14fc0 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
14fd0 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70 2d    for(j=1; j<sp-
14fe0 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a  >nsubsym; j++){.
14ff0 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66            printf
15000 28 22 7c 25 73 22 2c 20 73 70 2d 3e 73 75 62 73  ("|%s", sp->subs
15010 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ym[j]->name);.  
15020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
15030 20 20 20 20 20 20 2f 2a 20 69 66 28 20 72 70 2d        /* if( rp-
15040 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 29 20 70  >rhsalias[i] ) p
15050 72 69 6e 74 66 28 22 28 25 73 29 22 2c 72 70 2d  rintf("(%s)",rp-
15060 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 20 2a  >rhsalias[i]); *
15070 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e  /.    }.    prin
15080 74 66 28 22 2e 22 29 3b 0a 20 20 20 20 69 66 28  tf(".");.    if(
15090 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 29 20 70   rp->precsym ) p
150a0 72 69 6e 74 66 28 22 20 5b 25 73 5d 22 2c 72 70  rintf(" [%s]",rp
150b0 2d 3e 70 72 65 63 73 79 6d 2d 3e 6e 61 6d 65 29  ->precsym->name)
150c0 3b 0a 20 20 20 20 2f 2a 20 69 66 28 20 72 70 2d  ;.    /* if( rp-
150d0 3e 63 6f 64 65 20 29 20 70 72 69 6e 74 66 28 22  >code ) printf("
150e0 5c 6e 20 20 20 20 25 73 22 2c 72 70 2d 3e 63 6f  \n    %s",rp->co
150f0 64 65 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e  de); */.    prin
15100 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a  tf("\n");.  }.}.
15110 0a 76 6f 69 64 20 43 6f 6e 66 69 67 50 72 69 6e  .void ConfigPrin
15120 74 28 66 70 2c 63 66 70 29 0a 46 49 4c 45 20 2a  t(fp,cfp).FILE *
15130 66 70 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  fp;.struct confi
15140 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72 75  g *cfp;.{.  stru
15150 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73  ct rule *rp;.  s
15160 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
15170 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  ;.  int i, j;.  
15180 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20  rp = cfp->rp;.  
15190 66 70 72 69 6e 74 66 28 66 70 2c 22 25 73 20 3a  fprintf(fp,"%s :
151a0 3a 3d 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d  :=",rp->lhs->nam
151b0 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  e);.  for(i=0; i
151c0 3c 3d 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  <=rp->nrhs; i++)
151d0 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 63 66 70  {.    if( i==cfp
151e0 2d 3e 64 6f 74 20 29 20 66 70 72 69 6e 74 66 28  ->dot ) fprintf(
151f0 66 70 2c 22 20 2a 22 29 3b 0a 20 20 20 20 69 66  fp," *");.    if
15200 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20  ( i==rp->nrhs ) 
15210 62 72 65 61 6b 3b 0a 20 20 20 20 73 70 20 3d 20  break;.    sp = 
15220 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20  rp->rhs[i];.    
15230 66 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73 22  fprintf(fp," %s"
15240 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  , sp->name);.   
15250 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d   if( sp->type==M
15260 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
15270 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a        for(j=1; j
15280 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b  <sp->nsubsym; j+
15290 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  +){.        fpri
152a0 6e 74 66 28 66 70 2c 22 7c 25 73 22 2c 73 70 2d  ntf(fp,"|%s",sp-
152b0 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65  >subsym[j]->name
152c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
152d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 23 64 65 66 69  .  }.}../* #defi
152e0 6e 65 20 54 45 53 54 20 2a 2f 0a 23 69 66 20 30  ne TEST */.#if 0
152f0 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 65 74 20  ./* Print a set 
15300 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
15310 53 65 74 50 72 69 6e 74 28 6f 75 74 2c 73 65 74  SetPrint(out,set
15320 2c 6c 65 6d 70 29 0a 46 49 4c 45 20 2a 6f 75 74  ,lemp).FILE *out
15330 3b 0a 63 68 61 72 20 2a 73 65 74 3b 0a 73 74 72  ;.char *set;.str
15340 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
15350 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  .{.  int i;.  ch
15360 61 72 20 2a 73 70 61 63 65 72 3b 0a 20 20 73 70  ar *spacer;.  sp
15370 61 63 65 72 20 3d 20 22 22 3b 0a 20 20 66 70 72  acer = "";.  fpr
15380 69 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 5b 22  intf(out,"%12s["
15390 2c 22 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ,"");.  for(i=0;
153a0 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e   i<lemp->ntermin
153b0 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  al; i++){.    if
153c0 28 20 53 65 74 46 69 6e 64 28 73 65 74 2c 69 29  ( SetFind(set,i)
153d0 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
153e0 66 28 6f 75 74 2c 22 25 73 25 73 22 2c 73 70 61  f(out,"%s%s",spa
153f0 63 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  cer,lemp->symbol
15400 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  s[i]->name);.   
15410 20 20 20 73 70 61 63 65 72 20 3d 20 22 20 22 3b     spacer = " ";
15420 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
15430 69 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e 22 29 3b  intf(out,"]\n");
15440 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 70  .}../* Print a p
15450 6c 69 6e 6b 20 63 68 61 69 6e 20 2a 2f 0a 50 52  link chain */.PR
15460 49 56 41 54 45 20 76 6f 69 64 20 50 6c 69 6e 6b  IVATE void Plink
15470 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2c 74 61  Print(out,plp,ta
15480 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74  g).FILE *out;.st
15490 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b  ruct plink *plp;
154a0 0a 63 68 61 72 20 2a 74 61 67 3b 0a 7b 0a 20 20  .char *tag;.{.  
154b0 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20  while( plp ){.  
154c0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25    fprintf(out,"%
154d0 31 32 73 25 73 20 28 73 74 61 74 65 20 25 32 64  12s%s (state %2d
154e0 29 20 22 2c 22 22 2c 74 61 67 2c 70 6c 70 2d 3e  ) ","",tag,plp->
154f0 63 66 70 2d 3e 73 74 70 2d 3e 73 74 61 74 65 6e  cfp->stp->staten
15500 75 6d 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 50  um);.    ConfigP
15510 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2d 3e 63 66  rint(out,plp->cf
15520 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  p);.    fprintf(
15530 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 70  out,"\n");.    p
15540 6c 70 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a  lp = plp->next;.
15550 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a    }.}.#endif../*
15560 20 50 72 69 6e 74 20 61 6e 20 61 63 74 69 6f 6e   Print an action
15570 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69   to the given fi
15580 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
15590 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a  Return FALSE if.
155a0 2a 2a 20 6e 6f 74 68 69 6e 67 20 77 61 73 20 61  ** nothing was a
155b0 63 74 75 61 6c 6c 79 20 70 72 69 6e 74 65 64 2e  ctually printed.
155c0 0a 2a 2f 0a 69 6e 74 20 50 72 69 6e 74 41 63 74  .*/.int PrintAct
155d0 69 6f 6e 28 73 74 72 75 63 74 20 61 63 74 69 6f  ion(struct actio
155e0 6e 20 2a 61 70 2c 20 46 49 4c 45 20 2a 66 70 2c  n *ap, FILE *fp,
155f0 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20   int indent){.  
15600 69 6e 74 20 72 65 73 75 6c 74 20 3d 20 31 3b 0a  int result = 1;.
15610 20 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79    switch( ap->ty
15620 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  pe ){.    case S
15630 48 49 46 54 3a 0a 20 20 20 20 20 20 66 70 72 69  HIFT:.      fpri
15640 6e 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66  ntf(fp,"%*s shif
15650 74 20 20 25 64 22 2c 69 6e 64 65 6e 74 2c 61 70  t  %d",indent,ap
15660 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78  ->sp->name,ap->x
15670 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b  .stp->statenum);
15680 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
15690 20 20 63 61 73 65 20 52 45 44 55 43 45 3a 0a 20    case REDUCE:. 
156a0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
156b0 22 25 2a 73 20 72 65 64 75 63 65 20 25 64 22 2c  "%*s reduce %d",
156c0 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e  indent,ap->sp->n
156d0 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e  ame,ap->x.rp->in
156e0 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61  dex);.      brea
156f0 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 43 43 45  k;.    case ACCE
15700 50 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74  PT:.      fprint
15710 66 28 66 70 2c 22 25 2a 73 20 61 63 63 65 70 74  f(fp,"%*s accept
15720 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d  ",indent,ap->sp-
15730 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  >name);.      br
15740 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 52  eak;.    case ER
15750 52 4f 52 3a 0a 20 20 20 20 20 20 66 70 72 69 6e  ROR:.      fprin
15760 74 66 28 66 70 2c 22 25 2a 73 20 65 72 72 6f 72  tf(fp,"%*s error
15770 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d  ",indent,ap->sp-
15780 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72  >name);.      br
15790 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 52  eak;.    case SR
157a0 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 63 61  CONFLICT:.    ca
157b0 73 65 20 52 52 43 4f 4e 46 4c 49 43 54 3a 0a 20  se RRCONFLICT:. 
157c0 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
157d0 22 25 2a 73 20 72 65 64 75 63 65 20 25 2d 33 64  "%*s reduce %-3d
157e0 20 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66   ** Parsing conf
157f0 6c 69 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20  lict **",.      
15800 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d    indent,ap->sp-
15810 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e  >name,ap->x.rp->
15820 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72  index);.      br
15830 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53  eak;.    case SS
15840 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20  CONFLICT:.      
15850 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20  fprintf(fp,"%*s 
15860 73 68 69 66 74 20 20 25 64 20 2a 2a 20 50 61 72  shift  %d ** Par
15870 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a  sing conflict **
15880 22 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 64 65  ", .        inde
15890 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c  nt,ap->sp->name,
158a0 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65  ap->x.stp->state
158b0 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61  num);.      brea
158c0 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 48 5f 52  k;.    case SH_R
158d0 45 53 4f 4c 56 45 44 3a 0a 20 20 20 20 63 61 73  ESOLVED:.    cas
158e0 65 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a 20  e RD_RESOLVED:. 
158f0 20 20 20 63 61 73 65 20 4e 4f 54 5f 55 53 45 44     case NOT_USED
15900 3a 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d  :.      result =
15910 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
15920 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
15930 73 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  sult;.}../* Gene
15940 72 61 74 65 20 74 68 65 20 22 79 2e 6f 75 74 70  rate the "y.outp
15950 75 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a  ut" log file */.
15960 76 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75  void ReportOutpu
15970 74 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  t(lemp).struct l
15980 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
15990 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
159a0 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
159b0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
159c0 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
159d0 6e 20 2a 61 70 3b 0a 20 20 46 49 4c 45 20 2a 66  n *ap;.  FILE *f
159e0 70 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65 5f  p;..  fp = file_
159f0 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74 22  open(lemp,".out"
15a00 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 66 70  ,"wb");.  if( fp
15a10 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
15a20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
15a30 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
15a40 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
15a50 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 70  orted[i];.    fp
15a60 72 69 6e 74 66 28 66 70 2c 22 53 74 61 74 65 20  rintf(fp,"State 
15a70 25 64 3a 5c 6e 22 2c 73 74 70 2d 3e 73 74 61 74  %d:\n",stp->stat
15a80 65 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 6c  enum);.    if( l
15a90 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29  emp->basisflag )
15aa0 20 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a 20 20   cfp=stp->bp;.  
15ab0 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
15ac0 20 20 20 20 20 20 20 20 63 66 70 3d 73 74 70 2d          cfp=stp-
15ad0 3e 63 66 70 3b 0a 20 20 20 20 77 68 69 6c 65 28  >cfp;.    while(
15ae0 20 63 66 70 20 29 7b 0a 20 20 20 20 20 20 63 68   cfp ){.      ch
15af0 61 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20 20 20  ar buf[20];.    
15b00 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3d 3d    if( cfp->dot==
15b10 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 7b  cfp->rp->nrhs ){
15b20 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
15b30 28 62 75 66 2c 22 28 25 64 29 22 2c 63 66 70 2d  (buf,"(%d)",cfp-
15b40 3e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  >rp->index);.   
15b50 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
15b60 22 20 20 20 20 25 35 73 20 22 2c 62 75 66 29 3b  "    %5s ",buf);
15b70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15b80 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
15b90 2c 22 20 20 20 20 20 20 20 20 20 20 22 29 3b 0a  ,"          ");.
15ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 43 6f        }.      Co
15bb0 6e 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66 70  nfigPrint(fp,cfp
15bc0 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
15bd0 28 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 20 30  (fp,"\n");.#if 0
15be0 0a 20 20 20 20 20 20 53 65 74 50 72 69 6e 74 28  .      SetPrint(
15bf0 66 70 2c 63 66 70 2d 3e 66 77 73 2c 6c 65 6d 70  fp,cfp->fws,lemp
15c00 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72  );.      PlinkPr
15c10 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66 70 6c 70  int(fp,cfp->fplp
15c20 2c 22 54 6f 20 20 22 29 3b 0a 20 20 20 20 20 20  ,"To  ");.      
15c30 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66  PlinkPrint(fp,cf
15c40 70 2d 3e 62 70 6c 70 2c 22 46 72 6f 6d 22 29 3b  p->bplp,"From");
15c50 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
15c60 28 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61  ( lemp->basisfla
15c70 67 20 29 20 63 66 70 3d 63 66 70 2d 3e 62 70 3b  g ) cfp=cfp->bp;
15c80 0a 20 20 20 20 20 20 65 6c 73 65 20 20 20 20 20  .      else     
15c90 20 20 20 20 20 20 20 20 20 20 20 20 20 63 66 70               cfp
15ca0 3d 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20  =cfp->next;.    
15cb0 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70  }.    fprintf(fp
15cc0 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28  ,"\n");.    for(
15cd0 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
15ce0 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
15cf0 20 20 20 20 69 66 28 20 50 72 69 6e 74 41 63 74      if( PrintAct
15d00 69 6f 6e 28 61 70 2c 66 70 2c 33 30 29 20 29 20  ion(ap,fp,30) ) 
15d10 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29  fprintf(fp,"\n")
15d20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
15d30 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20  ntf(fp,"\n");.  
15d40 7d 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20  }.  fprintf(fp, 
15d50 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  "---------------
15d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d80 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 66 70 72  -----\n");.  fpr
15d90 69 6e 74 66 28 66 70 2c 20 22 53 79 6d 62 6f 6c  intf(fp, "Symbol
15da0 73 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69 3d  s:\n");.  for(i=
15db0 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
15dc0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ol; i++){.    in
15dd0 74 20 6a 3b 0a 20 20 20 20 73 74 72 75 63 74 20  t j;.    struct 
15de0 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 20  symbol *sp;..   
15df0 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62   sp = lemp->symb
15e00 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69  ols[i];.    fpri
15e10 6e 74 66 28 66 70 2c 20 22 20 20 25 33 64 3a 20  ntf(fp, "  %3d: 
15e20 25 73 22 2c 20 69 2c 20 73 70 2d 3e 6e 61 6d 65  %s", i, sp->name
15e30 29 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74  );.    if( sp->t
15e40 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c  ype==NONTERMINAL
15e50 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
15e60 66 28 66 70 2c 20 22 3a 22 29 3b 0a 20 20 20 20  f(fp, ":");.    
15e70 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61    if( sp->lambda
15e80 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69   ){.        fpri
15e90 6e 74 66 28 66 70 2c 20 22 20 3c 6c 61 6d 62 64  ntf(fp, " <lambd
15ea0 61 3e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  a>");.      }.  
15eb0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c      for(j=0; j<l
15ec0 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
15ed0 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  j++){.        if
15ee0 28 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20 26  ( sp->firstset &
15ef0 26 20 53 65 74 46 69 6e 64 28 73 70 2d 3e 66 69  & SetFind(sp->fi
15f00 72 73 74 73 65 74 2c 20 6a 29 20 29 7b 0a 20 20  rstset, j) ){.  
15f10 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
15f20 66 70 2c 20 22 20 25 73 22 2c 20 6c 65 6d 70 2d  fp, " %s", lemp-
15f30 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2d 3e 6e 61 6d  >symbols[j]->nam
15f40 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
15f50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15f60 66 70 72 69 6e 74 66 28 66 70 2c 20 22 5c 6e 22  fprintf(fp, "\n"
15f70 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28  );.  }.  fclose(
15f80 66 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  fp);.  return;.}
15f90 0a 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20  ../* Search for 
15fa0 74 68 65 20 66 69 6c 65 20 22 6e 61 6d 65 22 20  the file "name" 
15fb0 77 68 69 63 68 20 69 73 20 69 6e 20 74 68 65 20  which is in the 
15fc0 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
15fd0 73 0a 2a 2a 20 74 68 65 20 65 78 61 63 75 74 61  s.** the exacuta
15fe0 62 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 63  ble */.PRIVATE c
15ff0 68 61 72 20 2a 70 61 74 68 73 65 61 72 63 68 28  har *pathsearch(
16000 61 72 67 76 30 2c 6e 61 6d 65 2c 6d 6f 64 65 6d  argv0,name,modem
16010 61 73 6b 29 0a 63 68 61 72 20 2a 61 72 67 76 30  ask).char *argv0
16020 3b 0a 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 69 6e  ;.char *name;.in
16030 74 20 6d 6f 64 65 6d 61 73 6b 3b 0a 7b 0a 20 20  t modemask;.{.  
16040 63 68 61 72 20 2a 70 61 74 68 6c 69 73 74 3b 0a  char *pathlist;.
16050 20 20 63 68 61 72 20 2a 70 61 74 68 2c 2a 63 70    char *path,*cp
16060 3b 0a 20 20 63 68 61 72 20 63 3b 0a 0a 23 69 66  ;.  char c;..#if
16070 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 20 20  def __WIN32__.  
16080 63 70 20 3d 20 73 74 72 72 63 68 72 28 61 72 67  cp = strrchr(arg
16090 76 30 2c 27 5c 5c 27 29 3b 0a 23 65 6c 73 65 0a  v0,'\\');.#else.
160a0 20 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 61    cp = strrchr(a
160b0 72 67 76 30 2c 27 2f 27 29 3b 0a 23 65 6e 64 69  rgv0,'/');.#endi
160c0 66 0a 20 20 69 66 28 20 63 70 20 29 7b 0a 20 20  f.  if( cp ){.  
160d0 20 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a    c = *cp;.    *
160e0 63 70 20 3d 20 30 3b 0a 20 20 20 20 70 61 74 68  cp = 0;.    path
160f0 20 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f   = (char *)mallo
16100 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 61  c( lemonStrlen(a
16110 72 67 76 30 29 20 2b 20 6c 65 6d 6f 6e 53 74 72  rgv0) + lemonStr
16120 6c 65 6e 28 6e 61 6d 65 29 20 2b 20 32 20 29 3b  len(name) + 2 );
16130 0a 20 20 20 20 69 66 28 20 70 61 74 68 20 29 20  .    if( path ) 
16140 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73  sprintf(path,"%s
16150 2f 25 73 22 2c 61 72 67 76 30 2c 6e 61 6d 65 29  /%s",argv0,name)
16160 3b 0a 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20  ;.    *cp = c;. 
16170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 78 74 65   }else{.    exte
16180 72 6e 20 63 68 61 72 20 2a 67 65 74 65 6e 76 28  rn char *getenv(
16190 29 3b 0a 20 20 20 20 70 61 74 68 6c 69 73 74 20  );.    pathlist 
161a0 3d 20 67 65 74 65 6e 76 28 22 50 41 54 48 22 29  = getenv("PATH")
161b0 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68 6c 69  ;.    if( pathli
161c0 73 74 3d 3d 30 20 29 20 70 61 74 68 6c 69 73 74  st==0 ) pathlist
161d0 20 3d 20 22 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f   = ".:/bin:/usr/
161e0 62 69 6e 22 3b 0a 20 20 20 20 70 61 74 68 20 3d  bin";.    path =
161f0 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28   (char *)malloc(
16200 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74   lemonStrlen(pat
16210 68 6c 69 73 74 29 2b 6c 65 6d 6f 6e 53 74 72 6c  hlist)+lemonStrl
16220 65 6e 28 6e 61 6d 65 29 2b 32 20 29 3b 0a 20 20  en(name)+2 );.  
16230 20 20 69 66 28 20 70 61 74 68 21 3d 30 20 29 7b    if( path!=0 ){
16240 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 70  .      while( *p
16250 61 74 68 6c 69 73 74 20 29 7b 0a 20 20 20 20 20  athlist ){.     
16260 20 20 20 63 70 20 3d 20 73 74 72 63 68 72 28 70     cp = strchr(p
16270 61 74 68 6c 69 73 74 2c 27 3a 27 29 3b 0a 20 20  athlist,':');.  
16280 20 20 20 20 20 20 69 66 28 20 63 70 3d 3d 30 20        if( cp==0 
16290 29 20 63 70 20 3d 20 26 70 61 74 68 6c 69 73 74  ) cp = &pathlist
162a0 5b 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74  [lemonStrlen(pat
162b0 68 6c 69 73 74 29 5d 3b 0a 20 20 20 20 20 20 20  hlist)];.       
162c0 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20   c = *cp;.      
162d0 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 20    *cp = 0;.     
162e0 20 20 20 73 70 72 69 6e 74 66 28 70 61 74 68 2c     sprintf(path,
162f0 22 25 73 2f 25 73 22 2c 70 61 74 68 6c 69 73 74  "%s/%s",pathlist
16300 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ,name);.        
16310 2a 63 70 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  *cp = c;.       
16320 20 69 66 28 20 63 3d 3d 30 20 29 20 70 61 74 68   if( c==0 ) path
16330 6c 69 73 74 20 3d 20 22 22 3b 0a 20 20 20 20 20  list = "";.     
16340 20 20 20 65 6c 73 65 20 70 61 74 68 6c 69 73 74     else pathlist
16350 20 3d 20 26 63 70 5b 31 5d 3b 0a 20 20 20 20 20   = &cp[1];.     
16360 20 20 20 69 66 28 20 61 63 63 65 73 73 28 70 61     if( access(pa
16370 74 68 2c 6d 6f 64 65 6d 61 73 6b 29 3d 3d 30 20  th,modemask)==0 
16380 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
16390 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
163a0 75 72 6e 20 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20  urn path;.}../* 
163b0 47 69 76 65 6e 20 61 6e 20 61 63 74 69 6f 6e 2c  Given an action,
163c0 20 63 6f 6d 70 75 74 65 20 74 68 65 20 69 6e 74   compute the int
163d0 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74  eger value for t
163e0 68 61 74 20 61 63 74 69 6f 6e 0a 2a 2a 20 77 68  hat action.** wh
163f0 69 63 68 20 69 73 20 74 6f 20 62 65 20 70 75 74  ich is to be put
16400 20 69 6e 20 74 68 65 20 61 63 74 69 6f 6e 20 74   in the action t
16410 61 62 6c 65 20 6f 66 20 74 68 65 20 67 65 6e 65  able of the gene
16420 72 61 74 65 64 20 6d 61 63 68 69 6e 65 2e 0a 2a  rated machine..*
16430 2a 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76  * Return negativ
16440 65 20 69 66 20 6e 6f 20 61 63 74 69 6f 6e 20 73  e if no action s
16450 68 6f 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74  hould be generat
16460 65 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 69  ed..*/.PRIVATE i
16470 6e 74 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f  nt compute_actio
16480 6e 28 6c 65 6d 70 2c 61 70 29 0a 73 74 72 75 63  n(lemp,ap).struc
16490 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 73  t lemon *lemp;.s
164a0 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
164b0 3b 0a 7b 0a 20 20 69 6e 74 20 61 63 74 3b 0a 20  ;.{.  int act;. 
164c0 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70   switch( ap->typ
164d0 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48  e ){.    case SH
164e0 49 46 54 3a 20 20 61 63 74 20 3d 20 61 70 2d 3e  IFT:  act = ap->
164f0 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 3b  x.stp->statenum;
16500 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
16510 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45 44 55  k;.    case REDU
16520 43 45 3a 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e  CE: act = ap->x.
16530 72 70 2d 3e 69 6e 64 65 78 20 2b 20 6c 65 6d 70  rp->index + lemp
16540 2d 3e 6e 73 74 61 74 65 3b 20 62 72 65 61 6b 3b  ->nstate; break;
16550 0a 20 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a  .    case ERROR:
16560 20 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73    act = lemp->ns
16570 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75  tate + lemp->nru
16580 6c 65 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  le;     break;. 
16590 20 20 20 63 61 73 65 20 41 43 43 45 50 54 3a 20     case ACCEPT: 
165a0 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  act = lemp->nsta
165b0 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  te + lemp->nrule
165c0 20 2b 20 31 3b 20 62 72 65 61 6b 3b 0a 20 20 20   + 1; break;.   
165d0 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 61 63   default:     ac
165e0 74 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 0a 20  t = -1; break;. 
165f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 63 74 3b   }.  return act;
16600 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45  .}..#define LINE
16610 53 49 5a 45 20 31 30 30 30 0a 2f 2a 20 54 68 65  SIZE 1000./* The
16620 20 6e 65 78 74 20 63 6c 75 73 74 65 72 20 6f 66   next cluster of
16630 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 66 6f   routines are fo
16640 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 74 65  r reading the te
16650 6d 70 6c 61 74 65 20 66 69 6c 65 0a 2a 2a 20 61  mplate file.** a
16660 6e 64 20 77 72 69 74 69 6e 67 20 74 68 65 20 72  nd writing the r
16670 65 73 75 6c 74 73 20 74 6f 20 74 68 65 20 67 65  esults to the ge
16680 6e 65 72 61 74 65 64 20 70 61 72 73 65 72 20 2a  nerated parser *
16690 2f 0a 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66  /./* The first f
166a0 75 6e 63 74 69 6f 6e 20 74 72 61 6e 73 66 65 72  unction transfer
166b0 73 20 64 61 74 61 20 66 72 6f 6d 20 22 69 6e 22  s data from "in"
166c0 20 74 6f 20 22 6f 75 74 22 20 75 6e 74 69 6c 0a   to "out" until.
166d0 2a 2a 20 61 20 6c 69 6e 65 20 69 73 20 73 65 65  ** a line is see
166e0 6e 20 77 68 69 63 68 20 62 65 67 69 6e 73 20 77  n which begins w
166f0 69 74 68 20 22 25 25 22 2e 20 20 54 68 65 20 6c  ith "%%".  The l
16700 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ine number is.**
16710 20 74 72 61 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20   tracked..**.** 
16720 69 66 20 6e 61 6d 65 21 3d 30 2c 20 74 68 65 6e  if name!=0, then
16730 20 61 6e 79 20 77 6f 72 64 20 74 68 61 74 20 62   any word that b
16740 65 67 69 6e 20 77 69 74 68 20 22 50 61 72 73 65  egin with "Parse
16750 22 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a  " is changed to.
16760 2a 2a 20 62 65 67 69 6e 20 77 69 74 68 20 2a 6e  ** begin with *n
16770 61 6d 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a  ame instead..*/.
16780 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c  PRIVATE void tpl
16790 74 5f 78 66 65 72 28 6e 61 6d 65 2c 69 6e 2c 6f  t_xfer(name,in,o
167a0 75 74 2c 6c 69 6e 65 6e 6f 29 0a 63 68 61 72 20  ut,lineno).char 
167b0 2a 6e 61 6d 65 3b 0a 46 49 4c 45 20 2a 69 6e 3b  *name;.FILE *in;
167c0 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 69 6e 74 20  .FILE *out;.int 
167d0 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 6e 74  *lineno;.{.  int
167e0 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 63 68   i, iStart;.  ch
167f0 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45  ar line[LINESIZE
16800 5d 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74  ];.  while( fget
16810 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c  s(line,LINESIZE,
16820 69 6e 29 20 26 26 20 28 6c 69 6e 65 5b 30 5d 21  in) && (line[0]!
16830 3d 27 25 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d 21  ='%' || line[1]!
16840 3d 27 25 27 29 20 29 7b 0a 20 20 20 20 28 2a 6c  ='%') ){.    (*l
16850 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69 53  ineno)++;.    iS
16860 74 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  tart = 0;.    if
16870 28 20 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  ( name ){.      
16880 66 6f 72 28 69 3d 30 3b 20 6c 69 6e 65 5b 69 5d  for(i=0; line[i]
16890 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
168a0 69 66 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50 27  if( line[i]=='P'
168b0 20 26 26 20 73 74 72 6e 63 6d 70 28 26 6c 69 6e   && strncmp(&lin
168c0 65 5b 69 5d 2c 22 50 61 72 73 65 22 2c 35 29 3d  e[i],"Parse",5)=
168d0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  =0.          && 
168e0 28 69 3d 3d 30 20 7c 7c 20 21 69 73 61 6c 70 68  (i==0 || !isalph
168f0 61 28 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a 20 20  a(line[i-1])).  
16900 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
16910 20 20 20 69 66 28 20 69 3e 69 53 74 61 72 74 20     if( i>iStart 
16920 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25  ) fprintf(out,"%
16930 2e 2a 73 22 2c 69 2d 69 53 74 61 72 74 2c 26 6c  .*s",i-iStart,&l
16940 69 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20  ine[iStart]);.  
16950 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
16960 6f 75 74 2c 22 25 73 22 2c 6e 61 6d 65 29 3b 0a  out,"%s",name);.
16970 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34            i += 4
16980 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53 74 61  ;.          iSta
16990 72 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20  rt = i+1;.      
169a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
169b0 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  }.    fprintf(ou
169c0 74 2c 22 25 73 22 2c 26 6c 69 6e 65 5b 69 53 74  t,"%s",&line[iSt
169d0 61 72 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  art]);.  }.}../*
169e0 20 54 68 65 20 6e 65 78 74 20 66 75 6e 63 74 69   The next functi
169f0 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 74 65 6d  on finds the tem
16a00 70 6c 61 74 65 20 66 69 6c 65 20 61 6e 64 20 6f  plate file and o
16a10 70 65 6e 73 20 69 74 2c 20 72 65 74 75 72 6e 69  pens it, returni
16a20 6e 67 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  ng.** a pointer 
16a30 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69  to the opened fi
16a40 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20 46  le. */.PRIVATE F
16a50 49 4c 45 20 2a 74 70 6c 74 5f 6f 70 65 6e 28 6c  ILE *tplt_open(l
16a60 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
16a70 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 61  n *lemp;.{.  sta
16a80 74 69 63 20 63 68 61 72 20 74 65 6d 70 6c 61 74  tic char templat
16a90 65 6e 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d 70 61  ename[] = "lempa
16aa0 72 2e 63 22 3b 0a 20 20 63 68 61 72 20 62 75 66  r.c";.  char buf
16ab0 5b 31 30 30 30 5d 3b 0a 20 20 46 49 4c 45 20 2a  [1000];.  FILE *
16ac0 69 6e 3b 0a 20 20 63 68 61 72 20 2a 74 70 6c 74  in;.  char *tplt
16ad0 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70  name;.  char *cp
16ae0 3b 0a 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68  ;..  cp = strrch
16af0 72 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  r(lemp->filename
16b00 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20  ,'.');.  if( cp 
16b10 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 62  ){.    sprintf(b
16b20 75 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28 69 6e  uf,"%.*s.lt",(in
16b30 74 29 28 63 70 2d 6c 65 6d 70 2d 3e 66 69 6c 65  t)(cp-lemp->file
16b40 6e 61 6d 65 29 2c 6c 65 6d 70 2d 3e 66 69 6c 65  name),lemp->file
16b50 6e 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  name);.  }else{.
16b60 20 20 20 20 73 70 72 69 6e 74 66 28 62 75 66 2c      sprintf(buf,
16b70 22 25 73 2e 6c 74 22 2c 6c 65 6d 70 2d 3e 66 69  "%s.lt",lemp->fi
16b80 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69  lename);.  }.  i
16b90 66 28 20 61 63 63 65 73 73 28 62 75 66 2c 30 30  f( access(buf,00
16ba0 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c  4)==0 ){.    tpl
16bb0 74 6e 61 6d 65 20 3d 20 62 75 66 3b 0a 20 20 7d  tname = buf;.  }
16bc0 65 6c 73 65 20 69 66 28 20 61 63 63 65 73 73 28  else if( access(
16bd0 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34  templatename,004
16be0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74  )==0 ){.    tplt
16bf0 6e 61 6d 65 20 3d 20 74 65 6d 70 6c 61 74 65 6e  name = templaten
16c00 61 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ame;.  }else{.  
16c10 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 70 61 74    tpltname = pat
16c20 68 73 65 61 72 63 68 28 6c 65 6d 70 2d 3e 61 72  hsearch(lemp->ar
16c30 67 76 30 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65  gv0,templatename
16c40 2c 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74  ,0);.  }.  if( t
16c50 70 6c 74 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  pltname==0 ){.  
16c60 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
16c70 2c 22 43 61 6e 27 74 20 66 69 6e 64 20 74 68 65  ,"Can't find the
16c80 20 70 61 72 73 65 72 20 64 72 69 76 65 72 20 74   parser driver t
16c90 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25  emplate file \"%
16ca0 73 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 74 65 6d  s\".\n",.    tem
16cb0 70 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20  platename);.    
16cc0 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
16cd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
16ce0 20 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e    }.  in = fopen
16cf0 28 74 70 6c 74 6e 61 6d 65 2c 22 72 62 22 29 3b  (tpltname,"rb");
16d00 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a  .  if( in==0 ){.
16d10 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
16d20 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74  rr,"Can't open t
16d30 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  he template file
16d40 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70   \"%s\".\n",temp
16d50 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c  latename);.    l
16d60 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
16d70 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
16d80 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a   }.  return in;.
16d90 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 23 6c  }../* Print a #l
16da0 69 6e 65 20 64 69 72 65 63 74 69 76 65 20 6c 69  ine directive li
16db0 6e 65 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ne to the output
16dc0 20 66 69 6c 65 2e 20 2a 2f 0a 50 52 49 56 41 54   file. */.PRIVAT
16dd0 45 20 76 6f 69 64 20 74 70 6c 74 5f 6c 69 6e 65  E void tplt_line
16de0 64 69 72 28 6f 75 74 2c 6c 69 6e 65 6e 6f 2c 66  dir(out,lineno,f
16df0 69 6c 65 6e 61 6d 65 29 0a 46 49 4c 45 20 2a 6f  ilename).FILE *o
16e00 75 74 3b 0a 69 6e 74 20 6c 69 6e 65 6e 6f 3b 0a  ut;.int lineno;.
16e10 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 0a  char *filename;.
16e20 7b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  {.  fprintf(out,
16e30 22 23 6c 69 6e 65 20 25 64 20 5c 22 22 2c 6c 69  "#line %d \"",li
16e40 6e 65 6e 6f 29 3b 0a 20 20 77 68 69 6c 65 28 20  neno);.  while( 
16e50 2a 66 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20  *filename ){.   
16e60 20 69 66 28 20 2a 66 69 6c 65 6e 61 6d 65 20 3d   if( *filename =
16e70 3d 20 27 5c 5c 27 20 29 20 70 75 74 63 28 27 5c  = '\\' ) putc('\
16e80 5c 27 2c 6f 75 74 29 3b 0a 20 20 20 20 70 75 74  \',out);.    put
16e90 63 28 2a 66 69 6c 65 6e 61 6d 65 2c 6f 75 74 29  c(*filename,out)
16ea0 3b 0a 20 20 20 20 66 69 6c 65 6e 61 6d 65 2b 2b  ;.    filename++
16eb0 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  ;.  }.  fprintf(
16ec0 6f 75 74 2c 22 5c 22 5c 6e 22 29 3b 0a 7d 0a 0a  out,"\"\n");.}..
16ed0 2f 2a 20 50 72 69 6e 74 20 61 20 73 74 72 69 6e  /* Print a strin
16ee0 67 20 74 6f 20 74 68 65 20 66 69 6c 65 20 61 6e  g to the file an
16ef0 64 20 6b 65 65 70 20 74 68 65 20 6c 69 6e 65 6e  d keep the linen
16f00 75 6d 62 65 72 20 75 70 20 74 6f 20 64 61 74 65  umber up to date
16f10 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64   */.PRIVATE void
16f20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
16f30 6c 65 6d 70 2c 73 74 72 2c 6c 69 6e 65 6e 6f 29  lemp,str,lineno)
16f40 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75  .FILE *out;.stru
16f50 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
16f60 63 68 61 72 20 2a 73 74 72 3b 0a 69 6e 74 20 2a  char *str;.int *
16f70 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 66 28 20  lineno;.{.  if( 
16f80 73 74 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  str==0 ) return;
16f90 0a 20 20 77 68 69 6c 65 28 20 2a 73 74 72 20 29  .  while( *str )
16fa0 7b 0a 20 20 20 20 70 75 74 63 28 2a 73 74 72 2c  {.    putc(*str,
16fb0 6f 75 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 73  out);.    if( *s
16fc0 74 72 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e  tr=='\n' ) (*lin
16fd0 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 73 74 72 2b  eno)++;.    str+
16fe0 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72  +;.  }.  if( str
16ff0 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20  [-1]!='\n' ){.  
17000 20 20 70 75 74 63 28 27 5c 6e 27 2c 6f 75 74 29    putc('\n',out)
17010 3b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b  ;.    (*lineno)+
17020 2b 3b 0a 20 20 7d 0a 20 20 69 66 20 28 21 6c 65  +;.  }.  if (!le
17030 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61  mp->nolinenosfla
17040 67 29 20 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e  g) {.    (*linen
17050 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64  o)++; tplt_lined
17060 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c  ir(out,*lineno,l
17070 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 0a  emp->outname); .
17080 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a    }.  return;.}.
17090 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
170a0 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 65 6d 69  wing routine emi
170b0 74 73 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ts code for the 
170c0 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  destructor for t
170d0 68 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 73 70 0a  he.** symbol sp.
170e0 2a 2f 0a 76 6f 69 64 20 65 6d 69 74 5f 64 65 73  */.void emit_des
170f0 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74  tructor_code(out
17100 2c 73 70 2c 6c 65 6d 70 2c 6c 69 6e 65 6e 6f 29  ,sp,lemp,lineno)
17110 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75  .FILE *out;.stru
17120 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 73  ct symbol *sp;.s
17130 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
17140 70 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a  p;.int *lineno;.
17150 7b 0a 20 63 68 61 72 20 2a 63 70 20 3d 20 30 3b  {. char *cp = 0;
17160 0a 0a 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d  .. if( sp->type=
17170 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  =TERMINAL ){.   
17180 63 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  cp = lemp->token
17190 64 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70 3d  dest;.   if( cp=
171a0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  =0 ) return;.   
171b0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e  fprintf(out,"{\n
171c0 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  "); (*lineno)++;
171d0 0a 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e  . }else if( sp->
171e0 64 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  destructor ){.  
171f0 20 63 70 20 3d 20 73 70 2d 3e 64 65 73 74 72 75   cp = sp->destru
17200 63 74 6f 72 3b 0a 20 20 20 66 70 72 69 6e 74 66  ctor;.   fprintf
17210 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c  (out,"{\n"); (*l
17220 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66 20  ineno)++;.   if 
17230 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f  (!lemp->nolineno
17240 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65 6e  sflag) { (*linen
17250 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64  o)++; tplt_lined
17260 69 72 28 6f 75 74 2c 73 70 2d 3e 64 65 73 74 4c  ir(out,sp->destL
17270 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 66 69 6c 65  ineno,lemp->file
17280 6e 61 6d 65 29 3b 20 7d 0a 20 7d 65 6c 73 65 20  name); }. }else 
17290 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73  if( lemp->vardes
172a0 74 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d  t ){.   cp = lem
172b0 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20 69  p->vardest;.   i
172c0 66 28 20 63 70 3d 3d 30 20 29 20 72 65 74 75 72  f( cp==0 ) retur
172d0 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75  n;.   fprintf(ou
172e0 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65  t,"{\n"); (*line
172f0 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65 7b 0a 20  no)++;. }else{. 
17300 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20    assert( 0 );  
17310 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e  /* Cannot happen
17320 20 2a 2f 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a 63   */. }. for(; *c
17330 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 69 66 28  p; cp++){.   if(
17340 20 2a 63 70 3d 3d 27 24 27 20 26 26 20 63 70 5b   *cp=='$' && cp[
17350 31 5d 3d 3d 27 24 27 20 29 7b 0a 20 20 20 20 20  1]=='$' ){.     
17360 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 28 79 79  fprintf(out,"(yy
17370 70 6d 69 6e 6f 72 2d 3e 79 79 25 64 29 22 2c 73  pminor->yy%d)",s
17380 70 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20  p->dtnum);.     
17390 63 70 2b 2b 3b 0a 20 20 20 20 20 63 6f 6e 74 69  cp++;.     conti
173a0 6e 75 65 3b 0a 20 20 20 7d 0a 20 20 20 69 66 28  nue;.   }.   if(
173b0 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c   *cp=='\n' ) (*l
173c0 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 66 70 75  ineno)++;.   fpu
173d0 74 63 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a  tc(*cp,out);. }.
173e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e   fprintf(out,"\n
173f0 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  "); (*lineno)++;
17400 0a 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c  . if (!lemp->nol
17410 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 20 0a 20  inenosflag) { . 
17420 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 20 74    (*lineno)++; t
17430 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c  plt_linedir(out,
17440 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75  *lineno,lemp->ou
17450 74 6e 61 6d 65 29 3b 20 0a 20 7d 0a 20 66 70 72  tname); . }. fpr
17460 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b  intf(out,"}\n");
17470 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 72   (*lineno)++;. r
17480 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
17490 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e  Return TRUE (non
174a0 2d 7a 65 72 6f 29 20 69 66 20 74 68 65 20 67 69  -zero) if the gi
174b0 76 65 6e 20 73 79 6d 62 6f 6c 20 68 61 73 20 61  ven symbol has a
174c0 20 64 65 73 74 72 75 63 74 6f 72 2e 0a 2a 2f 0a   destructor..*/.
174d0 69 6e 74 20 68 61 73 5f 64 65 73 74 72 75 63 74  int has_destruct
174e0 6f 72 28 73 70 2c 20 6c 65 6d 70 29 0a 73 74 72  or(sp, lemp).str
174f0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a  uct symbol *sp;.
17500 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
17510 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 72 65 74 3b  mp;.{.  int ret;
17520 0a 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d  .  if( sp->type=
17530 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  =TERMINAL ){.   
17540 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b   ret = lemp->tok
17550 65 6e 64 65 73 74 21 3d 30 3b 0a 20 20 7d 65 6c  endest!=0;.  }el
17560 73 65 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c 65  se{.    ret = le
17570 6d 70 2d 3e 76 61 72 64 65 73 74 21 3d 30 20 7c  mp->vardest!=0 |
17580 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72  | sp->destructor
17590 21 3d 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  !=0;.  }.  retur
175a0 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
175b0 41 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20 61  Append text to a
175c0 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
175d0 6f 63 61 74 65 64 20 73 74 72 69 6e 67 2e 20 20  ocated string.  
175e0 49 66 20 7a 54 65 78 74 20 69 73 20 30 20 74 68  If zText is 0 th
175f0 65 6e 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20  en.** reset the 
17600 73 74 72 69 6e 67 20 74 6f 20 62 65 20 65 6d 70  string to be emp
17610 74 79 20 61 67 61 69 6e 2e 20 20 41 6c 77 61 79  ty again.  Alway
17620 73 20 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6d  s return the com
17630 70 6c 65 74 65 20 74 65 78 74 0a 2a 2a 20 6f 66  plete text.** of
17640 20 74 68 65 20 73 74 72 69 6e 67 20 28 77 68 69   the string (whi
17650 63 68 20 69 73 20 6f 76 65 72 77 72 69 74 74 65  ch is overwritte
17660 6e 20 77 69 74 68 20 65 61 63 68 20 63 61 6c 6c  n with each call
17670 29 2e 0a 2a 2a 0a 2a 2a 20 6e 20 62 79 74 65 73  )..**.** n bytes
17680 20 6f 66 20 7a 54 65 78 74 20 61 72 65 20 73 74   of zText are st
17690 6f 72 65 64 2e 20 20 49 66 20 6e 3d 3d 30 20 74  ored.  If n==0 t
176a0 68 65 6e 20 61 6c 6c 20 6f 66 20 7a 54 65 78 74  hen all of zText
176b0 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
176c0 0a 2a 2a 20 5c 30 30 30 20 74 65 72 6d 69 6e 61  .** \000 termina
176d0 74 6f 72 20 69 73 20 73 74 6f 72 65 64 2e 20 20  tor is stored.  
176e0 7a 54 65 78 74 20 63 61 6e 20 63 6f 6e 74 61 69  zText can contai
176f0 6e 20 75 70 20 74 6f 20 74 77 6f 20 69 6e 73 74  n up to two inst
17700 61 6e 63 65 73 20 6f 66 0a 2a 2a 20 25 64 2e 20  ances of.** %d. 
17710 20 54 68 65 20 76 61 6c 75 65 73 20 6f 66 20 70   The values of p
17720 31 20 61 6e 64 20 70 32 20 61 72 65 20 77 72 69  1 and p2 are wri
17730 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 66 69  tten into the fi
17740 72 73 74 20 61 6e 64 20 73 65 63 6f 6e 64 0a 2a  rst and second.*
17750 2a 20 25 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  * %d..**.** If n
17760 3d 3d 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 70  ==-1, then the p
17770 72 65 76 69 6f 75 73 20 63 68 61 72 61 63 74 65  revious characte
17780 72 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e  r is overwritten
17790 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 63 68 61  ..*/.PRIVATE cha
177a0 72 20 2a 61 70 70 65 6e 64 5f 73 74 72 28 63 68  r *append_str(ch
177b0 61 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 6e  ar *zText, int n
177c0 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32  , int p1, int p2
177d0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  ){.  static char
177e0 20 2a 7a 20 3d 20 30 3b 0a 20 20 73 74 61 74 69   *z = 0;.  stati
177f0 63 20 69 6e 74 20 61 6c 6c 6f 63 65 64 20 3d 20  c int alloced = 
17800 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
17810 75 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  used = 0;.  int 
17820 63 3b 0a 20 20 63 68 61 72 20 7a 49 6e 74 5b 34  c;.  char zInt[4
17830 30 5d 3b 0a 0a 20 20 69 66 28 20 7a 54 65 78 74  0];..  if( zText
17840 3d 3d 30 20 29 7b 0a 20 20 20 20 75 73 65 64 20  ==0 ){.    used 
17850 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
17860 7a 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c 3d  z;.  }.  if( n<=
17870 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 3c 30  0 ){.    if( n<0
17880 20 29 7b 0a 20 20 20 20 20 20 75 73 65 64 20 2b   ){.      used +
17890 3d 20 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = n;.      asser
178a0 74 28 20 75 73 65 64 3e 3d 30 20 29 3b 0a 20 20  t( used>=0 );.  
178b0 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6c 65 6d 6f    }.    n = lemo
178c0 6e 53 74 72 6c 65 6e 28 7a 54 65 78 74 29 3b 0a  nStrlen(zText);.
178d0 20 20 7d 0a 20 20 69 66 28 20 6e 2b 73 69 7a 65    }.  if( n+size
178e0 6f 66 28 7a 49 6e 74 29 2a 32 2b 75 73 65 64 20  of(zInt)*2+used 
178f0 3e 3d 20 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20  >= alloced ){.  
17900 20 20 61 6c 6c 6f 63 65 64 20 3d 20 6e 20 2b 20    alloced = n + 
17910 73 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 20 2b  sizeof(zInt)*2 +
17920 20 75 73 65 64 20 2b 20 32 30 30 3b 0a 20 20 20   used + 200;.   
17930 20 7a 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 2c 20   z = realloc(z, 
17940 20 61 6c 6c 6f 63 65 64 29 3b 0a 20 20 7d 0a 20   alloced);.  }. 
17950 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75   if( z==0 ) retu
17960 72 6e 20 22 22 3b 0a 20 20 77 68 69 6c 65 28 20  rn "";.  while( 
17970 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 63  n-- > 0 ){.    c
17980 20 3d 20 2a 28 7a 54 65 78 74 2b 2b 29 3b 0a 20   = *(zText++);. 
17990 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 26 26     if( c=='%' &&
179a0 20 6e 3e 30 20 26 26 20 7a 54 65 78 74 5b 30 5d   n>0 && zText[0]
179b0 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20 20 20 73  =='d' ){.      s
179c0 70 72 69 6e 74 66 28 7a 49 6e 74 2c 20 22 25 64  printf(zInt, "%d
179d0 22 2c 20 70 31 29 3b 0a 20 20 20 20 20 20 70 31  ", p1);.      p1
179e0 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 73 74 72   = p2;.      str
179f0 63 70 79 28 26 7a 5b 75 73 65 64 5d 2c 20 7a 49  cpy(&z[used], zI
17a00 6e 74 29 3b 0a 20 20 20 20 20 20 75 73 65 64 20  nt);.      used 
17a10 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 26  += lemonStrlen(&
17a20 7a 5b 75 73 65 64 5d 29 3b 0a 20 20 20 20 20 20  z[used]);.      
17a30 7a 54 65 78 74 2b 2b 3b 0a 20 20 20 20 20 20 6e  zText++;.      n
17a40 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  --;.    }else{. 
17a50 20 20 20 20 20 7a 5b 75 73 65 64 2b 2b 5d 20 3d       z[used++] =
17a60 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   c;.    }.  }.  
17a70 7a 5b 75 73 65 64 5d 20 3d 20 30 3b 0a 20 20 72  z[used] = 0;.  r
17a80 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
17a90 2a 20 7a 43 6f 64 65 20 69 73 20 61 20 73 74 72  * zCode is a str
17aa0 69 6e 67 20 74 68 61 74 20 69 73 20 74 68 65 20  ing that is the 
17ab0 61 63 74 69 6f 6e 20 61 73 73 6f 63 69 61 74 65  action associate
17ac0 64 20 77 69 74 68 20 61 20 72 75 6c 65 2e 20 20  d with a rule.  
17ad0 45 78 70 61 6e 64 0a 2a 2a 20 74 68 65 20 73 79  Expand.** the sy
17ae0 6d 62 6f 6c 73 20 69 6e 20 74 68 69 73 20 73 74  mbols in this st
17af0 72 69 6e 67 20 73 6f 20 74 68 61 74 20 74 68 65  ring so that the
17b00 20 72 65 66 65 72 20 74 6f 20 65 6c 65 6d 65 6e   refer to elemen
17b10 74 73 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  ts of the parser
17b20 0a 2a 2a 20 73 74 61 63 6b 2e 0a 2a 2f 0a 50 52  .** stack..*/.PR
17b30 49 56 41 54 45 20 76 6f 69 64 20 74 72 61 6e 73  IVATE void trans
17b40 6c 61 74 65 5f 63 6f 64 65 28 73 74 72 75 63 74  late_code(struct
17b50 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74   lemon *lemp, st
17b60 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a  ruct rule *rp){.
17b70 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 78 70 3b    char *cp, *xp;
17b80 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
17b90 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 20 20 20   lhsused = 0;   
17ba0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
17bb0 4c 48 53 20 65 6c 65 6d 65 6e 74 20 68 61 73 20  LHS element has 
17bc0 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20 63  been used */.  c
17bd0 68 61 72 20 75 73 65 64 5b 4d 41 58 52 48 53 5d  har used[MAXRHS]
17be0 3b 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20  ;   /* True for 
17bf0 65 61 63 68 20 52 48 53 20 65 6c 65 6d 65 6e 74  each RHS element
17c00 20 77 68 69 63 68 20 69 73 20 75 73 65 64 20 2a   which is used *
17c10 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  /..  for(i=0; i<
17c20 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 20 75  rp->nrhs; i++) u
17c30 73 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 6c 68  sed[i] = 0;.  lh
17c40 73 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66  sused = 0;..  if
17c50 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 7b  ( rp->code==0 ){
17c60 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20  .    rp->code = 
17c70 22 5c 6e 22 3b 0a 20 20 20 20 72 70 2d 3e 6c 69  "\n";.    rp->li
17c80 6e 65 20 3d 20 72 70 2d 3e 72 75 6c 65 6c 69 6e  ne = rp->rulelin
17c90 65 3b 0a 20 20 7d 0a 0a 20 20 61 70 70 65 6e 64  e;.  }..  append
17ca0 5f 73 74 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 20  _str(0,0,0,0);. 
17cb0 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65   for(cp=rp->code
17cc0 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20  ; *cp; cp++){.  
17cd0 20 20 69 66 28 20 69 73 61 6c 70 68 61 28 2a 63    if( isalpha(*c
17ce0 70 29 20 26 26 20 28 63 70 3d 3d 72 70 2d 3e 63  p) && (cp==rp->c
17cf0 6f 64 65 20 7c 7c 20 28 21 69 73 61 6c 6e 75 6d  ode || (!isalnum
17d00 28 63 70 5b 2d 31 5d 29 20 26 26 20 63 70 5b 2d  (cp[-1]) && cp[-
17d10 31 5d 21 3d 27 5f 27 29 29 20 29 7b 0a 20 20 20  1]!='_')) ){.   
17d20 20 20 20 63 68 61 72 20 73 61 76 65 64 3b 0a 20     char saved;. 
17d30 20 20 20 20 20 66 6f 72 28 78 70 3d 20 26 63 70       for(xp= &cp
17d40 5b 31 5d 3b 20 69 73 61 6c 6e 75 6d 28 2a 78 70  [1]; isalnum(*xp
17d50 29 20 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b 20 78  ) || *xp=='_'; x
17d60 70 2b 2b 29 3b 0a 20 20 20 20 20 20 73 61 76 65  p++);.      save
17d70 64 20 3d 20 2a 78 70 3b 0a 20 20 20 20 20 20 2a  d = *xp;.      *
17d80 78 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  xp = 0;.      if
17d90 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26  ( rp->lhsalias &
17da0 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e  & strcmp(cp,rp->
17db0 6c 68 73 61 6c 69 61 73 29 3d 3d 30 20 29 7b 0a  lhsalias)==0 ){.
17dc0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73          append_s
17dd0 74 72 28 22 79 79 67 6f 74 6f 6d 69 6e 6f 72 2e  tr("yygotominor.
17de0 79 79 25 64 22 2c 30 2c 72 70 2d 3e 6c 68 73 2d  yy%d",0,rp->lhs-
17df0 3e 64 74 6e 75 6d 2c 30 29 3b 0a 20 20 20 20 20  >dtnum,0);.     
17e00 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20     cp = xp;.    
17e10 20 20 20 20 6c 68 73 75 73 65 64 20 3d 20 31 3b      lhsused = 1;
17e20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17e30 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
17e40 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
17e50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
17e60 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26  p->rhsalias[i] &
17e70 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e  & strcmp(cp,rp->
17e80 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30 20  rhsalias[i])==0 
17e90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
17ea0 66 28 20 63 70 21 3d 72 70 2d 3e 63 6f 64 65 20  f( cp!=rp->code 
17eb0 26 26 20 63 70 5b 2d 31 5d 3d 3d 27 40 27 20 29  && cp[-1]=='@' )
17ec0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
17ed0 2f 2a 20 49 66 20 74 68 65 20 61 72 67 75 6d 65  /* If the argume
17ee0 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  nt is of the for
17ef0 6d 20 40 58 20 74 68 65 6e 20 73 75 62 73 74 69  m @X then substi
17f00 74 75 74 65 64 0a 20 20 20 20 20 20 20 20 20 20  tuted.          
17f10 20 20 20 20 2a 2a 20 74 68 65 20 74 6f 6b 65 6e      ** the token
17f20 20 6e 75 6d 62 65 72 20 6f 66 20 58 2c 20 6e 6f   number of X, no
17f30 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 58  t the value of X
17f40 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
17f50 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79    append_str("yy
17f60 6d 73 70 5b 25 64 5d 2e 6d 61 6a 6f 72 22 2c 2d  msp[%d].major",-
17f70 31 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 30  1,i-rp->nrhs+1,0
17f80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
17f90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
17fa0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
17fb0 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b  l *sp = rp->rhs[
17fc0 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i];.            
17fd0 20 20 69 6e 74 20 64 74 6e 75 6d 3b 0a 20 20 20    int dtnum;.   
17fe0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
17ff0 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  p->type==MULTITE
18000 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
18010 20 20 20 20 20 20 20 20 20 20 64 74 6e 75 6d 20            dtnum 
18020 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d  = sp->subsym[0]-
18030 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20  >dtnum;.        
18040 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18050 20 20 20 20 20 20 20 20 20 20 20 20 20 64 74 6e               dtn
18060 75 6d 20 3d 20 73 70 2d 3e 64 74 6e 75 6d 3b 0a  um = sp->dtnum;.
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
18080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 70                ap
18090 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73 70 5b  pend_str("yymsp[
180a0 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64 22 2c  %d].minor.yy%d",
180b0 30 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 20  0,i-rp->nrhs+1, 
180c0 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20 20  dtnum);.        
180d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
180e0 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20    cp = xp;.     
180f0 20 20 20 20 20 20 20 75 73 65 64 5b 69 5d 20 3d         used[i] =
18100 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
18110 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
18120 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
18130 20 20 20 7d 0a 20 20 20 20 20 20 2a 78 70 20 3d     }.      *xp =
18140 20 73 61 76 65 64 3b 0a 20 20 20 20 7d 0a 20 20   saved;.    }.  
18150 20 20 61 70 70 65 6e 64 5f 73 74 72 28 63 70 2c    append_str(cp,
18160 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 20 2f   1, 0, 0);.  } /
18170 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 0a 20  * End loop */.. 
18180 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b   /* Check to mak
18190 65 20 73 75 72 65 20 74 68 65 20 4c 48 53 20 68  e sure the LHS h
181a0 61 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a  as been used */.
181b0 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69    if( rp->lhsali
181c0 61 73 20 26 26 20 21 6c 68 73 75 73 65 64 20 29  as && !lhsused )
181d0 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c  {.    ErrorMsg(l
181e0 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70  emp->filename,rp
181f0 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20  ->ruleline,.    
18200 20 20 22 4c 61 62 65 6c 20 5c 22 25 73 5c 22 20    "Label \"%s\" 
18210 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22 20 69  for \"%s(%s)\" i
18220 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22 2c 0a  s never used.",.
18230 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61          rp->lhsa
18240 6c 69 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61  lias,rp->lhs->na
18250 6d 65 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29  me,rp->lhsalias)
18260 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f  ;.    lemp->erro
18270 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  rcnt++;.  }..  /
18280 2a 20 47 65 6e 65 72 61 74 65 20 64 65 73 74 72  * Generate destr
18290 75 63 74 6f 72 20 63 6f 64 65 20 66 6f 72 20 52  uctor code for R
182a0 48 53 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68  HS symbols which
182b0 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e   are not used in
182c0 20 74 68 65 0a 20 20 2a 2a 20 72 65 64 75 63 65   the.  ** reduce
182d0 20 63 6f 64 65 20 2a 2f 0a 20 20 66 6f 72 28 69   code */.  for(i
182e0 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
182f0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 72 70  i++){.    if( rp
18300 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26 26  ->rhsalias[i] &&
18310 20 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20 20 20   !used[i] ){.   
18320 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
18330 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72  ->filename,rp->r
18340 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20  uleline,.       
18350 20 22 4c 61 62 65 6c 20 25 73 20 66 6f 72 20 5c   "Label %s for \
18360 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76  "%s(%s)\" is nev
18370 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20  er used.",.     
18380 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b     rp->rhsalias[
18390 69 5d 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e  i],rp->rhs[i]->n
183a0 61 6d 65 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73  ame,rp->rhsalias
183b0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70  [i]);.      lemp
183c0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
183d0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 70 2d 3e    }else if( rp->
183e0 72 68 73 61 6c 69 61 73 5b 69 5d 3d 3d 30 20 29  rhsalias[i]==0 )
183f0 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 5f  {.      if( has_
18400 64 65 73 74 72 75 63 74 6f 72 28 72 70 2d 3e 72  destructor(rp->r
18410 68 73 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20  hs[i],lemp) ){. 
18420 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74         append_st
18430 72 28 22 20 20 79 79 5f 64 65 73 74 72 75 63 74  r("  yy_destruct
18440 6f 72 28 79 79 70 50 61 72 73 65 72 2c 25 64 2c  or(yypParser,%d,
18450 26 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72  &yymsp[%d].minor
18460 29 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20 20 20  );\n", 0,.      
18470 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d       rp->rhs[i]-
18480 3e 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e 72 68  >index,i-rp->nrh
18490 73 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  s+1);.      }els
184a0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  e{.        /* No
184b0 20 64 65 73 74 72 75 63 74 6f 72 20 64 65 66 69   destructor defi
184c0 6e 65 64 20 66 6f 72 20 74 68 69 73 20 74 65 72  ned for this ter
184d0 6d 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  m */.      }.   
184e0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 70 2d   }.  }.  if( rp-
184f0 3e 63 6f 64 65 20 29 7b 0a 20 20 20 20 63 70 20  >code ){.    cp 
18500 3d 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30  = append_str(0,0
18510 2c 30 2c 30 29 3b 0a 20 20 20 20 72 70 2d 3e 63  ,0,0);.    rp->c
18520 6f 64 65 20 3d 20 53 74 72 73 61 66 65 28 63 70  ode = Strsafe(cp
18530 3f 63 70 3a 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  ?cp:"");.  }.}..
18540 2f 2a 20 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  /* .** Generate 
18550 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
18560 74 65 73 20 77 68 65 6e 20 74 68 65 20 72 75 6c  tes when the rul
18570 65 20 22 72 70 22 20 69 73 20 72 65 64 75 63 65  e "rp" is reduce
18580 64 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65  d.  Write.** the
18590 20 63 6f 64 65 20 74 6f 20 22 6f 75 74 22 2e 20   code to "out". 
185a0 20 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e 65 6e   Make sure linen
185b0 6f 20 73 74 61 79 73 20 75 70 2d 74 6f 2d 64 61  o stays up-to-da
185c0 74 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76  te..*/.PRIVATE v
185d0 6f 69 64 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75  oid emit_code(ou
185e0 74 2c 72 70 2c 6c 65 6d 70 2c 6c 69 6e 65 6e 6f  t,rp,lemp,lineno
185f0 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72  ).FILE *out;.str
18600 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 73 74  uct rule *rp;.st
18610 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
18620 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b  ;.int *lineno;.{
18630 0a 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 2f 2a  . char *cp;.. /*
18640 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
18650 6f 20 64 6f 20 74 68 65 20 72 65 64 75 63 65 20  o do the reduce 
18660 61 63 74 69 6f 6e 20 2a 2f 0a 20 69 66 28 20 72  action */. if( r
18670 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 69 66  p->code ){.   if
18680 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e   (!lemp->nolinen
18690 6f 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65  osflag) { (*line
186a0 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65  no)++; tplt_line
186b0 64 69 72 28 6f 75 74 2c 72 70 2d 3e 6c 69 6e 65  dir(out,rp->line
186c0 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29  ,lemp->filename)
186d0 3b 20 7d 0a 20 20 20 66 70 72 69 6e 74 66 28 6f  ; }.   fprintf(o
186e0 75 74 2c 22 7b 25 73 22 2c 72 70 2d 3e 63 6f 64  ut,"{%s",rp->cod
186f0 65 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72 70  e);.   for(cp=rp
18700 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b  ->code; *cp; cp+
18710 2b 29 7b 0a 20 20 20 20 20 69 66 28 20 2a 63 70  +){.     if( *cp
18720 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e  =='\n' ) (*linen
18730 6f 29 2b 2b 3b 0a 20 20 20 7d 20 2f 2a 20 45 6e  o)++;.   } /* En
18740 64 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 66 70 72  d loop */.   fpr
18750 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b  intf(out,"}\n");
18760 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20   (*lineno)++;.  
18770 20 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69   if (!lemp->noli
18780 6e 65 6e 6f 73 66 6c 61 67 29 20 7b 20 28 2a 6c  nenosflag) { (*l
18790 69 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c  ineno)++; tplt_l
187a0 69 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65  inedir(out,*line
187b0 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65  no,lemp->outname
187c0 29 3b 20 7d 0a 20 7d 20 2f 2a 20 45 6e 64 20 69  ); }. } /* End i
187d0 66 28 20 72 70 2d 3e 63 6f 64 65 20 29 20 2a 2f  f( rp->code ) */
187e0 0a 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .. return;.}../*
187f0 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 64 65  .** Print the de
18800 66 69 6e 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  finition of the 
18810 75 6e 69 6f 6e 20 75 73 65 64 20 66 6f 72 20 74  union used for t
18820 68 65 20 70 61 72 73 65 72 27 73 20 64 61 74 61  he parser's data
18830 20 73 74 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20   stack..** This 
18840 75 6e 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 66  union contains f
18850 69 65 6c 64 73 20 66 6f 72 20 65 76 65 72 79 20  ields for every 
18860 70 6f 73 73 69 62 6c 65 20 64 61 74 61 20 74 79  possible data ty
18870 70 65 20 66 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a  pe for tokens.**
18880 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
18890 73 2e 20 20 49 6e 20 74 68 65 20 70 72 6f 63 65  s.  In the proce
188a0 73 73 20 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20  ss of computing 
188b0 61 6e 64 20 70 72 69 6e 74 69 6e 67 20 74 68 69  and printing thi
188c0 73 0a 2a 2a 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f  s.** union, also
188d0 20 73 65 74 20 74 68 65 20 22 2e 64 74 6e 75 6d   set the ".dtnum
188e0 22 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79  " field of every
188f0 20 74 65 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f   terminal and no
18900 6e 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d  nterminal.** sym
18910 62 6f 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 70 72 69  bol..*/.void pri
18920 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 6f  nt_stack_union(o
18930 75 74 2c 6c 65 6d 70 2c 70 6c 69 6e 65 6e 6f 2c  ut,lemp,plineno,
18940 6d 68 66 6c 61 67 29 0a 46 49 4c 45 20 2a 6f 75  mhflag).FILE *ou
18950 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
18960 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75      /* The outpu
18970 74 20 73 74 72 65 61 6d 20 2a 2f 0a 73 74 72 75  t stream */.stru
18980 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 20  ct lemon *lemp; 
18990 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
189a0 61 69 6e 20 69 6e 66 6f 20 73 74 72 75 63 74 75  ain info structu
189b0 72 65 20 66 6f 72 20 74 68 69 73 20 70 61 72 73  re for this pars
189c0 65 72 20 2a 2f 0a 69 6e 74 20 2a 70 6c 69 6e 65  er */.int *pline
189d0 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
189e0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
189f0 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  the line number 
18a00 2a 2f 0a 69 6e 74 20 6d 68 66 6c 61 67 3b 20 20  */.int mhflag;  
18a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18a20 2a 20 54 72 75 65 20 69 66 20 67 65 6e 65 72 61  * True if genera
18a30 74 69 6e 67 20 6d 61 6b 65 68 65 61 64 65 72 73  ting makeheaders
18a40 20 6f 75 74 70 75 74 20 2a 2f 0a 7b 0a 20 20 69   output */.{.  i
18a50 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69  nt lineno = *pli
18a60 6e 65 6e 6f 3b 20 20 20 20 2f 2a 20 54 68 65 20  neno;    /* The 
18a70 6c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  line number of t
18a80 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 63  he output */.  c
18a90 68 61 72 20 2a 2a 74 79 70 65 73 3b 20 20 20 20  har **types;    
18aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 68 61           /* A ha
18ab0 73 68 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61  sh table of data
18ac0 74 79 70 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61  types */.  int a
18ad0 72 72 61 79 73 69 7a 65 3b 20 20 20 20 20 20 20  rraysize;       
18ae0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
18af0 74 68 65 20 22 74 79 70 65 73 22 20 61 72 72 61  the "types" arra
18b00 79 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 64 74  y */.  int maxdt
18b10 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 20  length;         
18b20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67   /* Maximum leng
18b30 74 68 20 6f 66 20 61 6e 79 20 22 2e 64 61 74 61  th of any ".data
18b40 74 79 70 65 22 20 66 69 65 6c 64 2e 20 2a 2f 0a  type" field. */.
18b50 20 20 63 68 61 72 20 2a 73 74 64 64 74 3b 20 20    char *stddt;  
18b60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18b70 74 61 6e 64 61 72 64 69 7a 65 64 20 6e 61 6d 65  tandardized name
18b80 20 66 6f 72 20 61 20 64 61 74 61 74 79 70 65 20   for a datatype 
18b90 2a 2f 0a 20 20 69 6e 74 20 69 2c 6a 3b 20 20 20  */.  int i,j;   
18ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18bb0 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
18bc0 2a 2f 0a 20 20 69 6e 74 20 68 61 73 68 3b 20 20  */.  int hash;  
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18be0 2a 20 46 6f 72 20 68 61 73 68 69 6e 67 20 74 68  * For hashing th
18bf0 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 79 70 65  e name of a type
18c00 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65   */.  char *name
18c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18c20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70  /* Name of the p
18c30 61 72 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41  arser */..  /* A
18c40 6c 6c 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74  llocate and init
18c50 69 61 6c 69 7a 65 20 74 79 70 65 73 5b 5d 20 61  ialize types[] a
18c60 6e 64 20 61 6c 6c 6f 63 61 74 65 20 73 74 64 64  nd allocate stdd
18c70 74 5b 5d 20 2a 2f 0a 20 20 61 72 72 61 79 73 69  t[] */.  arraysi
18c80 7a 65 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62  ze = lemp->nsymb
18c90 6f 6c 20 2a 20 32 3b 0a 20 20 74 79 70 65 73 20  ol * 2;.  types 
18ca0 3d 20 28 63 68 61 72 2a 2a 29 63 61 6c 6c 6f 63  = (char**)calloc
18cb0 28 20 61 72 72 61 79 73 69 7a 65 2c 20 73 69 7a  ( arraysize, siz
18cc0 65 6f 66 28 63 68 61 72 2a 29 20 29 3b 0a 20 20  eof(char*) );.  
18cd0 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72 61 79  for(i=0; i<array
18ce0 73 69 7a 65 3b 20 69 2b 2b 29 20 74 79 70 65 73  size; i++) types
18cf0 5b 69 5d 20 3d 20 30 3b 0a 20 20 6d 61 78 64 74  [i] = 0;.  maxdt
18d00 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20 69 66  length = 0;.  if
18d10 28 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 20  ( lemp->vartype 
18d20 29 7b 0a 20 20 20 20 6d 61 78 64 74 6c 65 6e 67  ){.    maxdtleng
18d30 74 68 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  th = lemonStrlen
18d40 28 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 29 3b  (lemp->vartype);
18d50 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
18d60 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
18d70 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c   i++){.    int l
18d80 65 6e 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  en;.    struct s
18d90 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
18da0 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
18db0 20 20 69 66 28 20 73 70 2d 3e 64 61 74 61 74 79    if( sp->dataty
18dc0 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  pe==0 ) continue
18dd0 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6d 6f  ;.    len = lemo
18de0 6e 53 74 72 6c 65 6e 28 73 70 2d 3e 64 61 74 61  nStrlen(sp->data
18df0 74 79 70 65 29 3b 0a 20 20 20 20 69 66 28 20 6c  type);.    if( l
18e00 65 6e 3e 6d 61 78 64 74 6c 65 6e 67 74 68 20 29  en>maxdtlength )
18e10 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c   maxdtlength = l
18e20 65 6e 3b 0a 20 20 7d 0a 20 20 73 74 64 64 74 20  en;.  }.  stddt 
18e30 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28  = (char*)malloc(
18e40 20 6d 61 78 64 74 6c 65 6e 67 74 68 2a 32 20 2b   maxdtlength*2 +
18e50 20 31 20 29 3b 0a 20 20 69 66 28 20 74 79 70 65   1 );.  if( type
18e60 73 3d 3d 30 20 7c 7c 20 73 74 64 64 74 3d 3d 30  s==0 || stddt==0
18e70 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
18e80 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d  stderr,"Out of m
18e90 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20  emory.\n");.    
18ea0 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20  exit(1);.  }..  
18eb0 2f 2a 20 42 75 69 6c 64 20 61 20 68 61 73 68 20  /* Build a hash 
18ec0 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70  table of datatyp
18ed0 65 73 2e 20 54 68 65 20 22 2e 64 74 6e 75 6d 22  es. The ".dtnum"
18ee0 20 66 69 65 6c 64 20 6f 66 20 65 61 63 68 20 73   field of each s
18ef0 79 6d 62 6f 6c 0a 20 20 2a 2a 20 69 73 20 66 69  ymbol.  ** is fi
18f00 6c 6c 65 64 20 69 6e 20 77 69 74 68 20 74 68 65  lled in with the
18f10 20 68 61 73 68 20 69 6e 64 65 78 20 70 6c 75 73   hash index plus
18f20 20 31 2e 20 20 41 20 22 2e 64 74 6e 75 6d 22 20   1.  A ".dtnum" 
18f30 76 61 6c 75 65 20 6f 66 20 30 20 69 73 0a 20 20  value of 0 is.  
18f40 2a 2a 20 75 73 65 64 20 66 6f 72 20 74 65 72 6d  ** used for term
18f50 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 2e 20 20 49  inal symbols.  I
18f60 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 25 64  f there is no %d
18f70 65 66 61 75 6c 74 5f 74 79 70 65 20 64 65 66 69  efault_type defi
18f80 6e 65 64 20 74 68 65 6e 0a 20 20 2a 2a 20 30 20  ned then.  ** 0 
18f90 69 73 20 61 6c 73 6f 20 75 73 65 64 20 61 73 20  is also used as 
18fa0 74 68 65 20 2e 64 74 6e 75 6d 20 76 61 6c 75 65  the .dtnum value
18fb0 20 66 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   for nonterminal
18fc0 73 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 73  s which do not s
18fd0 70 65 63 69 66 79 0a 20 20 2a 2a 20 61 20 64 61  pecify.  ** a da
18fe0 74 61 74 79 70 65 20 75 73 69 6e 67 20 74 68 65  tatype using the
18ff0 20 25 74 79 70 65 20 64 69 72 65 63 74 69 76 65   %type directive
19000 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
19010 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
19020 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  l; i++){.    str
19030 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
19040 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
19050 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 70 3b  ];.    char *cp;
19060 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 6c 65 6d  .    if( sp==lem
19070 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20  p->errsym ){.   
19080 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 61     sp->dtnum = a
19090 72 72 61 79 73 69 7a 65 2b 31 3b 0a 20 20 20 20  rraysize+1;.    
190a0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
190b0 7d 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  }.    if( sp->ty
190c0 70 65 21 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20  pe!=NONTERMINAL 
190d0 7c 7c 20 28 73 70 2d 3e 64 61 74 61 74 79 70 65  || (sp->datatype
190e0 3d 3d 30 20 26 26 20 6c 65 6d 70 2d 3e 76 61 72  ==0 && lemp->var
190f0 74 79 70 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  type==0) ){.    
19100 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b    sp->dtnum = 0;
19110 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
19120 0a 20 20 20 20 7d 0a 20 20 20 20 63 70 20 3d 20  .    }.    cp = 
19130 73 70 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20 20  sp->datatype;.  
19140 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70    if( cp==0 ) cp
19150 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65   = lemp->vartype
19160 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20  ;.    j = 0;.   
19170 20 77 68 69 6c 65 28 20 69 73 73 70 61 63 65 28   while( isspace(
19180 2a 63 70 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20  *cp) ) cp++;.   
19190 20 77 68 69 6c 65 28 20 2a 63 70 20 29 20 73 74   while( *cp ) st
191a0 64 64 74 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b  ddt[j++] = *cp++
191b0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30  ;.    while( j>0
191c0 20 26 26 20 69 73 73 70 61 63 65 28 73 74 64 64   && isspace(stdd
191d0 74 5b 6a 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20  t[j-1]) ) j--;. 
191e0 20 20 20 73 74 64 64 74 5b 6a 5d 20 3d 20 30 3b     stddt[j] = 0;
191f0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
19200 73 74 64 64 74 2c 20 6c 65 6d 70 2d 3e 74 6f 6b  stddt, lemp->tok
19210 65 6e 74 79 70 65 29 3d 3d 30 20 29 7b 0a 20 20  entype)==0 ){.  
19220 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20      sp->dtnum = 
19230 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
19240 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73  e;.    }.    has
19250 68 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a  h = 0;.    for(j
19260 3d 30 3b 20 73 74 64 64 74 5b 6a 5d 3b 20 6a 2b  =0; stddt[j]; j+
19270 2b 29 7b 0a 20 20 20 20 20 20 68 61 73 68 20 3d  +){.      hash =
19280 20 68 61 73 68 2a 35 33 20 2b 20 73 74 64 64 74   hash*53 + stddt
19290 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  [j];.    }.    h
192a0 61 73 68 20 3d 20 28 68 61 73 68 20 26 20 30 78  ash = (hash & 0x
192b0 37 66 66 66 66 66 66 66 29 25 61 72 72 61 79 73  7fffffff)%arrays
192c0 69 7a 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ize;.    while( 
192d0 74 79 70 65 73 5b 68 61 73 68 5d 20 29 7b 0a 20  types[hash] ){. 
192e0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
192f0 74 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64  types[hash],stdd
19300 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)==0 ){.       
19310 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73   sp->dtnum = has
19320 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 62  h + 1;.        b
19330 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
19340 20 20 20 20 68 61 73 68 2b 2b 3b 0a 20 20 20 20      hash++;.    
19350 20 20 69 66 28 20 68 61 73 68 3e 3d 61 72 72 61    if( hash>=arra
19360 79 73 69 7a 65 20 29 20 68 61 73 68 20 3d 20 30  ysize ) hash = 0
19370 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19380 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30 20 29  types[hash]==0 )
19390 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75  {.      sp->dtnu
193a0 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20 20  m = hash + 1;.  
193b0 20 20 20 20 74 79 70 65 73 5b 68 61 73 68 5d 20      types[hash] 
193c0 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28  = (char*)malloc(
193d0 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 74 64   lemonStrlen(std
193e0 64 74 29 2b 31 20 29 3b 0a 20 20 20 20 20 20 69  dt)+1 );.      i
193f0 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d  f( types[hash]==
19400 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  0 ){.        fpr
19410 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74  intf(stderr,"Out
19420 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b   of memory.\n");
19430 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29  .        exit(1)
19440 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19450 73 74 72 63 70 79 28 74 79 70 65 73 5b 68 61 73  strcpy(types[has
19460 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20 20 20 7d  h],stddt);.    }
19470 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e 74  .  }..  /* Print
19480 20 6f 75 74 20 74 68 65 20 64 65 66 69 6e 69 74   out the definit
19490 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45 4e 54 59  ion of YYTOKENTY
194a0 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f 52 54 59  PE and YYMINORTY
194b0 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d 20 6c  PE */.  name = l
194c0 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70  emp->name ? lemp
194d0 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22  ->name : "Parse"
194e0 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c  ;.  lineno = *pl
194f0 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20 6d 68 66  ineno;.  if( mhf
19500 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f  lag ){ fprintf(o
19510 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43  ut,"#if INTERFAC
19520 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  E\n"); lineno++;
19530 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
19540 2c 22 23 64 65 66 69 6e 65 20 25 73 54 4f 4b 45  ,"#define %sTOKE
19550 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e 61 6d 65  NTYPE %s\n",name
19560 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 6f 6b 65  ,.    lemp->toke
19570 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f 6b 65  ntype?lemp->toke
19580 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22 29 3b 20  ntype:"void*"); 
19590 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28   lineno++;.  if(
195a0 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e   mhflag ){ fprin
195b0 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e  tf(out,"#endif\n
195c0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a  "); lineno++; }.
195d0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 74    fprintf(out,"t
195e0 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 5c 6e  ypedef union {\n
195f0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
19600 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69  fprintf(out,"  i
19610 6e 74 20 79 79 69 6e 69 74 3b 5c 6e 22 29 3b 20  nt yyinit;\n"); 
19620 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
19630 6e 74 66 28 6f 75 74 2c 22 20 20 25 73 54 4f 4b  ntf(out,"  %sTOK
19640 45 4e 54 59 50 45 20 79 79 30 3b 5c 6e 22 2c 6e  ENTYPE yy0;\n",n
19650 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
19660 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72    for(i=0; i<arr
19670 61 79 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  aysize; i++){.  
19680 20 20 69 66 28 20 74 79 70 65 73 5b 69 5d 3d 3d    if( types[i]==
19690 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
196a0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
196b0 20 25 73 20 79 79 25 64 3b 5c 6e 22 2c 74 79 70   %s yy%d;\n",typ
196c0 65 73 5b 69 5d 2c 69 2b 31 29 3b 20 6c 69 6e 65  es[i],i+1); line
196d0 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 74  no++;.    free(t
196e0 79 70 65 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  ypes[i]);.  }.  
196f0 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  if( lemp->errsym
19700 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20  ->useCnt ){.    
19710 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69  fprintf(out,"  i
19720 6e 74 20 79 79 25 64 3b 5c 6e 22 2c 6c 65 6d 70  nt yy%d;\n",lemp
19730 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29  ->errsym->dtnum)
19740 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
19750 20 20 66 72 65 65 28 73 74 64 64 74 29 3b 0a 20    free(stddt);. 
19760 20 66 72 65 65 28 74 79 70 65 73 29 3b 0a 20 20   free(types);.  
19770 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 20 59  fprintf(out,"} Y
19780 59 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e 22 29 3b  YMINORTYPE;\n");
19790 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a 70 6c   lineno++;.  *pl
197a0 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a  ineno = lineno;.
197b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
197c0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 43 20  the name of a C 
197d0 64 61 74 61 74 79 70 65 20 61 62 6c 65 20 74 6f  datatype able to
197e0 20 72 65 70 72 65 73 65 6e 74 20 76 61 6c 75 65   represent value
197f0 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 6c 77 72  s between.** lwr
19800 20 61 6e 64 20 75 70 72 2c 20 69 6e 63 6c 75 73   and upr, inclus
19810 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ive..*/.static c
19820 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e 69 6d  onst char *minim
19830 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e 74  um_size_type(int
19840 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 29 7b 0a   lwr, int upr){.
19850 20 20 69 66 28 20 6c 77 72 3e 3d 30 20 29 7b 0a    if( lwr>=0 ){.
19860 20 20 20 20 69 66 28 20 75 70 72 3c 3d 32 35 35      if( upr<=255
19870 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
19880 20 22 75 6e 73 69 67 6e 65 64 20 63 68 61 72 22   "unsigned char"
19890 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
198a0 75 70 72 3c 36 35 35 33 35 20 29 7b 0a 20 20 20  upr<65535 ){.   
198b0 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67     return "unsig
198c0 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 22 3b 0a  ned short int";.
198d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
198e0 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67 6e 65   return "unsigne
198f0 64 20 69 6e 74 22 3b 0a 20 20 20 20 7d 0a 20 20  d int";.    }.  
19900 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d  }else if( lwr>=-
19910 31 32 37 20 26 26 20 75 70 72 3c 3d 31 32 37 20  127 && upr<=127 
19920 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22 73  ){.    return "s
19930 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20 20 7d  igned char";.  }
19940 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d 33  else if( lwr>=-3
19950 32 37 36 37 20 26 26 20 75 70 72 3c 33 32 37 36  2767 && upr<3276
19960 37 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  7 ){.    return 
19970 22 73 68 6f 72 74 22 3b 0a 20 20 7d 65 6c 73 65  "short";.  }else
19980 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22 69 6e  {.    return "in
19990 74 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t";.  }.}../*.**
199a0 20 45 61 63 68 20 73 74 61 74 65 20 63 6f 6e 74   Each state cont
199b0 61 69 6e 73 20 61 20 73 65 74 20 6f 66 20 74 6f  ains a set of to
199c0 6b 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ken transaction 
199d0 61 6e 64 20 61 20 73 65 74 20 6f 66 0a 2a 2a 20  and a set of.** 
199e0 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 74 72 61 6e  nonterminal tran
199f0 73 61 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20  sactions.  Each 
19a00 6f 66 20 74 68 65 73 65 20 73 65 74 73 20 6d 61  of these sets ma
19a10 6b 65 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 0a  kes an instance.
19a20 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
19a30 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
19a40 41 6e 20 61 72 72 61 79 20 6f 66 20 74 68 65 73  An array of thes
19a50 65 20 73 74 72 75 63 74 75 72 65 73 20 69 73 20  e structures is 
19a60 75 73 65 64 0a 2a 2a 20 74 6f 20 6f 72 64 65 72  used.** to order
19a70 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66   the creation of
19a80 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
19a90 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c  yy_action[] tabl
19aa0 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 61 78 73  e..*/.struct axs
19ab0 65 74 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74  et {.  struct st
19ac0 61 74 65 20 2a 73 74 70 3b 20 20 20 2f 2a 20 41  ate *stp;   /* A
19ad0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
19ae0 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  ate */.  int isT
19af0 6b 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  kn;           /*
19b00 20 54 72 75 65 20 74 6f 20 75 73 65 20 74 6f 6b   True to use tok
19b10 65 6e 73 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ens.  False for 
19b20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 2a 2f  non-terminals */
19b30 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b 20  .  int nAction; 
19b40 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
19b50 72 20 6f 66 20 61 63 74 69 6f 6e 73 20 2a 2f 0a  r of actions */.
19b60 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  };../*.** Compar
19b70 65 20 74 6f 20 61 78 73 65 74 20 73 74 72 75 63  e to axset struc
19b80 74 75 72 65 73 20 66 6f 72 20 73 6f 72 74 69 6e  tures for sortin
19b90 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74  g purposes.*/.st
19ba0 61 74 69 63 20 69 6e 74 20 61 78 73 65 74 5f 63  atic int axset_c
19bb0 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76 6f 69  ompare(const voi
19bc0 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64  d *a, const void
19bd0 20 2a 62 29 7b 0a 20 20 73 74 72 75 63 74 20 61   *b){.  struct a
19be0 78 73 65 74 20 2a 70 31 20 3d 20 28 73 74 72 75  xset *p1 = (stru
19bf0 63 74 20 61 78 73 65 74 2a 29 61 3b 0a 20 20 73  ct axset*)a;.  s
19c00 74 72 75 63 74 20 61 78 73 65 74 20 2a 70 32 20  truct axset *p2 
19c10 3d 20 28 73 74 72 75 63 74 20 61 78 73 65 74 2a  = (struct axset*
19c20 29 62 3b 0a 20 20 72 65 74 75 72 6e 20 70 32 2d  )b;.  return p2-
19c30 3e 6e 41 63 74 69 6f 6e 20 2d 20 70 31 2d 3e 6e  >nAction - p1->n
19c40 41 63 74 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Action;.}../*.**
19c50 20 57 72 69 74 65 20 74 65 78 74 20 6f 6e 20 22   Write text on "
19c60 6f 75 74 22 20 74 68 61 74 20 64 65 73 63 72 69  out" that descri
19c70 62 65 73 20 74 68 65 20 72 75 6c 65 20 22 72 70  bes the rule "rp
19c80 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  "..*/.static voi
19c90 64 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28  d writeRuleText(
19ca0 46 49 4c 45 20 2a 6f 75 74 2c 20 73 74 72 75 63  FILE *out, struc
19cb0 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a 20 20 69  t rule *rp){.  i
19cc0 6e 74 20 6a 3b 0a 20 20 66 70 72 69 6e 74 66 28  nt j;.  fprintf(
19cd0 6f 75 74 2c 22 25 73 20 3a 3a 3d 22 2c 20 72 70  out,"%s ::=", rp
19ce0 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ->lhs->name);.  
19cf0 66 6f 72 28 6a 3d 30 3b 20 6a 3c 72 70 2d 3e 6e  for(j=0; j<rp->n
19d00 72 68 73 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73  rhs; j++){.    s
19d10 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
19d20 20 3d 20 72 70 2d 3e 72 68 73 5b 6a 5d 3b 0a 20   = rp->rhs[j];. 
19d30 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
19d40 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b   %s", sp->name);
19d50 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70  .    if( sp->typ
19d60 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e==MULTITERMINAL
19d70 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6b 3b   ){.      int k;
19d80 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31 3b 20  .      for(k=1; 
19d90 6b 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b  k<sp->nsubsym; k
19da0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
19db0 69 6e 74 66 28 6f 75 74 2c 22 7c 25 73 22 2c 73  intf(out,"|%s",s
19dc0 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d 2d 3e 6e 61  p->subsym[k]->na
19dd0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
19de0 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65   }.  }.}.../* Ge
19df0 6e 65 72 61 74 65 20 43 20 73 6f 75 72 63 65 20  nerate C source 
19e00 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70 61 72  code for the par
19e10 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f  ser */.void Repo
19e20 72 74 54 61 62 6c 65 28 6c 65 6d 70 2c 20 6d 68  rtTable(lemp, mh
19e30 66 6c 61 67 29 0a 73 74 72 75 63 74 20 6c 65 6d  flag).struct lem
19e40 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20 6d 68  on *lemp;.int mh
19e50 66 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74  flag;     /* Out
19e60 70 75 74 20 69 6e 20 6d 61 6b 65 68 65 61 64 65  put in makeheade
19e70 72 73 20 66 6f 72 6d 61 74 20 69 66 20 74 72 75  rs format if tru
19e80 65 20 2a 2f 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f  e */.{.  FILE *o
19e90 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20  ut, *in;.  char 
19ea0 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a  line[LINESIZE];.
19eb0 20 20 69 6e 74 20 20 6c 69 6e 65 6e 6f 3b 0a 20    int  lineno;. 
19ec0 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
19ed0 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74  tp;.  struct act
19ee0 69 6f 6e 20 2a 61 70 3b 0a 20 20 73 74 72 75 63  ion *ap;.  struc
19ef0 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74  t rule *rp;.  st
19f00 72 75 63 74 20 61 63 74 74 61 62 20 2a 70 41 63  ruct acttab *pAc
19f10 74 74 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  ttab;.  int i, j
19f20 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 6e 61 6d  , n;.  char *nam
19f30 65 3b 0a 20 20 69 6e 74 20 6d 6e 54 6b 6e 4f 66  e;.  int mnTknOf
19f40 73 74 2c 20 6d 78 54 6b 6e 4f 66 73 74 3b 0a 20  st, mxTknOfst;. 
19f50 20 69 6e 74 20 6d 6e 4e 74 4f 66 73 74 2c 20 6d   int mnNtOfst, m
19f60 78 4e 74 4f 66 73 74 3b 0a 20 20 73 74 72 75 63  xNtOfst;.  struc
19f70 74 20 61 78 73 65 74 20 2a 61 78 3b 0a 0a 20 20  t axset *ax;..  
19f80 69 6e 20 3d 20 74 70 6c 74 5f 6f 70 65 6e 28 6c  in = tplt_open(l
19f90 65 6d 70 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d  emp);.  if( in==
19fa0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 75  0 ) return;.  ou
19fb0 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65  t = file_open(le
19fc0 6d 70 2c 22 2e 63 22 2c 22 77 62 22 29 3b 0a 20  mp,".c","wb");. 
19fd0 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20   if( out==0 ){. 
19fe0 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
19ff0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
1a000 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 74   lineno = 1;.  t
1a010 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1a020 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1a030 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1a040 61 74 65 20 74 68 65 20 69 6e 63 6c 75 64 65 20  ate the include 
1a050 63 6f 64 65 2c 20 69 66 20 61 6e 79 20 2a 2f 0a  code, if any */.
1a060 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
1a070 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 69 6e 63 6c  ,lemp,lemp->incl
1a080 75 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  ude,&lineno);.  
1a090 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20  if( mhflag ){.  
1a0a0 20 20 63 68 61 72 20 2a 6e 61 6d 65 20 3d 20 66    char *name = f
1a0b0 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d  ile_makename(lem
1a0c0 70 2c 20 22 2e 68 22 29 3b 0a 20 20 20 20 66 70  p, ".h");.    fp
1a0d0 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 6e 63 6c  rintf(out,"#incl
1a0e0 75 64 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 6e  ude \"%s\"\n", n
1a0f0 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
1a100 20 20 20 20 66 72 65 65 28 6e 61 6d 65 29 3b 0a      free(name);.
1a110 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
1a120 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1a130 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1a140 2a 20 47 65 6e 65 72 61 74 65 20 23 64 65 66 69  * Generate #defi
1a150 6e 65 73 20 66 6f 72 20 61 6c 6c 20 74 6f 6b 65  nes for all toke
1a160 6e 73 20 2a 2f 0a 20 20 69 66 28 20 6d 68 66 6c  ns */.  if( mhfl
1a170 61 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ag ){.    char *
1a180 70 72 65 66 69 78 3b 0a 20 20 20 20 66 70 72 69  prefix;.    fpri
1a190 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54  ntf(out,"#if INT
1a1a0 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65  ERFACE\n"); line
1a1b0 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6c 65  no++;.    if( le
1a1c0 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20  mp->tokenprefix 
1a1d0 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d  ) prefix = lemp-
1a1e0 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20  >tokenprefix;.  
1a1f0 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
1a200 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78            prefix
1a210 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72 28 69   = "";.    for(i
1a220 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =1; i<lemp->nter
1a230 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  minal; i++){.   
1a240 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1a250 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20  #define %s%-30s 
1a260 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65  %2d\n",prefix,le
1a270 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
1a280 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 6c  name,i);.      l
1a290 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ineno++;.    }. 
1a2a0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1a2b0 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65  #endif\n"); line
1a2c0 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74  no++;.  }.  tplt
1a2d0 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1a2e0 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1a2f0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1a300 20 74 68 65 20 64 65 66 69 6e 65 73 20 2a 2f 0a   the defines */.
1a310 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1a320 64 65 66 69 6e 65 20 59 59 43 4f 44 45 54 59 50  define YYCODETYP
1a330 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e  E %s\n",.    min
1a340 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 30  imum_size_type(0
1a350 2c 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b  , lemp->nsymbol+
1a360 35 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  5)); lineno++;. 
1a370 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1a380 65 66 69 6e 65 20 59 59 4e 4f 43 4f 44 45 20 25  efine YYNOCODE %
1a390 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  d\n",lemp->nsymb
1a3a0 6f 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  ol+1);  lineno++
1a3b0 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1a3c0 22 23 64 65 66 69 6e 65 20 59 59 41 43 54 49 4f  "#define YYACTIO
1a3d0 4e 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20  NTYPE %s\n",.   
1a3e0 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79   minimum_size_ty
1a3f0 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61  pe(0, lemp->nsta
1a400 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2b 35  te+lemp->nrule+5
1a410 29 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ));  lineno++;. 
1a420 20 69 66 28 20 6c 65 6d 70 2d 3e 77 69 6c 64 63   if( lemp->wildc
1a430 61 72 64 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ard ){.    fprin
1a440 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1a450 59 59 57 49 4c 44 43 41 52 44 20 25 64 5c 6e 22  YYWILDCARD %d\n"
1a460 2c 0a 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 77  ,.       lemp->w
1a470 69 6c 64 63 61 72 64 2d 3e 69 6e 64 65 78 29 3b  ildcard->index);
1a480 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
1a490 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e 69   print_stack_uni
1a4a0 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26 6c 69 6e  on(out,lemp,&lin
1a4b0 65 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a 20 20 66  eno,mhflag);.  f
1a4c0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 69 66  printf(out, "#if
1a4d0 6e 64 65 66 20 59 59 53 54 41 43 4b 44 45 50 54  ndef YYSTACKDEPT
1a4e0 48 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  H\n"); lineno++;
1a4f0 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61  .  if( lemp->sta
1a500 63 6b 73 69 7a 65 20 29 7b 0a 20 20 20 20 66 70  cksize ){.    fp
1a510 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69  rintf(out,"#defi
1a520 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54 48 20  ne YYSTACKDEPTH 
1a530 25 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73 74 61 63  %s\n",lemp->stac
1a540 6b 73 69 7a 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b  ksize);  lineno+
1a550 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
1a560 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1a570 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54  fine YYSTACKDEPT
1a580 48 20 31 30 30 5c 6e 22 29 3b 20 20 6c 69 6e 65  H 100\n");  line
1a590 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69  no++;.  }.  fpri
1a5a0 6e 74 66 28 6f 75 74 2c 20 22 23 65 6e 64 69 66  ntf(out, "#endif
1a5b0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1a5c0 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a    if( mhflag ){.
1a5d0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1a5e0 22 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e  "#if INTERFACE\n
1a5f0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1a600 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d  }.  name = lemp-
1a610 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61  >name ? lemp->na
1a620 6d 65 20 3a 20 22 50 61 72 73 65 22 3b 0a 20 20  me : "Parse";.  
1a630 69 66 28 20 6c 65 6d 70 2d 3e 61 72 67 20 26 26  if( lemp->arg &&
1a640 20 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d 20 29 7b   lemp->arg[0] ){
1a650 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1a660 69 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  i = lemonStrlen(
1a670 6c 65 6d 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20  lemp->arg);.    
1a680 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 69  while( i>=1 && i
1a690 73 73 70 61 63 65 28 6c 65 6d 70 2d 3e 61 72 67  sspace(lemp->arg
1a6a0 5b 69 2d 31 5d 29 20 29 20 69 2d 2d 3b 0a 20 20  [i-1]) ) i--;.  
1a6b0 20 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26    while( i>=1 &&
1a6c0 20 28 69 73 61 6c 6e 75 6d 28 6c 65 6d 70 2d 3e   (isalnum(lemp->
1a6d0 61 72 67 5b 69 2d 31 5d 29 20 7c 7c 20 6c 65 6d  arg[i-1]) || lem
1a6e0 70 2d 3e 61 72 67 5b 69 2d 31 5d 3d 3d 27 5f 27  p->arg[i-1]=='_'
1a6f0 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20 66 70 72  ) ) i--;.    fpr
1a700 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1a710 65 20 25 73 41 52 47 5f 53 44 45 43 4c 20 25 73  e %sARG_SDECL %s
1a720 3b 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e  ;\n",name,lemp->
1a730 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  arg);  lineno++;
1a740 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1a750 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
1a760 50 44 45 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d  PDECL ,%s\n",nam
1a770 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c  e,lemp->arg);  l
1a780 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
1a790 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1a7a0 65 20 25 73 41 52 47 5f 46 45 54 43 48 20 25 73  e %sARG_FETCH %s
1a7b0 20 3d 20 79 79 70 50 61 72 73 65 72 2d 3e 25 73   = yypParser->%s
1a7c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1a7d0 20 20 20 20 20 20 6e 61 6d 65 2c 6c 65 6d 70 2d        name,lemp-
1a7e0 3e 61 72 67 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b  >arg,&lemp->arg[
1a7f0 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  i]);  lineno++;.
1a800 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1a810 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53  "#define %sARG_S
1a820 54 4f 52 45 20 79 79 70 50 61 72 73 65 72 2d 3e  TORE yypParser->
1a830 25 73 20 3d 20 25 73 5c 6e 22 2c 0a 20 20 20 20  %s = %s\n",.    
1a840 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d               nam
1a850 65 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 2c  e,&lemp->arg[i],
1a860 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20  &lemp->arg[i]); 
1a870 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c   lineno++;.  }el
1a880 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  se{.    fprintf(
1a890 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41  out,"#define %sA
1a8a0 52 47 5f 53 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65  RG_SDECL\n",name
1a8b0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1a8c0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1a8d0 64 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44 45  define %sARG_PDE
1a8e0 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69  CL\n",name);  li
1a8f0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
1a900 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1a910 20 25 73 41 52 47 5f 46 45 54 43 48 5c 6e 22 2c   %sARG_FETCH\n",
1a920 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
1a930 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1a940 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
1a950 53 54 4f 52 45 5c 6e 22 2c 6e 61 6d 65 29 3b 20  STORE\n",name); 
1a960 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1a970 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20  if( mhflag ){.  
1a980 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1a990 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e  endif\n"); linen
1a9a0 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  o++;.  }.  fprin
1a9b0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1a9c0 59 59 4e 53 54 41 54 45 20 25 64 5c 6e 22 2c 6c  YYNSTATE %d\n",l
1a9d0 65 6d 70 2d 3e 6e 73 74 61 74 65 29 3b 20 20 6c  emp->nstate);  l
1a9e0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
1a9f0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1aa00 59 59 4e 52 55 4c 45 20 25 64 5c 6e 22 2c 6c 65  YYNRULE %d\n",le
1aa10 6d 70 2d 3e 6e 72 75 6c 65 29 3b 20 20 6c 69 6e  mp->nrule);  lin
1aa20 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d  eno++;.  if( lem
1aa30 70 2d 3e 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e  p->errsym->useCn
1aa40 74 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  t ){.    fprintf
1aa50 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1aa60 45 52 52 4f 52 53 59 4d 42 4f 4c 20 25 64 5c 6e  ERRORSYMBOL %d\n
1aa70 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e  ",lemp->errsym->
1aa80 69 6e 64 65 78 29 3b 20 20 6c 69 6e 65 6e 6f 2b  index);  lineno+
1aa90 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  +;.    fprintf(o
1aaa0 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45 52  ut,"#define YYER
1aab0 52 53 59 4d 44 54 20 79 79 25 64 5c 6e 22 2c 6c  RSYMDT yy%d\n",l
1aac0 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e  emp->errsym->dtn
1aad0 75 6d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  um);  lineno++;.
1aae0 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e    }.  if( lemp->
1aaf0 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a  has_fallback ){.
1ab00 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1ab10 22 23 64 65 66 69 6e 65 20 59 59 46 41 4c 4c 42  "#define YYFALLB
1ab20 41 43 4b 20 31 5c 6e 22 29 3b 20 20 6c 69 6e 65  ACK 1\n");  line
1ab30 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74  no++;.  }.  tplt
1ab40 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1ab50 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1ab60 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1ab70 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
1ab80 65 20 61 6e 64 20 69 74 73 20 61 73 73 6f 63 69  e and its associ
1ab90 61 74 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ates:.  **.  ** 
1aba0 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 20 20 20   yy_action[]    
1abb0 20 20 20 20 41 20 73 69 6e 67 6c 65 20 74 61 62      A single tab
1abc0 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c  le containing al
1abd0 6c 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20  l actions..  ** 
1abe0 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20   yy_lookahead[] 
1abf0 20 20 20 20 41 20 74 61 62 6c 65 20 63 6f 6e 74      A table cont
1ac00 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 6b 61  aining the looka
1ac10 68 65 61 64 20 66 6f 72 20 65 61 63 68 20 65 6e  head for each en
1ac20 74 72 79 20 69 6e 0a 20 20 2a 2a 20 20 20 20 20  try in.  **     
1ac30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac40 79 79 5f 61 63 74 69 6f 6e 2e 20 20 55 73 65 64  yy_action.  Used
1ac50 20 74 6f 20 64 65 74 65 63 74 20 68 61 73 68 20   to detect hash 
1ac60 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2a  collisions..  **
1ac70 20 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b    yy_shift_ofst[
1ac80 5d 20 20 20 20 46 6f 72 20 65 61 63 68 20 73 74  ]    For each st
1ac90 61 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74 20  ate, the offset 
1aca0 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 66  into yy_action f
1acb0 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  or.  **         
1acc0 20 20 20 20 20 20 20 20 20 20 20 20 73 68 69 66              shif
1acd0 74 69 6e 67 20 74 65 72 6d 69 6e 61 6c 73 2e 0a  ting terminals..
1ace0 20 20 2a 2a 20 20 79 79 5f 72 65 64 75 63 65 5f    **  yy_reduce_
1acf0 6f 66 73 74 5b 5d 20 20 20 46 6f 72 20 65 61 63  ofst[]   For eac
1ad00 68 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66  h state, the off
1ad10 73 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69  set into yy_acti
1ad20 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20  on for.  **     
1ad30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad40 73 68 69 66 74 69 6e 67 20 6e 6f 6e 2d 74 65 72  shifting non-ter
1ad50 6d 69 6e 61 6c 73 20 61 66 74 65 72 20 61 20 72  minals after a r
1ad60 65 64 75 63 65 2e 0a 20 20 2a 2a 20 20 79 79 5f  educe..  **  yy_
1ad70 64 65 66 61 75 6c 74 5b 5d 20 20 20 20 20 20 20  default[]       
1ad80 44 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 66  Default action f
1ad90 6f 72 20 65 61 63 68 20 73 74 61 74 65 2e 0a 20  or each state.. 
1ada0 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74   */..  /* Comput
1adb0 65 20 74 68 65 20 61 63 74 69 6f 6e 73 20 6f 6e  e the actions on
1adc0 20 61 6c 6c 20 73 74 61 74 65 73 20 61 6e 64 20   all states and 
1add0 63 6f 75 6e 74 20 74 68 65 6d 20 75 70 20 2a 2f  count them up */
1ade0 0a 20 20 61 78 20 3d 20 63 61 6c 6c 6f 63 28 6c  .  ax = calloc(l
1adf0 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 2c 20 73  emp->nstate*2, s
1ae00 69 7a 65 6f 66 28 61 78 5b 30 5d 29 29 3b 0a 20  izeof(ax[0]));. 
1ae10 20 69 66 28 20 61 78 3d 3d 30 20 29 7b 0a 20 20   if( ax==0 ){.  
1ae20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1ae30 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c  ,"malloc failed\
1ae40 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
1ae50 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1ae60 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
1ae70 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
1ae80 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
1ae90 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 73 74  ;.    ax[i*2].st
1aea0 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61 78 5b  p = stp;.    ax[
1aeb0 69 2a 32 5d 2e 69 73 54 6b 6e 20 3d 20 31 3b 0a  i*2].isTkn = 1;.
1aec0 20 20 20 20 61 78 5b 69 2a 32 5d 2e 6e 41 63 74      ax[i*2].nAct
1aed0 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 54 6b 6e 41  ion = stp->nTknA
1aee0 63 74 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31  ct;.    ax[i*2+1
1aef0 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20  ].stp = stp;.   
1af00 20 61 78 5b 69 2a 32 2b 31 5d 2e 69 73 54 6b 6e   ax[i*2+1].isTkn
1af10 20 3d 20 30 3b 0a 20 20 20 20 61 78 5b 69 2a 32   = 0;.    ax[i*2
1af20 2b 31 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74  +1].nAction = st
1af30 70 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20 7d 0a 20  p->nNtAct;.  }. 
1af40 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20 6d 6e 54   mxTknOfst = mnT
1af50 6b 6e 4f 66 73 74 20 3d 20 30 3b 0a 20 20 6d 78  knOfst = 0;.  mx
1af60 4e 74 4f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73  NtOfst = mnNtOfs
1af70 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  t = 0;..  /* Com
1af80 70 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20  pute the action 
1af90 74 61 62 6c 65 2e 20 20 49 6e 20 6f 72 64 65 72  table.  In order
1afa0 20 74 6f 20 74 72 79 20 74 6f 20 6b 65 65 70 20   to try to keep 
1afb0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
1afc0 20 20 2a 2a 20 61 63 74 69 6f 6e 20 74 61 62 6c    ** action tabl
1afd0 65 20 74 6f 20 61 20 6d 69 6e 69 6d 75 6d 2c 20  e to a minimum, 
1afe0 74 68 65 20 68 65 75 72 69 73 74 69 63 20 6f 66  the heuristic of
1aff0 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6c 61 72   placing the lar
1b000 67 65 73 74 20 61 63 74 69 6f 6e 0a 20 20 2a 2a  gest action.  **
1b010 20 73 65 74 73 20 66 69 72 73 74 20 69 73 20 75   sets first is u
1b020 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 71 73 6f 72  sed..  */.  qsor
1b030 74 28 61 78 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61  t(ax, lemp->nsta
1b040 74 65 2a 32 2c 20 73 69 7a 65 6f 66 28 61 78 5b  te*2, sizeof(ax[
1b050 30 5d 29 2c 20 61 78 73 65 74 5f 63 6f 6d 70 61  0]), axset_compa
1b060 72 65 29 3b 0a 20 20 70 41 63 74 74 61 62 20 3d  re);.  pActtab =
1b070 20 61 63 74 74 61 62 5f 61 6c 6c 6f 63 28 29 3b   acttab_alloc();
1b080 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
1b090 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 20 26 26 20  mp->nstate*2 && 
1b0a0 61 78 5b 69 5d 2e 6e 41 63 74 69 6f 6e 3e 30 3b  ax[i].nAction>0;
1b0b0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
1b0c0 20 61 78 5b 69 5d 2e 73 74 70 3b 0a 20 20 20 20   ax[i].stp;.    
1b0d0 69 66 28 20 61 78 5b 69 5d 2e 69 73 54 6b 6e 20  if( ax[i].isTkn 
1b0e0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 61 70 3d  ){.      for(ap=
1b0f0 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  stp->ap; ap; ap=
1b100 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
1b110 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20     int action;. 
1b120 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73         if( ap->s
1b130 70 2d 3e 69 6e 64 65 78 3e 3d 6c 65 6d 70 2d 3e  p->index>=lemp->
1b140 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74  nterminal ) cont
1b150 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63  inue;.        ac
1b160 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61  tion = compute_a
1b170 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b  ction(lemp, ap);
1b180 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 63 74  .        if( act
1b190 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65  ion<0 ) continue
1b1a0 3b 0a 20 20 20 20 20 20 20 20 61 63 74 74 61 62  ;.        acttab
1b1b0 5f 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c  _action(pActtab,
1b1c0 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20   ap->sp->index, 
1b1d0 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  action);.      }
1b1e0 0a 20 20 20 20 20 20 73 74 70 2d 3e 69 54 6b 6e  .      stp->iTkn
1b1f0 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f 69 6e  Ofst = acttab_in
1b200 73 65 72 74 28 70 41 63 74 74 61 62 29 3b 0a 20  sert(pActtab);. 
1b210 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 54       if( stp->iT
1b220 6b 6e 4f 66 73 74 3c 6d 6e 54 6b 6e 4f 66 73 74  knOfst<mnTknOfst
1b230 20 29 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 73   ) mnTknOfst = s
1b240 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20  tp->iTknOfst;.  
1b250 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 54 6b      if( stp->iTk
1b260 6e 4f 66 73 74 3e 6d 78 54 6b 6e 4f 66 73 74 20  nOfst>mxTknOfst 
1b270 29 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20 73 74  ) mxTknOfst = st
1b280 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20  p->iTknOfst;.   
1b290 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
1b2a0 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
1b2b0 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
1b2c0 20 20 20 20 20 20 20 20 69 6e 74 20 61 63 74 69          int acti
1b2d0 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  on;.        if( 
1b2e0 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65  ap->sp->index<le
1b2f0 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20  mp->nterminal ) 
1b300 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1b310 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e    if( ap->sp->in
1b320 64 65 78 3d 3d 6c 65 6d 70 2d 3e 6e 73 79 6d 62  dex==lemp->nsymb
1b330 6f 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  ol ) continue;. 
1b340 20 20 20 20 20 20 20 61 63 74 69 6f 6e 20 3d 20         action = 
1b350 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c  compute_action(l
1b360 65 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20  emp, ap);.      
1b370 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29    if( action<0 )
1b380 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1b390 20 20 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e     acttab_action
1b3a0 28 70 41 63 74 74 61 62 2c 20 61 70 2d 3e 73 70  (pActtab, ap->sp
1b3b0 2d 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29  ->index, action)
1b3c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b3d0 73 74 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 61  stp->iNtOfst = a
1b3e0 63 74 74 61 62 5f 69 6e 73 65 72 74 28 70 41 63  cttab_insert(pAc
1b3f0 74 74 61 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ttab);.      if(
1b400 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3c 6d 6e   stp->iNtOfst<mn
1b410 4e 74 4f 66 73 74 20 29 20 6d 6e 4e 74 4f 66 73  NtOfst ) mnNtOfs
1b420 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  t = stp->iNtOfst
1b430 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d  ;.      if( stp-
1b440 3e 69 4e 74 4f 66 73 74 3e 6d 78 4e 74 4f 66 73  >iNtOfst>mxNtOfs
1b450 74 20 29 20 6d 78 4e 74 4f 66 73 74 20 3d 20 73  t ) mxNtOfst = s
1b460 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20  tp->iNtOfst;.   
1b470 20 7d 0a 20 20 7d 0a 20 20 66 72 65 65 28 61 78   }.  }.  free(ax
1b480 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  );..  /* Output 
1b490 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61  the yy_action ta
1b4a0 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66  ble */.  fprintf
1b4b0 28 6f 75 74 2c 22 73 74 61 74 69 63 20 63 6f 6e  (out,"static con
1b4c0 73 74 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20  st YYACTIONTYPE 
1b4d0 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 3d 20 7b 5c  yy_action[] = {\
1b4e0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1b4f0 20 6e 20 3d 20 61 63 74 74 61 62 5f 73 69 7a 65   n = acttab_size
1b500 28 70 41 63 74 74 61 62 29 3b 0a 20 20 66 6f 72  (pActtab);.  for
1b510 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
1b520 29 7b 0a 20 20 20 20 69 6e 74 20 61 63 74 69 6f  ){.    int actio
1b530 6e 20 3d 20 61 63 74 74 61 62 5f 79 79 61 63 74  n = acttab_yyact
1b540 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 69 29 3b  ion(pActtab, i);
1b550 0a 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e 3c  .    if( action<
1b560 30 20 29 20 61 63 74 69 6f 6e 20 3d 20 6c 65 6d  0 ) action = lem
1b570 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70  p->nstate + lemp
1b580 2d 3e 6e 72 75 6c 65 20 2b 20 32 3b 0a 20 20 20  ->nrule + 2;.   
1b590 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69   if( j==0 ) fpri
1b5a0 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64  ntf(out," /* %5d
1b5b0 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66   */ ", i);.    f
1b5c0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34  printf(out, " %4
1b5d0 64 2c 22 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20  d,", action);.  
1b5e0 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d    if( j==9 || i=
1b5f0 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70  =n-1 ){.      fp
1b600 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
1b610 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1b620 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c    j = 0;.    }el
1b630 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20  se{.      j++;. 
1b640 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e     }.  }.  fprin
1b650 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b  tf(out, "};\n");
1b660 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a   lineno++;..  /*
1b670 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 6c   Output the yy_l
1b680 6f 6f 6b 61 68 65 61 64 20 74 61 62 6c 65 20 2a  ookahead table *
1b690 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  /.  fprintf(out,
1b6a0 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 59 59  "static const YY
1b6b0 43 4f 44 45 54 59 50 45 20 79 79 5f 6c 6f 6f 6b  CODETYPE yy_look
1b6c0 61 68 65 61 64 5b 5d 20 3d 20 7b 5c 6e 22 29 3b  ahead[] = {\n");
1b6d0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72   lineno++;.  for
1b6e0 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
1b6f0 29 7b 0a 20 20 20 20 69 6e 74 20 6c 61 20 3d 20  ){.    int la = 
1b700 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61 68 65  acttab_yylookahe
1b710 61 64 28 70 41 63 74 74 61 62 2c 20 69 29 3b 0a  ad(pActtab, i);.
1b720 20 20 20 20 69 66 28 20 6c 61 3c 30 20 29 20 6c      if( la<0 ) l
1b730 61 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  a = lemp->nsymbo
1b740 6c 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20  l;.    if( j==0 
1b750 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20  ) fprintf(out," 
1b760 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b  /* %5d */ ", i);
1b770 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1b780 2c 20 22 20 25 34 64 2c 22 2c 20 6c 61 29 3b 0a  , " %4d,", la);.
1b790 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
1b7a0 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
1b7b0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
1b7c0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1b7d0 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
1b7e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
1b7f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
1b800 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
1b810 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20  ); lineno++;..  
1b820 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79  /* Output the yy
1b830 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 74 61  _shift_ofst[] ta
1b840 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66  ble */.  fprintf
1b850 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
1b860 59 5f 53 48 49 46 54 5f 55 53 45 5f 44 46 4c 54  Y_SHIFT_USE_DFLT
1b870 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f   (%d)\n", mnTknO
1b880 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  fst-1); lineno++
1b890 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73  ;.  n = lemp->ns
1b8a0 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28 20 6e  tate;.  while( n
1b8b0 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72 74  >0 && lemp->sort
1b8c0 65 64 5b 6e 2d 31 5d 2d 3e 69 54 6b 6e 4f 66 73  ed[n-1]->iTknOfs
1b8d0 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6e  t==NO_OFFSET ) n
1b8e0 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  --;.  fprintf(ou
1b8f0 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53  t, "#define YY_S
1b900 48 49 46 54 5f 4d 41 58 20 25 64 5c 6e 22 2c 20  HIFT_MAX %d\n", 
1b910 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  n-1); lineno++;.
1b920 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1b930 73 74 61 74 69 63 20 63 6f 6e 73 74 20 25 73 20  static const %s 
1b940 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20  yy_shift_ofst[] 
1b950 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  = {\n", .       
1b960 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f     minimum_size_
1b970 74 79 70 65 28 6d 6e 54 6b 6e 4f 66 73 74 2d 31  type(mnTknOfst-1
1b980 2c 20 6d 78 54 6b 6e 4f 66 73 74 29 29 3b 20 6c  , mxTknOfst)); l
1b990 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69  ineno++;.  for(i
1b9a0 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
1b9b0 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20  .    int ofst;. 
1b9c0 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
1b9d0 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66  orted[i];.    of
1b9e0 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66  st = stp->iTknOf
1b9f0 73 74 3b 0a 20 20 20 20 69 66 28 20 6f 66 73 74  st;.    if( ofst
1ba00 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6f 66  ==NO_OFFSET ) of
1ba10 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20 2d  st = mnTknOfst -
1ba20 20 31 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30   1;.    if( j==0
1ba30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22   ) fprintf(out,"
1ba40 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29   /* %5d */ ", i)
1ba50 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1ba60 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66 73 74  t, " %4d,", ofst
1ba70 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20  );.    if( j==9 
1ba80 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20  || i==n-1 ){.   
1ba90 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1baa0 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
1bab0 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  .      j = 0;.  
1bac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a    }else{.      j
1bad0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
1bae0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b  fprintf(out, "};
1baf0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1bb00 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
1bb10 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b   yy_reduce_ofst[
1bb20 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72  ] table */.  fpr
1bb30 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69  intf(out, "#defi
1bb40 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 55 53 45  ne YY_REDUCE_USE
1bb50 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6d  _DFLT (%d)\n", m
1bb60 6e 4e 74 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65  nNtOfst-1); line
1bb70 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70  no++;.  n = lemp
1bb80 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68 69 6c  ->nstate;.  whil
1bb90 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e  e( n>0 && lemp->
1bba0 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 4e 74  sorted[n-1]->iNt
1bbb0 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20  Ofst==NO_OFFSET 
1bbc0 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66  ) n--;.  fprintf
1bbd0 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
1bbe0 59 5f 52 45 44 55 43 45 5f 4d 41 58 20 25 64 5c  Y_REDUCE_MAX %d\
1bbf0 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f  n", n-1); lineno
1bc00 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1bc10 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74  t, "static const
1bc20 20 25 73 20 79 79 5f 72 65 64 75 63 65 5f 6f 66   %s yy_reduce_of
1bc30 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20  st[] = {\n", .  
1bc40 20 20 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f          minimum_
1bc50 73 69 7a 65 5f 74 79 70 65 28 6d 6e 4e 74 4f 66  size_type(mnNtOf
1bc60 73 74 2d 31 2c 20 6d 78 4e 74 4f 66 73 74 29 29  st-1, mxNtOfst))
1bc70 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f  ; lineno++;.  fo
1bc80 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
1bc90 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74  +){.    int ofst
1bca0 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  ;.    stp = lemp
1bcb0 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
1bcc0 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74   ofst = stp->iNt
1bcd0 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f 66  Ofst;.    if( of
1bce0 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20  st==NO_OFFSET ) 
1bcf0 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20  ofst = mnNtOfst 
1bd00 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  - 1;.    if( j==
1bd10 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  0 ) fprintf(out,
1bd20 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69  " /* %5d */ ", i
1bd30 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1bd40 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66 73  ut, " %4d,", ofs
1bd50 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39  t);.    if( j==9
1bd60 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20   || i==n-1 ){.  
1bd70 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1bd80 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   "\n"); lineno++
1bd90 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20  ;.      j = 0;. 
1bda0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bdb0 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  j++;.    }.  }. 
1bdc0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d   fprintf(out, "}
1bdd0 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1bde0 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68  ..  /* Output th
1bdf0 65 20 64 65 66 61 75 6c 74 20 61 63 74 69 6f 6e  e default action
1be00 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69   table */.  fpri
1be10 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69 63  ntf(out, "static
1be20 20 63 6f 6e 73 74 20 59 59 41 43 54 49 4f 4e 54   const YYACTIONT
1be30 59 50 45 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d  YPE yy_default[]
1be40 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   = {\n"); lineno
1be50 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e  ++;.  n = lemp->
1be60 6e 73 74 61 74 65 3b 0a 20 20 66 6f 72 28 69 3d  nstate;.  for(i=
1be70 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
1be80 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
1be90 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 69  sorted[i];.    i
1bea0 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74  f( j==0 ) fprint
1beb0 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a  f(out," /* %5d *
1bec0 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72  / ", i);.    fpr
1bed0 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c  intf(out, " %4d,
1bee0 22 2c 20 73 74 70 2d 3e 69 44 66 6c 74 29 3b 0a  ", stp->iDflt);.
1bef0 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
1bf00 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
1bf10 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
1bf20 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1bf30 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
1bf40 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
1bf50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
1bf60 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
1bf70 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74  ); lineno++;.  t
1bf80 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1bf90 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1bfa0 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1bfb0 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 6f 66  ate the table of
1bfc0 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 73   fallback tokens
1bfd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d  ..  */.  if( lem
1bfe0 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20  p->has_fallback 
1bff0 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
1c000 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  i<lemp->ntermina
1c010 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
1c020 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 70 20  truct symbol *p 
1c030 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  = lemp->symbols[
1c040 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  i];.      if( p-
1c050 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a  >fallback==0 ){.
1c060 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1c070 6f 75 74 2c 20 22 20 20 20 20 30 2c 20 20 2f 2a  out, "    0,  /*
1c080 20 25 31 30 73 20 3d 3e 20 6e 6f 74 68 69 6e 67   %10s => nothing
1c090 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 6e 61 6d 65 29   */\n", p->name)
1c0a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1c0b0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
1c0c0 75 74 2c 20 22 20 20 25 33 64 2c 20 20 2f 2a 20  ut, "  %3d,  /* 
1c0d0 25 31 30 73 20 3d 3e 20 25 73 20 2a 2f 5c 6e 22  %10s => %s */\n"
1c0e0 2c 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 69  , p->fallback->i
1c0f0 6e 64 65 78 2c 0a 20 20 20 20 20 20 20 20 20 20  ndex,.          
1c100 70 2d 3e 6e 61 6d 65 2c 20 70 2d 3e 66 61 6c 6c  p->name, p->fall
1c110 62 61 63 6b 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  back->name);.   
1c120 20 20 20 7d 0a 20 20 20 20 20 20 6c 69 6e 65 6e     }.      linen
1c130 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  o++;.    }.  }. 
1c140 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1c150 3e 6e 61 6d 65 2c 20 69 6e 2c 20 6f 75 74 2c 20  >name, in, out, 
1c160 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1c170 47 65 6e 65 72 61 74 65 20 61 20 74 61 62 6c 65  Generate a table
1c180 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1c190 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 6f 66  symbolic name of
1c1a0 20 65 76 65 72 79 20 73 79 6d 62 6f 6c 0a 20 20   every symbol.  
1c1b0 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1c1c0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69  lemp->nsymbol; i
1c1d0 2b 2b 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  ++){.    sprintf
1c1e0 28 6c 69 6e 65 2c 22 5c 22 25 73 5c 22 2c 22 2c  (line,"\"%s\",",
1c1f0 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
1c200 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 66 70 72  ->name);.    fpr
1c210 69 6e 74 66 28 6f 75 74 2c 22 20 20 25 2d 31 35  intf(out,"  %-15
1c220 73 22 2c 6c 69 6e 65 29 3b 0a 20 20 20 20 69 66  s",line);.    if
1c230 28 20 28 69 26 33 29 3d 3d 33 20 29 7b 20 66 70  ( (i&3)==3 ){ fp
1c240 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b  rintf(out,"\n");
1c250 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 7d   lineno++; }.  }
1c260 0a 20 20 69 66 28 20 28 69 26 33 29 21 3d 30 20  .  if( (i&3)!=0 
1c270 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  ){ fprintf(out,"
1c280 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20  \n"); lineno++; 
1c290 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
1c2a0 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1c2b0 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1c2c0 47 65 6e 65 72 61 74 65 20 61 20 74 61 62 6c 65  Generate a table
1c2d0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 74 65   containing a te
1c2e0 78 74 20 73 74 72 69 6e 67 20 74 68 61 74 20 64  xt string that d
1c2f0 65 73 63 72 69 62 65 73 20 65 76 65 72 79 0a 20  escribes every. 
1c300 20 2a 2a 20 72 75 6c 65 20 69 6e 20 74 68 65 20   ** rule in the 
1c310 72 75 6c 65 20 73 65 74 20 6f 66 20 74 68 65 20  rule set of the 
1c320 67 72 61 6d 6d 61 72 2e 20 20 54 68 69 73 20 69  grammar.  This i
1c330 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
1c340 65 64 0a 20 20 2a 2a 20 77 68 65 6e 20 74 72 61  ed.  ** when tra
1c350 63 69 6e 67 20 52 45 44 55 43 45 20 61 63 74 69  cing REDUCE acti
1c360 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ons..  */.  for(
1c370 69 3d 30 2c 20 72 70 3d 6c 65 6d 70 2d 3e 72 75  i=0, rp=lemp->ru
1c380 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
1c390 65 78 74 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 61  ext, i++){.    a
1c3a0 73 73 65 72 74 28 20 72 70 2d 3e 69 6e 64 65 78  ssert( rp->index
1c3b0 3d 3d 69 20 29 3b 0a 20 20 20 20 66 70 72 69 6e  ==i );.    fprin
1c3c0 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 33 64 20  tf(out," /* %3d 
1c3d0 2a 2f 20 5c 22 22 2c 20 69 29 3b 0a 20 20 20 20  */ \"", i);.    
1c3e0 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75  writeRuleText(ou
1c3f0 74 2c 20 72 70 29 3b 0a 20 20 20 20 66 70 72 69  t, rp);.    fpri
1c400 6e 74 66 28 6f 75 74 2c 22 5c 22 2c 5c 6e 22 29  ntf(out,"\",\n")
1c410 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
1c420 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1c430 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1c440 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
1c450 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63  nerate code whic
1c460 68 20 65 78 65 63 75 74 65 73 20 65 76 65 72 79  h executes every
1c470 20 74 69 6d 65 20 61 20 73 79 6d 62 6f 6c 20 69   time a symbol i
1c480 73 20 70 6f 70 70 65 64 20 66 72 6f 6d 0a 20 20  s popped from.  
1c490 2a 2a 20 74 68 65 20 73 74 61 63 6b 20 77 68 69  ** the stack whi
1c4a0 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20 65 72  le processing er
1c4b0 72 6f 72 73 20 6f 72 20 77 68 69 6c 65 20 64 65  rors or while de
1c4c0 73 74 72 6f 79 69 6e 67 20 74 68 65 20 70 61 72  stroying the par
1c4d0 73 65 72 2e 20 0a 20 20 2a 2a 20 28 49 6e 20 6f  ser. .  ** (In o
1c4e0 74 68 65 72 20 77 6f 72 64 73 2c 20 67 65 6e 65  ther words, gene
1c4f0 72 61 74 65 20 74 68 65 20 25 64 65 73 74 72 75  rate the %destru
1c500 63 74 6f 72 20 61 63 74 69 6f 6e 73 29 0a 20 20  ctor actions).  
1c510 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74  */.  if( lemp->t
1c520 6f 6b 65 6e 64 65 73 74 20 29 7b 0a 20 20 20 20  okendest ){.    
1c530 69 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20  int once = 1;.  
1c540 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1c550 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
1c560 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
1c570 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
1c580 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
1c590 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c      if( sp==0 ||
1c5a0 20 73 70 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49   sp->type!=TERMI
1c5b0 4e 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  NAL ) continue;.
1c5c0 20 20 20 20 20 20 69 66 28 20 6f 6e 63 65 20 29        if( once )
1c5d0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
1c5e0 66 28 6f 75 74 2c 20 22 20 20 20 20 20 20 2f 2a  f(out, "      /*
1c5f0 20 54 45 52 4d 49 4e 41 4c 20 44 65 73 74 72 75   TERMINAL Destru
1c600 63 74 6f 72 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e  ctor */\n"); lin
1c610 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6f  eno++;.        o
1c620 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nce = 0;.      }
1c630 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1c640 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a  ut,"    case %d:
1c650 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20   /* %s */\n",.  
1c660 20 20 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e              sp->
1c670 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29  index, sp->name)
1c680 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1c690 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
1c6a0 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 26  <lemp->nsymbol &
1c6b0 26 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  & lemp->symbols[
1c6c0 69 5d 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e  i]->type!=TERMIN
1c6d0 41 4c 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 69 66  AL; i++);.    if
1c6e0 28 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ( i<lemp->nsymbo
1c6f0 6c 20 29 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f  l ){.      emit_
1c700 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28  destructor_code(
1c710 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  out,lemp->symbol
1c720 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e  s[i],lemp,&linen
1c730 6f 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  o);.      fprint
1c740 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65  f(out,"      bre
1c750 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ak;\n"); lineno+
1c760 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  +;.    }.  }.  i
1c770 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74  f( lemp->vardest
1c780 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
1c790 79 6d 62 6f 6c 20 2a 64 66 6c 74 5f 73 70 20 3d  ymbol *dflt_sp =
1c7a0 20 30 3b 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65   0;.    int once
1c7b0 20 3d 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 1;.    for(i=
1c7c0 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
1c7d0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
1c7e0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
1c7f0 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  p = lemp->symbol
1c800 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  s[i];.      if( 
1c810 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70  sp==0 || sp->typ
1c820 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 0a 20  e==TERMINAL ||. 
1c830 20 20 20 20 20 20 20 20 20 73 70 2d 3e 69 6e 64           sp->ind
1c840 65 78 3c 3d 30 20 7c 7c 20 73 70 2d 3e 64 65 73  ex<=0 || sp->des
1c850 74 72 75 63 74 6f 72 21 3d 30 20 29 20 63 6f 6e  tructor!=0 ) con
1c860 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
1c870 20 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20   once ){.       
1c880 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
1c890 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c 74 20       /* Default 
1c8a0 4e 4f 4e 2d 54 45 52 4d 49 4e 41 4c 20 44 65 73  NON-TERMINAL Des
1c8b0 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22 29 3b 20  tructor */\n"); 
1c8c0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
1c8d0 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20    once = 0;.    
1c8e0 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
1c8f0 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20  f(out,"    case 
1c900 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c  %d: /* %s */\n",
1c910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
1c920 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61  p->index, sp->na
1c930 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
1c940 20 20 20 20 20 64 66 6c 74 5f 73 70 20 3d 20 73       dflt_sp = s
1c950 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  p;.    }.    if(
1c960 20 64 66 6c 74 5f 73 70 21 3d 30 20 29 7b 0a 20   dflt_sp!=0 ){. 
1c970 20 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72 75       emit_destru
1c980 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 64 66  ctor_code(out,df
1c990 6c 74 5f 73 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65  lt_sp,lemp,&line
1c9a0 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  no);.    }.    f
1c9b0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
1c9c0 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69    break;\n"); li
1c9d0 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f  neno++;.  }.  fo
1c9e0 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1c9f0 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
1ca00 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1ca10 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62  *sp = lemp->symb
1ca20 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ols[i];.    if( 
1ca30 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70  sp==0 || sp->typ
1ca40 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73  e==TERMINAL || s
1ca50 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 3d 3d 30  p->destructor==0
1ca60 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1ca70 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1ca80 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73    case %d: /* %s
1ca90 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   */\n",.        
1caa0 20 20 20 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73      sp->index, s
1cab0 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  p->name); lineno
1cac0 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62  ++;..    /* Comb
1cad0 69 6e 65 20 64 75 70 6c 69 63 61 74 65 20 64 65  ine duplicate de
1cae0 73 74 72 75 63 74 6f 72 73 20 69 6e 74 6f 20 61  structors into a
1caf0 20 73 69 6e 67 6c 65 20 63 61 73 65 20 2a 2f 0a   single case */.
1cb00 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a      for(j=i+1; j
1cb10 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
1cb20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  j++){.      stru
1cb30 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 32 20 3d  ct symbol *sp2 =
1cb40 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a   lemp->symbols[j
1cb50 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 32  ];.      if( sp2
1cb60 20 26 26 20 73 70 32 2d 3e 74 79 70 65 21 3d 54   && sp2->type!=T
1cb70 45 52 4d 49 4e 41 4c 20 26 26 20 73 70 32 2d 3e  ERMINAL && sp2->
1cb80 64 65 73 74 72 75 63 74 6f 72 0a 20 20 20 20 20  destructor.     
1cb90 20 20 20 20 20 26 26 20 73 70 32 2d 3e 64 74 6e       && sp2->dtn
1cba0 75 6d 3d 3d 73 70 2d 3e 64 74 6e 75 6d 0a 20 20  um==sp->dtnum.  
1cbb0 20 20 20 20 20 20 20 20 26 26 20 73 74 72 63 6d          && strcm
1cbc0 70 28 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72  p(sp->destructor
1cbd0 2c 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72  ,sp2->destructor
1cbe0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
1cbf0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1cc00 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73    case %d: /* %s
1cc10 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   */\n",.        
1cc20 20 20 20 20 20 20 20 20 20 73 70 32 2d 3e 69 6e           sp2->in
1cc30 64 65 78 2c 20 73 70 32 2d 3e 6e 61 6d 65 29 3b  dex, sp2->name);
1cc40 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
1cc50 20 20 20 20 73 70 32 2d 3e 64 65 73 74 72 75 63      sp2->destruc
1cc60 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  tor = 0;.      }
1cc70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6d 69 74  .    }..    emit
1cc80 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64 65  _destructor_code
1cc90 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  (out,lemp->symbo
1cca0 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65  ls[i],lemp,&line
1ccb0 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  no);.    fprintf
1ccc0 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65 61  (out,"      brea
1ccd0 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  k;\n"); lineno++
1cce0 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ;.  }.  tplt_xfe
1ccf0 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1cd00 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1cd10 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1cd20 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
1cd30 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 70 61   whenever the pa
1cd40 72 73 65 72 20 73 74 61 63 6b 20 6f 76 65 72 66  rser stack overf
1cd50 6c 6f 77 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70  lows */.  tplt_p
1cd60 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65  rint(out,lemp,le
1cd70 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77 2c 26 6c 69  mp->overflow,&li
1cd80 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66  neno);.  tplt_xf
1cd90 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1cda0 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1cdb0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
1cdc0 65 20 74 61 62 6c 65 20 6f 66 20 72 75 6c 65 20  e table of rule 
1cdd0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a 20 20 2a  information .  *
1cde0 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69  *.  ** Note: Thi
1cdf0 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f  s code depends o
1ce00 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20  n the fact that 
1ce10 72 75 6c 65 73 20 61 72 65 20 6e 75 6d 62 65 72  rules are number
1ce20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 74 75 61 6c  .  ** sequentual
1ce30 6c 79 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ly beginning wit
1ce40 68 20 30 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  h 0..  */.  for(
1ce50 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
1ce60 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
1ce70 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1ce80 2c 22 20 20 7b 20 25 64 2c 20 25 64 20 7d 2c 5c  ,"  { %d, %d },\
1ce90 6e 22 2c 72 70 2d 3e 6c 68 73 2d 3e 69 6e 64 65  n",rp->lhs->inde
1cea0 78 2c 72 70 2d 3e 6e 72 68 73 29 3b 20 6c 69 6e  x,rp->nrhs); lin
1ceb0 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c  eno++;.  }.  tpl
1cec0 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
1ced0 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
1cee0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
1cef0 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
1cf00 63 75 74 69 6f 6e 20 64 75 72 69 6e 67 20 65 61  cution during ea
1cf10 63 68 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e  ch REDUCE action
1cf20 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d   */.  for(rp=lem
1cf30 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
1cf40 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 74  rp->next){.    t
1cf50 72 61 6e 73 6c 61 74 65 5f 63 6f 64 65 28 6c 65  ranslate_code(le
1cf60 6d 70 2c 20 72 70 29 3b 0a 20 20 7d 0a 20 20 66  mp, rp);.  }.  f
1cf70 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
1cf80 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
1cf90 74 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 72  t){.    struct r
1cfa0 75 6c 65 20 2a 72 70 32 3b 0a 20 20 20 20 69 66  ule *rp2;.    if
1cfb0 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 20  ( rp->code==0 ) 
1cfc0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 70  continue;.    fp
1cfd0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
1cfe0 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 22 2c 20   case %d: /* ", 
1cff0 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  rp->index);.    
1d000 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f 75  writeRuleText(ou
1d010 74 2c 20 72 70 29 3b 0a 20 20 20 20 66 70 72 69  t, rp);.    fpri
1d020 6e 74 66 28 6f 75 74 2c 20 22 20 2a 2f 5c 6e 22  ntf(out, " */\n"
1d030 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
1d040 20 66 6f 72 28 72 70 32 3d 72 70 2d 3e 6e 65 78   for(rp2=rp->nex
1d050 74 3b 20 72 70 32 3b 20 72 70 32 3d 72 70 32 2d  t; rp2; rp2=rp2-
1d060 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
1d070 28 20 72 70 32 2d 3e 63 6f 64 65 3d 3d 72 70 2d  ( rp2->code==rp-
1d080 3e 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  >code ){.       
1d090 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1d0a0 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20      case %d: /* 
1d0b0 22 2c 20 72 70 32 2d 3e 69 6e 64 65 78 29 3b 0a  ", rp2->index);.
1d0c0 20 20 20 20 20 20 20 20 77 72 69 74 65 52 75 6c          writeRul
1d0d0 65 54 65 78 74 28 6f 75 74 2c 20 72 70 32 29 3b  eText(out, rp2);
1d0e0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
1d0f0 28 6f 75 74 2c 22 20 2a 2f 5c 6e 22 29 3b 20 6c  (out," */\n"); l
1d100 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
1d110 20 72 70 32 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a   rp2->code = 0;.
1d120 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d130 20 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c    emit_code(out,
1d140 72 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  rp,lemp,&lineno)
1d150 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1d160 74 2c 22 20 20 20 20 20 20 20 20 62 72 65 61 6b  t,"        break
1d170 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1d180 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
1d190 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1d1a0 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1d1b0 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1d1c0 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20   which executes 
1d1d0 69 66 20 61 20 70 61 72 73 65 20 66 61 69 6c 73  if a parse fails
1d1e0 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74   */.  tplt_print
1d1f0 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e  (out,lemp,lemp->
1d200 66 61 69 6c 75 72 65 2c 26 6c 69 6e 65 6e 6f 29  failure,&lineno)
1d210 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
1d220 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1d230 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1d240 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68  Generate code wh
1d250 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65  ich executes whe
1d260 6e 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72  n a syntax error
1d270 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 74 70 6c   occurs */.  tpl
1d280 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70  t_print(out,lemp
1d290 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72 2c 26 6c 69  ,lemp->error,&li
1d2a0 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66  neno);.  tplt_xf
1d2b0 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1d2c0 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1d2d0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1d2e0 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
1d2f0 73 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65  s when the parse
1d300 72 20 61 63 63 65 70 74 73 20 69 74 73 20 69 6e  r accepts its in
1d310 70 75 74 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72  put */.  tplt_pr
1d320 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d  int(out,lemp,lem
1d330 70 2d 3e 61 63 63 65 70 74 2c 26 6c 69 6e 65 6e  p->accept,&linen
1d340 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  o);.  tplt_xfer(
1d350 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1d360 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1d370 2a 20 41 70 70 65 6e 64 20 61 6e 79 20 61 64 64  * Append any add
1d380 69 74 69 6f 6e 20 63 6f 64 65 20 74 68 65 20 75  ition code the u
1d390 73 65 72 20 64 65 73 69 72 65 73 20 2a 2f 0a 20  ser desires */. 
1d3a0 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
1d3b0 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78 74 72 61  lemp,lemp->extra
1d3c0 63 6f 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  code,&lineno);..
1d3d0 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
1d3e0 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 72  fclose(out);.  r
1d3f0 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e  eturn;.}../* Gen
1d400 65 72 61 74 65 20 61 20 68 65 61 64 65 72 20 66  erate a header f
1d410 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 72 73  ile for the pars
1d420 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72  er */.void Repor
1d430 74 48 65 61 64 65 72 28 6c 65 6d 70 29 0a 73 74  tHeader(lemp).st
1d440 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
1d450 3b 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c  ;.{.  FILE *out,
1d460 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a 70 72   *in;.  char *pr
1d470 65 66 69 78 3b 0a 20 20 63 68 61 72 20 6c 69 6e  efix;.  char lin
1d480 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 63  e[LINESIZE];.  c
1d490 68 61 72 20 70 61 74 74 65 72 6e 5b 4c 49 4e 45  har pattern[LINE
1d4a0 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a  SIZE];.  int i;.
1d4b0 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b  .  if( lemp->tok
1d4c0 65 6e 70 72 65 66 69 78 20 29 20 70 72 65 66 69  enprefix ) prefi
1d4d0 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70  x = lemp->tokenp
1d4e0 72 65 66 69 78 3b 0a 20 20 65 6c 73 65 20 20 20  refix;.  else   
1d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d500 20 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20   prefix = "";.  
1d510 69 6e 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c  in = file_open(l
1d520 65 6d 70 2c 22 2e 68 22 2c 22 72 62 22 29 3b 0a  emp,".h","rb");.
1d530 20 20 69 66 28 20 69 6e 20 29 7b 0a 20 20 20 20    if( in ){.    
1d540 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d  for(i=1; i<lemp-
1d550 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26 20 66 67  >nterminal && fg
1d560 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a  ets(line,LINESIZ
1d570 45 2c 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  E,in); i++){.   
1d580 20 20 20 73 70 72 69 6e 74 66 28 70 61 74 74 65     sprintf(patte
1d590 72 6e 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d  rn,"#define %s%-
1d5a0 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69  30s %2d\n",prefi
1d5b0 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  x,lemp->symbols[
1d5c0 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20  i]->name,i);.   
1d5d0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6c 69     if( strcmp(li
1d5e0 6e 65 2c 70 61 74 74 65 72 6e 29 20 29 20 62 72  ne,pattern) ) br
1d5f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  eak;.    }.    f
1d600 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 69  close(in);.    i
1d610 66 28 20 69 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72  f( i==lemp->nter
1d620 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f  minal ){.      /
1d630 2a 20 4e 6f 20 63 68 61 6e 67 65 20 69 6e 20 74  * No change in t
1d640 68 65 20 66 69 6c 65 2e 20 20 44 6f 6e 27 74 20  he file.  Don't 
1d650 72 65 77 72 69 74 65 20 69 74 2e 20 2a 2f 0a 20  rewrite it. */. 
1d660 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
1d670 20 7d 0a 20 20 7d 0a 20 20 6f 75 74 20 3d 20 66   }.  }.  out = f
1d680 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e  ile_open(lemp,".
1d690 68 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20  h","wb");.  if( 
1d6a0 6f 75 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  out ){.    for(i
1d6b0 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =1; i<lemp->nter
1d6c0 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  minal; i++){.   
1d6d0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1d6e0 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20  #define %s%-30s 
1d6f0 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65  %2d\n",prefix,le
1d700 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
1d710 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 7d 0a 20  name,i);.    }. 
1d720 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 20     fclose(out); 
1d730 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a   .  }.  return;.
1d740 7d 0a 0a 2f 2a 20 52 65 64 75 63 65 20 74 68 65  }../* Reduce the
1d750 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 63 74   size of the act
1d760 69 6f 6e 20 74 61 62 6c 65 73 2c 20 69 66 20 70  ion tables, if p
1d770 6f 73 73 69 62 6c 65 2c 20 62 79 20 6d 61 6b 69  ossible, by maki
1d780 6e 67 20 75 73 65 0a 2a 2a 20 6f 66 20 64 65 66  ng use.** of def
1d790 61 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  aults..**.** In 
1d7a0 74 68 69 73 20 76 65 72 73 69 6f 6e 2c 20 77 65  this version, we
1d7b0 20 74 61 6b 65 20 74 68 65 20 6d 6f 73 74 20 66   take the most f
1d7c0 72 65 71 75 65 6e 74 20 52 45 44 55 43 45 20 61  requent REDUCE a
1d7d0 63 74 69 6f 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a  ction and make.*
1d7e0 2a 20 69 74 20 74 68 65 20 64 65 66 61 75 6c 74  * it the default
1d7f0 2e 20 20 45 78 63 65 70 74 2c 20 74 68 65 72 65  .  Except, there
1d800 20 69 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 69   is no default i
1d810 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 74  f the wildcard t
1d820 6f 6b 65 6e 0a 2a 2a 20 69 73 20 61 20 70 6f 73  oken.** is a pos
1d830 73 69 62 6c 65 20 6c 6f 6f 6b 2d 61 68 65 61 64  sible look-ahead
1d840 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6d 70 72 65  ..*/.void Compre
1d850 73 73 54 61 62 6c 65 73 28 6c 65 6d 70 29 0a 73  ssTables(lemp).s
1d860 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
1d870 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 74  p;.{.  struct st
1d880 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
1d890 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20 2a  ct action *ap, *
1d8a0 61 70 32 3b 0a 20 20 73 74 72 75 63 74 20 72 75  ap2;.  struct ru
1d8b0 6c 65 20 2a 72 70 2c 20 2a 72 70 32 2c 20 2a 72  le *rp, *rp2, *r
1d8c0 62 65 73 74 3b 0a 20 20 69 6e 74 20 6e 62 65 73  best;.  int nbes
1d8d0 74 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  t, n;.  int i;. 
1d8e0 20 69 6e 74 20 75 73 65 73 57 69 6c 64 63 61 72   int usesWildcar
1d8f0 64 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  d;..  for(i=0; i
1d900 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
1d910 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
1d920 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
1d930 20 20 20 20 6e 62 65 73 74 20 3d 20 30 3b 0a 20      nbest = 0;. 
1d940 20 20 20 72 62 65 73 74 20 3d 20 30 3b 0a 20 20     rbest = 0;.  
1d950 20 20 75 73 65 73 57 69 6c 64 63 61 72 64 20 3d    usesWildcard =
1d960 20 30 3b 0a 0a 20 20 20 20 66 6f 72 28 61 70 3d   0;..    for(ap=
1d970 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  stp->ap; ap; ap=
1d980 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
1d990 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 53   if( ap->type==S
1d9a0 48 49 46 54 20 26 26 20 61 70 2d 3e 73 70 3d 3d  HIFT && ap->sp==
1d9b0 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64 20 29  lemp->wildcard )
1d9c0 7b 0a 20 20 20 20 20 20 20 20 75 73 65 73 57 69  {.        usesWi
1d9d0 6c 64 63 61 72 64 20 3d 20 31 3b 0a 20 20 20 20  ldcard = 1;.    
1d9e0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 70    }.      if( ap
1d9f0 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45 20 29  ->type!=REDUCE )
1da00 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
1da10 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a   rp = ap->x.rp;.
1da20 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68        if( rp->lh
1da30 73 53 74 61 72 74 20 29 20 63 6f 6e 74 69 6e 75  sStart ) continu
1da40 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 3d  e;.      if( rp=
1da50 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69 6e 75  =rbest ) continu
1da60 65 3b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a  e;.      n = 1;.
1da70 20 20 20 20 20 20 66 6f 72 28 61 70 32 3d 61 70        for(ap2=ap
1da80 2d 3e 6e 65 78 74 3b 20 61 70 32 3b 20 61 70 32  ->next; ap2; ap2
1da90 3d 61 70 32 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =ap2->next){.   
1daa0 20 20 20 20 20 69 66 28 20 61 70 32 2d 3e 74 79       if( ap2->ty
1dab0 70 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f 6e  pe!=REDUCE ) con
1dac0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 72  tinue;.        r
1dad0 70 32 20 3d 20 61 70 32 2d 3e 78 2e 72 70 3b 0a  p2 = ap2->x.rp;.
1dae0 20 20 20 20 20 20 20 20 69 66 28 20 72 70 32 3d          if( rp2=
1daf0 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69 6e 75  =rbest ) continu
1db00 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  e;.        if( r
1db10 70 32 3d 3d 72 70 20 29 20 6e 2b 2b 3b 0a 20 20  p2==rp ) n++;.  
1db20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1db30 6e 3e 6e 62 65 73 74 20 29 7b 0a 20 20 20 20 20  n>nbest ){.     
1db40 20 20 20 6e 62 65 73 74 20 3d 20 6e 3b 0a 20 20     nbest = n;.  
1db50 20 20 20 20 20 20 72 62 65 73 74 20 3d 20 72 70        rbest = rp
1db60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1db70 20 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20   .    /* Do not 
1db80 6d 61 6b 65 20 61 20 64 65 66 61 75 6c 74 20 69  make a default i
1db90 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
1dba0 72 75 6c 65 73 20 74 6f 20 64 65 66 61 75 6c 74  rules to default
1dbb0 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61  .    ** is not a
1dbc0 74 20 6c 65 61 73 74 20 31 20 6f 72 20 69 66 20  t least 1 or if 
1dbd0 74 68 65 20 77 69 6c 64 63 61 72 64 20 74 6f 6b  the wildcard tok
1dbe0 65 6e 20 69 73 20 61 20 70 6f 73 73 69 62 6c 65  en is a possible
1dbf0 0a 20 20 20 20 2a 2a 20 6c 6f 6f 6b 61 68 65 61  .    ** lookahea
1dc00 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
1dc10 28 20 6e 62 65 73 74 3c 31 20 7c 7c 20 75 73 65  ( nbest<1 || use
1dc20 73 57 69 6c 64 63 61 72 64 20 29 20 63 6f 6e 74  sWildcard ) cont
1dc30 69 6e 75 65 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43  inue;...    /* C
1dc40 6f 6d 62 69 6e 65 20 6d 61 74 63 68 69 6e 67 20  ombine matching 
1dc50 52 45 44 55 43 45 20 61 63 74 69 6f 6e 73 20 69  REDUCE actions i
1dc60 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 64 65 66  nto a single def
1dc70 61 75 6c 74 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ault */.    for(
1dc80 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
1dc90 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
1dca0 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65      if( ap->type
1dcb0 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e  ==REDUCE && ap->
1dcc0 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20 62 72  x.rp==rbest ) br
1dcd0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  eak;.    }.    a
1dce0 73 73 65 72 74 28 20 61 70 20 29 3b 0a 20 20 20  ssert( ap );.   
1dcf0 20 61 70 2d 3e 73 70 20 3d 20 53 79 6d 62 6f 6c   ap->sp = Symbol
1dd00 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c 74 7d 22  _new("{default}"
1dd10 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 61 70  );.    for(ap=ap
1dd20 2d 3e 6e 65 78 74 3b 20 61 70 3b 20 61 70 3d 61  ->next; ap; ap=a
1dd30 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
1dd40 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45  if( ap->type==RE
1dd50 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72 70  DUCE && ap->x.rp
1dd60 3d 3d 72 62 65 73 74 20 29 20 61 70 2d 3e 74 79  ==rbest ) ap->ty
1dd70 70 65 20 3d 20 4e 4f 54 5f 55 53 45 44 3b 0a 20  pe = NOT_USED;. 
1dd80 20 20 20 7d 0a 20 20 20 20 73 74 70 2d 3e 61 70     }.    stp->ap
1dd90 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73   = Action_sort(s
1dda0 74 70 2d 3e 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a  tp->ap);.  }.}..
1ddb0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
1ddc0 77 6f 20 73 74 61 74 65 73 20 66 6f 72 20 73 6f  wo states for so
1ddd0 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73 2e 20  rting purposes. 
1dde0 20 54 68 65 20 73 6d 61 6c 6c 65 72 20 73 74 61   The smaller sta
1ddf0 74 65 20 69 73 20 74 68 65 0a 2a 2a 20 6f 6e 65  te is the.** one
1de00 20 77 69 74 68 20 74 68 65 20 6d 6f 73 74 20 6e   with the most n
1de10 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63 74 69  on-terminal acti
1de20 6f 6e 73 2e 20 20 49 66 20 74 68 65 79 20 68 61  ons.  If they ha
1de30 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62  ve the same numb
1de40 65 72 0a 2a 2a 20 6f 66 20 6e 6f 6e 2d 74 65 72  er.** of non-ter
1de50 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2c 20 74  minal actions, t
1de60 68 65 6e 20 74 68 65 20 73 6d 61 6c 6c 65 72 20  hen the smaller 
1de70 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20  is the one with 
1de80 74 68 65 20 6d 6f 73 74 0a 2a 2a 20 74 6f 6b 65  the most.** toke
1de90 6e 20 61 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  n actions..*/.st
1dea0 61 74 69 63 20 69 6e 74 20 73 74 61 74 65 52 65  atic int stateRe
1deb0 73 6f 72 74 43 6f 6d 70 61 72 65 28 63 6f 6e 73  sortCompare(cons
1dec0 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74  t void *a, const
1ded0 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 63 6f 6e   void *b){.  con
1dee0 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65 20  st struct state 
1def0 2a 70 41 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74  *pA = *(const st
1df00 72 75 63 74 20 73 74 61 74 65 2a 2a 29 61 3b 0a  ruct state**)a;.
1df10 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 73    const struct s
1df20 74 61 74 65 20 2a 70 42 20 3d 20 2a 28 63 6f 6e  tate *pB = *(con
1df30 73 74 20 73 74 72 75 63 74 20 73 74 61 74 65 2a  st struct state*
1df40 2a 29 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20  *)b;.  int n;.. 
1df50 20 6e 20 3d 20 70 42 2d 3e 6e 4e 74 41 63 74 20   n = pB->nNtAct 
1df60 2d 20 70 41 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20  - pA->nNtAct;.  
1df70 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
1df80 6e 20 3d 20 70 42 2d 3e 6e 54 6b 6e 41 63 74 20  n = pB->nTknAct 
1df90 2d 20 70 41 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20  - pA->nTknAct;. 
1dfa0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
1dfb0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 75 6d 62 65  .../*.** Renumbe
1dfc0 72 20 61 6e 64 20 72 65 73 6f 72 74 20 73 74 61  r and resort sta
1dfd0 74 65 73 20 73 6f 20 74 68 61 74 20 73 74 61 74  tes so that stat
1dfe0 65 73 20 77 69 74 68 20 66 65 77 65 72 20 63 68  es with fewer ch
1dff0 6f 69 63 65 73 0a 2a 2a 20 6f 63 63 75 72 20 61  oices.** occur a
1e000 74 20 74 68 65 20 65 6e 64 2e 20 20 45 78 63 65  t the end.  Exce
1e010 70 74 2c 20 6b 65 65 70 20 73 74 61 74 65 20 30  pt, keep state 0
1e020 20 61 73 20 74 68 65 20 66 69 72 73 74 20 73 74   as the first st
1e030 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 52 65 73  ate..*/.void Res
1e040 6f 72 74 53 74 61 74 65 73 28 6c 65 6d 70 29 0a  ortStates(lemp).
1e050 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
1e060 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  mp;.{.  int i;. 
1e070 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
1e080 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74  tp;.  struct act
1e090 69 6f 6e 20 2a 61 70 3b 0a 0a 20 20 66 6f 72 28  ion *ap;..  for(
1e0a0 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
1e0b0 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
1e0c0 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
1e0d0 64 5b 69 5d 3b 0a 20 20 20 20 73 74 70 2d 3e 6e  d[i];.    stp->n
1e0e0 54 6b 6e 41 63 74 20 3d 20 73 74 70 2d 3e 6e 4e  TknAct = stp->nN
1e0f0 74 41 63 74 20 3d 20 30 3b 0a 20 20 20 20 73 74  tAct = 0;.    st
1e100 70 2d 3e 69 44 66 6c 74 20 3d 20 6c 65 6d 70 2d  p->iDflt = lemp-
1e110 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e  >nstate + lemp->
1e120 6e 72 75 6c 65 3b 0a 20 20 20 20 73 74 70 2d 3e  nrule;.    stp->
1e130 69 54 6b 6e 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46  iTknOfst = NO_OF
1e140 46 53 45 54 3b 0a 20 20 20 20 73 74 70 2d 3e 69  FSET;.    stp->i
1e150 4e 74 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53  NtOfst = NO_OFFS
1e160 45 54 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73  ET;.    for(ap=s
1e170 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61  tp->ap; ap; ap=a
1e180 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
1e190 69 66 28 20 63 6f 6d 70 75 74 65 5f 61 63 74 69  if( compute_acti
1e1a0 6f 6e 28 6c 65 6d 70 2c 61 70 29 3e 3d 30 20 29  on(lemp,ap)>=0 )
1e1b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  {.        if( ap
1e1c0 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70  ->sp->index<lemp
1e1d0 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20  ->nterminal ){. 
1e1e0 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 54           stp->nT
1e1f0 6b 6e 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20  knAct++;.       
1e200 20 7d 65 6c 73 65 20 69 66 28 20 61 70 2d 3e 73   }else if( ap->s
1e210 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e  p->index<lemp->n
1e220 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20  symbol ){.      
1e230 20 20 20 20 73 74 70 2d 3e 6e 4e 74 41 63 74 2b      stp->nNtAct+
1e240 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
1e250 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 70 2d  {.          stp-
1e260 3e 69 44 66 6c 74 20 3d 20 63 6f 6d 70 75 74 65  >iDflt = compute
1e270 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70  _action(lemp, ap
1e280 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1e290 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
1e2a0 20 71 73 6f 72 74 28 26 6c 65 6d 70 2d 3e 73 6f   qsort(&lemp->so
1e2b0 72 74 65 64 5b 31 5d 2c 20 6c 65 6d 70 2d 3e 6e  rted[1], lemp->n
1e2c0 73 74 61 74 65 2d 31 2c 20 73 69 7a 65 6f 66 28  state-1, sizeof(
1e2d0 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d 29  lemp->sorted[0])
1e2e0 2c 0a 20 20 20 20 20 20 20 20 73 74 61 74 65 52  ,.        stateR
1e2f0 65 73 6f 72 74 43 6f 6d 70 61 72 65 29 3b 0a 20  esortCompare);. 
1e300 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
1e310 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
1e320 20 20 20 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64      lemp->sorted
1e330 5b 69 5d 2d 3e 73 74 61 74 65 6e 75 6d 20 3d 20  [i]->statenum = 
1e340 69 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a  i;.  }.}.../****
1e350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
1e360 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73 65 74  om the file "set
1e370 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
1e380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e390 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
1e3a0 53 65 74 20 6d 61 6e 69 70 75 6c 61 74 69 6f 6e  Set manipulation
1e3b0 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 74 68   routines for th
1e3c0 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
1e3d0 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74  enerator..*/..st
1e3e0 61 74 69 63 20 69 6e 74 20 73 69 7a 65 20 3d 20  atic int size = 
1e3f0 30 3b 0a 0a 2f 2a 20 53 65 74 20 74 68 65 20 73  0;../* Set the s
1e400 65 74 20 73 69 7a 65 20 2a 2f 0a 76 6f 69 64 20  et size */.void 
1e410 53 65 74 53 69 7a 65 28 6e 29 0a 69 6e 74 20 6e  SetSize(n).int n
1e420 3b 0a 7b 0a 20 20 73 69 7a 65 20 3d 20 6e 2b 31  ;.{.  size = n+1
1e430 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;.}../* Allocate
1e440 20 61 20 6e 65 77 20 73 65 74 20 2a 2f 0a 63 68   a new set */.ch
1e450 61 72 20 2a 53 65 74 4e 65 77 28 29 7b 0a 20 20  ar *SetNew(){.  
1e460 63 68 61 72 20 2a 73 3b 0a 20 20 73 20 3d 20 28  char *s;.  s = (
1e470 63 68 61 72 2a 29 63 61 6c 6c 6f 63 28 20 73 69  char*)calloc( si
1e480 7a 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 73 3d  ze, 1);.  if( s=
1e490 3d 30 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e  =0 ){.    extern
1e4a0 20 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72   void memory_err
1e4b0 6f 72 28 29 3b 0a 20 20 20 20 6d 65 6d 6f 72 79  or();.    memory
1e4c0 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20  _error();.  }.  
1e4d0 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20  return s;.}../* 
1e4e0 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 73 65 74  Deallocate a set
1e4f0 20 2a 2f 0a 76 6f 69 64 20 53 65 74 46 72 65 65   */.void SetFree
1e500 28 73 29 0a 63 68 61 72 20 2a 73 3b 0a 7b 0a 20  (s).char *s;.{. 
1e510 20 66 72 65 65 28 73 29 3b 0a 7d 0a 0a 2f 2a 20   free(s);.}../* 
1e520 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
1e530 74 20 74 6f 20 74 68 65 20 73 65 74 2e 20 20 52  t to the set.  R
1e540 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
1e550 65 20 65 6c 65 6d 65 6e 74 20 77 61 73 20 61 64  e element was ad
1e560 64 65 64 0a 2a 2a 20 61 6e 64 20 46 41 4c 53 45  ded.** and FALSE
1e570 20 69 66 20 69 74 20 77 61 73 20 61 6c 72 65 61   if it was alrea
1e580 64 79 20 74 68 65 72 65 2e 20 2a 2f 0a 69 6e 74  dy there. */.int
1e590 20 53 65 74 41 64 64 28 73 2c 65 29 0a 63 68 61   SetAdd(s,e).cha
1e5a0 72 20 2a 73 3b 0a 69 6e 74 20 65 3b 0a 7b 0a 20  r *s;.int e;.{. 
1e5b0 20 69 6e 74 20 72 76 3b 0a 20 20 61 73 73 65 72   int rv;.  asser
1e5c0 74 28 20 65 3e 3d 30 20 26 26 20 65 3c 73 69 7a  t( e>=0 && e<siz
1e5d0 65 20 29 3b 0a 20 20 72 76 20 3d 20 73 5b 65 5d  e );.  rv = s[e]
1e5e0 3b 0a 20 20 73 5b 65 5d 20 3d 20 31 3b 0a 20 20  ;.  s[e] = 1;.  
1e5f0 72 65 74 75 72 6e 20 21 72 76 3b 0a 7d 0a 0a 2f  return !rv;.}../
1e600 2a 20 41 64 64 20 65 76 65 72 79 20 65 6c 65 6d  * Add every elem
1e610 65 6e 74 20 6f 66 20 73 32 20 74 6f 20 73 31 2e  ent of s2 to s1.
1e620 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
1e630 20 73 31 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a   s1 changes. */.
1e640 69 6e 74 20 53 65 74 55 6e 69 6f 6e 28 73 31 2c  int SetUnion(s1,
1e650 73 32 29 0a 63 68 61 72 20 2a 73 31 3b 0a 63 68  s2).char *s1;.ch
1e660 61 72 20 2a 73 32 3b 0a 7b 0a 20 20 69 6e 74 20  ar *s2;.{.  int 
1e670 69 2c 20 70 72 6f 67 72 65 73 73 3b 0a 20 20 70  i, progress;.  p
1e680 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 66  rogress = 0;.  f
1e690 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20  or(i=0; i<size; 
1e6a0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 32  i++){.    if( s2
1e6b0 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
1e6c0 65 3b 0a 20 20 20 20 69 66 28 20 73 31 5b 69 5d  e;.    if( s1[i]
1e6d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f  ==0 ){.      pro
1e6e0 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20  gress = 1;.     
1e6f0 20 73 31 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20   s1[i] = 1;.    
1e700 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
1e710 72 6f 67 72 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a 2a  rogress;.}./****
1e720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e730 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
1e740 20 22 74 61 62 6c 65 2e 63 22 20 2a 2a 2a 2a 2a   "table.c" *****
1e750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e760 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41  *******/./*.** A
1e770 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20  ll code in this 
1e780 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61 75  file has been au
1e790 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65  tomatically gene
1e7a0 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20  rated.** from a 
1e7b0 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e  specification in
1e7c0 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20   the file.**    
1e7d0 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65            "table
1e7e0 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20 61 73  .q".** by the as
1e7f0 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
1e800 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20 70 72  code building pr
1e810 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a  ogram "aagen"..*
1e820 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 74 68  * Do not edit th
1e830 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74 65 61  is file!  Instea
1e840 64 2c 20 65 64 69 74 20 74 68 65 20 73 70 65 63  d, edit the spec
1e850 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c  ification.** fil
1e860 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20 61 61  e, then rerun aa
1e870 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f  gen..*/./*.** Co
1e880 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  de for processin
1e890 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  g tables in the 
1e8a0 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
1e8b0 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 50 52 49 56  erator..*/..PRIV
1e8c0 41 54 45 20 69 6e 74 20 73 74 72 68 61 73 68 28  ATE int strhash(
1e8d0 78 29 0a 63 68 61 72 20 2a 78 3b 0a 7b 0a 20 20  x).char *x;.{.  
1e8e0 69 6e 74 20 68 20 3d 20 30 3b 0a 20 20 77 68 69  int h = 0;.  whi
1e8f0 6c 65 28 20 2a 78 29 20 68 20 3d 20 68 2a 31 33  le( *x) h = h*13
1e900 20 2b 20 2a 28 78 2b 2b 29 3b 0a 20 20 72 65 74   + *(x++);.  ret
1e910 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72  urn h;.}../* Wor
1e920 6b 73 20 6c 69 6b 65 20 73 74 72 64 75 70 2c 20  ks like strdup, 
1e930 73 6f 72 74 20 6f 66 2e 20 20 53 61 76 65 20 61  sort of.  Save a
1e940 20 73 74 72 69 6e 67 20 69 6e 20 6d 61 6c 6c 6f   string in mallo
1e950 63 65 64 20 6d 65 6d 6f 72 79 2c 20 62 75 74 0a  ced memory, but.
1e960 2a 2a 20 6b 65 65 70 20 73 74 72 69 6e 67 73 20  ** keep strings 
1e970 69 6e 20 61 20 74 61 62 6c 65 20 73 6f 20 74 68  in a table so th
1e980 61 74 20 74 68 65 20 73 61 6d 65 20 73 74 72 69  at the same stri
1e990 6e 67 20 69 73 20 6e 6f 74 20 69 6e 20 6d 6f 72  ng is not in mor
1e9a0 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 70 6c  e.** than one pl
1e9b0 61 63 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 53 74  ace..*/.char *St
1e9c0 72 73 61 66 65 28 79 29 0a 63 68 61 72 20 2a 79  rsafe(y).char *y
1e9d0 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a  ;.{.  char *z;..
1e9e0 20 20 69 66 28 20 79 3d 3d 30 20 29 20 72 65 74    if( y==0 ) ret
1e9f0 75 72 6e 20 30 3b 0a 20 20 7a 20 3d 20 53 74 72  urn 0;.  z = Str
1ea00 73 61 66 65 5f 66 69 6e 64 28 79 29 3b 0a 20 20  safe_find(y);.  
1ea10 69 66 28 20 7a 3d 3d 30 20 26 26 20 28 7a 3d 6d  if( z==0 && (z=m
1ea20 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c  alloc( lemonStrl
1ea30 65 6e 28 79 29 2b 31 20 29 29 21 3d 30 20 29 7b  en(y)+1 ))!=0 ){
1ea40 0a 20 20 20 20 73 74 72 63 70 79 28 7a 2c 79 29  .    strcpy(z,y)
1ea50 3b 0a 20 20 20 20 53 74 72 73 61 66 65 5f 69 6e  ;.    Strsafe_in
1ea60 73 65 72 74 28 7a 29 3b 0a 20 20 7d 0a 20 20 4d  sert(z);.  }.  M
1ea70 65 6d 6f 72 79 43 68 65 63 6b 28 7a 29 3b 0a 20  emoryCheck(z);. 
1ea80 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
1ea90 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
1eaa0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
1eab0 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
1eac0 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73  e for each.** as
1ead0 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
1eae0 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f  of type "x1"..*/
1eaf0 0a 73 74 72 75 63 74 20 73 5f 78 31 20 7b 0a 20  .struct s_x1 {. 
1eb00 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
1eb10 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1eb20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
1eb30 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20  ble slots. */.  
1eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb50 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73          /*   Mus
1eb60 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
1eb70 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  2 greater than o
1eb80 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  r */.           
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1eba0 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a  *   equal to 1 *
1ebb0 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20  /.  int count;  
1ebc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1ebd0 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74  umber of current
1ebe0 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20  ly slots filled 
1ebf0 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31  */.  struct s_x1
1ec00 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54  node *tbl;  /* T
1ec10 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68  he data stored h
1ec20 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ere */.  struct 
1ec30 73 5f 78 31 6e 6f 64 65 20 2a 2a 68 74 3b 20 20  s_x1node **ht;  
1ec40 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f  /* Hash table fo
1ec50 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a  r lookups */.};.
1ec60 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  ./* There is one
1ec70 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
1ec80 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  s structure for 
1ec90 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65  every data eleme
1eca0 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f  nt.** in an asso
1ecb0 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66  ciative array of
1ecc0 20 74 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 74   type "x1"..*/.t
1ecd0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f  ypedef struct s_
1ece0 78 31 6e 6f 64 65 20 7b 0a 20 20 63 68 61 72 20  x1node {.  char 
1ecf0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
1ed00 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
1ed10 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ata */.  struct 
1ed20 73 5f 78 31 6e 6f 64 65 20 2a 6e 65 78 74 3b 20  s_x1node *next; 
1ed30 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
1ed40 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61  with the same ha
1ed50 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  sh */.  struct s
1ed60 5f 78 31 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20  _x1node **from; 
1ed70 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e   /* Previous lin
1ed80 6b 20 2a 2f 0a 7d 20 78 31 6e 6f 64 65 3b 0a 0a  k */.} x1node;..
1ed90 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79  /* There is only
1eda0 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
1edb0 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63   the array, whic
1edc0 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h is the followi
1edd0 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ng */.static str
1ede0 75 63 74 20 73 5f 78 31 20 2a 78 31 61 3b 0a 0a  uct s_x1 *x1a;..
1edf0 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
1ee00 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  w associative ar
1ee10 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 74 72 73  ray */.void Strs
1ee20 61 66 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66  afe_init(){.  if
1ee30 28 20 78 31 61 20 29 20 72 65 74 75 72 6e 3b 0a  ( x1a ) return;.
1ee40 20 20 78 31 61 20 3d 20 28 73 74 72 75 63 74 20    x1a = (struct 
1ee50 73 5f 78 31 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  s_x1*)malloc( si
1ee60 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 31  zeof(struct s_x1
1ee70 29 20 29 3b 0a 20 20 69 66 28 20 78 31 61 20 29  ) );.  if( x1a )
1ee80 7b 0a 20 20 20 20 78 31 61 2d 3e 73 69 7a 65 20  {.    x1a->size 
1ee90 3d 20 31 30 32 34 3b 0a 20 20 20 20 78 31 61 2d  = 1024;.    x1a-
1eea0 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  >count = 0;.    
1eeb0 78 31 61 2d 3e 74 62 6c 20 3d 20 28 78 31 6e 6f  x1a->tbl = (x1no
1eec0 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20  de*)malloc( .   
1eed0 20 20 20 28 73 69 7a 65 6f 66 28 78 31 6e 6f 64     (sizeof(x1nod
1eee0 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f  e) + sizeof(x1no
1eef0 64 65 2a 29 29 2a 31 30 32 34 20 29 3b 0a 20 20  de*))*1024 );.  
1ef00 20 20 69 66 28 20 78 31 61 2d 3e 74 62 6c 3d 3d    if( x1a->tbl==
1ef10 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
1ef20 78 31 61 29 3b 0a 20 20 20 20 20 20 78 31 61 20  x1a);.      x1a 
1ef30 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1ef40 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1ef50 20 20 20 78 31 61 2d 3e 68 74 20 3d 20 28 78 31     x1a->ht = (x1
1ef60 6e 6f 64 65 2a 2a 29 26 28 78 31 61 2d 3e 74 62  node**)&(x1a->tb
1ef70 6c 5b 31 30 32 34 5d 29 3b 0a 20 20 20 20 20 20  l[1024]);.      
1ef80 66 6f 72 28 69 3d 30 3b 20 69 3c 31 30 32 34 3b  for(i=0; i<1024;
1ef90 20 69 2b 2b 29 20 78 31 61 2d 3e 68 74 5b 69 5d   i++) x1a->ht[i]
1efa0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1efb0 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  }./* Insert a ne
1efc0 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
1efd0 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e  e array.  Return
1efe0 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73   TRUE if success
1eff0 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61  ful..** Prior da
1f000 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ta with the same
1f010 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72   key is NOT over
1f020 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53  written */.int S
1f030 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28 64 61  trsafe_insert(da
1f040 74 61 29 0a 63 68 61 72 20 2a 64 61 74 61 3b 0a  ta).char *data;.
1f050 7b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a  {.  x1node *np;.
1f060 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70    int h;.  int p
1f070 68 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d 30  h;..  if( x1a==0
1f080 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
1f090 68 20 3d 20 73 74 72 68 61 73 68 28 64 61 74 61  h = strhash(data
1f0a0 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  );.  h = ph & (x
1f0b0 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  1a->size-1);.  n
1f0c0 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x1a->ht[h];.
1f0d0 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
1f0e0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70     if( strcmp(np
1f0f0 2d 3e 64 61 74 61 2c 64 61 74 61 29 3d 3d 30 20  ->data,data)==0 
1f100 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  ){.      /* An e
1f110 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69  xisting entry wi
1f120 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
1f130 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20  is found. */.   
1f140 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75     /* Fail becau
1f150 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20  se overwrite is 
1f160 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20  not allows. */. 
1f170 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1f180 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70     }.    np = np
1f190 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  ->next;.  }.  if
1f1a0 28 20 78 31 61 2d 3e 63 6f 75 6e 74 3e 3d 78 31  ( x1a->count>=x1
1f1b0 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f  a->size ){.    /
1f1c0 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74  * Need to make t
1f1d0 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69  he hash table bi
1f1e0 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  gger */.    int 
1f1f0 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75  i,size;.    stru
1f200 63 74 20 73 5f 78 31 20 61 72 72 61 79 3b 0a 20  ct s_x1 array;. 
1f210 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20     array.size = 
1f220 73 69 7a 65 20 3d 20 78 31 61 2d 3e 73 69 7a 65  size = x1a->size
1f230 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f  *2;.    array.co
1f240 75 6e 74 20 3d 20 78 31 61 2d 3e 63 6f 75 6e 74  unt = x1a->count
1f250 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20  ;.    array.tbl 
1f260 3d 20 28 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f  = (x1node*)mallo
1f270 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66  c(.      (sizeof
1f280 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x1node) + sizeo
1f290 66 28 78 31 6e 6f 64 65 2a 29 29 2a 73 69 7a 65  f(x1node*))*size
1f2a0 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61   );.    if( arra
1f2b0 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72  y.tbl==0 ) retur
1f2c0 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75  n 0;  /* Fail du
1f2d0 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e to malloc fail
1f2e0 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79  ure */.    array
1f2f0 2e 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29  .ht = (x1node**)
1f300 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65  &(array.tbl[size
1f310 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ]);.    for(i=0;
1f320 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72   i<size; i++) ar
1f330 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  ray.ht[i] = 0;. 
1f340 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 31     for(i=0; i<x1
1f350 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a  a->count; i++){.
1f360 20 20 20 20 20 20 78 31 6e 6f 64 65 20 2a 6f 6c        x1node *ol
1f370 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20  dnp, *newnp;.   
1f380 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 31 61     oldnp = &(x1a
1f390 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  ->tbl[i]);.     
1f3a0 20 68 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64   h = strhash(old
1f3b0 6e 70 2d 3e 64 61 74 61 29 20 26 20 28 73 69 7a  np->data) & (siz
1f3c0 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  e-1);.      newn
1f3d0 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b  p = &(array.tbl[
1f3e0 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  i]);.      if( a
1f3f0 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72  rray.ht[h] ) arr
1f400 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  ay.ht[h]->from =
1f410 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b   &(newnp->next);
1f420 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65  .      newnp->ne
1f430 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d  xt = array.ht[h]
1f440 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64  ;.      newnp->d
1f450 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74  ata = oldnp->dat
1f460 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  a;.      newnp->
1f470 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68  from = &(array.h
1f480 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72  t[h]);.      arr
1f490 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70  ay.ht[h] = newnp
1f4a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
1f4b0 28 78 31 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20  (x1a->tbl);.    
1f4c0 2a 78 31 61 20 3d 20 61 72 72 61 79 3b 0a 20 20  *x1a = array;.  
1f4d0 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  }.  /* Insert th
1f4e0 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20  e new data */.  
1f4f0 68 20 3d 20 70 68 20 26 20 28 78 31 61 2d 3e 73  h = ph & (x1a->s
1f500 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26  ize-1);.  np = &
1f510 28 78 31 61 2d 3e 74 62 6c 5b 78 31 61 2d 3e 63  (x1a->tbl[x1a->c
1f520 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e  ount++]);.  np->
1f530 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69  data = data;.  i
1f540 66 28 20 78 31 61 2d 3e 68 74 5b 68 5d 20 29 20  f( x1a->ht[h] ) 
1f550 78 31 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  x1a->ht[h]->from
1f560 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a   = &(np->next);.
1f570 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 31 61    np->next = x1a
1f580 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 31 61 2d 3e  ->ht[h];.  x1a->
1f590 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70  ht[h] = np;.  np
1f5a0 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 31 61 2d 3e  ->from = &(x1a->
1f5b0 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ht[h]);.  return
1f5c0 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   1;.}../* Return
1f5d0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
1f5e0 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ta assigned to t
1f5f0 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52  he given key.  R
1f600 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
1f610 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f   no such key. */
1f620 0a 63 68 61 72 20 2a 53 74 72 73 61 66 65 5f 66  .char *Strsafe_f
1f630 69 6e 64 28 6b 65 79 29 0a 63 68 61 72 20 2a 6b  ind(key).char *k
1f640 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20  ey;.{.  int h;. 
1f650 20 78 31 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20   x1node *np;..  
1f660 69 66 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74  if( x1a==0 ) ret
1f670 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 72  urn 0;.  h = str
1f680 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 31 61  hash(key) & (x1a
1f690 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20  ->size-1);.  np 
1f6a0 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x1a->ht[h];.  
1f6b0 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20  while( np ){.   
1f6c0 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e   if( strcmp(np->
1f6d0 64 61 74 61 2c 6b 65 79 29 3d 3d 30 20 29 20 62  data,key)==0 ) b
1f6e0 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e  reak;.    np = n
1f6f0 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72  p->next;.  }.  r
1f700 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64  eturn np ? np->d
1f710 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52  ata : 0;.}../* R
1f720 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1f730 74 6f 20 74 68 65 20 28 74 65 72 6d 69 6e 61 6c  to the (terminal
1f740 20 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 29   or nonterminal)
1f750 20 73 79 6d 62 6f 6c 20 22 78 22 2e 0a 2a 2a 20   symbol "x"..** 
1f760 43 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d  Create a new sym
1f770 62 6f 6c 20 69 66 20 74 68 69 73 20 69 73 20 74  bol if this is t
1f780 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 22 78  he first time "x
1f790 22 20 68 61 73 20 62 65 65 6e 20 73 65 65 6e 2e  " has been seen.
1f7a0 0a 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  .*/.struct symbo
1f7b0 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29  l *Symbol_new(x)
1f7c0 0a 63 68 61 72 20 2a 78 3b 0a 7b 0a 20 20 73 74  .char *x;.{.  st
1f7d0 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
1f7e0 0a 0a 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f  ..  sp = Symbol_
1f7f0 66 69 6e 64 28 78 29 3b 0a 20 20 69 66 28 20 73  find(x);.  if( s
1f800 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 70 20 3d  p==0 ){.    sp =
1f810 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20   (struct symbol 
1f820 2a 29 63 61 6c 6c 6f 63 28 31 2c 20 73 69 7a 65  *)calloc(1, size
1f830 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  of(struct symbol
1f840 29 20 29 3b 0a 20 20 20 20 4d 65 6d 6f 72 79 43  ) );.    MemoryC
1f850 68 65 63 6b 28 73 70 29 3b 0a 20 20 20 20 73 70  heck(sp);.    sp
1f860 2d 3e 6e 61 6d 65 20 3d 20 53 74 72 73 61 66 65  ->name = Strsafe
1f870 28 78 29 3b 0a 20 20 20 20 73 70 2d 3e 74 79 70  (x);.    sp->typ
1f880 65 20 3d 20 69 73 75 70 70 65 72 28 2a 78 29 20  e = isupper(*x) 
1f890 3f 20 54 45 52 4d 49 4e 41 4c 20 3a 20 4e 4f 4e  ? TERMINAL : NON
1f8a0 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 73 70  TERMINAL;.    sp
1f8b0 2d 3e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20  ->rule = 0;.    
1f8c0 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30  sp->fallback = 0
1f8d0 3b 0a 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d  ;.    sp->prec =
1f8e0 20 2d 31 3b 0a 20 20 20 20 73 70 2d 3e 61 73 73   -1;.    sp->ass
1f8f0 6f 63 20 3d 20 55 4e 4b 3b 0a 20 20 20 20 73 70  oc = UNK;.    sp
1f900 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 30 3b 0a  ->firstset = 0;.
1f910 20 20 20 20 73 70 2d 3e 6c 61 6d 62 64 61 20 3d      sp->lambda =
1f920 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20   LEMON_FALSE;.  
1f930 20 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72    sp->destructor
1f940 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64 65   = 0;.    sp->de
1f950 73 74 4c 69 6e 65 6e 6f 20 3d 20 30 3b 0a 20 20  stLineno = 0;.  
1f960 20 20 73 70 2d 3e 64 61 74 61 74 79 70 65 20 3d    sp->datatype =
1f970 20 30 3b 0a 20 20 20 20 73 70 2d 3e 75 73 65 43   0;.    sp->useC
1f980 6e 74 20 3d 20 30 3b 0a 20 20 20 20 53 79 6d 62  nt = 0;.    Symb
1f990 6f 6c 5f 69 6e 73 65 72 74 28 73 70 2c 73 70 2d  ol_insert(sp,sp-
1f9a0 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 70  >name);.  }.  sp
1f9b0 2d 3e 75 73 65 43 6e 74 2b 2b 3b 0a 20 20 72 65  ->useCnt++;.  re
1f9c0 74 75 72 6e 20 73 70 3b 0a 7d 0a 0a 2f 2a 20 43  turn sp;.}../* C
1f9d0 6f 6d 70 61 72 65 20 74 77 6f 20 73 79 6d 62 6f  ompare two symbo
1f9e0 6c 73 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 70  ls for working p
1f9f0 75 72 70 6f 73 65 73 0a 2a 2a 0a 2a 2a 20 53 79  urposes.**.** Sy
1fa00 6d 62 6f 6c 73 20 74 68 61 74 20 62 65 67 69 6e  mbols that begin
1fa10 20 77 69 74 68 20 75 70 70 65 72 20 63 61 73 65   with upper case
1fa20 20 6c 65 74 74 65 72 73 20 28 74 65 72 6d 69 6e   letters (termin
1fa30 61 6c 73 20 6f 72 20 74 6f 6b 65 6e 73 29 0a 2a  als or tokens).*
1fa40 2a 20 6d 75 73 74 20 73 6f 72 74 20 62 65 66 6f  * must sort befo
1fa50 72 65 20 73 79 6d 62 6f 6c 73 20 74 68 61 74 20  re symbols that 
1fa60 62 65 67 69 6e 20 77 69 74 68 20 6c 6f 77 65 72  begin with lower
1fa70 20 63 61 73 65 20 6c 65 74 74 65 72 73 0a 2a 2a   case letters.**
1fa80 20 28 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 29   (non-terminals)
1fa90 2e 20 20 4f 74 68 65 72 20 74 68 61 6e 20 74 68  .  Other than th
1faa0 61 74 2c 20 74 68 65 20 6f 72 64 65 72 20 64 6f  at, the order do
1fab0 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 0a 2a  es not matter..*
1fac0 2a 0a 2a 2a 20 57 65 20 66 69 6e 64 20 65 78 70  *.** We find exp
1fad0 65 72 69 6d 65 6e 74 61 6c 6c 79 20 74 68 61 74  erimentally that
1fae0 20 6c 65 61 76 69 6e 67 20 74 68 65 20 73 79 6d   leaving the sym
1faf0 62 6f 6c 73 20 69 6e 20 74 68 65 69 72 20 6f 72  bols in their or
1fb00 69 67 69 6e 61 6c 0a 2a 2a 20 6f 72 64 65 72 20  iginal.** order 
1fb10 28 74 68 65 20 6f 72 64 65 72 20 74 68 65 79 20  (the order they 
1fb20 61 70 70 65 61 72 65 64 20 69 6e 20 74 68 65 20  appeared in the 
1fb30 67 72 61 6d 6d 61 72 20 66 69 6c 65 29 20 67 69  grammar file) gi
1fb40 76 65 73 20 74 68 65 0a 2a 2a 20 73 6d 61 6c 6c  ves the.** small
1fb50 65 73 74 20 70 61 72 73 65 72 20 74 61 62 6c 65  est parser table
1fb60 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a  s in SQLite..*/.
1fb70 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28 73  int Symbolcmpp(s
1fb80 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 61  truct symbol **a
1fb90 2c 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  , struct symbol 
1fba0 2a 2a 62 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d  **b){.  int i1 =
1fbb0 20 28 2a 2a 61 29 2e 69 6e 64 65 78 20 2b 20 31   (**a).index + 1
1fbc0 30 30 30 30 30 30 30 2a 28 28 2a 2a 61 29 2e 6e  0000000*((**a).n
1fbd0 61 6d 65 5b 30 5d 3e 27 5a 27 29 3b 0a 20 20 69  ame[0]>'Z');.  i
1fbe0 6e 74 20 69 32 20 3d 20 28 2a 2a 62 29 2e 69 6e  nt i2 = (**b).in
1fbf0 64 65 78 20 2b 20 31 30 30 30 30 30 30 30 2a 28  dex + 10000000*(
1fc00 28 2a 2a 62 29 2e 6e 61 6d 65 5b 30 5d 3e 27 5a  (**b).name[0]>'Z
1fc10 27 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 31 2d  ');.  return i1-
1fc20 69 32 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20  i2;.}../* There 
1fc30 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
1fc40 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1fc50 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
1fc60 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69  ach.** associati
1fc70 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
1fc80 20 22 78 32 22 2e 0a 2a 2f 0a 73 74 72 75 63 74   "x2"..*/.struct
1fc90 20 73 5f 78 32 20 7b 0a 20 20 69 6e 74 20 73 69   s_x2 {.  int si
1fca0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
1fcb0 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
1fcc0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  of available slo
1fcd0 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ts. */.         
1fce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcf0 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20   /*   Must be a 
1fd00 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74  power of 2 great
1fd10 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20  er than or */.  
1fd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd30 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75          /*   equ
1fd40 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74  al to 1 */.  int
1fd50 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20   count;         
1fd60 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1fd70 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74  f currently slot
1fd80 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74  s filled */.  st
1fd90 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 74  ruct s_x2node *t
1fda0 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  bl;  /* The data
1fdb0 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a   stored here */.
1fdc0 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64    struct s_x2nod
1fdd0 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68  e **ht;  /* Hash
1fde0 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75   table for looku
1fdf0 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  ps */.};../* The
1fe00 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
1fe10 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
1fe20 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64  ture for every d
1fe30 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69  ata element.** i
1fe40 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65  n an associative
1fe50 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
1fe60 78 32 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  x2"..*/.typedef 
1fe70 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20  struct s_x2node 
1fe80 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  {.  struct symbo
1fe90 6c 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  l *data;        
1fea0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1feb0 20 64 61 74 61 20 2a 2f 0a 20 20 63 68 61 72 20   data */.  char 
1fec0 2a 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20  *key;           
1fed0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b          /* The k
1fee0 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  ey */.  struct s
1fef0 5f 78 32 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20  _x2node *next;  
1ff00 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77   /* Next entry w
1ff10 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73  ith the same has
1ff20 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  h */.  struct s_
1ff30 78 32 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20  x2node **from;  
1ff40 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b  /* Previous link
1ff50 20 2a 2f 0a 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f   */.} x2node;../
1ff60 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  * There is only 
1ff70 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
1ff80 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68  the array, which
1ff90 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   is the followin
1ffa0 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  g */.static stru
1ffb0 63 74 20 73 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f  ct s_x2 *x2a;../
1ffc0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
1ffd0 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
1ffe0 61 79 20 2a 2f 0a 76 6f 69 64 20 53 79 6d 62 6f  ay */.void Symbo
1fff0 6c 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20  l_init(){.  if( 
20000 78 32 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  x2a ) return;.  
20010 78 32 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f  x2a = (struct s_
20020 78 32 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  x2*)malloc( size
20030 6f 66 28 73 74 72 75 63 74 20 73 5f 78 32 29 20  of(struct s_x2) 
20040 29 3b 0a 20 20 69 66 28 20 78 32 61 20 29 7b 0a  );.  if( x2a ){.
20050 20 20 20 20 78 32 61 2d 3e 73 69 7a 65 20 3d 20      x2a->size = 
20060 31 32 38 3b 0a 20 20 20 20 78 32 61 2d 3e 63 6f  128;.    x2a->co
20070 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 32 61  unt = 0;.    x2a
20080 2d 3e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a  ->tbl = (x2node*
20090 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20  )malloc( .      
200a0 28 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20  (sizeof(x2node) 
200b0 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a  + sizeof(x2node*
200c0 29 29 2a 31 32 38 20 29 3b 0a 20 20 20 20 69 66  ))*128 );.    if
200d0 28 20 78 32 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b  ( x2a->tbl==0 ){
200e0 0a 20 20 20 20 20 20 66 72 65 65 28 78 32 61 29  .      free(x2a)
200f0 3b 0a 20 20 20 20 20 20 78 32 61 20 3d 20 30 3b  ;.      x2a = 0;
20100 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20110 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78    int i;.      x
20120 32 61 2d 3e 68 74 20 3d 20 28 78 32 6e 6f 64 65  2a->ht = (x2node
20130 2a 2a 29 26 28 78 32 61 2d 3e 74 62 6c 5b 31 32  **)&(x2a->tbl[12
20140 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  8]);.      for(i
20150 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20  =0; i<128; i++) 
20160 78 32 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a  x2a->ht[i] = 0;.
20170 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49      }.  }.}./* I
20180 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f  nsert a new reco
20190 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61  rd into the arra
201a0 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  y.  Return TRUE 
201b0 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a  if successful..*
201c0 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77 69 74  * Prior data wit
201d0 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69  h the same key i
201e0 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65  s NOT overwritte
201f0 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f  n */.int Symbol_
20200 69 6e 73 65 72 74 28 64 61 74 61 2c 6b 65 79 29  insert(data,key)
20210 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
20220 64 61 74 61 3b 0a 63 68 61 72 20 2a 6b 65 79 3b  data;.char *key;
20230 0a 7b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b  .{.  x2node *np;
20240 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20  .  int h;.  int 
20250 70 68 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d  ph;..  if( x2a==
20260 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
20270 70 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79  ph = strhash(key
20280 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  );.  h = ph & (x
20290 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  2a->size-1);.  n
202a0 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x2a->ht[h];.
202b0 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
202c0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70     if( strcmp(np
202d0 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b  ->key,key)==0 ){
202e0 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69  .      /* An exi
202f0 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68  sting entry with
20300 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
20310 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20   found. */.     
20320 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65   /* Fail because
20330 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f   overwrite is no
20340 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20  t allows. */.   
20350 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
20360 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e   }.    np = np->
20370 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  next;.  }.  if( 
20380 78 32 61 2d 3e 63 6f 75 6e 74 3e 3d 78 32 61 2d  x2a->count>=x2a-
20390 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20  >size ){.    /* 
203a0 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65  Need to make the
203b0 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67   hash table bigg
203c0 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c  er */.    int i,
203d0 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74  size;.    struct
203e0 20 73 5f 78 32 20 61 72 72 61 79 3b 0a 20 20 20   s_x2 array;.   
203f0 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69   array.size = si
20400 7a 65 20 3d 20 78 32 61 2d 3e 73 69 7a 65 2a 32  ze = x2a->size*2
20410 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e  ;.    array.coun
20420 74 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a  t = x2a->count;.
20430 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20      array.tbl = 
20440 28 78 32 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x2node*)malloc(
20450 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
20460 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  2node) + sizeof(
20470 78 32 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29  x2node*))*size )
20480 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e  ;.    if( array.
20490 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  tbl==0 ) return 
204a0 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20  0;  /* Fail due 
204b0 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72  to malloc failur
204c0 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68  e */.    array.h
204d0 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28  t = (x2node**)&(
204e0 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29  array.tbl[size])
204f0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
20500 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  <size; i++) arra
20510 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  y.ht[i] = 0;.   
20520 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 32 61 2d   for(i=0; i<x2a-
20530 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20  >count; i++){.  
20540 20 20 20 20 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e      x2node *oldn
20550 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20  p, *newnp;.     
20560 20 6f 6c 64 6e 70 20 3d 20 26 28 78 32 61 2d 3e   oldnp = &(x2a->
20570 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68  tbl[i]);.      h
20580 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70   = strhash(oldnp
20590 2d 3e 6b 65 79 29 20 26 20 28 73 69 7a 65 2d 31  ->key) & (size-1
205a0 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d  );.      newnp =
205b0 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29   &(array.tbl[i])
205c0 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61  ;.      if( arra
205d0 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e  y.ht[h] ) array.
205e0 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
205f0 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20  newnp->next);.  
20600 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20      newnp->next 
20610 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20  = array.ht[h];. 
20620 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20       newnp->key 
20630 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20  = oldnp->key;.  
20640 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20      newnp->data 
20650 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20  = oldnp->data;. 
20660 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d       newnp->from
20670 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d   = &(array.ht[h]
20680 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68  );.      array.h
20690 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20  t[h] = newnp;.  
206a0 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 32 61    }.    free(x2a
206b0 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 32 61  ->tbl);.    *x2a
206c0 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20   = array;.  }.  
206d0 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
206e0 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20  w data */.  h = 
206f0 70 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d  ph & (x2a->size-
20700 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 32 61  1);.  np = &(x2a
20710 2d 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f 75 6e 74  ->tbl[x2a->count
20720 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20  ++]);.  np->key 
20730 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74  = key;.  np->dat
20740 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20  a = data;.  if( 
20750 78 32 61 2d 3e 68 74 5b 68 5d 20 29 20 78 32 61  x2a->ht[h] ) x2a
20760 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  ->ht[h]->from = 
20770 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e  &(np->next);.  n
20780 70 2d 3e 6e 65 78 74 20 3d 20 78 32 61 2d 3e 68  p->next = x2a->h
20790 74 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e 68 74 5b  t[h];.  x2a->ht[
207a0 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66  h] = np;.  np->f
207b0 72 6f 6d 20 3d 20 26 28 78 32 61 2d 3e 68 74 5b  rom = &(x2a->ht[
207c0 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  h]);.  return 1;
207d0 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
207e0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
207f0 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20  assigned to the 
20800 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75  given key.  Retu
20810 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f  rn NULL.** if no
20820 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74   such key. */.st
20830 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d  ruct symbol *Sym
20840 62 6f 6c 5f 66 69 6e 64 28 6b 65 79 29 0a 63 68  bol_find(key).ch
20850 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74  ar *key;.{.  int
20860 20 68 3b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70   h;.  x2node *np
20870 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20  ;..  if( x2a==0 
20880 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20  ) return 0;.  h 
20890 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29 20 26  = strhash(key) &
208a0 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x2a->size-1);.
208b0 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68    np = x2a->ht[h
208c0 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
208d0 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
208e0 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30  (np->key,key)==0
208f0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70   ) break;.    np
20900 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
20910 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e  .  return np ? n
20920 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a  p->data : 0;.}..
20930 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 2d  /* Return the n-
20940 74 68 20 64 61 74 61 2e 20 20 52 65 74 75 72 6e  th data.  Return
20950 20 4e 55 4c 4c 20 69 66 20 6e 20 69 73 20 6f 75   NULL if n is ou
20960 74 20 6f 66 20 72 61 6e 67 65 2e 20 2a 2f 0a 73  t of range. */.s
20970 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
20980 6d 62 6f 6c 5f 4e 74 68 28 6e 29 0a 69 6e 74 20  mbol_Nth(n).int 
20990 6e 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79  n;.{.  struct sy
209a0 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a 20 20 69 66  mbol *data;.  if
209b0 28 20 78 32 61 20 26 26 20 6e 3e 30 20 26 26 20  ( x2a && n>0 && 
209c0 6e 3c 3d 78 32 61 2d 3e 63 6f 75 6e 74 20 29 7b  n<=x2a->count ){
209d0 0a 20 20 20 20 64 61 74 61 20 3d 20 78 32 61 2d  .    data = x2a-
209e0 3e 74 62 6c 5b 6e 2d 31 5d 2e 64 61 74 61 3b 0a  >tbl[n-1].data;.
209f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 61 74    }else{.    dat
20a00 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  a = 0;.  }.  ret
20a10 75 72 6e 20 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 20  urn data;.}../* 
20a20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
20a30 6f 66 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a  of the array */.
20a40 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74  int Symbol_count
20a50 28 29 0a 7b 0a 20 20 72 65 74 75 72 6e 20 78 32  ().{.  return x2
20a60 61 20 3f 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3a  a ? x2a->count :
20a70 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   0;.}../* Return
20a80 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   an array of poi
20a90 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74  nters to all dat
20aa0 61 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  a in the table..
20ab0 2a 2a 20 54 68 65 20 61 72 72 61 79 20 69 73 20  ** The array is 
20ac0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
20ad0 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55  lloc.  Return NU
20ae0 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c  LL if memory all
20af0 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c  ocation.** probl
20b00 65 6d 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61  ems, or if the a
20b10 72 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a  rray is empty. *
20b20 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  /.struct symbol 
20b30 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66  **Symbol_arrayof
20b40 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79  ().{.  struct sy
20b50 6d 62 6f 6c 20 2a 2a 61 72 72 61 79 3b 0a 20 20  mbol **array;.  
20b60 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 69 66  int i,size;.  if
20b70 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x2a==0 ) retur
20b80 6e 20 30 3b 0a 20 20 73 69 7a 65 20 3d 20 78 32  n 0;.  size = x2
20b90 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61  a->count;.  arra
20ba0 79 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62  y = (struct symb
20bb0 6f 6c 20 2a 2a 29 63 61 6c 6c 6f 63 28 73 69 7a  ol **)calloc(siz
20bc0 65 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  e, sizeof(struct
20bd0 20 73 79 6d 62 6f 6c 20 2a 29 29 3b 0a 20 20 69   symbol *));.  i
20be0 66 28 20 61 72 72 61 79 20 29 7b 0a 20 20 20 20  f( array ){.    
20bf0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
20c00 20 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d   i++) array[i] =
20c10 20 78 32 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74   x2a->tbl[i].dat
20c20 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  a;.  }.  return 
20c30 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d  array;.}../* Com
20c40 70 61 72 65 20 74 77 6f 20 63 6f 6e 66 69 67 75  pare two configu
20c50 72 61 74 69 6f 6e 73 20 2a 2f 0a 69 6e 74 20 43  rations */.int C
20c60 6f 6e 66 69 67 63 6d 70 28 61 2c 62 29 0a 73 74  onfigcmp(a,b).st
20c70 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a  ruct config *a;.
20c80 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
20c90 3b 0a 7b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 78  ;.{.  int x;.  x
20ca0 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20   = a->rp->index 
20cb0 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a  - b->rp->index;.
20cc0 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d    if( x==0 ) x =
20cd0 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74   a->dot - b->dot
20ce0 3b 0a 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a  ;.  return x;.}.
20cf0 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  ./* Compare two 
20d00 73 74 61 74 65 73 20 2a 2f 0a 50 52 49 56 41 54  states */.PRIVAT
20d10 45 20 69 6e 74 20 73 74 61 74 65 63 6d 70 28 61  E int statecmp(a
20d20 2c 62 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  ,b).struct confi
20d30 67 20 2a 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e  g *a;.struct con
20d40 66 69 67 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20  fig *b;.{.  int 
20d50 72 63 3b 0a 20 20 66 6f 72 28 72 63 3d 30 3b 20  rc;.  for(rc=0; 
20d60 72 63 3d 3d 30 20 26 26 20 61 20 26 26 20 62 3b  rc==0 && a && b;
20d70 20 20 61 3d 61 2d 3e 62 70 2c 20 62 3d 62 2d 3e    a=a->bp, b=b->
20d80 62 70 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 2d  bp){.    rc = a-
20d90 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e  >rp->index - b->
20da0 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 20 20 69  rp->index;.    i
20db0 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20  f( rc==0 ) rc = 
20dc0 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b  a->dot - b->dot;
20dd0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30  .  }.  if( rc==0
20de0 20 29 7b 0a 20 20 20 20 69 66 28 20 61 20 29 20   ){.    if( a ) 
20df0 72 63 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  rc = 1;.    if( 
20e00 62 20 29 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d  b ) rc = -1;.  }
20e10 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
20e20 0a 2f 2a 20 48 61 73 68 20 61 20 73 74 61 74 65  ./* Hash a state
20e30 20 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20   */.PRIVATE int 
20e40 73 74 61 74 65 68 61 73 68 28 61 29 0a 73 74 72  statehash(a).str
20e50 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 7b  uct config *a;.{
20e60 0a 20 20 69 6e 74 20 68 3d 30 3b 0a 20 20 77 68  .  int h=0;.  wh
20e70 69 6c 65 28 20 61 20 29 7b 0a 20 20 20 20 68 20  ile( a ){.    h 
20e80 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d  = h*571 + a->rp-
20e90 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64  >index*37 + a->d
20ea0 6f 74 3b 0a 20 20 20 20 61 20 3d 20 61 2d 3e 62  ot;.    a = a->b
20eb0 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
20ec0 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  h;.}../* Allocat
20ed0 65 20 61 20 6e 65 77 20 73 74 61 74 65 20 73 74  e a new state st
20ee0 72 75 63 74 75 72 65 20 2a 2f 0a 73 74 72 75 63  ructure */.struc
20ef0 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e  t state *State_n
20f00 65 77 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  ew().{.  struct 
20f10 73 74 61 74 65 20 2a 6e 65 77 3b 0a 20 20 6e 65  state *new;.  ne
20f20 77 20 3d 20 28 73 74 72 75 63 74 20 73 74 61 74  w = (struct stat
20f30 65 20 2a 29 63 61 6c 6c 6f 63 28 31 2c 20 73 69  e *)calloc(1, si
20f40 7a 65 6f 66 28 73 74 72 75 63 74 20 73 74 61 74  zeof(struct stat
20f50 65 29 20 29 3b 0a 20 20 4d 65 6d 6f 72 79 43 68  e) );.  MemoryCh
20f60 65 63 6b 28 6e 65 77 29 3b 0a 20 20 72 65 74 75  eck(new);.  retu
20f70 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 54 68  rn new;.}../* Th
20f80 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
20f90 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
20fa0 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66  wing structure f
20fb0 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63  or each.** assoc
20fc0 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
20fd0 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 73 74  type "x3"..*/.st
20fe0 72 75 63 74 20 73 5f 78 33 20 7b 0a 20 20 69 6e  ruct s_x3 {.  in
20ff0 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
21000 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
21010 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
21020 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20   slots. */.     
21030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21040 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62       /*   Must b
21050 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67  e a power of 2 g
21060 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a  reater than or *
21070 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
21080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
21090 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20   equal to 1 */. 
210a0 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20   int count;     
210b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
210c0 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20  er of currently 
210d0 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a  slots filled */.
210e0 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64    struct s_x3nod
210f0 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20  e *tbl;  /* The 
21100 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65  data stored here
21110 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
21120 33 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20  3node **ht;  /* 
21130 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c  Hash table for l
21140 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ookups */.};../*
21150 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
21160 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
21170 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65  tructure for eve
21180 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a  ry data element.
21190 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61  ** in an associa
211a0 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
211b0 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 74 79 70 65  pe "x3"..*/.type
211c0 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 33 6e  def struct s_x3n
211d0 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73  ode {.  struct s
211e0 74 61 74 65 20 2a 64 61 74 61 3b 20 20 20 20 20  tate *data;     
211f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21200 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74  The data */.  st
21210 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79  ruct config *key
21220 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21230 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
21240 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e  /.  struct s_x3n
21250 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20  ode *next;   /* 
21260 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20  Next entry with 
21270 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f  the same hash */
21280 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f  .  struct s_x3no
21290 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50  de **from;  /* P
212a0 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a  revious link */.
212b0 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68  } x3node;../* Th
212c0 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
212d0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
212e0 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20  array, which is 
212f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
21300 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73  .static struct s
21310 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f 2a 20 41 6c  _x3 *x3a;../* Al
21320 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73  locate a new ass
21330 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a  ociative array *
21340 2f 0a 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69  /.void State_ini
21350 74 28 29 7b 0a 20 20 69 66 28 20 78 33 61 20 29  t(){.  if( x3a )
21360 20 72 65 74 75 72 6e 3b 0a 20 20 78 33 61 20 3d   return;.  x3a =
21370 20 28 73 74 72 75 63 74 20 73 5f 78 33 2a 29 6d   (struct s_x3*)m
21380 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74  alloc( sizeof(st
21390 72 75 63 74 20 73 5f 78 33 29 20 29 3b 0a 20 20  ruct s_x3) );.  
213a0 69 66 28 20 78 33 61 20 29 7b 0a 20 20 20 20 78  if( x3a ){.    x
213b0 33 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b 0a  3a->size = 128;.
213c0 20 20 20 20 78 33 61 2d 3e 63 6f 75 6e 74 20 3d      x3a->count =
213d0 20 30 3b 0a 20 20 20 20 78 33 61 2d 3e 74 62 6c   0;.    x3a->tbl
213e0 20 3d 20 28 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x3node*)mall
213f0 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65  oc( .      (size
21400 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x3node) + siz
21410 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 2a 31 32  eof(x3node*))*12
21420 38 20 29 3b 0a 20 20 20 20 69 66 28 20 78 33 61  8 );.    if( x3a
21430 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  ->tbl==0 ){.    
21440 20 20 66 72 65 65 28 78 33 61 29 3b 0a 20 20 20    free(x3a);.   
21450 20 20 20 78 33 61 20 3d 20 30 3b 0a 20 20 20 20     x3a = 0;.    
21460 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
21470 20 69 3b 0a 20 20 20 20 20 20 78 33 61 2d 3e 68   i;.      x3a->h
21480 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28  t = (x3node**)&(
21490 78 33 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a  x3a->tbl[128]);.
214a0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
214b0 3c 31 32 38 3b 20 69 2b 2b 29 20 78 33 61 2d 3e  <128; i++) x3a->
214c0 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ht[i] = 0;.    }
214d0 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74  .  }.}./* Insert
214e0 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e   a new record in
214f0 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52  to the array.  R
21500 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75  eturn TRUE if su
21510 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69  ccessful..** Pri
21520 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65  or data with the
21530 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54   same key is NOT
21540 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a   overwritten */.
21550 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65 72 74  int State_insert
21560 28 64 61 74 61 2c 6b 65 79 29 0a 73 74 72 75 63  (data,key).struc
21570 74 20 73 74 61 74 65 20 2a 64 61 74 61 3b 0a 73  t state *data;.s
21580 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65  truct config *ke
21590 79 3b 0a 7b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e  y;.{.  x3node *n
215a0 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e  p;.  int h;.  in
215b0 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 33 61  t ph;..  if( x3a
215c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
215d0 20 20 70 68 20 3d 20 73 74 61 74 65 68 61 73 68    ph = statehash
215e0 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70 68 20  (key);.  h = ph 
215f0 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x3a->size-1);
21600 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b  .  np = x3a->ht[
21610 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
21620 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74 65  ){.    if( state
21630 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29  cmp(np->key,key)
21640 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
21650 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  An existing entr
21660 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
21670 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f  key is found. */
21680 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62  .      /* Fail b
21690 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65  ecause overwrite
216a0 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20   is not allows. 
216b0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
216c0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20  0;.    }.    np 
216d0 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
216e0 20 20 69 66 28 20 78 33 61 2d 3e 63 6f 75 6e 74    if( x3a->count
216f0 3e 3d 78 33 61 2d 3e 73 69 7a 65 20 29 7b 0a 20  >=x3a->size ){. 
21700 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61     /* Need to ma
21710 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  ke the hash tabl
21720 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20  e bigger */.    
21730 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20  int i,size;.    
21740 73 74 72 75 63 74 20 73 5f 78 33 20 61 72 72 61  struct s_x3 arra
21750 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a  y;.    array.siz
21760 65 20 3d 20 73 69 7a 65 20 3d 20 78 33 61 2d 3e  e = size = x3a->
21770 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61  size*2;.    arra
21780 79 2e 63 6f 75 6e 74 20 3d 20 78 33 61 2d 3e 63  y.count = x3a->c
21790 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e  ount;.    array.
217a0 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 6d  tbl = (x3node*)m
217b0 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69  alloc(.      (si
217c0 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73  zeof(x3node) + s
217d0 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 2a  izeof(x3node*))*
217e0 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  size );.    if( 
217f0 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72  array.tbl==0 ) r
21800 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69  eturn 0;  /* Fai
21810 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20  l due to malloc 
21820 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61  failure */.    a
21830 72 72 61 79 2e 68 74 20 3d 20 28 78 33 6e 6f 64  rray.ht = (x3nod
21840 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b  e**)&(array.tbl[
21850 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28  size]);.    for(
21860 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b  i=0; i<size; i++
21870 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20  ) array.ht[i] = 
21880 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
21890 69 3c 78 33 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b  i<x3a->count; i+
218a0 2b 29 7b 0a 20 20 20 20 20 20 78 33 6e 6f 64 65  +){.      x3node
218b0 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b   *oldnp, *newnp;
218c0 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26  .      oldnp = &
218d0 28 78 33 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20  (x3a->tbl[i]);. 
218e0 20 20 20 20 20 68 20 3d 20 73 74 61 74 65 68 61       h = stateha
218f0 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26  sh(oldnp->key) &
21900 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20   (size-1);.     
21910 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79   newnp = &(array
21920 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  .tbl[i]);.      
21930 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20  if( array.ht[h] 
21940 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66  ) array.ht[h]->f
21950 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e  rom = &(newnp->n
21960 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  ext);.      newn
21970 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e  p->next = array.
21980 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77  ht[h];.      new
21990 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d  np->key = oldnp-
219a0 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e  >key;.      newn
219b0 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d  p->data = oldnp-
219c0 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77  >data;.      new
219d0 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72  np->from = &(arr
219e0 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20  ay.ht[h]);.     
219f0 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e   array.ht[h] = n
21a00 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ewnp;.    }.    
21a10 66 72 65 65 28 78 33 61 2d 3e 74 62 6c 29 3b 0a  free(x3a->tbl);.
21a20 20 20 20 20 2a 78 33 61 20 3d 20 61 72 72 61 79      *x3a = array
21a30 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  ;.  }.  /* Inser
21a40 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a  t the new data *
21a50 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 33  /.  h = ph & (x3
21a60 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
21a70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 78 33   = &(x3a->tbl[x3
21a80 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20  a->count++]);.  
21a90 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20  np->key = key;. 
21aa0 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61   np->data = data
21ab0 3b 0a 20 20 69 66 28 20 78 33 61 2d 3e 68 74 5b  ;.  if( x3a->ht[
21ac0 68 5d 20 29 20 78 33 61 2d 3e 68 74 5b 68 5d 2d  h] ) x3a->ht[h]-
21ad0 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65  >from = &(np->ne
21ae0 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20  xt);.  np->next 
21af0 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x3a->ht[h];.  
21b00 78 33 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b  x3a->ht[h] = np;
21b10 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  .  np->from = &(
21b20 78 33 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72  x3a->ht[h]);.  r
21b30 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52  eturn 1;.}../* R
21b40 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
21b50 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64  to data assigned
21b60 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65   to the given ke
21b70 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a  y.  Return NULL.
21b80 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65  ** if no such ke
21b90 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61  y. */.struct sta
21ba0 74 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 6b  te *State_find(k
21bb0 65 79 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  ey).struct confi
21bc0 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20  g *key;.{.  int 
21bd0 68 3b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b  h;.  x3node *np;
21be0 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29  ..  if( x3a==0 )
21bf0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d   return 0;.  h =
21c00 20 73 74 61 74 65 68 61 73 68 28 6b 65 79 29 20   statehash(key) 
21c10 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x3a->size-1);
21c20 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b  .  np = x3a->ht[
21c30 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
21c40 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74 65  ){.    if( state
21c50 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29  cmp(np->key,key)
21c60 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
21c70 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
21c80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20    }.  return np 
21c90 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a  ? np->data : 0;.
21ca0 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20  }../* Return an 
21cb0 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
21cc0 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e  s to all data in
21cd0 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54   the table..** T
21ce0 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61  he array is obta
21cf0 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
21d00 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
21d10 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  f memory allocat
21d20 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c  ion.** problems,
21d30 20 6f 72 20 69 66 20 74 68 65 20 61 72 72 61 79   or if the array
21d40 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74   is empty. */.st
21d50 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53 74 61  ruct state **Sta
21d60 74 65 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a 20  te_arrayof().{. 
21d70 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a   struct state **
21d80 61 72 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c 73  array;.  int i,s
21d90 69 7a 65 3b 0a 20 20 69 66 28 20 78 33 61 3d 3d  ize;.  if( x3a==
21da0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
21db0 73 69 7a 65 20 3d 20 78 33 61 2d 3e 63 6f 75 6e  size = x3a->coun
21dc0 74 3b 0a 20 20 61 72 72 61 79 20 3d 20 28 73 74  t;.  array = (st
21dd0 72 75 63 74 20 73 74 61 74 65 20 2a 2a 29 6d 61  ruct state **)ma
21de0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
21df0 75 63 74 20 73 74 61 74 65 20 2a 29 2a 73 69 7a  uct state *)*siz
21e00 65 20 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79  e );.  if( array
21e10 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
21e20 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72   i<size; i++) ar
21e30 72 61 79 5b 69 5d 20 3d 20 78 33 61 2d 3e 74 62  ray[i] = x3a->tb
21e40 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20  l[i].data;.  }. 
21e50 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d   return array;.}
21e60 0a 0a 2f 2a 20 48 61 73 68 20 61 20 63 6f 6e 66  ../* Hash a conf
21e70 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49  iguration */.PRI
21e80 56 41 54 45 20 69 6e 74 20 63 6f 6e 66 69 67 68  VATE int configh
21e90 61 73 68 28 61 29 0a 73 74 72 75 63 74 20 63 6f  ash(a).struct co
21ea0 6e 66 69 67 20 2a 61 3b 0a 7b 0a 20 20 69 6e 74  nfig *a;.{.  int
21eb0 20 68 3d 30 3b 0a 20 20 68 20 3d 20 68 2a 35 37   h=0;.  h = h*57
21ec0 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78  1 + a->rp->index
21ed0 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20  *37 + a->dot;.  
21ee0 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20  return h;.}../* 
21ef0 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
21f00 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
21f10 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
21f20 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73   for each.** ass
21f30 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
21f40 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a  f type "x4"..*/.
21f50 73 74 72 75 63 74 20 73 5f 78 34 20 7b 0a 20 20  struct s_x4 {.  
21f60 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
21f70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
21f80 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
21f90 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20  le slots. */.   
21fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fb0 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74         /*   Must
21fc0 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
21fd0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
21fe0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
21ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22000 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f     equal to 1 */
22010 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20  .  int count;   
22020 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
22030 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c  mber of currentl
22040 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a  y slots filled *
22050 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e  /.  struct s_x4n
22060 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68  ode *tbl;  /* Th
22070 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65  e data stored he
22080 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  re */.  struct s
22090 5f 78 34 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f  _x4node **ht;  /
220a0 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
220b0 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a   lookups */.};..
220c0 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
220d0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
220e0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
220f0 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e  very data elemen
22100 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63  t.** in an assoc
22110 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
22120 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 74 79  type "x4"..*/.ty
22130 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78  pedef struct s_x
22140 34 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74  4node {.  struct
22150 20 63 6f 6e 66 69 67 20 2a 64 61 74 61 3b 20 20   config *data;  
22160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22170 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
22180 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65   struct s_x4node
22190 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78   *next;   /* Nex
221a0 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  t entry with the
221b0 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20   same hash */.  
221c0 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20  struct s_x4node 
221d0 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76  **from;  /* Prev
221e0 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78  ious link */.} x
221f0 34 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65  4node;../* There
22200 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73   is only one ins
22210 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72  tance of the arr
22220 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  ay, which is the
22230 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74   following */.st
22240 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 34  atic struct s_x4
22250 20 2a 78 34 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63   *x4a;../* Alloc
22260 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69  ate a new associ
22270 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76  ative array */.v
22280 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  oid Configtable_
22290 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78 34  init(){.  if( x4
222a0 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 34  a ) return;.  x4
222b0 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 34  a = (struct s_x4
222c0 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  *)malloc( sizeof
222d0 28 73 74 72 75 63 74 20 73 5f 78 34 29 20 29 3b  (struct s_x4) );
222e0 0a 20 20 69 66 28 20 78 34 61 20 29 7b 0a 20 20  .  if( x4a ){.  
222f0 20 20 78 34 61 2d 3e 73 69 7a 65 20 3d 20 36 34    x4a->size = 64
22300 3b 0a 20 20 20 20 78 34 61 2d 3e 63 6f 75 6e 74  ;.    x4a->count
22310 20 3d 20 30 3b 0a 20 20 20 20 78 34 61 2d 3e 74   = 0;.    x4a->t
22320 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29 6d 61  bl = (x4node*)ma
22330 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69  lloc( .      (si
22340 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73  zeof(x4node) + s
22350 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 2a  izeof(x4node*))*
22360 36 34 20 29 3b 0a 20 20 20 20 69 66 28 20 78 34  64 );.    if( x4
22370 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
22380 20 20 20 66 72 65 65 28 78 34 61 29 3b 0a 20 20     free(x4a);.  
22390 20 20 20 20 78 34 61 20 3d 20 30 3b 0a 20 20 20      x4a = 0;.   
223a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
223b0 74 20 69 3b 0a 20 20 20 20 20 20 78 34 61 2d 3e  t i;.      x4a->
223c0 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26  ht = (x4node**)&
223d0 28 78 34 61 2d 3e 74 62 6c 5b 36 34 5d 29 3b 0a  (x4a->tbl[64]);.
223e0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
223f0 3c 36 34 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68  <64; i++) x4a->h
22400 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  t[i] = 0;.    }.
22410 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20    }.}./* Insert 
22420 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  a new record int
22430 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65  o the array.  Re
22440 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63  turn TRUE if suc
22450 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f  cessful..** Prio
22460 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20  r data with the 
22470 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20  same key is NOT 
22480 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69  overwritten */.i
22490 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69  nt Configtable_i
224a0 6e 73 65 72 74 28 64 61 74 61 29 0a 73 74 72 75  nsert(data).stru
224b0 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74 61 3b  ct config *data;
224c0 0a 7b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b  .{.  x4node *np;
224d0 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20  .  int h;.  int 
224e0 70 68 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d  ph;..  if( x4a==
224f0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
22500 70 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28  ph = confighash(
22510 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20  data);.  h = ph 
22520 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x4a->size-1);
22530 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b  .  np = x4a->ht[
22540 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
22550 29 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69  ){.    if( Confi
22560 67 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61  gcmp(np->data,da
22570 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ta)==0 ){.      
22580 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65  /* An existing e
22590 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
225a0 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e  me key is found.
225b0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69   */.      /* Fai
225c0 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72  l because overwr
225d0 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77  ite is not allow
225e0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  s. */.      retu
225f0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
22600 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
22610 20 7d 0a 20 20 69 66 28 20 78 34 61 2d 3e 63 6f   }.  if( x4a->co
22620 75 6e 74 3e 3d 78 34 61 2d 3e 73 69 7a 65 20 29  unt>=x4a->size )
22630 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f  {.    /* Need to
22640 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74   make the hash t
22650 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20  able bigger */. 
22660 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20     int i,size;. 
22670 20 20 20 73 74 72 75 63 74 20 73 5f 78 34 20 61     struct s_x4 a
22680 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e  rray;.    array.
22690 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 34  size = size = x4
226a0 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61  a->size*2;.    a
226b0 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 34 61  rray.count = x4a
226c0 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72  ->count;.    arr
226d0 61 79 2e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65  ay.tbl = (x4node
226e0 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  *)malloc(.      
226f0 28 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20  (sizeof(x4node) 
22700 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a  + sizeof(x4node*
22710 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69  ))*size );.    i
22720 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20  f( array.tbl==0 
22730 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20  ) return 0;  /* 
22740 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c  Fail due to mall
22750 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20  oc failure */.  
22760 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 34    array.ht = (x4
22770 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74  node**)&(array.t
22780 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66  bl[size]);.    f
22790 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20  or(i=0; i<size; 
227a0 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d  i++) array.ht[i]
227b0 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d   = 0;.    for(i=
227c0 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b  0; i<x4a->count;
227d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 34 6e   i++){.      x4n
227e0 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77  ode *oldnp, *new
227f0 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20  np;.      oldnp 
22800 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 29  = &(x4a->tbl[i])
22810 3b 0a 20 20 20 20 20 20 68 20 3d 20 63 6f 6e 66  ;.      h = conf
22820 69 67 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61  ighash(oldnp->da
22830 74 61 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a  ta) & (size-1);.
22840 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28        newnp = &(
22850 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20  array.tbl[i]);. 
22860 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68       if( array.h
22870 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b  t[h] ) array.ht[
22880 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77  h]->from = &(new
22890 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20  np->next);.     
228a0 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61   newnp->next = a
228b0 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20  rray.ht[h];.    
228c0 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20    newnp->data = 
228d0 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20  oldnp->data;.   
228e0 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d     newnp->from =
228f0 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b   &(array.ht[h]);
22900 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b  .      array.ht[
22910 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20  h] = newnp;.    
22920 7d 0a 20 20 20 20 66 72 65 65 28 78 34 61 2d 3e  }.    free(x4a->
22930 74 62 6c 29 3b 0a 20 20 20 20 2a 78 34 61 20 3d  tbl);.    *x4a =
22940 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a   array;.  }.  /*
22950 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20   Insert the new 
22960 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68  data */.  h = ph
22970 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29   & (x4a->size-1)
22980 3b 0a 20 20 6e 70 20 3d 20 26 28 78 34 61 2d 3e  ;.  np = &(x4a->
22990 74 62 6c 5b 78 34 61 2d 3e 63 6f 75 6e 74 2b 2b  tbl[x4a->count++
229a0 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d  ]);.  np->data =
229b0 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 34 61   data;.  if( x4a
229c0 2d 3e 68 74 5b 68 5d 20 29 20 78 34 61 2d 3e 68  ->ht[h] ) x4a->h
229d0 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
229e0 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e  p->next);.  np->
229f0 6e 65 78 74 20 3d 20 78 34 61 2d 3e 68 74 5b 68  next = x4a->ht[h
22a00 5d 3b 0a 20 20 78 34 61 2d 3e 68 74 5b 68 5d 20  ];.  x4a->ht[h] 
22a10 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d  = np;.  np->from
22a20 20 3d 20 26 28 78 34 61 2d 3e 68 74 5b 68 5d 29   = &(x4a->ht[h])
22a30 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
22a40 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
22a50 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73 73  nter to data ass
22a60 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76  igned to the giv
22a70 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20  en key.  Return 
22a80 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75  NULL.** if no su
22a90 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63  ch key. */.struc
22aa0 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
22ab0 74 61 62 6c 65 5f 66 69 6e 64 28 6b 65 79 29 0a  table_find(key).
22ac0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b  struct config *k
22ad0 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20  ey;.{.  int h;. 
22ae0 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20   x4node *np;..  
22af0 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74  if( x4a==0 ) ret
22b00 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 63 6f 6e  urn 0;.  h = con
22b10 66 69 67 68 61 73 68 28 6b 65 79 29 20 26 20 28  fighash(key) & (
22b20 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x4a->size-1);.  
22b30 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b  np = x4a->ht[h];
22b40 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a  .  while( np ){.
22b50 20 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d      if( Configcm
22b60 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29 3d  p(np->data,key)=
22b70 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
22b80 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
22b90 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f   }.  return np ?
22ba0 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d   np->data : 0;.}
22bb0 0a 0a 2f 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20  ../* Remove all 
22bc0 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 74 61  data from the ta
22bd0 62 6c 65 2e 20 20 50 61 73 73 20 65 61 63 68 20  ble.  Pass each 
22be0 64 61 74 61 20 74 6f 20 74 68 65 20 66 75 6e 63  data to the func
22bf0 74 69 6f 6e 20 22 66 22 0a 2a 2a 20 61 73 20 69  tion "f".** as i
22c00 74 20 69 73 20 72 65 6d 6f 76 65 64 2e 20 20 28  t is removed.  (
22c10 22 66 22 20 6d 61 79 20 62 65 20 6e 75 6c 6c 20  "f" may be null 
22c20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 73 74  to avoid this st
22c30 65 70 2e 29 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  ep.) */.void Con
22c40 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 66  figtable_clear(f
22c50 29 0a 69 6e 74 28 2a 66 29 28 2f 2a 20 73 74 72  ).int(*f)(/* str
22c60 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f 29  uct config * */)
22c70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ;.{.  int i;.  i
22c80 66 28 20 78 34 61 3d 3d 30 20 7c 7c 20 78 34 61  f( x4a==0 || x4a
22c90 2d 3e 63 6f 75 6e 74 3d 3d 30 20 29 20 72 65 74  ->count==0 ) ret
22ca0 75 72 6e 3b 0a 20 20 69 66 28 20 66 20 29 20 66  urn;.  if( f ) f
22cb0 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63  or(i=0; i<x4a->c
22cc0 6f 75 6e 74 3b 20 69 2b 2b 29 20 28 2a 66 29 28  ount; i++) (*f)(
22cd0 78 34 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61  x4a->tbl[i].data
22ce0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
22cf0 78 34 61 2d 3e 73 69 7a 65 3b 20 69 2b 2b 29 20  x4a->size; i++) 
22d00 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a  x4a->ht[i] = 0;.
22d10 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30    x4a->count = 0
22d20 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a        ;.  return;.}.