/ Hex Artifact Content
Login

Artifact f1f54e93808b09d2000ec1c3ff53888a27067b52:


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 73 74 61 74 69 63 20 73  ar*));..static s
0330: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41 63  truct action *Ac
0340: 74 69 6f 6e 5f 6e 65 77 28 76 6f 69 64 29 3b 0a  tion_new(void);.
0350: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61 63  static struct ac
0360: 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72  tion *Action_sor
0370: 74 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  t(struct action 
0380: 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *);../**********
0390: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
03a0: 62 75 69 6c 64 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  build.h" *******
03b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76  *************/.v
03d0: 6f 69 64 20 46 69 6e 64 52 75 6c 65 50 72 65 63  oid FindRulePrec
03e0: 65 64 65 6e 63 65 73 28 29 3b 0a 76 6f 69 64 20  edences();.void 
03f0: 46 69 6e 64 46 69 72 73 74 53 65 74 73 28 29 3b  FindFirstSets();
0400: 0a 76 6f 69 64 20 46 69 6e 64 53 74 61 74 65 73  .void FindStates
0410: 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e  ();.void FindLin
0420: 6b 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46  ks();.void FindF
0430: 6f 6c 6c 6f 77 53 65 74 73 28 29 3b 0a 76 6f 69  ollowSets();.voi
0440: 64 20 46 69 6e 64 41 63 74 69 6f 6e 73 28 29 3b  d FindActions();
0450: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ../********* Fro
0460: 6d 20 74 68 65 20 66 69 6c 65 20 22 63 6f 6e 66  m the file "conf
0470: 69 67 6c 69 73 74 2e 68 22 20 2a 2a 2a 2a 2a 2a  iglist.h" ******
0480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69  ***********/.voi
04a0: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e 69  d Configlist_ini
04b0: 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 73  t(/* void */);.s
04c0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
04d0: 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 2f 2a 20  nfiglist_add(/* 
04e0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 2c 20 69  struct rule *, i
04f0: 6e 74 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 63  nt */);.struct c
0500: 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73  onfig *Configlis
0510: 74 5f 61 64 64 62 61 73 69 73 28 2f 2a 20 73 74  t_addbasis(/* st
0520: 72 75 63 74 20 72 75 6c 65 20 2a 2c 20 69 6e 74  ruct rule *, int
0530: 20 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69   */);.void Confi
0540: 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 2f 2a  glist_closure(/*
0550: 20 76 6f 69 64 20 2a 2f 29 3b 0a 76 6f 69 64 20   void */);.void 
0560: 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28  Configlist_sort(
0570: 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 76 6f 69  /* void */);.voi
0580: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72  d Configlist_sor
0590: 74 62 61 73 69 73 28 2f 2a 20 76 6f 69 64 20 2a  tbasis(/* void *
05a0: 2f 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  /);.struct confi
05b0: 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65  g *Configlist_re
05c0: 74 75 72 6e 28 2f 2a 20 76 6f 69 64 20 2a 2f 29  turn(/* void */)
05d0: 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
05e0: 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73 69  *Configlist_basi
05f0: 73 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 76  s(/* void */);.v
0600: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65  oid Configlist_e
0610: 61 74 28 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e  at(/* struct con
0620: 66 69 67 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20  fig * */);.void 
0630: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74  Configlist_reset
0640: 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 0a 2f  (/* void */);../
0650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
0660: 68 65 20 66 69 6c 65 20 22 65 72 72 6f 72 2e 68  he file "error.h
0670: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
0680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20  *********/.void 
06a0: 45 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63  ErrorMsg(const c
06b0: 68 61 72 20 2a 2c 20 69 6e 74 2c 63 6f 6e 73 74  har *, int,const
06c0: 20 63 68 61 72 20 2a 2c 20 2e 2e 2e 29 3b 0a 0a   char *, ...);..
06d0: 2f 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  /****** From the
06e0: 20 66 69 6c 65 20 22 6f 70 74 69 6f 6e 2e 68 22   file "option.h"
06f0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
0700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0710: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72  ***********/.str
0720: 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 7b 0a  uct s_options {.
0730: 20 20 65 6e 75 6d 20 7b 20 4f 50 54 5f 46 4c 41    enum { OPT_FLA
0740: 47 3d 31 2c 20 20 4f 50 54 5f 49 4e 54 2c 20 20  G=1,  OPT_INT,  
0750: 4f 50 54 5f 44 42 4c 2c 20 20 4f 50 54 5f 53 54  OPT_DBL,  OPT_ST
0760: 52 2c 0a 20 20 20 20 20 20 20 20 20 4f 50 54 5f  R,.         OPT_
0770: 46 46 4c 41 47 2c 20 4f 50 54 5f 46 49 4e 54 2c  FFLAG, OPT_FINT,
0780: 20 4f 50 54 5f 46 44 42 4c 2c 20 4f 50 54 5f 46   OPT_FDBL, OPT_F
0790: 53 54 52 7d 20 74 79 70 65 3b 0a 20 20 63 68 61  STR} type;.  cha
07a0: 72 20 2a 6c 61 62 65 6c 3b 0a 20 20 63 68 61 72  r *label;.  char
07b0: 20 2a 61 72 67 3b 0a 20 20 63 68 61 72 20 2a 6d   *arg;.  char *m
07c0: 65 73 73 61 67 65 3b 0a 7d 3b 0a 69 6e 74 20 20  essage;.};.int  
07d0: 20 20 4f 70 74 49 6e 69 74 28 2f 2a 20 63 68 61    OptInit(/* cha
07e0: 72 2a 2a 2c 73 74 72 75 63 74 20 73 5f 6f 70 74  r**,struct s_opt
07f0: 69 6f 6e 73 2a 2c 46 49 4c 45 2a 20 2a 2f 29 3b  ions*,FILE* */);
0800: 0a 69 6e 74 20 20 20 20 4f 70 74 4e 41 72 67 73  .int    OptNArgs
0810: 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 63 68  (/* void */);.ch
0820: 61 72 20 20 2a 4f 70 74 41 72 67 28 2f 2a 20 69  ar  *OptArg(/* i
0830: 6e 74 20 2a 2f 29 3b 0a 76 6f 69 64 20 20 20 4f  nt */);.void   O
0840: 70 74 45 72 72 28 2f 2a 20 69 6e 74 20 2a 2f 29  ptErr(/* int */)
0850: 3b 0a 76 6f 69 64 20 20 20 4f 70 74 50 72 69 6e  ;.void   OptPrin
0860: 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 0a  t(/* void */);..
0870: 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  /******** From t
0880: 68 65 20 66 69 6c 65 20 22 70 61 72 73 65 2e 68  he file "parse.h
0890: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
08a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
08b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69  ***********/.voi
08c0: 64 20 50 61 72 73 65 28 2f 2a 20 73 74 72 75 63  d Parse(/* struc
08d0: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 20 2a 2f  t lemon *lemp */
08e0: 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  );../********* F
08f0: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 6c  rom the file "pl
0900: 69 6e 6b 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ink.h" *********
0910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
0930: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 50 6c  struct plink *Pl
0940: 69 6e 6b 5f 6e 65 77 28 2f 2a 20 76 6f 69 64 20  ink_new(/* void 
0950: 2a 2f 29 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  */);.void Plink_
0960: 61 64 64 28 2f 2a 20 73 74 72 75 63 74 20 70 6c  add(/* struct pl
0970: 69 6e 6b 20 2a 2a 2c 20 73 74 72 75 63 74 20 63  ink **, struct c
0980: 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 76 6f 69  onfig * */);.voi
0990: 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 2f 2a 20  d Plink_copy(/* 
09a0: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c  struct plink **,
09b0: 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 20   struct plink * 
09c0: 2a 2f 29 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  */);.void Plink_
09d0: 64 65 6c 65 74 65 28 2f 2a 20 73 74 72 75 63 74  delete(/* struct
09e0: 20 70 6c 69 6e 6b 20 2a 20 2a 2f 29 3b 0a 0a 2f   plink * */);../
09f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
0a00: 74 68 65 20 66 69 6c 65 20 22 72 65 70 6f 72 74  the file "report
0a10: 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .h" ************
0a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20  *********/.void 
0a40: 52 65 70 72 69 6e 74 28 2f 2a 20 73 74 72 75 63  Reprint(/* struc
0a50: 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a 76  t lemon * */);.v
0a60: 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74  oid ReportOutput
0a70: 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  (/* struct lemon
0a80: 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 52 65 70   * */);.void Rep
0a90: 6f 72 74 54 61 62 6c 65 28 2f 2a 20 73 74 72 75  ortTable(/* stru
0aa0: 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a  ct lemon * */);.
0ab0: 76 6f 69 64 20 52 65 70 6f 72 74 48 65 61 64 65  void ReportHeade
0ac0: 72 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f  r(/* struct lemo
0ad0: 6e 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f  n * */);.void Co
0ae0: 6d 70 72 65 73 73 54 61 62 6c 65 73 28 2f 2a 20  mpressTables(/* 
0af0: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a  struct lemon * *
0b00: 2f 29 3b 0a 76 6f 69 64 20 52 65 73 6f 72 74 53  /);.void ResortS
0b10: 74 61 74 65 73 28 2f 2a 20 73 74 72 75 63 74 20  tates(/* struct 
0b20: 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a 0a 2f 2a  lemon * */);../*
0b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
0b40: 68 65 20 66 69 6c 65 20 22 73 65 74 2e 68 22 20  he file "set.h" 
0b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b70: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 20  ********/.void  
0b80: 53 65 74 53 69 7a 65 28 2f 2a 20 69 6e 74 20 4e  SetSize(/* int N
0b90: 20 2a 2f 29 3b 20 20 20 20 20 20 20 20 20 20 20   */);           
0ba0: 20 20 2f 2a 20 41 6c 6c 20 73 65 74 73 20 77 69    /* All sets wi
0bb0: 6c 6c 20 62 65 20 6f 66 20 73 69 7a 65 20 4e 20  ll be of size N 
0bc0: 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28  */.char *SetNew(
0bd0: 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 20 20 20 20  /* void */);    
0be0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
0bf0: 6e 65 77 20 73 65 74 20 66 6f 72 20 65 6c 65 6d  new set for elem
0c00: 65 6e 74 20 30 2e 2e 4e 20 2a 2f 0a 76 6f 69 64  ent 0..N */.void
0c10: 20 20 53 65 74 46 72 65 65 28 2f 2a 20 63 68 61    SetFree(/* cha
0c20: 72 2a 20 2a 2f 29 3b 20 20 20 20 20 20 20 20 20  r* */);         
0c30: 20 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74      /* Deallocat
0c40: 65 20 61 20 73 65 74 20 2a 2f 0a 0a 69 6e 74 20  e a set */..int 
0c50: 53 65 74 41 64 64 28 2f 2a 20 63 68 61 72 2a 2c  SetAdd(/* char*,
0c60: 69 6e 74 20 2a 2f 29 3b 20 20 20 20 20 20 20 20  int */);        
0c70: 20 20 20 20 2f 2a 20 41 64 64 20 65 6c 65 6d 65      /* Add eleme
0c80: 6e 74 20 74 6f 20 61 20 73 65 74 20 2a 2f 0a 69  nt to a set */.i
0c90: 6e 74 20 53 65 74 55 6e 69 6f 6e 28 2f 2a 20 63  nt SetUnion(/* c
0ca0: 68 61 72 20 2a 41 2c 63 68 61 72 20 2a 42 20 2a  har *A,char *B *
0cb0: 2f 29 3b 20 20 20 20 2f 2a 20 41 20 3c 2d 20 41  /);    /* A <- A
0cc0: 20 55 20 42 2c 20 74 68 72 75 20 65 6c 65 6d 65   U B, thru eleme
0cd0: 6e 74 20 4e 20 2a 2f 0a 0a 23 64 65 66 69 6e 65  nt N */..#define
0ce0: 20 53 65 74 46 69 6e 64 28 58 2c 59 29 20 28 58   SetFind(X,Y) (X
0cf0: 5b 59 5d 29 20 20 20 20 20 20 20 2f 2a 20 54 72  [Y])       /* Tr
0d00: 75 65 20 69 66 20 59 20 69 73 20 69 6e 20 73 65  ue if Y is in se
0d10: 74 20 58 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  t X */../*******
0d20: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
0d30: 65 20 22 73 74 72 75 63 74 2e 68 22 20 2a 2a 2a  e "struct.h" ***
0d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0d60: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 63 69  **/./*.** Princi
0d70: 70 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75  pal data structu
0d80: 72 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f  res for the LEMO
0d90: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
0da0: 6f 72 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20  or..*/..typedef 
0db0: 65 6e 75 6d 20 7b 4c 45 4d 4f 4e 5f 46 41 4c 53  enum {LEMON_FALS
0dc0: 45 3d 30 2c 20 4c 45 4d 4f 4e 5f 54 52 55 45 7d  E=0, LEMON_TRUE}
0dd0: 20 42 6f 6f 6c 65 61 6e 3b 0a 0a 2f 2a 20 53 79   Boolean;../* Sy
0de0: 6d 62 6f 6c 73 20 28 74 65 72 6d 69 6e 61 6c 73  mbols (terminals
0df0: 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
0e00: 73 29 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  s) of the gramma
0e10: 72 20 61 72 65 20 73 74 6f 72 65 64 0a 2a 2a 20  r are stored.** 
0e20: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
0e30: 3a 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62  : */.struct symb
0e40: 6f 6c 20 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d  ol {.  char *nam
0e50: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
0e60: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
0e70: 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  ymbol */.  int i
0e80: 6e 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  ndex;           
0e90: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6e 75 6d      /* Index num
0ea0: 62 65 72 20 66 6f 72 20 74 68 69 73 20 73 79 6d  ber for this sym
0eb0: 62 6f 6c 20 2a 2f 0a 20 20 65 6e 75 6d 20 7b 0a  bol */.  enum {.
0ec0: 20 20 20 20 54 45 52 4d 49 4e 41 4c 2c 0a 20 20      TERMINAL,.  
0ed0: 20 20 4e 4f 4e 54 45 52 4d 49 4e 41 4c 2c 0a 20    NONTERMINAL,. 
0ee0: 20 20 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c     MULTITERMINAL
0ef0: 0a 20 20 7d 20 74 79 70 65 3b 20 20 20 20 20 20  .  } type;      
0f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
0f10: 79 6d 62 6f 6c 73 20 61 72 65 20 61 6c 6c 20 65  ymbols are all e
0f20: 69 74 68 65 72 20 54 45 52 4d 49 4e 41 4c 53 20  ither TERMINALS 
0f30: 6f 72 20 4e 54 73 20 2a 2f 0a 20 20 73 74 72 75  or NTs */.  stru
0f40: 63 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20  ct rule *rule;  
0f50: 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c       /* Linked l
0f60: 69 73 74 20 6f 66 20 72 75 6c 65 73 20 6f 66 20  ist of rules of 
0f70: 74 68 69 73 20 28 69 66 20 61 6e 20 4e 54 29 20  this (if an NT) 
0f80: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
0f90: 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 2f 2a  ol *fallback; /*
0fa0: 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20   fallback token 
0fb0: 69 6e 20 63 61 73 65 20 74 68 69 73 20 74 6f 6b  in case this tok
0fc0: 65 6e 20 64 6f 65 73 6e 27 74 20 70 61 72 73 65  en doesn't parse
0fd0: 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 63 3b 20   */.  int prec; 
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0ff0: 2a 20 50 72 65 63 65 64 65 6e 63 65 20 69 66 20  * Precedence if 
1000: 64 65 66 69 6e 65 64 20 28 2d 31 20 6f 74 68 65  defined (-1 othe
1010: 72 77 69 73 65 29 20 2a 2f 0a 20 20 65 6e 75 6d  rwise) */.  enum
1020: 20 65 5f 61 73 73 6f 63 20 7b 0a 20 20 20 20 4c   e_assoc {.    L
1030: 45 46 54 2c 0a 20 20 20 20 52 49 47 48 54 2c 0a  EFT,.    RIGHT,.
1040: 20 20 20 20 4e 4f 4e 45 2c 0a 20 20 20 20 55 4e      NONE,.    UN
1050: 4b 0a 20 20 7d 20 61 73 73 6f 63 3b 20 20 20 20  K.  } assoc;    
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1070: 41 73 73 6f 63 69 61 74 69 76 69 74 79 20 69 66  Associativity if
1080: 20 70 72 65 64 65 63 65 6e 63 65 20 69 73 20 64   predecence is d
1090: 65 66 69 6e 65 64 20 2a 2f 0a 20 20 63 68 61 72  efined */.  char
10a0: 20 2a 66 69 72 73 74 73 65 74 3b 20 20 20 20 20   *firstset;     
10b0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 2d 73 65       /* First-se
10c0: 74 20 66 6f 72 20 61 6c 6c 20 72 75 6c 65 73 20  t for all rules 
10d0: 6f 66 20 74 68 69 73 20 73 79 6d 62 6f 6c 20 2a  of this symbol *
10e0: 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 6c 61 6d 62  /.  Boolean lamb
10f0: 64 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  da;          /* 
1100: 54 72 75 65 20 69 66 20 4e 54 20 61 6e 64 20 63  True if NT and c
1110: 61 6e 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65  an generate an e
1120: 6d 70 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 20  mpty string */. 
1130: 20 69 6e 74 20 75 73 65 43 6e 74 3b 20 20 20 20   int useCnt;    
1140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1150: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 75 73 65  ber of times use
1160: 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 65 73  d */.  char *des
1170: 74 72 75 63 74 6f 72 3b 20 20 20 20 20 20 20 20  tructor;        
1180: 2f 2a 20 43 6f 64 65 20 77 68 69 63 68 20 65 78  /* Code which ex
1190: 65 63 75 74 65 73 20 77 68 65 6e 65 76 65 72 20  ecutes whenever 
11a0: 74 68 69 73 20 73 79 6d 62 6f 6c 20 69 73 0a 20  this symbol is. 
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 70            ** pop
11d0: 70 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ped from the sta
11e0: 63 6b 20 64 75 72 69 6e 67 20 65 72 72 6f 72 20  ck during error 
11f0: 70 72 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20  processing */.  
1200: 69 6e 74 20 64 65 73 74 4c 69 6e 65 6e 6f 3b 20  int destLineno; 
1210: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65           /* Line
1220: 20 6e 75 6d 62 65 72 20 66 6f 72 20 73 74 61 72   number for star
1230: 74 20 6f 66 20 64 65 73 74 72 75 63 74 6f 72 20  t of destructor 
1240: 2a 2f 0a 20 20 63 68 61 72 20 2a 64 61 74 61 74  */.  char *datat
1250: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ype;          /*
1260: 20 54 68 65 20 64 61 74 61 20 74 79 70 65 20 6f   The data type o
1270: 66 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 68 65  f information he
1280: 6c 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 20  ld by this.     
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a0: 20 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e        ** object.
12b0: 20 4f 6e 6c 79 20 75 73 65 64 20 69 66 20 74 79   Only used if ty
12c0: 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20  pe==NONTERMINAL 
12d0: 2a 2f 0a 20 20 69 6e 74 20 64 74 6e 75 6d 3b 20  */.  int dtnum; 
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12f0: 20 54 68 65 20 64 61 74 61 20 74 79 70 65 20 6e   The data type n
1300: 75 6d 62 65 72 2e 20 20 49 6e 20 74 68 65 20 70  umber.  In the p
1310: 61 72 73 65 72 2c 20 74 68 65 20 76 61 6c 75 65  arser, the value
1320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1330: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
1340: 74 61 63 6b 20 69 73 20 61 20 75 6e 69 6f 6e 2e  tack is a union.
1350: 20 20 54 68 65 20 2e 79 79 25 64 20 65 6c 65 6d    The .yy%d elem
1360: 65 6e 74 20 6f 66 20 74 68 69 73 0a 20 20 20 20  ent of this.    
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1380: 20 20 20 20 20 20 20 2a 2a 20 75 6e 69 6f 6e 20         ** union 
1390: 69 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 64  is the correct d
13a0: 61 74 61 20 74 79 70 65 20 66 6f 72 20 74 68 69  ata type for thi
13b0: 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 2f 2a  s object */.  /*
13c0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
13d0: 69 65 6c 64 73 20 61 72 65 20 75 73 65 64 20 62  ields are used b
13e0: 79 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 73  y MULTITERMINALs
13f0: 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 6e 74 20 6e   only */.  int n
1400: 73 75 62 73 79 6d 3b 20 20 20 20 20 20 20 20 20  subsym;         
1410: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1420: 20 63 6f 6e 73 74 69 74 75 65 6e 74 20 73 79 6d   constituent sym
1430: 62 6f 6c 73 20 69 6e 20 74 68 65 20 4d 55 4c 54  bols in the MULT
1440: 49 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  I */.  struct sy
1450: 6d 62 6f 6c 20 2a 2a 73 75 62 73 79 6d 3b 20 20  mbol **subsym;  
1460: 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6e 73  /* Array of cons
1470: 74 69 74 75 65 6e 74 20 73 79 6d 62 6f 6c 73 20  tituent symbols 
1480: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20 70  */.};../* Each p
1490: 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 69  roduction rule i
14a0: 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 69 73  n the grammar is
14b0: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 66   stored in the f
14c0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75  ollowing.** stru
14d0: 63 74 75 72 65 2e 20 20 2a 2f 0a 73 74 72 75 63  cture.  */.struc
14e0: 74 20 72 75 6c 65 20 7b 0a 20 20 73 74 72 75 63  t rule {.  struc
14f0: 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20 20  t symbol *lhs;  
1500: 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64      /* Left-hand
1510: 20 73 69 64 65 20 6f 66 20 74 68 65 20 72 75 6c   side of the rul
1520: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 68 73  e */.  char *lhs
1530: 61 6c 69 61 73 3b 20 20 20 20 20 20 20 20 20 20  alias;          
1540: 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65  /* Alias for the
1550: 20 4c 48 53 20 28 4e 55 4c 4c 20 69 66 20 6e 6f   LHS (NULL if no
1560: 6e 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6c 68 73  ne) */.  int lhs
1570: 53 74 61 72 74 3b 20 20 20 20 20 20 20 20 20 20  Start;          
1580: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 65 66    /* True if lef
1590: 74 2d 68 61 6e 64 20 73 69 64 65 20 69 73 20 74  t-hand side is t
15a0: 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  he start symbol 
15b0: 2a 2f 0a 20 20 69 6e 74 20 72 75 6c 65 6c 69 6e  */.  int rulelin
15c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
15d0: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72   Line number for
15e0: 20 74 68 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69   the rule */.  i
15f0: 6e 74 20 6e 72 68 73 3b 20 20 20 20 20 20 20 20  nt nrhs;        
1600: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1610: 72 20 6f 66 20 52 48 53 20 73 79 6d 62 6f 6c 73  r of RHS symbols
1620: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
1630: 62 6f 6c 20 2a 2a 72 68 73 3b 20 20 20 20 20 2f  bol **rhs;     /
1640: 2a 20 54 68 65 20 52 48 53 20 73 79 6d 62 6f 6c  * The RHS symbol
1650: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 72 68  s */.  char **rh
1660: 73 61 6c 69 61 73 3b 20 20 20 20 20 20 20 20 20  salias;         
1670: 2f 2a 20 41 6e 20 61 6c 69 61 73 20 66 6f 72 20  /* An alias for 
1680: 65 61 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20  each RHS symbol 
1690: 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e 65 29 20 2a  (NULL if none) *
16a0: 2f 0a 20 20 69 6e 74 20 6c 69 6e 65 3b 20 20 20  /.  int line;   
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16c0: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 61 74 20 77  Line number at w
16d0: 68 69 63 68 20 63 6f 64 65 20 62 65 67 69 6e 73  hich code begins
16e0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 64 65   */.  char *code
16f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1700: 2a 20 54 68 65 20 63 6f 64 65 20 65 78 65 63 75  * The code execu
1710: 74 65 64 20 77 68 65 6e 20 74 68 69 73 20 72 75  ted when this ru
1720: 6c 65 20 69 73 20 72 65 64 75 63 65 64 20 2a 2f  le is reduced */
1730: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
1740: 20 2a 70 72 65 63 73 79 6d 3b 20 20 2f 2a 20 50   *precsym;  /* P
1750: 72 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c  recedence symbol
1760: 20 66 6f 72 20 74 68 69 73 20 72 75 6c 65 20 2a   for this rule *
1770: 2f 0a 20 20 69 6e 74 20 69 6e 64 65 78 3b 20 20  /.  int index;  
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1790: 41 6e 20 69 6e 64 65 78 20 6e 75 6d 62 65 72 20  An index number 
17a0: 66 6f 72 20 74 68 69 73 20 72 75 6c 65 20 2a 2f  for this rule */
17b0: 0a 20 20 42 6f 6f 6c 65 61 6e 20 63 61 6e 52 65  .  Boolean canRe
17c0: 64 75 63 65 3b 20 20 20 20 20 20 20 2f 2a 20 54  duce;       /* T
17d0: 72 75 65 20 69 66 20 74 68 69 73 20 72 75 6c 65  rue if this rule
17e0: 20 69 73 20 65 76 65 72 20 72 65 64 75 63 65 64   is ever reduced
17f0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
1800: 65 20 2a 6e 65 78 74 6c 68 73 3b 20 20 20 20 2f  e *nextlhs;    /
1810: 2a 20 4e 65 78 74 20 72 75 6c 65 20 77 69 74 68  * Next rule with
1820: 20 74 68 65 20 73 61 6d 65 20 4c 48 53 20 2a 2f   the same LHS */
1830: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
1840: 6e 65 78 74 3b 20 20 20 20 20 20 20 2f 2a 20 4e  next;       /* N
1850: 65 78 74 20 72 75 6c 65 20 69 6e 20 74 68 65 20  ext rule in the 
1860: 67 6c 6f 62 61 6c 20 6c 69 73 74 20 2a 2f 0a 7d  global list */.}
1870: 3b 0a 0a 2f 2a 20 41 20 63 6f 6e 66 69 67 75 72  ;../* A configur
1880: 61 74 69 6f 6e 20 69 73 20 61 20 70 72 6f 64 75  ation is a produ
1890: 63 74 69 6f 6e 20 72 75 6c 65 20 6f 66 20 74 68  ction rule of th
18a0: 65 20 67 72 61 6d 6d 61 72 20 74 6f 67 65 74 68  e grammar togeth
18b0: 65 72 20 77 69 74 68 0a 2a 2a 20 61 20 6d 61 72  er with.** a mar
18c0: 6b 20 28 64 6f 74 29 20 73 68 6f 77 69 6e 67 20  k (dot) showing 
18d0: 68 6f 77 20 6d 75 63 68 20 6f 66 20 74 68 61 74  how much of that
18e0: 20 72 75 6c 65 20 68 61 73 20 62 65 65 6e 20 70   rule has been p
18f0: 72 6f 63 65 73 73 65 64 20 73 6f 20 66 61 72 2e  rocessed so far.
1900: 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  .** Configuratio
1910: 6e 73 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 20  ns also contain 
1920: 61 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 77 68 69  a follow-set whi
1930: 63 68 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20  ch is a list of 
1940: 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62  terminal.** symb
1950: 6f 6c 73 20 77 68 69 63 68 20 61 72 65 20 61 6c  ols which are al
1960: 6c 6f 77 65 64 20 74 6f 20 69 6d 6d 65 64 69 61  lowed to immedia
1970: 74 65 6c 79 20 66 6f 6c 6c 6f 77 20 74 68 65 20  tely follow the 
1980: 65 6e 64 20 6f 66 20 74 68 65 20 72 75 6c 65 2e  end of the rule.
1990: 0a 2a 2a 20 45 76 65 72 79 20 63 6f 6e 66 69 67  .** Every config
19a0: 75 72 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72  uration is recor
19b0: 64 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e  ded as an instan
19c0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
19d0: 69 6e 67 3a 20 2a 2f 0a 73 74 72 75 63 74 20 63  ing: */.struct c
19e0: 6f 6e 66 69 67 20 7b 0a 20 20 73 74 72 75 63 74  onfig {.  struct
19f0: 20 72 75 6c 65 20 2a 72 70 3b 20 20 20 20 20 20   rule *rp;      
1a00: 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65 20 75     /* The rule u
1a10: 70 6f 6e 20 77 68 69 63 68 20 74 68 65 20 63 6f  pon which the co
1a20: 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 73 20 62  nfiguration is b
1a30: 61 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 6f  ased */.  int do
1a40: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1a50: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 20     /* The parse 
1a60: 70 6f 69 6e 74 20 2a 2f 0a 20 20 63 68 61 72 20  point */.  char 
1a70: 2a 66 77 73 3b 20 20 20 20 20 20 20 20 20 20 20  *fws;           
1a80: 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65      /* Follow-se
1a90: 74 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 66 69  t for this confi
1aa0: 67 75 72 61 74 69 6f 6e 20 6f 6e 6c 79 20 2a 2f  guration only */
1ab0: 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  .  struct plink 
1ac0: 2a 66 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20 46  *fplp;      /* F
1ad0: 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72 77 61 72  ollow-set forwar
1ae0: 64 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69  d propagation li
1af0: 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nks */.  struct 
1b00: 70 6c 69 6e 6b 20 2a 62 70 6c 70 3b 20 20 20 20  plink *bplp;    
1b10: 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20    /* Follow-set 
1b20: 62 61 63 6b 77 61 72 64 73 20 70 72 6f 70 61 67  backwards propag
1b30: 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20  ation links */. 
1b40: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
1b50: 74 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f 69  tp;       /* Poi
1b60: 6e 74 65 72 20 74 6f 20 73 74 61 74 65 20 77 68  nter to state wh
1b70: 69 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68 69  ich contains thi
1b80: 73 20 2a 2f 0a 20 20 65 6e 75 6d 20 7b 0a 20 20  s */.  enum {.  
1b90: 20 20 43 4f 4d 50 4c 45 54 45 2c 20 20 20 20 20    COMPLETE,     
1ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1bb0: 73 74 61 74 75 73 20 69 73 20 75 73 65 64 20 64  status is used d
1bc0: 75 72 69 6e 67 20 66 6f 6c 6c 6f 77 73 65 74 20  uring followset 
1bd0: 61 6e 64 20 2a 2f 0a 20 20 20 20 49 4e 43 4f 4d  and */.    INCOM
1be0: 50 4c 45 54 45 20 20 20 20 20 20 20 20 20 20 20  PLETE           
1bf0: 20 20 2f 2a 20 20 20 20 73 68 69 66 74 20 63 6f    /*    shift co
1c00: 6d 70 75 74 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  mputations */.  
1c10: 7d 20 73 74 61 74 75 73 3b 0a 20 20 73 74 72 75  } status;.  stru
1c20: 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 78 74 3b  ct config *next;
1c30: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 63 6f 6e       /* Next con
1c40: 66 69 67 75 72 61 74 69 6f 6e 20 69 6e 20 74 68  figuration in th
1c50: 65 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72  e state */.  str
1c60: 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 70 3b 20  uct config *bp; 
1c70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78        /* The nex
1c80: 74 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  t basis configur
1c90: 61 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  ation */.};../* 
1ca0: 45 76 65 72 79 20 73 68 69 66 74 20 6f 72 20 72  Every shift or r
1cb0: 65 64 75 63 65 20 6f 70 65 72 61 74 69 6f 6e 20  educe operation 
1cc0: 69 73 20 73 74 6f 72 65 64 20 61 73 20 6f 6e 65  is stored as one
1cd0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1ce0: 67 20 2a 2f 0a 73 74 72 75 63 74 20 61 63 74 69  g */.struct acti
1cf0: 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79  on {.  struct sy
1d00: 6d 62 6f 6c 20 2a 73 70 3b 20 20 20 20 20 20 20  mbol *sp;       
1d10: 2f 2a 20 54 68 65 20 6c 6f 6f 6b 2d 61 68 65 61  /* The look-ahea
1d20: 64 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 65 6e  d symbol */.  en
1d30: 75 6d 20 65 5f 61 63 74 69 6f 6e 20 7b 0a 20 20  um e_action {.  
1d40: 20 20 53 48 49 46 54 2c 0a 20 20 20 20 41 43 43    SHIFT,.    ACC
1d50: 45 50 54 2c 0a 20 20 20 20 52 45 44 55 43 45 2c  EPT,.    REDUCE,
1d60: 0a 20 20 20 20 45 52 52 4f 52 2c 0a 20 20 20 20  .    ERROR,.    
1d70: 53 53 43 4f 4e 46 4c 49 43 54 2c 20 20 20 20 20  SSCONFLICT,     
1d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 68           /* A sh
1d90: 69 66 74 2f 73 68 69 66 74 20 63 6f 6e 66 6c 69  ift/shift confli
1da0: 63 74 20 2a 2f 0a 20 20 20 20 53 52 43 4f 4e 46  ct */.    SRCONF
1db0: 4c 49 43 54 2c 20 20 20 20 20 20 20 20 20 20 20  LICT,           
1dc0: 20 20 20 2f 2a 20 57 61 73 20 61 20 72 65 64 75     /* Was a redu
1dd0: 63 65 2c 20 62 75 74 20 70 61 72 74 20 6f 66 20  ce, but part of 
1de0: 61 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20  a conflict */.  
1df0: 20 20 52 52 43 4f 4e 46 4c 49 43 54 2c 20 20 20    RRCONFLICT,   
1e00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 61             /* Wa
1e10: 73 20 61 20 72 65 64 75 63 65 2c 20 62 75 74 20  s a reduce, but 
1e20: 70 61 72 74 20 6f 66 20 61 20 63 6f 6e 66 6c 69  part of a confli
1e30: 63 74 20 2a 2f 0a 20 20 20 20 53 48 5f 52 45 53  ct */.    SH_RES
1e40: 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20 20 20  OLVED,          
1e50: 20 20 20 2f 2a 20 57 61 73 20 61 20 73 68 69 66     /* Was a shif
1e60: 74 2e 20 20 50 72 65 63 65 64 65 6e 63 65 20 72  t.  Precedence r
1e70: 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74  esolved conflict
1e80: 20 2a 2f 0a 20 20 20 20 52 44 5f 52 45 53 4f 4c   */.    RD_RESOL
1e90: 56 45 44 2c 20 20 20 20 20 20 20 20 20 20 20 20  VED,            
1ea0: 20 2f 2a 20 57 61 73 20 72 65 64 75 63 65 2e 20   /* Was reduce. 
1eb0: 20 50 72 65 63 65 64 65 6e 63 65 20 72 65 73 6f   Precedence reso
1ec0: 6c 76 65 64 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  lved conflict */
1ed0: 0a 20 20 20 20 4e 4f 54 5f 55 53 45 44 20 20 20  .    NOT_USED   
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ef0: 20 44 65 6c 65 74 65 64 20 62 79 20 63 6f 6d 70   Deleted by comp
1f00: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 7d 20 74  ression */.  } t
1f10: 79 70 65 3b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  ype;.  union {. 
1f20: 20 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20     struct state 
1f30: 2a 73 74 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  *stp;     /* The
1f40: 20 6e 65 77 20 73 74 61 74 65 2c 20 69 66 20 61   new state, if a
1f50: 20 73 68 69 66 74 20 2a 2f 0a 20 20 20 20 73 74   shift */.    st
1f60: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 20 20  ruct rule *rp;  
1f70: 20 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65       /* The rule
1f80: 2c 20 69 66 20 61 20 72 65 64 75 63 65 20 2a 2f  , if a reduce */
1f90: 0a 20 20 7d 20 78 3b 0a 20 20 73 74 72 75 63 74  .  } x;.  struct
1fa0: 20 61 63 74 69 6f 6e 20 2a 6e 65 78 74 3b 20 20   action *next;  
1fb0: 20 20 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f     /* Next actio
1fc0: 6e 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  n for this state
1fd0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 61 63 74   */.  struct act
1fe0: 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65 3b 20 20 2f  ion *collide;  /
1ff0: 2a 20 4e 65 78 74 20 61 63 74 69 6f 6e 20 77 69  * Next action wi
2000: 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
2010: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68 20   */.};../* Each 
2020: 73 74 61 74 65 20 6f 66 20 74 68 65 20 67 65 6e  state of the gen
2030: 65 72 61 74 65 64 20 70 61 72 73 65 72 27 73 20  erated parser's 
2040: 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63  finite state mac
2050: 68 69 6e 65 0a 2a 2a 20 69 73 20 65 6e 63 6f 64  hine.** is encod
2060: 65 64 20 61 73 20 61 6e 20 69 6e 73 74 61 6e 63  ed as an instanc
2070: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
2080: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 2a 2f  ng structure. */
2090: 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 7b 0a  .struct state {.
20a0: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
20b0: 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  *bp;       /* Th
20c0: 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72  e basis configur
20d0: 61 74 69 6f 6e 73 20 66 6f 72 20 74 68 69 73 20  ations for this 
20e0: 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63  state */.  struc
20f0: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 20 20  t config *cfp;  
2100: 20 20 20 20 2f 2a 20 41 6c 6c 20 63 6f 6e 66 69      /* All confi
2110: 67 75 72 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  gurations in thi
2120: 73 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 73  s set */.  int s
2130: 74 61 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20  tatenum;        
2140: 20 20 20 20 2f 2a 20 53 65 71 75 65 6e 63 69 61      /* Sequencia
2150: 6c 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 69  l number for thi
2160: 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 74 72  s state */.  str
2170: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 20  uct action *ap; 
2180: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
2190: 66 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68  f actions for th
21a0: 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e  is state */.  in
21b0: 74 20 6e 54 6b 6e 41 63 74 2c 20 6e 4e 74 41 63  t nTknAct, nNtAc
21c0: 74 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  t;     /* Number
21d0: 20 6f 66 20 61 63 74 69 6f 6e 73 20 6f 6e 20 74   of actions on t
21e0: 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e  erminals and non
21f0: 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 69  terminals */.  i
2200: 6e 74 20 69 54 6b 6e 4f 66 73 74 2c 20 69 4e 74  nt iTknOfst, iNt
2210: 4f 66 73 74 3b 20 20 20 2f 2a 20 79 79 5f 61 63  Ofst;   /* yy_ac
2220: 74 69 6f 6e 5b 5d 20 6f 66 66 73 65 74 20 66 6f  tion[] offset fo
2230: 72 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20  r terminals and 
2240: 6e 6f 6e 74 65 72 6d 73 20 2a 2f 0a 20 20 69 6e  nonterms */.  in
2250: 74 20 69 44 66 6c 74 3b 20 20 20 20 20 20 20 20  t iDflt;        
2260: 20 20 20 20 20 20 20 2f 2a 20 44 65 66 61 75 6c         /* Defaul
2270: 74 20 61 63 74 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23  t action */.};.#
2280: 64 65 66 69 6e 65 20 4e 4f 5f 4f 46 46 53 45 54  define NO_OFFSET
2290: 20 28 2d 32 31 34 37 34 38 33 36 34 37 29 0a 0a   (-2147483647)..
22a0: 2f 2a 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20 70  /* A followset p
22b0: 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 20  ropagation link 
22c0: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
22d0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 6f  he contents of o
22e0: 6e 65 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 61 74  ne.** configurat
22f0: 69 6f 6e 20 66 6f 6c 6c 6f 77 73 65 74 20 73 68  ion followset sh
2300: 6f 75 6c 64 20 62 65 20 70 72 6f 70 61 67 61 74  ould be propagat
2310: 65 64 20 74 6f 20 61 6e 6f 74 68 65 72 20 77 68  ed to another wh
2320: 65 6e 65 76 65 72 0a 2a 2a 20 74 68 65 20 66 69  enever.** the fi
2330: 72 73 74 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a  rst changes. */.
2340: 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 7b 0a 20  struct plink {. 
2350: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
2360: 63 66 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65  cfp;      /* The
2370: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74   configuration t
2380: 6f 20 77 68 69 63 68 20 6c 69 6e 6b 65 64 20 2a  o which linked *
2390: 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  /.  struct plink
23a0: 20 2a 6e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20   *next;      /* 
23b0: 54 68 65 20 6e 65 78 74 20 70 72 6f 70 61 67 61  The next propaga
23c0: 74 65 20 6c 69 6e 6b 20 2a 2f 0a 7d 3b 0a 0a 2f  te link */.};../
23d0: 2a 20 54 68 65 20 73 74 61 74 65 20 76 65 63 74  * The state vect
23e0: 6f 72 20 66 6f 72 20 74 68 65 20 65 6e 74 69 72  or for the entir
23f0: 65 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  e parser generat
2400: 6f 72 20 69 73 20 72 65 63 6f 72 64 65 64 20 61  or is recorded a
2410: 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 2e 20 20 28  s.** follows.  (
2420: 4c 45 4d 4f 4e 20 75 73 65 73 20 6e 6f 20 67 6c  LEMON uses no gl
2430: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61  obal variables a
2440: 6e 64 20 6d 61 6b 65 73 20 6c 69 74 74 6c 65 20  nd makes little 
2450: 75 73 65 20 6f 66 0a 2a 2a 20 73 74 61 74 69 63  use of.** static
2460: 20 76 61 72 69 61 62 6c 65 73 2e 20 20 46 69 65   variables.  Fie
2470: 6c 64 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f  lds in the follo
2480: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 63  wing structure c
2490: 61 6e 20 62 65 20 74 68 6f 75 67 68 74 0a 2a 2a  an be thought.**
24a0: 20 6f 66 20 61 73 20 62 65 67 69 6e 20 67 6c 6f   of as begin glo
24b0: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 69 6e  bal variables in
24c0: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 29 20 2a   the program.) *
24d0: 2f 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 7b  /.struct lemon {
24e0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
24f0: 2a 2a 73 6f 72 74 65 64 3b 20 20 20 2f 2a 20 54  **sorted;   /* T
2500: 61 62 6c 65 20 6f 66 20 73 74 61 74 65 73 20 73  able of states s
2510: 6f 72 74 65 64 20 62 79 20 73 74 61 74 65 20 6e  orted by state n
2520: 75 6d 62 65 72 20 2a 2f 0a 20 20 73 74 72 75 63  umber */.  struc
2530: 74 20 72 75 6c 65 20 2a 72 75 6c 65 3b 20 20 20  t rule *rule;   
2540: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
2550: 6c 6c 20 72 75 6c 65 73 20 2a 2f 0a 20 20 69 6e  ll rules */.  in
2560: 74 20 6e 73 74 61 74 65 3b 20 20 20 20 20 20 20  t nstate;       
2570: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2580: 20 6f 66 20 73 74 61 74 65 73 20 2a 2f 0a 20 20   of states */.  
2590: 69 6e 74 20 6e 72 75 6c 65 3b 20 20 20 20 20 20  int nrule;      
25a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
25b0: 65 72 20 6f 66 20 72 75 6c 65 73 20 2a 2f 0a 20  er of rules */. 
25c0: 20 69 6e 74 20 6e 73 79 6d 62 6f 6c 3b 20 20 20   int nsymbol;   
25d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
25e0: 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20  ber of terminal 
25f0: 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20  and nonterminal 
2600: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e 74  symbols */.  int
2610: 20 6e 74 65 72 6d 69 6e 61 6c 3b 20 20 20 20 20   nterminal;     
2620: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2630: 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62  of terminal symb
2640: 6f 6c 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ols */.  struct 
2650: 73 79 6d 62 6f 6c 20 2a 2a 73 79 6d 62 6f 6c 73  symbol **symbols
2660: 3b 20 2f 2a 20 53 6f 72 74 65 64 20 61 72 72 61  ; /* Sorted arra
2670: 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  y of pointers to
2680: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 69 6e   symbols */.  in
2690: 74 20 65 72 72 6f 72 63 6e 74 3b 20 20 20 20 20  t errorcnt;     
26a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
26b0: 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20   of errors */.  
26c0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 65  struct symbol *e
26d0: 72 72 73 79 6d 3b 20 20 20 2f 2a 20 54 68 65 20  rrsym;   /* The 
26e0: 65 72 72 6f 72 20 73 79 6d 62 6f 6c 20 2a 2f 0a  error symbol */.
26f0: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
2700: 2a 77 69 6c 64 63 61 72 64 3b 20 2f 2a 20 54 6f  *wildcard; /* To
2710: 6b 65 6e 20 74 68 61 74 20 6d 61 74 63 68 65 73  ken that matches
2720: 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 63   anything */.  c
2730: 68 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20  har *name;      
2740: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2750: 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
2760: 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 63 68 61   parser */.  cha
2770: 72 20 2a 61 72 67 3b 20 20 20 20 20 20 20 20 20  r *arg;         
2780: 20 20 20 20 20 20 2f 2a 20 44 65 63 6c 61 72 61        /* Declara
2790: 74 69 6f 6e 20 6f 66 20 74 68 65 20 33 74 68 20  tion of the 3th 
27a0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 72 73  argument to pars
27b0: 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f  er */.  char *to
27c0: 6b 65 6e 74 79 70 65 3b 20 20 20 20 20 20 20 20  kentype;        
27d0: 20 2f 2a 20 54 79 70 65 20 6f 66 20 74 65 72 6d   /* Type of term
27e0: 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 69 6e 20  inal symbols in 
27f0: 74 68 65 20 70 61 72 73 65 72 20 73 74 61 63 6b  the parser stack
2800: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 76 61 72 74   */.  char *vart
2810: 79 70 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ype;           /
2820: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 74 79  * The default ty
2830: 70 65 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e  pe of non-termin
2840: 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20  al symbols */.  
2850: 63 68 61 72 20 2a 73 74 61 72 74 3b 20 20 20 20  char *start;    
2860: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2870: 20 6f 66 20 74 68 65 20 73 74 61 72 74 20 73 79   of the start sy
2880: 6d 62 6f 6c 20 66 6f 72 20 74 68 65 20 67 72 61  mbol for the gra
2890: 6d 6d 61 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mmar */.  char *
28a0: 73 74 61 63 6b 73 69 7a 65 3b 20 20 20 20 20 20  stacksize;      
28b0: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
28c0: 65 20 70 61 72 73 65 72 20 73 74 61 63 6b 20 2a  e parser stack *
28d0: 2f 0a 20 20 63 68 61 72 20 2a 69 6e 63 6c 75 64  /.  char *includ
28e0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
28f0: 43 6f 64 65 20 74 6f 20 70 75 74 20 61 74 20 74  Code to put at t
2900: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
2910: 43 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  C file */.  char
2920: 20 2a 65 72 72 6f 72 3b 20 20 20 20 20 20 20 20   *error;        
2930: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20       /* Code to 
2940: 65 78 65 63 75 74 65 20 77 68 65 6e 20 61 6e 20  execute when an 
2950: 65 72 72 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f  error is seen */
2960: 0a 20 20 63 68 61 72 20 2a 6f 76 65 72 66 6c 6f  .  char *overflo
2970: 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  w;          /* C
2980: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f  ode to execute o
2990: 6e 20 61 20 73 74 61 63 6b 20 6f 76 65 72 66 6c  n a stack overfl
29a0: 6f 77 20 2a 2f 0a 20 20 63 68 61 72 20 2a 66 61  ow */.  char *fa
29b0: 69 6c 75 72 65 3b 20 20 20 20 20 20 20 20 20 20  ilure;          
29c0: 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63   /* Code to exec
29d0: 75 74 65 20 6f 6e 20 70 61 72 73 65 72 20 66 61  ute on parser fa
29e0: 69 6c 75 72 65 20 2a 2f 0a 20 20 63 68 61 72 20  ilure */.  char 
29f0: 2a 61 63 63 65 70 74 3b 20 20 20 20 20 20 20 20  *accept;        
2a00: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65      /* Code to e
2a10: 78 65 63 75 74 65 20 77 68 65 6e 20 74 68 65 20  xecute when the 
2a20: 70 61 72 73 65 72 20 65 78 63 65 70 74 73 20 2a  parser excepts *
2a30: 2f 0a 20 20 63 68 61 72 20 2a 65 78 74 72 61 63  /.  char *extrac
2a40: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ode;         /* 
2a50: 43 6f 64 65 20 61 70 70 65 6e 64 65 64 20 74 6f  Code appended to
2a60: 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 66   the generated f
2a70: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74  ile */.  char *t
2a80: 6f 6b 65 6e 64 65 73 74 3b 20 20 20 20 20 20 20  okendest;       
2a90: 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65    /* Code to exe
2aa0: 63 75 74 65 20 74 6f 20 64 65 73 74 72 6f 79 20  cute to destroy 
2ab0: 74 6f 6b 65 6e 20 64 61 74 61 20 2a 2f 0a 20 20  token data */.  
2ac0: 63 68 61 72 20 2a 76 61 72 64 65 73 74 3b 20 20  char *vardest;  
2ad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65           /* Code
2ae0: 20 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74   for the default
2af0: 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 64 65   non-terminal de
2b00: 73 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 63 68  structor */.  ch
2b10: 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20  ar *filename;   
2b20: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2b30: 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
2b40: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 75 74 6e   */.  char *outn
2b50: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
2b60: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 75  * Name of the cu
2b70: 72 72 65 6e 74 20 6f 75 74 70 75 74 20 66 69 6c  rrent output fil
2b80: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b  e */.  char *tok
2b90: 65 6e 70 72 65 66 69 78 3b 20 20 20 20 20 20 20  enprefix;       
2ba0: 2f 2a 20 41 20 70 72 65 66 69 78 20 61 64 64 65  /* A prefix adde
2bb0: 64 20 74 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65 73  d to token names
2bc0: 20 69 6e 20 74 68 65 20 2e 68 20 66 69 6c 65 20   in the .h file 
2bd0: 2a 2f 0a 20 20 69 6e 74 20 6e 63 6f 6e 66 6c 69  */.  int nconfli
2be0: 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct;           /*
2bf0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 73 69   Number of parsi
2c00: 6e 67 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a  ng conflicts */.
2c10: 20 20 69 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b    int tablesize;
2c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2c30: 7a 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 20  ze of the parse 
2c40: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20  tables */.  int 
2c50: 62 61 73 69 73 66 6c 61 67 3b 20 20 20 20 20 20  basisflag;      
2c60: 20 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 6f 6e       /* Print on
2c70: 6c 79 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75  ly basis configu
2c80: 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  rations */.  int
2c90: 20 68 61 73 5f 66 61 6c 6c 62 61 63 6b 3b 20 20   has_fallback;  
2ca0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2cb0: 20 61 6e 79 20 25 66 61 6c 6c 62 61 63 6b 20 69   any %fallback i
2cc0: 73 20 73 65 65 6e 20 69 6e 20 74 68 65 20 67 72  s seen in the gr
2cd0: 61 6d 6d 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  ammer */.  char 
2ce0: 2a 61 72 67 76 30 3b 20 20 20 20 20 20 20 20 20  *argv0;         
2cf0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2d00: 68 65 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 7d 3b  he program */.};
2d10: 0a 0a 23 64 65 66 69 6e 65 20 4d 65 6d 6f 72 79  ..#define Memory
2d20: 43 68 65 63 6b 28 58 29 20 69 66 28 28 58 29 3d  Check(X) if((X)=
2d30: 3d 30 29 7b 20 5c 0a 20 20 65 78 74 65 72 6e 20  =0){ \.  extern 
2d40: 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f  void memory_erro
2d50: 72 28 29 3b 20 5c 0a 20 20 6d 65 6d 6f 72 79 5f  r(); \.  memory_
2d60: 65 72 72 6f 72 28 29 3b 20 5c 0a 7d 0a 0a 2f 2a  error(); \.}../*
2d70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
2d80: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74  From the file "t
2d90: 61 62 6c 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  able.h" ********
2da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
2dc0: 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69   All code in thi
2dd0: 73 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  s file has been 
2de0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
2df0: 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  nerated.** from 
2e00: 61 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20  a specification 
2e10: 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20  in the file.**  
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 22 74 61 62              "tab
2e30: 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20  le.q".** by the 
2e40: 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
2e50: 79 20 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20  y code building 
2e60: 70 72 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e  program "aagen".
2e70: 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20  .** Do not edit 
2e80: 74 68 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74  this file!  Inst
2e90: 65 61 64 2c 20 65 64 69 74 20 74 68 65 20 73 70  ead, edit the sp
2ea0: 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66  ecification.** f
2eb0: 69 6c 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20  ile, then rerun 
2ec0: 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  aagen..*/./*.** 
2ed0: 43 6f 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73  Code for process
2ee0: 69 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68  ing tables in th
2ef0: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
2f00: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
2f10: 20 52 6f 75 74 69 6e 65 73 20 66 6f 72 20 68 61   Routines for ha
2f20: 6e 64 6c 69 6e 67 20 61 20 73 74 72 69 6e 67 73  ndling a strings
2f30: 20 2a 2f 0a 0a 63 68 61 72 20 2a 53 74 72 73 61   */..char *Strsa
2f40: 66 65 28 29 3b 0a 0a 76 6f 69 64 20 53 74 72 73  fe();..void Strs
2f50: 61 66 65 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64  afe_init(/* void
2f60: 20 2a 2f 29 3b 0a 69 6e 74 20 53 74 72 73 61 66   */);.int Strsaf
2f70: 65 5f 69 6e 73 65 72 74 28 2f 2a 20 63 68 61 72  e_insert(/* char
2f80: 20 2a 20 2a 2f 29 3b 0a 63 68 61 72 20 2a 53 74   * */);.char *St
2f90: 72 73 61 66 65 5f 66 69 6e 64 28 2f 2a 20 63 68  rsafe_find(/* ch
2fa0: 61 72 20 2a 20 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f  ar * */);../* Ro
2fb0: 75 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c  utines for handl
2fc0: 69 6e 67 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74  ing symbols of t
2fd0: 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 0a 73  he grammar */..s
2fe0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
2ff0: 6d 62 6f 6c 5f 6e 65 77 28 29 3b 0a 69 6e 74 20  mbol_new();.int 
3000: 53 79 6d 62 6f 6c 63 6d 70 70 28 2f 2a 20 73 74  Symbolcmpp(/* st
3010: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 2c 20  ruct symbol **, 
3020: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
3030: 20 2a 2f 29 3b 0a 76 6f 69 64 20 53 79 6d 62 6f   */);.void Symbo
3040: 6c 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a  l_init(/* void *
3050: 2f 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69  /);.int Symbol_i
3060: 6e 73 65 72 74 28 2f 2a 20 73 74 72 75 63 74 20  nsert(/* struct 
3070: 73 79 6d 62 6f 6c 20 2a 2c 20 63 68 61 72 20 2a  symbol *, char *
3080: 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 79 6d   */);.struct sym
3090: 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64  bol *Symbol_find
30a0: 28 2f 2a 20 63 68 61 72 20 2a 20 2a 2f 29 3b 0a  (/* char * */);.
30b0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
30c0: 79 6d 62 6f 6c 5f 4e 74 68 28 2f 2a 20 69 6e 74  ymbol_Nth(/* int
30d0: 20 2a 2f 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c   */);.int Symbol
30e0: 5f 63 6f 75 6e 74 28 2f 2a 20 20 2a 2f 29 3b 0a  _count(/*  */);.
30f0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
3100: 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 2f  Symbol_arrayof(/
3110: 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74  *  */);../* Rout
3120: 69 6e 65 73 20 74 6f 20 6d 61 6e 61 67 65 20 74  ines to manage t
3130: 68 65 20 73 74 61 74 65 20 74 61 62 6c 65 20 2a  he state table *
3140: 2f 0a 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70  /..int Configcmp
3150: 28 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e 66 69  (/* struct confi
3160: 67 20 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e 66  g *, struct conf
3170: 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74  ig * */);.struct
3180: 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e 65   state *State_ne
3190: 77 28 29 3b 0a 76 6f 69 64 20 53 74 61 74 65 5f  w();.void State_
31a0: 69 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29  init(/* void */)
31b0: 3b 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65  ;.int State_inse
31c0: 72 74 28 2f 2a 20 73 74 72 75 63 74 20 73 74 61  rt(/* struct sta
31d0: 74 65 20 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e  te *, struct con
31e0: 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63  fig * */);.struc
31f0: 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 66  t state *State_f
3200: 69 6e 64 28 2f 2a 20 73 74 72 75 63 74 20 63 6f  ind(/* struct co
3210: 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75  nfig * */);.stru
3220: 63 74 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65  ct state **State
3230: 5f 61 72 72 61 79 6f 66 28 2f 2a 20 20 2a 2f 29  _arrayof(/*  */)
3240: 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 75  ;../* Routines u
3250: 73 65 64 20 66 6f 72 20 65 66 66 69 63 69 65 6e  sed for efficien
3260: 63 79 20 69 6e 20 43 6f 6e 66 69 67 6c 69 73 74  cy in Configlist
3270: 5f 61 64 64 20 2a 2f 0a 0a 76 6f 69 64 20 43 6f  _add */..void Co
3280: 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 2f  nfigtable_init(/
3290: 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e 74 20  * void */);.int 
32a0: 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65  Configtable_inse
32b0: 72 74 28 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e  rt(/* struct con
32c0: 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63  fig * */);.struc
32d0: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
32e0: 74 61 62 6c 65 5f 66 69 6e 64 28 2f 2a 20 73 74  table_find(/* st
32f0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f  ruct config * */
3300: 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  );.void Configta
3310: 62 6c 65 5f 63 6c 65 61 72 28 2f 2a 20 69 6e 74  ble_clear(/* int
3320: 28 2a 29 28 73 74 72 75 63 74 20 63 6f 6e 66 69  (*)(struct confi
3330: 67 20 2a 29 20 2a 2f 29 3b 0a 2f 2a 2a 2a 2a 2a  g *) */);./*****
3340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
3350: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 61 63 74  om the file "act
3360: 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion.c" *********
3370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3380: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f  ******/./*.** Ro
3390: 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73 69 6e  utines processin
33a0: 67 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 73  g parser actions
33b0: 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
33c0: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
33d0: 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  */../* Allocate 
33e0: 61 20 6e 65 77 20 70 61 72 73 65 72 20 61 63 74  a new parser act
33f0: 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ion */.static st
3400: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41 63 74  ruct action *Act
3410: 69 6f 6e 5f 6e 65 77 28 76 6f 69 64 29 7b 0a 20  ion_new(void){. 
3420: 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61   static struct a
3430: 63 74 69 6f 6e 20 2a 66 72 65 65 6c 69 73 74 20  ction *freelist 
3440: 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 61 63  = 0;.  struct ac
3450: 74 69 6f 6e 20 2a 6e 65 77 3b 0a 0a 20 20 69 66  tion *new;..  if
3460: 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b  ( freelist==0 ){
3470: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
3480: 69 6e 74 20 61 6d 74 20 3d 20 31 30 30 3b 0a 20  int amt = 100;. 
3490: 20 20 20 66 72 65 65 6c 69 73 74 20 3d 20 28 73     freelist = (s
34a0: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 63  truct action *)c
34b0: 61 6c 6c 6f 63 28 61 6d 74 2c 20 73 69 7a 65 6f  alloc(amt, sizeo
34c0: 66 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 29  f(struct action)
34d0: 29 3b 0a 20 20 20 20 69 66 28 20 66 72 65 65 6c  );.    if( freel
34e0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
34f0: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
3500: 55 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  Unable to alloca
3510: 74 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20  te memory for a 
3520: 6e 65 77 20 70 61 72 73 65 72 20 61 63 74 69 6f  new parser actio
3530: 6e 2e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74  n.");.      exit
3540: 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  (1);.    }.    f
3550: 6f 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b  or(i=0; i<amt-1;
3560: 20 69 2b 2b 29 20 66 72 65 65 6c 69 73 74 5b 69   i++) freelist[i
3570: 5d 2e 6e 65 78 74 20 3d 20 26 66 72 65 65 6c 69  ].next = &freeli
3580: 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65  st[i+1];.    fre
3590: 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78  elist[amt-1].nex
35a0: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77  t = 0;.  }.  new
35b0: 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66   = freelist;.  f
35c0: 72 65 65 6c 69 73 74 20 3d 20 66 72 65 65 6c 69  reelist = freeli
35d0: 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75  st->next;.  retu
35e0: 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 43 6f  rn new;.}../* Co
35f0: 6d 70 61 72 65 20 74 77 6f 20 61 63 74 69 6f 6e  mpare two action
3600: 73 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75  s for sorting pu
3610: 72 70 6f 73 65 73 2e 20 20 52 65 74 75 72 6e 20  rposes.  Return 
3620: 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
3630: 6f 72 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 69  or.** positive i
3640: 66 20 74 68 65 20 66 69 72 73 74 20 61 63 74 69  f the first acti
3650: 6f 6e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  on is less than,
3660: 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72   equal to, or gr
3670: 65 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  eater than.** th
3680: 65 20 66 69 72 73 74 0a 2a 2f 0a 73 74 61 74 69  e first.*/.stati
3690: 63 20 69 6e 74 20 61 63 74 69 6f 6e 63 6d 70 28  c int actioncmp(
36a0: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
36b0: 20 2a 61 70 31 2c 0a 20 20 73 74 72 75 63 74 20   *ap1,.  struct 
36c0: 61 63 74 69 6f 6e 20 2a 61 70 32 0a 29 7b 0a 20  action *ap2.){. 
36d0: 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
36e0: 61 70 31 2d 3e 73 70 2d 3e 69 6e 64 65 78 20 2d  ap1->sp->index -
36f0: 20 61 70 32 2d 3e 73 70 2d 3e 69 6e 64 65 78 3b   ap2->sp->index;
3700: 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
3710: 20 20 20 20 72 63 20 3d 20 28 69 6e 74 29 61 70      rc = (int)ap
3720: 31 2d 3e 74 79 70 65 20 2d 20 28 69 6e 74 29 61  1->type - (int)a
3730: 70 32 2d 3e 74 79 70 65 3b 0a 20 20 7d 0a 20 20  p2->type;.  }.  
3740: 69 66 28 20 72 63 3d 3d 30 20 26 26 20 61 70 31  if( rc==0 && ap1
3750: 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29  ->type==REDUCE )
3760: 7b 0a 20 20 20 20 72 63 20 3d 20 61 70 31 2d 3e  {.    rc = ap1->
3770: 78 2e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 61 70  x.rp->index - ap
3780: 32 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 3b 0a  2->x.rp->index;.
3790: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
37a0: 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 70 61 72 73  .}../* Sort pars
37b0: 65 72 20 61 63 74 69 6f 6e 73 20 2a 2f 0a 73 74  er actions */.st
37c0: 61 74 69 63 20 73 74 72 75 63 74 20 61 63 74 69  atic struct acti
37d0: 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74 28  on *Action_sort(
37e0: 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
37f0: 20 2a 61 70 0a 29 7b 0a 20 20 61 70 20 3d 20 28   *ap.){.  ap = (
3800: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29  struct action *)
3810: 6d 73 6f 72 74 28 28 63 68 61 72 20 2a 29 61 70  msort((char *)ap
3820: 2c 28 63 68 61 72 20 2a 2a 29 26 61 70 2d 3e 6e  ,(char **)&ap->n
3830: 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ext,.           
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3850: 20 20 20 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74     (int(*)(const
3860: 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61   char*,const cha
3870: 72 2a 29 29 61 63 74 69 6f 6e 63 6d 70 29 3b 0a  r*))actioncmp);.
3880: 20 20 72 65 74 75 72 6e 20 61 70 3b 0a 7d 0a 0a    return ap;.}..
3890: 76 6f 69 64 20 41 63 74 69 6f 6e 5f 61 64 64 28  void Action_add(
38a0: 61 70 70 2c 74 79 70 65 2c 73 70 2c 61 72 67 29  app,type,sp,arg)
38b0: 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a  .struct action *
38c0: 2a 61 70 70 3b 0a 65 6e 75 6d 20 65 5f 61 63 74  *app;.enum e_act
38d0: 69 6f 6e 20 74 79 70 65 3b 0a 73 74 72 75 63 74  ion type;.struct
38e0: 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 63 68 61   symbol *sp;.cha
38f0: 72 20 2a 61 72 67 3b 0a 7b 0a 20 20 73 74 72 75  r *arg;.{.  stru
3900: 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 3b 0a  ct action *new;.
3910: 20 20 6e 65 77 20 3d 20 41 63 74 69 6f 6e 5f 6e    new = Action_n
3920: 65 77 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e 65 78  ew();.  new->nex
3930: 74 20 3d 20 2a 61 70 70 3b 0a 20 20 2a 61 70 70  t = *app;.  *app
3940: 20 3d 20 6e 65 77 3b 0a 20 20 6e 65 77 2d 3e 74   = new;.  new->t
3950: 79 70 65 20 3d 20 74 79 70 65 3b 0a 20 20 6e 65  ype = type;.  ne
3960: 77 2d 3e 73 70 20 3d 20 73 70 3b 0a 20 20 69 66  w->sp = sp;.  if
3970: 28 20 74 79 70 65 3d 3d 53 48 49 46 54 20 29 7b  ( type==SHIFT ){
3980: 0a 20 20 20 20 6e 65 77 2d 3e 78 2e 73 74 70 20  .    new->x.stp 
3990: 3d 20 28 73 74 72 75 63 74 20 73 74 61 74 65 20  = (struct state 
39a0: 2a 29 61 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a  *)arg;.  }else{.
39b0: 20 20 20 20 6e 65 77 2d 3e 78 2e 72 70 20 3d 20      new->x.rp = 
39c0: 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 29 61  (struct rule *)a
39d0: 72 67 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a  rg;.  }.}./*****
39e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
39f0: 2a 20 4e 65 77 20 63 6f 64 65 20 74 6f 20 69 6d  * New code to im
3a00: 70 6c 65 6d 65 6e 74 20 74 68 65 20 22 61 63 74  plement the "act
3a10: 74 61 62 22 20 6d 6f 64 75 6c 65 20 2a 2a 2a 2a  tab" module ****
3a20: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 54  *******/./*.** T
3a30: 68 69 73 20 6d 6f 64 75 6c 65 20 69 6d 70 6c 65  his module imple
3a40: 6d 65 6e 74 73 20 72 6f 75 74 69 6e 65 73 20 75  ments routines u
3a50: 73 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74 20  se to construct 
3a60: 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20  the yy_action[] 
3a70: 74 61 62 6c 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  table..*/../*.**
3a80: 20 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   The state of th
3a90: 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c  e yy_action tabl
3aa0: 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63  e under construc
3ab0: 74 69 6f 6e 20 69 73 20 61 6e 20 69 6e 73 74 61  tion is an insta
3ac0: 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66 6f  nce of.** the fo
3ad0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
3ae0: 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e.*/.typedef str
3af0: 75 63 74 20 61 63 74 74 61 62 20 61 63 74 74 61  uct acttab actta
3b00: 62 3b 0a 73 74 72 75 63 74 20 61 63 74 74 61 62  b;.struct acttab
3b10: 20 7b 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e   {.  int nAction
3b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3b30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
3b40: 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 41 63  sed slots in aAc
3b50: 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  tion[] */.  int 
3b60: 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20 20 20  nActionAlloc;   
3b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74           /* Slot
3b80: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
3b90: 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 73  aAction[] */.  s
3ba0: 74 72 75 63 74 20 7b 0a 20 20 20 20 69 6e 74 20  truct {.    int 
3bb0: 6c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20  lookahead;      
3bc0: 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
3bd0: 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64  of the lookahead
3be0: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 69 6e   token */.    in
3bf0: 74 20 61 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  t action;       
3c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69           /* Acti
3c10: 6f 6e 20 74 6f 20 74 61 6b 65 20 6f 6e 20 74 68  on to take on th
3c20: 65 20 67 69 76 65 6e 20 6c 6f 6f 6b 61 68 65 61  e given lookahea
3c30: 64 20 2a 2f 0a 20 20 7d 20 2a 61 41 63 74 69 6f  d */.  } *aActio
3c40: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
3c50: 20 20 20 20 2f 2a 20 54 68 65 20 79 79 5f 61 63      /* The yy_ac
3c60: 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 75 6e 64  tion[] table und
3c70: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
3c80: 2a 2f 0a 20 20 20 20 2a 61 4c 6f 6f 6b 61 68 65  */.    *aLookahe
3c90: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
3ca0: 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e 65    /* A single ne
3cb0: 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  w transaction se
3cc0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e 4c 6f 6f  t */.  int mnLoo
3cd0: 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20  kahead;         
3ce0: 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 61      /* Minimum a
3cf0: 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b  Lookahead[].look
3d00: 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6d  ahead */.  int m
3d10: 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  nAction;        
3d20: 20 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69 6f          /* Actio
3d30: 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  n associated wit
3d40: 68 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2a 2f  h mnLookahead */
3d50: 0a 20 20 69 6e 74 20 6d 78 4c 6f 6f 6b 61 68 65  .  int mxLookahe
3d60: 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ad;             
3d70: 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 4c 6f 6f 6b  /* Maximum aLook
3d80: 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65 61  ahead[].lookahea
3d90: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b  d */.  int nLook
3da0: 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  ahead;          
3db0: 20 20 20 20 2f 2a 20 55 73 65 64 20 73 6c 6f 74      /* Used slot
3dc0: 73 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64 5b  s in aLookahead[
3dd0: 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f 6b  ] */.  int nLook
3de0: 61 68 65 61 64 41 6c 6c 6f 63 3b 20 20 20 20 20  aheadAlloc;     
3df0: 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c 6c      /* Slots all
3e00: 6f 63 61 74 65 64 20 69 6e 20 61 4c 6f 6f 6b 61  ocated in aLooka
3e10: 68 65 61 64 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  head[] */.};../*
3e20: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
3e30: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
3e40: 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74   the yy_action t
3e50: 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  able */.#define 
3e60: 61 63 74 74 61 62 5f 73 69 7a 65 28 58 29 20 28  acttab_size(X) (
3e70: 28 58 29 2d 3e 6e 41 63 74 69 6f 6e 29 0a 0a 2f  (X)->nAction)../
3e80: 2a 20 54 68 65 20 76 61 6c 75 65 20 66 6f 72 20  * The value for 
3e90: 74 68 65 20 4e 2d 74 68 20 65 6e 74 72 79 20 69  the N-th entry i
3ea0: 6e 20 79 79 5f 61 63 74 69 6f 6e 20 2a 2f 0a 23  n yy_action */.#
3eb0: 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f 79 79  define acttab_yy
3ec0: 61 63 74 69 6f 6e 28 58 2c 4e 29 20 20 28 28 58  action(X,N)  ((X
3ed0: 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 61 63  )->aAction[N].ac
3ee0: 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76 61  tion)../* The va
3ef0: 6c 75 65 20 66 6f 72 20 74 68 65 20 4e 2d 74 68  lue for the N-th
3f00: 20 65 6e 74 72 79 20 69 6e 20 79 79 5f 6c 6f 6f   entry in yy_loo
3f10: 6b 61 68 65 61 64 20 2a 2f 0a 23 64 65 66 69 6e  kahead */.#defin
3f20: 65 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61  e acttab_yylooka
3f30: 68 65 61 64 28 58 2c 4e 29 20 20 28 28 58 29 2d  head(X,N)  ((X)-
3f40: 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 6c 6f 6f 6b  >aAction[N].look
3f50: 61 68 65 61 64 29 0a 0a 2f 2a 20 46 72 65 65 20  ahead)../* Free 
3f60: 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  all memory assoc
3f70: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67  iated with the g
3f80: 69 76 65 6e 20 61 63 74 74 61 62 20 2a 2f 0a 76  iven acttab */.v
3f90: 6f 69 64 20 61 63 74 74 61 62 5f 66 72 65 65 28  oid acttab_free(
3fa0: 61 63 74 74 61 62 20 2a 70 29 7b 0a 20 20 66 72  acttab *p){.  fr
3fb0: 65 65 28 20 70 2d 3e 61 41 63 74 69 6f 6e 20 29  ee( p->aAction )
3fc0: 3b 0a 20 20 66 72 65 65 28 20 70 2d 3e 61 4c 6f  ;.  free( p->aLo
3fd0: 6f 6b 61 68 65 61 64 20 29 3b 0a 20 20 66 72 65  okahead );.  fre
3fe0: 65 28 20 70 20 29 3b 0a 7d 0a 0a 2f 2a 20 41 6c  e( p );.}../* Al
3ff0: 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 63 74  locate a new act
4000: 74 61 62 20 73 74 72 75 63 74 75 72 65 20 2a 2f  tab structure */
4010: 0a 61 63 74 74 61 62 20 2a 61 63 74 74 61 62 5f  .acttab *acttab_
4020: 61 6c 6c 6f 63 28 76 6f 69 64 29 7b 0a 20 20 61  alloc(void){.  a
4030: 63 74 74 61 62 20 2a 70 20 3d 20 63 61 6c 6c 6f  cttab *p = callo
4040: 63 28 20 31 2c 20 73 69 7a 65 6f 66 28 2a 70 29  c( 1, sizeof(*p)
4050: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
4060: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
4070: 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20  derr,"Unable to 
4080: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  allocate memory 
4090: 66 6f 72 20 61 20 6e 65 77 20 61 63 74 74 61 62  for a new acttab
40a0: 2e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  .");.    exit(1)
40b0: 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
40c0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
40d0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
40e0: 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 61 63  ./* Add a new ac
40f0: 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 75 72 72  tion to the curr
4100: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
4110: 73 65 74 0a 2a 2f 0a 76 6f 69 64 20 61 63 74 74  set.*/.void actt
4120: 61 62 5f 61 63 74 69 6f 6e 28 61 63 74 74 61 62  ab_action(acttab
4130: 20 2a 70 2c 20 69 6e 74 20 6c 6f 6f 6b 61 68 65   *p, int lookahe
4140: 61 64 2c 20 69 6e 74 20 61 63 74 69 6f 6e 29 7b  ad, int action){
4150: 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61  .  if( p->nLooka
4160: 68 65 61 64 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68  head>=p->nLookah
4170: 65 61 64 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  eadAlloc ){.    
4180: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c  p->nLookaheadAll
4190: 6f 63 20 2b 3d 20 32 35 3b 0a 20 20 20 20 70 2d  oc += 25;.    p-
41a0: 3e 61 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 72 65  >aLookahead = re
41b0: 61 6c 6c 6f 63 28 20 70 2d 3e 61 4c 6f 6f 6b 61  alloc( p->aLooka
41c0: 68 65 61 64 2c 0a 20 20 20 20 20 20 20 20 20 20  head,.          
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41e0: 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 6f     sizeof(p->aLo
41f0: 6f 6b 61 68 65 61 64 5b 30 5d 29 2a 70 2d 3e 6e  okahead[0])*p->n
4200: 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 29  LookaheadAlloc )
4210: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f  ;.    if( p->aLo
4220: 6f 6b 61 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20  okahead==0 ){.  
4230: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
4240: 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65  rr,"malloc faile
4250: 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69  d\n");.      exi
4260: 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t(1);.    }.  }.
4270: 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68    if( p->nLookah
4280: 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  ead==0 ){.    p-
4290: 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c  >mxLookahead = l
42a0: 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 70 2d  ookahead;.    p-
42b0: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c  >mnLookahead = l
42c0: 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 70 2d  ookahead;.    p-
42d0: 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20 61 63 74 69  >mnAction = acti
42e0: 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  on;.  }else{.   
42f0: 20 69 66 28 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68   if( p->mxLookah
4300: 65 61 64 3c 6c 6f 6f 6b 61 68 65 61 64 20 29 20  ead<lookahead ) 
4310: 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d  p->mxLookahead =
4320: 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20   lookahead;.    
4330: 69 66 28 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  if( p->mnLookahe
4340: 61 64 3e 6c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a  ad>lookahead ){.
4350: 20 20 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61        p->mnLooka
4360: 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64  head = lookahead
4370: 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 41 63 74  ;.      p->mnAct
4380: 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20  ion = action;.  
4390: 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c 6f    }.  }.  p->aLo
43a0: 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b  okahead[p->nLook
43b0: 61 68 65 61 64 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ahead].lookahead
43c0: 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20   = lookahead;.  
43d0: 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d  p->aLookahead[p-
43e0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e 61 63 74  >nLookahead].act
43f0: 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20  ion = action;.  
4400: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 2b 2b 3b  p->nLookahead++;
4410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68  .}../*.** Add th
4420: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  e transaction se
4430: 74 20 62 75 69 6c 74 20 75 70 20 77 69 74 68 20  t built up with 
4440: 70 72 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 61  prior calls to a
4450: 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 29 0a 2a  cttab_action().*
4460: 2a 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65  * into the curre
4470: 6e 74 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e  nt action table.
4480: 20 20 54 68 65 6e 20 72 65 73 65 74 20 74 68 65    Then reset the
4490: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74   transaction set
44a0: 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 61 6e 20 65   back.** to an e
44b0: 6d 70 74 79 20 73 65 74 20 69 6e 20 70 72 65 70  mpty set in prep
44c0: 61 72 61 74 69 6f 6e 20 66 6f 72 20 61 20 6e 65  aration for a ne
44d0: 77 20 72 6f 75 6e 64 20 6f 66 20 61 63 74 74 61  w round of actta
44e0: 62 5f 61 63 74 69 6f 6e 28 29 20 63 61 6c 6c 73  b_action() calls
44f0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
4500: 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74  he offset into t
4510: 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  he action table 
4520: 6f 66 20 74 68 65 20 6e 65 77 20 74 72 61 6e 73  of the new trans
4530: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 61  action..*/.int a
4540: 63 74 74 61 62 5f 69 6e 73 65 72 74 28 61 63 74  cttab_insert(act
4550: 74 61 62 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  tab *p){.  int i
4560: 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 61 73 73  , j, k, n;.  ass
4570: 65 72 74 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  ert( p->nLookahe
4580: 61 64 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61  ad>0 );..  /* Ma
4590: 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
45a0: 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20  enough space to 
45b0: 68 6f 6c 64 20 74 68 65 20 65 78 70 61 6e 64 65  hold the expande
45c0: 64 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 0a 20  d action table. 
45d0: 20 2a 2a 20 69 6e 20 74 68 65 20 77 6f 72 73 74   ** in the worst
45e0: 20 63 61 73 65 2e 20 20 54 68 65 20 77 6f 72 73   case.  The wors
45f0: 74 20 63 61 73 65 20 6f 63 63 75 72 73 20 69 66  t case occurs if
4600: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
4610: 20 73 65 74 0a 20 20 2a 2a 20 6d 75 73 74 20 62   set.  ** must b
4620: 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
4630: 65 20 63 75 72 72 65 6e 74 20 61 63 74 69 6f 6e  e current action
4640: 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 6e 20   table.  */.  n 
4650: 3d 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64  = p->mxLookahead
4660: 20 2b 20 31 3b 0a 20 20 69 66 28 20 70 2d 3e 6e   + 1;.  if( p->n
4670: 41 63 74 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70 2d  Action + n >= p-
4680: 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 29 7b  >nActionAlloc ){
4690: 0a 20 20 20 20 69 6e 74 20 6f 6c 64 41 6c 6c 6f  .    int oldAllo
46a0: 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c  c = p->nActionAl
46b0: 6c 6f 63 3b 0a 20 20 20 20 70 2d 3e 6e 41 63 74  loc;.    p->nAct
46c0: 69 6f 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41  ionAlloc = p->nA
46d0: 63 74 69 6f 6e 20 2b 20 6e 20 2b 20 70 2d 3e 6e  ction + n + p->n
46e0: 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 2b 20 32 30  ActionAlloc + 20
46f0: 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e  ;.    p->aAction
4700: 20 3d 20 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61   = realloc( p->a
4710: 41 63 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20  Action,.        
4720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4730: 20 20 73 69 7a 65 6f 66 28 70 2d 3e 61 41 63 74    sizeof(p->aAct
4740: 69 6f 6e 5b 30 5d 29 2a 70 2d 3e 6e 41 63 74 69  ion[0])*p->nActi
4750: 6f 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66  onAlloc);.    if
4760: 28 20 70 2d 3e 61 41 63 74 69 6f 6e 3d 3d 30 20  ( p->aAction==0 
4770: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
4780: 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20  (stderr,"malloc 
4790: 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20  failed\n");.    
47a0: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d    exit(1);.    }
47b0: 0a 20 20 20 20 66 6f 72 28 69 3d 6f 6c 64 41 6c  .    for(i=oldAl
47c0: 6c 6f 63 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f  loc; i<p->nActio
47d0: 6e 41 6c 6c 6f 63 3b 20 69 2b 2b 29 7b 0a 20 20  nAlloc; i++){.  
47e0: 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69      p->aAction[i
47f0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 2d 31  ].lookahead = -1
4800: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 41 63 74 69  ;.      p->aActi
4810: 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e 20 3d 20 2d  on[i].action = -
4820: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
4830: 2f 2a 20 53 63 61 6e 20 74 68 65 20 65 78 69 73  /* Scan the exis
4840: 74 69 6e 67 20 61 63 74 69 6f 6e 20 74 61 62 6c  ting action tabl
4850: 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 6e  e looking for an
4860: 20 6f 66 66 73 65 74 20 77 68 65 72 65 20 77 65   offset where we
4870: 20 63 61 6e 0a 20 20 2a 2a 20 69 6e 73 65 72 74   can.  ** insert
4880: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
4890: 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e 20 20 46  nsaction set.  F
48a0: 61 6c 6c 20 6f 75 74 20 6f 66 20 74 68 65 20 6c  all out of the l
48b0: 6f 6f 70 20 77 68 65 6e 20 74 68 61 74 0a 20 20  oop when that.  
48c0: 2a 2a 20 6f 66 66 73 65 74 20 69 73 20 66 6f 75  ** offset is fou
48d0: 6e 64 2e 20 20 49 6e 20 74 68 65 20 77 6f 72 73  nd.  In the wors
48e0: 74 20 63 61 73 65 2c 20 77 65 20 66 61 6c 6c 20  t case, we fall 
48f0: 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20  out of the loop 
4900: 77 68 65 6e 0a 20 20 2a 2a 20 69 20 72 65 61 63  when.  ** i reac
4910: 68 65 73 20 70 2d 3e 6e 41 63 74 69 6f 6e 2c 20  hes p->nAction, 
4920: 77 68 69 63 68 20 6d 65 61 6e 73 20 77 65 20 61  which means we a
4930: 70 70 65 6e 64 20 74 68 65 20 6e 65 77 20 74 72  ppend the new tr
4940: 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e 0a 20  ansaction set.. 
4950: 20 2a 2a 0a 20 20 2a 2a 20 69 20 69 73 20 74 68   **.  ** i is th
4960: 65 20 69 6e 64 65 78 20 69 6e 20 70 2d 3e 61 41  e index in p->aA
4970: 63 74 69 6f 6e 5b 5d 20 77 68 65 72 65 20 70 2d  ction[] where p-
4980: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 69 73 20  >mnLookahead is 
4990: 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20  inserted..  */. 
49a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
49b0: 41 63 74 69 6f 6e 2b 70 2d 3e 6d 6e 4c 6f 6f 6b  Action+p->mnLook
49c0: 61 68 65 61 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ahead; i++){.   
49d0: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
49e0: 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29  i].lookahead<0 )
49f0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  {.      for(j=0;
4a00: 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64   j<p->nLookahead
4a10: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
4a20: 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  k = p->aLookahea
4a30: 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d  d[j].lookahead -
4a40: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20   p->mnLookahead 
4a50: 2b 20 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28  + i;.        if(
4a60: 20 6b 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20   k<0 ) break;.  
4a70: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63        if( p->aAc
4a80: 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[k].lookahea
4a90: 64 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  d>=0 ) break;.  
4aa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
4ab0: 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20  j<p->nLookahead 
4ac0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
4ad0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
4ae0: 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20  nAction; j++){. 
4af0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41         if( p->aA
4b00: 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65  ction[j].lookahe
4b10: 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61  ad==j+p->mnLooka
4b20: 68 65 61 64 2d 69 20 29 20 62 72 65 61 6b 3b 0a  head-i ) break;.
4b30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4b40: 28 20 6a 3d 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20  ( j==p->nAction 
4b50: 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
4b60: 3b 20 20 2f 2a 20 46 69 74 73 20 69 6e 20 65 6d  ;  /* Fits in em
4b70: 70 74 79 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 20  pty slots */.   
4b80: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
4b90: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d  f( p->aAction[i]
4ba0: 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 70 2d 3e 6d  .lookahead==p->m
4bb0: 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20  nLookahead ){.  
4bc0: 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69      if( p->aActi
4bd0: 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d  on[i].action!=p-
4be0: 3e 6d 6e 41 63 74 69 6f 6e 20 29 20 63 6f 6e 74  >mnAction ) cont
4bf0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
4c00: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61  j=0; j<p->nLooka
4c10: 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  head; j++){.    
4c20: 20 20 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b      k = p->aLook
4c30: 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65  ahead[j].lookahe
4c40: 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68  ad - p->mnLookah
4c50: 65 61 64 20 2b 20 69 3b 0a 20 20 20 20 20 20 20  ead + i;.       
4c60: 20 69 66 28 20 6b 3c 30 20 7c 7c 20 6b 3e 3d 70   if( k<0 || k>=p
4c70: 2d 3e 6e 41 63 74 69 6f 6e 20 29 20 62 72 65 61  ->nAction ) brea
4c80: 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  k;.        if( p
4c90: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e  ->aLookahead[j].
4ca0: 6c 6f 6f 6b 61 68 65 61 64 21 3d 70 2d 3e 61 41  lookahead!=p->aA
4cb0: 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65  ction[k].lookahe
4cc0: 61 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ad ) break;.    
4cd0: 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b      if( p->aLook
4ce0: 61 68 65 61 64 5b 6a 5d 2e 61 63 74 69 6f 6e 21  ahead[j].action!
4cf0: 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 61  =p->aAction[k].a
4d00: 63 74 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20  ction ) break;. 
4d10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4d20: 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64   j<p->nLookahead
4d30: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
4d40: 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20     n = 0;.      
4d50: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41  for(j=0; j<p->nA
4d60: 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ction; j++){.   
4d70: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74       if( p->aAct
4d80: 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[j].lookahead
4d90: 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  <0 ) continue;. 
4da0: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41         if( p->aA
4db0: 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65  ction[j].lookahe
4dc0: 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61  ad==j+p->mnLooka
4dd0: 68 65 61 64 2d 69 20 29 20 6e 2b 2b 3b 0a 20 20  head-i ) n++;.  
4de0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
4df0: 6e 3d 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  n==p->nLookahead
4e00: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
4e10: 6b 3b 20 20 2f 2a 20 53 61 6d 65 20 61 73 20 61  k;  /* Same as a
4e20: 20 70 72 69 6f 72 20 74 72 61 6e 73 61 63 74 69   prior transacti
4e30: 6f 6e 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  on set */.      
4e40: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
4e50: 20 49 6e 73 65 72 74 20 74 72 61 6e 73 61 63 74   Insert transact
4e60: 69 6f 6e 20 73 65 74 20 61 74 20 69 6e 64 65 78  ion set at index
4e70: 20 69 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30   i. */.  for(j=0
4e80: 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  ; j<p->nLookahea
4e90: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6b 20 3d  d; j++){.    k =
4ea0: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a   p->aLookahead[j
4eb0: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d  ].lookahead - p-
4ec0: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69  >mnLookahead + i
4ed0: 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e  ;.    p->aAction
4ee0: 5b 6b 5d 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68  [k] = p->aLookah
4ef0: 65 61 64 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  ead[j];.    if( 
4f00: 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20  k>=p->nAction ) 
4f10: 70 2d 3e 6e 41 63 74 69 6f 6e 20 3d 20 6b 2b 31  p->nAction = k+1
4f20: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b  ;.  }.  p->nLook
4f30: 61 68 65 61 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a  ahead = 0;..  /*
4f40: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73   Return the offs
4f50: 65 74 20 74 68 61 74 20 69 73 20 61 64 64 65 64  et that is added
4f60: 20 74 6f 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61   to the lookahea
4f70: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  d in order to ge
4f80: 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  t the.  ** index
4f90: 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20   into yy_action 
4fa0: 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20 2a 2f  of the action */
4fb0: 0a 20 20 72 65 74 75 72 6e 20 69 20 2d 20 70 2d  .  return i - p-
4fc0: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b 0a 7d 0a  >mnLookahead;.}.
4fd0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
4fe0: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
4ff0: 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 63 22  e file "build.c"
5000: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
5010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
5020: 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74  /*.** Routines t
5030: 6f 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74  o construction t
5040: 68 65 20 66 69 6e 69 74 65 20 73 74 61 74 65 20  he finite state 
5050: 6d 61 63 68 69 6e 65 20 66 6f 72 20 74 68 65 20  machine for the 
5060: 4c 45 4d 4f 4e 0a 2a 2a 20 70 61 72 73 65 72 20  LEMON.** parser 
5070: 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f  generator..*/../
5080: 2a 20 46 69 6e 64 20 61 20 70 72 65 63 65 64 65  * Find a precede
5090: 6e 63 65 20 73 79 6d 62 6f 6c 20 6f 66 20 65 76  nce symbol of ev
50a0: 65 72 79 20 72 75 6c 65 20 69 6e 20 74 68 65 20  ery rule in the 
50b0: 67 72 61 6d 6d 61 72 2e 0a 2a 2a 20 0a 2a 2a 20  grammar..** .** 
50c0: 54 68 6f 73 65 20 72 75 6c 65 73 20 77 68 69 63  Those rules whic
50d0: 68 20 68 61 76 65 20 61 20 70 72 65 63 65 64 65  h have a precede
50e0: 6e 63 65 20 73 79 6d 62 6f 6c 20 63 6f 64 65 64  nce symbol coded
50f0: 20 69 6e 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a   in the input.**
5100: 20 67 72 61 6d 6d 61 72 20 75 73 69 6e 67 20 74   grammar using t
5110: 68 65 20 22 5b 73 79 6d 62 6f 6c 5d 22 20 63 6f  he "[symbol]" co
5120: 6e 73 74 72 75 63 74 20 77 69 6c 6c 20 61 6c 72  nstruct will alr
5130: 65 61 64 79 20 68 61 76 65 20 74 68 65 0a 2a 2a  eady have the.**
5140: 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 66 69 65   rp->precsym fie
5150: 6c 64 20 66 69 6c 6c 65 64 2e 20 20 4f 74 68 65  ld filled.  Othe
5160: 72 20 72 75 6c 65 73 20 74 61 6b 65 20 61 73 20  r rules take as 
5170: 74 68 65 69 72 20 70 72 65 63 65 64 65 6e 63 65  their precedence
5180: 0a 2a 2a 20 73 79 6d 62 6f 6c 20 74 68 65 20 66  .** symbol the f
5190: 69 72 73 74 20 52 48 53 20 73 79 6d 62 6f 6c 20  irst RHS symbol 
51a0: 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 70  with a defined p
51b0: 72 65 63 65 64 65 6e 63 65 2e 20 20 49 66 20 74  recedence.  If t
51c0: 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 74 20  here.** are not 
51d0: 52 48 53 20 73 79 6d 62 6f 6c 73 20 77 69 74 68  RHS symbols with
51e0: 20 61 20 64 65 66 69 6e 65 64 20 70 72 65 63 65   a defined prece
51f0: 64 65 6e 63 65 2c 20 74 68 65 20 70 72 65 63 65  dence, the prece
5200: 64 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20  dence.** symbol 
5210: 66 69 65 6c 64 20 69 73 20 6c 65 66 74 20 62 6c  field is left bl
5220: 61 6e 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e  ank..*/.void Fin
5230: 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73  dRulePrecedences
5240: 28 78 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  (xp).struct lemo
5250: 6e 20 2a 78 70 3b 0a 7b 0a 20 20 73 74 72 75 63  n *xp;.{.  struc
5260: 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 66 6f  t rule *rp;.  fo
5270: 72 28 72 70 3d 78 70 2d 3e 72 75 6c 65 3b 20 72  r(rp=xp->rule; r
5280: 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
5290: 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 70 72 65  .    if( rp->pre
52a0: 63 73 79 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  csym==0 ){.     
52b0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20   int i, j;.     
52c0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e   for(i=0; i<rp->
52d0: 6e 72 68 73 20 26 26 20 72 70 2d 3e 70 72 65 63  nrhs && rp->prec
52e0: 73 79 6d 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  sym==0; i++){.  
52f0: 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
5300: 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68  bol *sp = rp->rh
5310: 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  s[i];.        if
5320: 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54  ( sp->type==MULT
5330: 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20  ITERMINAL ){.   
5340: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
5350: 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a  j<sp->nsubsym; j
5360: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
5370: 20 69 66 28 20 73 70 2d 3e 73 75 62 73 79 6d 5b   if( sp->subsym[
5380: 6a 5d 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20  j]->prec>=0 ){. 
5390: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d               rp-
53a0: 3e 70 72 65 63 73 79 6d 20 3d 20 73 70 2d 3e 73  >precsym = sp->s
53b0: 75 62 73 79 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20  ubsym[j];.      
53c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
53d0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
53e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
53f0: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e 70   }else if( sp->p
5400: 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  rec>=0 ){.      
5410: 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20      rp->precsym 
5420: 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 09 7d  = rp->rhs[i];..}
5430: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5440: 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a   }.  return;.}..
5450: 2f 2a 20 46 69 6e 64 20 61 6c 6c 20 6e 6f 6e 74  /* Find all nont
5460: 65 72 6d 69 6e 61 6c 73 20 77 68 69 63 68 20 77  erminals which w
5470: 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 74 68 65  ill generate the
5480: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a   empty string..*
5490: 2a 20 54 68 65 6e 20 67 6f 20 62 61 63 6b 20 61  * Then go back a
54a0: 6e 64 20 63 6f 6d 70 75 74 65 20 74 68 65 20 66  nd compute the f
54b0: 69 72 73 74 20 73 65 74 73 20 6f 66 20 65 76 65  irst sets of eve
54c0: 72 79 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a  ry nonterminal..
54d0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 73 65 74  ** The first set
54e0: 20 69 73 20 74 68 65 20 73 65 74 20 6f 66 20 61   is the set of a
54f0: 6c 6c 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62  ll terminal symb
5500: 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20 62 65  ols which can be
5510: 67 69 6e 0a 2a 2a 20 61 20 73 74 72 69 6e 67 20  gin.** a string 
5520: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 61  generated by tha
5530: 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a  t nonterminal..*
5540: 2f 0a 76 6f 69 64 20 46 69 6e 64 46 69 72 73 74  /.void FindFirst
5550: 53 65 74 73 28 6c 65 6d 70 29 0a 73 74 72 75 63  Sets(lemp).struc
5560: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
5570: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73  .  int i, j;.  s
5580: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
5590: 20 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a    int progress;.
55a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
55b0: 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
55c0: 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79 6d  ){.    lemp->sym
55d0: 62 6f 6c 73 5b 69 5d 2d 3e 6c 61 6d 62 64 61 20  bols[i]->lambda 
55e0: 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20  = LEMON_FALSE;. 
55f0: 20 7d 0a 20 20 66 6f 72 28 69 3d 6c 65 6d 70 2d   }.  for(i=lemp-
5600: 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 3c 6c 65  >nterminal; i<le
5610: 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
5620: 29 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79 6d  ){.    lemp->sym
5630: 62 6f 6c 73 5b 69 5d 2d 3e 66 69 72 73 74 73 65  bols[i]->firstse
5640: 74 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20 20  t = SetNew();.  
5650: 7d 0a 0a 20 20 2f 2a 20 46 69 72 73 74 20 63 6f  }..  /* First co
5660: 6d 70 75 74 65 20 61 6c 6c 20 6c 61 6d 62 64 61  mpute all lambda
5670: 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 70  s */.  do{.    p
5680: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
5690: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
56a0: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
56b0: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
56c0: 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20  rp->lhs->lambda 
56d0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
56e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d    for(i=0; i<rp-
56f0: 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
5700: 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
5710: 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68  bol *sp = rp->rh
5720: 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 69  s[i];.         i
5730: 66 28 20 73 70 2d 3e 74 79 70 65 21 3d 54 45 52  f( sp->type!=TER
5740: 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 6c 61 6d  MINAL || sp->lam
5750: 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45  bda==LEMON_FALSE
5760: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
5770: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 72  }.      if( i==r
5780: 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20  p->nrhs ){.     
5790: 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62     rp->lhs->lamb
57a0: 64 61 20 3d 20 4c 45 4d 4f 4e 5f 54 52 55 45 3b  da = LEMON_TRUE;
57b0: 0a 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73  .        progres
57c0: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 1;.      }. 
57d0: 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 70     }.  }while( p
57e0: 72 6f 67 72 65 73 73 20 29 3b 0a 0a 20 20 2f 2a  rogress );..  /*
57f0: 20 4e 6f 77 20 63 6f 6d 70 75 74 65 20 61 6c 6c   Now compute all
5800: 20 66 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20   first sets */. 
5810: 20 64 6f 7b 0a 20 20 20 20 73 74 72 75 63 74 20   do{.    struct 
5820: 73 79 6d 62 6f 6c 20 2a 73 31 2c 20 2a 73 32 3b  symbol *s1, *s2;
5830: 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20  .    progress = 
5840: 30 3b 0a 20 20 20 20 66 6f 72 28 72 70 3d 6c 65  0;.    for(rp=le
5850: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
5860: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
5870: 20 20 73 31 20 3d 20 72 70 2d 3e 6c 68 73 3b 0a    s1 = rp->lhs;.
5880: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
5890: 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
58a0: 0a 20 20 20 20 20 20 20 20 73 32 20 3d 20 72 70  .        s2 = rp
58b0: 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20  ->rhs[i];.      
58c0: 20 20 69 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d    if( s2->type==
58d0: 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
58e0: 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b        progress +
58f0: 3d 20 53 65 74 41 64 64 28 73 31 2d 3e 66 69 72  = SetAdd(s1->fir
5900: 73 74 73 65 74 2c 73 32 2d 3e 69 6e 64 65 78 29  stset,s2->index)
5910: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
5920: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
5930: 20 69 66 28 20 73 32 2d 3e 74 79 70 65 3d 3d 4d   if( s2->type==M
5940: 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
5950: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d            for(j=
5960: 30 3b 20 6a 3c 73 32 2d 3e 6e 73 75 62 73 79 6d  0; j<s2->nsubsym
5970: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
5980: 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b 3d 20      progress += 
5990: 53 65 74 41 64 64 28 73 31 2d 3e 66 69 72 73 74  SetAdd(s1->first
59a0: 73 65 74 2c 73 32 2d 3e 73 75 62 73 79 6d 5b 6a  set,s2->subsym[j
59b0: 5d 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  ]->index);.     
59c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
59d0: 20 62 72 65 61 6b 3b 0a 09 7d 65 6c 73 65 20 69   break;..}else i
59e0: 66 28 20 73 31 3d 3d 73 32 20 29 7b 0a 20 20 20  f( s1==s2 ){.   
59f0: 20 20 20 20 20 20 20 69 66 28 20 73 31 2d 3e 6c         if( s1->l
5a00: 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c  ambda==LEMON_FAL
5a10: 53 45 20 29 20 62 72 65 61 6b 3b 0a 09 7d 65 6c  SE ) break;..}el
5a20: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72  se{.          pr
5a30: 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 55 6e 69  ogress += SetUni
5a40: 6f 6e 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c  on(s1->firstset,
5a50: 73 32 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a 20  s2->firstset);. 
5a60: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 32 2d           if( s2-
5a70: 3e 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46  >lambda==LEMON_F
5a80: 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 09 7d  ALSE ) break;..}
5a90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5aa0: 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73   }while( progres
5ab0: 73 20 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  s );.  return;.}
5ac0: 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c  ../* Compute all
5ad0: 20 4c 52 28 30 29 20 73 74 61 74 65 73 20 66 6f   LR(0) states fo
5ae0: 72 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20  r the grammar.  
5af0: 4c 69 6e 6b 73 0a 2a 2a 20 61 72 65 20 61 64 64  Links.** are add
5b00: 65 64 20 74 6f 20 62 65 74 77 65 65 6e 20 73 6f  ed to between so
5b10: 6d 65 20 73 74 61 74 65 73 20 73 6f 20 74 68 61  me states so tha
5b20: 74 20 74 68 65 20 4c 52 28 31 29 20 66 6f 6c 6c  t the LR(1) foll
5b30: 6f 77 20 73 65 74 73 0a 2a 2a 20 63 61 6e 20 62  ow sets.** can b
5b40: 65 20 63 6f 6d 70 75 74 65 64 20 6c 61 74 65 72  e computed later
5b50: 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 73 74 72  ..*/.PRIVATE str
5b60: 75 63 74 20 73 74 61 74 65 20 2a 67 65 74 73 74  uct state *getst
5b70: 61 74 65 28 2f 2a 20 73 74 72 75 63 74 20 6c 65  ate(/* struct le
5b80: 6d 6f 6e 20 2a 20 2a 2f 29 3b 20 20 2f 2a 20 66  mon * */);  /* f
5b90: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
5ba0: 20 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 53 74 61   */.void FindSta
5bb0: 74 65 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74  tes(lemp).struct
5bc0: 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a   lemon *lemp;.{.
5bd0: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
5be0: 2a 73 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75  *sp;.  struct ru
5bf0: 6c 65 20 2a 72 70 3b 0a 0a 20 20 43 6f 6e 66 69  le *rp;..  Confi
5c00: 67 6c 69 73 74 5f 69 6e 69 74 28 29 3b 0a 0a 20  glist_init();.. 
5c10: 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 74 61   /* Find the sta
5c20: 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69  rt symbol */.  i
5c30: 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29  f( lemp->start )
5c40: 7b 0a 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f  {.    sp = Symbo
5c50: 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61  l_find(lemp->sta
5c60: 72 74 29 3b 0a 20 20 20 20 69 66 28 20 73 70 3d  rt);.    if( sp=
5c70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 72 72 6f  =0 ){.      Erro
5c80: 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e  rMsg(lemp->filen
5c90: 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73 70 65 63  ame,0,."The spec
5ca0: 69 66 69 65 64 20 73 74 61 72 74 20 73 79 6d 62  ified start symb
5cb0: 6f 6c 20 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74  ol \"%s\" is not
5cc0: 20 5c 0a 69 6e 20 61 20 6e 6f 6e 74 65 72 6d 69   \.in a nontermi
5cd0: 6e 61 6c 20 6f 66 20 74 68 65 20 67 72 61 6d 6d  nal of the gramm
5ce0: 61 72 2e 20 20 5c 22 25 73 5c 22 20 77 69 6c 6c  ar.  \"%s\" will
5cf0: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20   be used as the 
5d00: 73 74 61 72 74 20 5c 0a 73 79 6d 62 6f 6c 20 69  start \.symbol i
5d10: 6e 73 74 65 61 64 2e 22 2c 6c 65 6d 70 2d 3e 73  nstead.",lemp->s
5d20: 74 61 72 74 2c 6c 65 6d 70 2d 3e 72 75 6c 65 2d  tart,lemp->rule-
5d30: 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  >lhs->name);.   
5d40: 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
5d50: 74 2b 2b 3b 0a 20 20 20 20 20 20 73 70 20 3d 20  t++;.      sp = 
5d60: 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b  lemp->rule->lhs;
5d70: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
5d80: 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72      sp = lemp->r
5d90: 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 0a 20  ule->lhs;.  }.. 
5da0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
5db0: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 64  e start symbol d
5dc0: 6f 65 73 6e 27 74 20 6f 63 63 75 72 20 6f 6e 20  oesn't occur on 
5dd0: 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73  the right-hand s
5de0: 69 64 65 20 6f 66 0a 20 20 2a 2a 20 61 6e 79 20  ide of.  ** any 
5df0: 72 75 6c 65 2e 20 20 52 65 70 6f 72 74 20 61 6e  rule.  Report an
5e00: 20 65 72 72 6f 72 20 69 66 20 69 74 20 64 6f 65   error if it doe
5e10: 73 2e 20 20 28 59 41 43 43 20 77 6f 75 6c 64 20  s.  (YACC would 
5e20: 67 65 6e 65 72 61 74 65 20 61 20 6e 65 77 0a 20  generate a new. 
5e30: 20 2a 2a 20 73 74 61 72 74 20 73 79 6d 62 6f 6c   ** start symbol
5e40: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 29 20   in this case.) 
5e50: 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70  */.  for(rp=lemp
5e60: 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
5e70: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 6e  p->next){.    in
5e80: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
5e90: 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b  ; i<rp->nrhs; i+
5ea0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70  +){.      if( rp
5eb0: 2d 3e 72 68 73 5b 69 5d 3d 3d 73 70 20 29 7b 20  ->rhs[i]==sp ){ 
5ec0: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 44 65    /* FIX ME:  De
5ed0: 61 6c 20 77 69 74 68 20 6d 75 6c 74 69 74 65 72  al with multiter
5ee0: 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20  minals */.      
5ef0: 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
5f00: 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68  >filename,0,."Th
5f10: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 5c  e start symbol \
5f20: 22 25 73 5c 22 20 6f 63 63 75 72 73 20 6f 6e 20  "%s\" occurs on 
5f30: 74 68 65 20 5c 0a 72 69 67 68 74 2d 68 61 6e 64  the \.right-hand
5f40: 20 73 69 64 65 20 6f 66 20 61 20 72 75 6c 65 2e   side of a rule.
5f50: 20 54 68 69 73 20 77 69 6c 6c 20 72 65 73 75 6c   This will resul
5f60: 74 20 69 6e 20 61 20 70 61 72 73 65 72 20 77 68  t in a parser wh
5f70: 69 63 68 20 5c 0a 64 6f 65 73 20 6e 6f 74 20 77  ich \.does not w
5f80: 6f 72 6b 20 70 72 6f 70 65 72 6c 79 2e 22 2c 73  ork properly.",s
5f90: 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p->name);.      
5fa0: 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
5fb0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
5fc0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
5fd0: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
5fe0: 69 6f 6e 20 73 65 74 20 66 6f 72 20 74 68 65 20  ion set for the 
5ff0: 66 69 72 73 74 20 73 74 61 74 65 0a 20 20 2a 2a  first state.  **
6000: 20 69 73 20 61 6c 6c 20 72 75 6c 65 73 20 77 68   is all rules wh
6010: 69 63 68 20 68 61 76 65 20 74 68 65 20 73 74 61  ich have the sta
6020: 72 74 20 73 79 6d 62 6f 6c 20 61 73 20 74 68 65  rt symbol as the
6030: 69 72 0a 20 20 2a 2a 20 6c 65 66 74 2d 68 61 6e  ir.  ** left-han
6040: 64 20 73 69 64 65 20 2a 2f 0a 20 20 66 6f 72 28  d side */.  for(
6050: 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  rp=sp->rule; rp;
6060: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 6c 68 73 29   rp=rp->nextlhs)
6070: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 63 6f 6e  {.    struct con
6080: 66 69 67 20 2a 6e 65 77 63 66 70 3b 0a 20 20 20  fig *newcfp;.   
6090: 20 72 70 2d 3e 6c 68 73 53 74 61 72 74 20 3d 20   rp->lhsStart = 
60a0: 31 3b 0a 20 20 20 20 6e 65 77 63 66 70 20 3d 20  1;.    newcfp = 
60b0: 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61  Configlist_addba
60c0: 73 69 73 28 72 70 2c 30 29 3b 0a 20 20 20 20 53  sis(rp,0);.    S
60d0: 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77  etAdd(newcfp->fw
60e0: 73 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  s,0);.  }..  /* 
60f0: 43 6f 6d 70 75 74 65 20 74 68 65 20 66 69 72 73  Compute the firs
6100: 74 20 73 74 61 74 65 2e 20 20 41 6c 6c 20 6f 74  t state.  All ot
6110: 68 65 72 20 73 74 61 74 65 73 20 77 69 6c 6c 20  her states will 
6120: 62 65 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64  be.  ** computed
6130: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
6140: 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 70 75 74  uring the comput
6150: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72  ation of the fir
6160: 73 74 20 6f 6e 65 2e 0a 20 20 2a 2a 20 54 68 65  st one..  ** The
6170: 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65   returned pointe
6180: 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 73  r to the first s
6190: 74 61 74 65 20 69 73 20 6e 6f 74 20 75 73 65 64  tate is not used
61a0: 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  . */.  (void)get
61b0: 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 20 20 72  state(lemp);.  r
61c0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  eturn;.}../* Ret
61d0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
61e0: 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 69   a state which i
61f0: 73 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74  s described by t
6200: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
6210: 0a 2a 2a 20 6c 69 73 74 20 77 68 69 63 68 20 68  .** list which h
6220: 61 73 20 62 65 65 6e 20 62 75 69 6c 74 20 66 72  as been built fr
6230: 6f 6d 20 63 61 6c 6c 73 20 74 6f 20 43 6f 6e 66  om calls to Conf
6240: 69 67 6c 69 73 74 5f 61 64 64 2e 0a 2a 2f 0a 50  iglist_add..*/.P
6250: 52 49 56 41 54 45 20 76 6f 69 64 20 62 75 69 6c  RIVATE void buil
6260: 64 73 68 69 66 74 73 28 2f 2a 20 73 74 72 75 63  dshifts(/* struc
6270: 74 20 6c 65 6d 6f 6e 20 2a 2c 20 73 74 72 75 63  t lemon *, struc
6280: 74 20 73 74 61 74 65 20 2a 20 2a 2f 29 3b 20 2f  t state * */); /
6290: 2a 20 46 6f 72 77 64 20 72 65 66 20 2a 2f 0a 50  * Forwd ref */.P
62a0: 52 49 56 41 54 45 20 73 74 72 75 63 74 20 73 74  RIVATE struct st
62b0: 61 74 65 20 2a 67 65 74 73 74 61 74 65 28 6c 65  ate *getstate(le
62c0: 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
62d0: 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75   *lemp;.{.  stru
62e0: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20  ct config *cfp, 
62f0: 2a 62 70 3b 0a 20 20 73 74 72 75 63 74 20 73 74  *bp;.  struct st
6300: 61 74 65 20 2a 73 74 70 3b 0a 0a 20 20 2f 2a 20  ate *stp;..  /* 
6310: 45 78 74 72 61 63 74 20 74 68 65 20 73 6f 72 74  Extract the sort
6320: 65 64 20 62 61 73 69 73 20 6f 66 20 74 68 65 20  ed basis of the 
6330: 6e 65 77 20 73 74 61 74 65 2e 20 20 54 68 65 20  new state.  The 
6340: 62 61 73 69 73 20 77 61 73 20 63 6f 6e 73 74 72  basis was constr
6350: 75 63 74 65 64 0a 20 20 2a 2a 20 62 79 20 70 72  ucted.  ** by pr
6360: 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 22 43 6f  ior calls to "Co
6370: 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69  nfiglist_addbasi
6380: 73 28 29 22 2e 20 2a 2f 0a 20 20 43 6f 6e 66 69  s()". */.  Confi
6390: 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28  glist_sortbasis(
63a0: 29 3b 0a 20 20 62 70 20 3d 20 43 6f 6e 66 69 67  );.  bp = Config
63b0: 6c 69 73 74 5f 62 61 73 69 73 28 29 3b 0a 0a 20  list_basis();.. 
63c0: 20 2f 2a 20 47 65 74 20 61 20 73 74 61 74 65 20   /* Get a state 
63d0: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 62 61  with the same ba
63e0: 73 69 73 20 2a 2f 0a 20 20 73 74 70 20 3d 20 53  sis */.  stp = S
63f0: 74 61 74 65 5f 66 69 6e 64 28 62 70 29 3b 0a 20  tate_find(bp);. 
6400: 20 69 66 28 20 73 74 70 20 29 7b 0a 20 20 20 20   if( stp ){.    
6410: 2f 2a 20 41 20 73 74 61 74 65 20 77 69 74 68 20  /* A state with 
6420: 74 68 65 20 73 61 6d 65 20 62 61 73 69 73 20 61  the same basis a
6430: 6c 72 65 61 64 79 20 65 78 69 73 74 73 21 20 20  lready exists!  
6440: 43 6f 70 79 20 61 6c 6c 20 74 68 65 20 66 6f 6c  Copy all the fol
6450: 6c 6f 77 2d 73 65 74 0a 20 20 20 20 2a 2a 20 70  low-set.    ** p
6460: 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73  ropagation links
6470: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65 20   from the state 
6480: 75 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69  under constructi
6490: 6f 6e 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20  on into the.    
64a0: 2a 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20 73  ** preexisting s
64b0: 74 61 74 65 2c 20 74 68 65 6e 20 72 65 74 75 72  tate, then retur
64c0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
64d0: 68 65 20 70 72 65 65 78 69 73 74 69 6e 67 20 73  he preexisting s
64e0: 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 72 75  tate */.    stru
64f0: 63 74 20 63 6f 6e 66 69 67 20 2a 78 2c 20 2a 79  ct config *x, *y
6500: 3b 0a 20 20 20 20 66 6f 72 28 78 3d 62 70 2c 20  ;.    for(x=bp, 
6510: 79 3d 73 74 70 2d 3e 62 70 3b 20 78 20 26 26 20  y=stp->bp; x && 
6520: 79 3b 20 78 3d 78 2d 3e 62 70 2c 20 79 3d 79 2d  y; x=x->bp, y=y-
6530: 3e 62 70 29 7b 0a 20 20 20 20 20 20 50 6c 69 6e  >bp){.      Plin
6540: 6b 5f 63 6f 70 79 28 26 79 2d 3e 62 70 6c 70 2c  k_copy(&y->bplp,
6550: 78 2d 3e 62 70 6c 70 29 3b 0a 20 20 20 20 20 20  x->bplp);.      
6560: 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 78 2d 3e  Plink_delete(x->
6570: 66 70 6c 70 29 3b 0a 20 20 20 20 20 20 78 2d 3e  fplp);.      x->
6580: 66 70 6c 70 20 3d 20 78 2d 3e 62 70 6c 70 20 3d  fplp = x->bplp =
6590: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 66   0;.    }.    cf
65a0: 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72  p = Configlist_r
65b0: 65 74 75 72 6e 28 29 3b 0a 20 20 20 20 43 6f 6e  eturn();.    Con
65c0: 66 69 67 6c 69 73 74 5f 65 61 74 28 63 66 70 29  figlist_eat(cfp)
65d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
65e0: 2a 20 54 68 69 73 20 72 65 61 6c 6c 79 20 69 73  * This really is
65f0: 20 61 20 6e 65 77 20 73 74 61 74 65 2e 20 20 43   a new state.  C
6600: 6f 6e 73 74 72 75 63 74 20 61 6c 6c 20 74 68 65  onstruct all the
6610: 20 64 65 74 61 69 6c 73 20 2a 2f 0a 20 20 20 20   details */.    
6620: 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75  Configlist_closu
6630: 72 65 28 6c 65 6d 70 29 3b 20 20 20 20 2f 2a 20  re(lemp);    /* 
6640: 43 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 66  Compute the conf
6650: 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72  iguration closur
6660: 65 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c  e */.    Configl
6670: 69 73 74 5f 73 6f 72 74 28 29 3b 20 20 20 20 20  ist_sort();     
6680: 20 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 74 68        /* Sort th
6690: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
66a0: 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 63  closure */.    c
66b0: 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f  fp = Configlist_
66c0: 72 65 74 75 72 6e 28 29 3b 20 20 20 2f 2a 20 47  return();   /* G
66d0: 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  et a pointer to 
66e0: 74 68 65 20 63 6f 6e 66 69 67 20 6c 69 73 74 20  the config list 
66f0: 2a 2f 0a 20 20 20 20 73 74 70 20 3d 20 53 74 61  */.    stp = Sta
6700: 74 65 5f 6e 65 77 28 29 3b 20 20 20 20 20 20 20  te_new();       
6710: 20 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 74 61      /* A new sta
6720: 74 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  te structure */.
6730: 20 20 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28      MemoryCheck(
6740: 73 74 70 29 3b 0a 20 20 20 20 73 74 70 2d 3e 62  stp);.    stp->b
6750: 70 20 3d 20 62 70 3b 20 20 20 20 20 20 20 20 20  p = bp;         
6760: 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62         /* Rememb
6770: 65 72 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  er the configura
6780: 74 69 6f 6e 20 62 61 73 69 73 20 2a 2f 0a 20 20  tion basis */.  
6790: 20 20 73 74 70 2d 3e 63 66 70 20 3d 20 63 66 70    stp->cfp = cfp
67a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
67b0: 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63  * Remember the c
67c0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f  onfiguration clo
67d0: 73 75 72 65 20 2a 2f 0a 20 20 20 20 73 74 70 2d  sure */.    stp-
67e0: 3e 73 74 61 74 65 6e 75 6d 20 3d 20 6c 65 6d 70  >statenum = lemp
67f0: 2d 3e 6e 73 74 61 74 65 2b 2b 3b 20 2f 2a 20 45  ->nstate++; /* E
6800: 76 65 72 79 20 73 74 61 74 65 20 67 65 74 73 20  very state gets 
6810: 61 20 73 65 71 75 65 6e 63 65 20 6e 75 6d 62 65  a sequence numbe
6820: 72 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 61 70  r */.    stp->ap
6830: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
6840: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 61 63 74 69        /* No acti
6850: 6f 6e 73 2c 20 79 65 74 2e 20 2a 2f 0a 20 20 20  ons, yet. */.   
6860: 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28 73 74   State_insert(st
6870: 70 2c 73 74 70 2d 3e 62 70 29 3b 20 20 20 2f 2a  p,stp->bp);   /*
6880: 20 41 64 64 20 74 6f 20 74 68 65 20 73 74 61 74   Add to the stat
6890: 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 62  e table */.    b
68a0: 75 69 6c 64 73 68 69 66 74 73 28 6c 65 6d 70 2c  uildshifts(lemp,
68b0: 73 74 70 29 3b 20 20 20 20 20 20 20 2f 2a 20 52  stp);       /* R
68c0: 65 63 75 72 73 69 76 65 6c 79 20 63 6f 6d 70 75  ecursively compu
68d0: 74 65 20 73 75 63 63 65 73 73 6f 72 20 73 74 61  te successor sta
68e0: 74 65 73 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  tes */.  }.  ret
68f0: 75 72 6e 20 73 74 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn stp;.}../*.*
6900: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
6910: 20 74 77 6f 20 73 79 6d 62 6f 6c 73 20 61 72 65   two symbols are
6920: 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 69 6e   the same..*/.in
6930: 74 20 73 61 6d 65 5f 73 79 6d 62 6f 6c 28 61 2c  t same_symbol(a,
6940: 62 29 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  b).struct symbol
6950: 20 2a 61 3b 0a 73 74 72 75 63 74 20 73 79 6d 62   *a;.struct symb
6960: 6f 6c 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20 69  ol *b;.{.  int i
6970: 3b 0a 20 20 69 66 28 20 61 3d 3d 62 20 29 20 72  ;.  if( a==b ) r
6980: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 61  eturn 1;.  if( a
6990: 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52  ->type!=MULTITER
69a0: 4d 49 4e 41 4c 20 29 20 72 65 74 75 72 6e 20 30  MINAL ) return 0
69b0: 3b 0a 20 20 69 66 28 20 62 2d 3e 74 79 70 65 21  ;.  if( b->type!
69c0: 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
69d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
69e0: 20 61 2d 3e 6e 73 75 62 73 79 6d 21 3d 62 2d 3e   a->nsubsym!=b->
69f0: 6e 73 75 62 73 79 6d 20 29 20 72 65 74 75 72 6e  nsubsym ) return
6a00: 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
6a10: 3c 61 2d 3e 6e 73 75 62 73 79 6d 3b 20 69 2b 2b  <a->nsubsym; i++
6a20: 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e 73 75  ){.    if( a->su
6a30: 62 73 79 6d 5b 69 5d 21 3d 62 2d 3e 73 75 62 73  bsym[i]!=b->subs
6a40: 79 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30  ym[i] ) return 0
6a50: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
6a60: 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75 63  ;.}../* Construc
6a70: 74 20 61 6c 6c 20 73 75 63 63 65 73 73 6f 72 20  t all successor 
6a80: 73 74 61 74 65 73 20 74 6f 20 74 68 65 20 67 69  states to the gi
6a90: 76 65 6e 20 73 74 61 74 65 2e 20 20 41 20 22 73  ven state.  A "s
6aa0: 75 63 63 65 73 73 6f 72 22 0a 2a 2a 20 73 74 61  uccessor".** sta
6ab0: 74 65 20 69 73 20 61 6e 79 20 73 74 61 74 65 20  te is any state 
6ac0: 77 68 69 63 68 20 63 61 6e 20 62 65 20 72 65 61  which can be rea
6ad0: 63 68 65 64 20 62 79 20 61 20 73 68 69 66 74 20  ched by a shift 
6ae0: 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41  action..*/.PRIVA
6af0: 54 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68 69  TE void buildshi
6b00: 66 74 73 28 6c 65 6d 70 2c 73 74 70 29 0a 73 74  fts(lemp,stp).st
6b10: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
6b20: 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  ;.struct state *
6b30: 73 74 70 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  stp;     /* The 
6b40: 73 74 61 74 65 20 66 72 6f 6d 20 77 68 69 63 68  state from which
6b50: 20 73 75 63 63 65 73 73 6f 72 73 20 61 72 65 20   successors are 
6b60: 63 6f 6d 70 75 74 65 64 20 2a 2f 0a 7b 0a 20 20  computed */.{.  
6b70: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
6b80: 66 70 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  fp;  /* For loop
6b90: 69 6e 67 20 74 68 72 75 20 74 68 65 20 63 6f 6e  ing thru the con
6ba0: 66 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20 22  fig closure of "
6bb0: 73 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74  stp" */.  struct
6bc0: 20 63 6f 6e 66 69 67 20 2a 62 63 66 70 3b 20 2f   config *bcfp; /
6bd0: 2a 20 46 6f 72 20 74 68 65 20 69 6e 6e 65 72 20  * For the inner 
6be0: 6c 6f 6f 70 20 6f 6e 20 63 6f 6e 66 69 67 20 63  loop on config c
6bf0: 6c 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22 20  losure of "stp" 
6c00: 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  */.  struct conf
6c10: 69 67 20 2a 6e 65 77 3b 20 20 2f 2a 20 2a 2f 0a  ig *new;  /* */.
6c20: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
6c30: 2a 73 70 3b 20 20 20 2f 2a 20 53 79 6d 62 6f 6c  *sp;   /* Symbol
6c40: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64   following the d
6c50: 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61 74  ot in configurat
6c60: 69 6f 6e 20 22 63 66 70 22 20 2a 2f 0a 20 20 73  ion "cfp" */.  s
6c70: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62 73  truct symbol *bs
6c80: 70 3b 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66 6f  p;  /* Symbol fo
6c90: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f 74 20  llowing the dot 
6ca0: 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  in configuration
6cb0: 20 22 62 63 66 70 22 20 2a 2f 0a 20 20 73 74 72   "bcfp" */.  str
6cc0: 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77 73 74  uct state *newst
6cd0: 70 3b 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20  p; /* A pointer 
6ce0: 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72 20 73  to a successor s
6cf0: 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 61  tate */..  /* Ea
6d00: 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ch configuration
6d10: 20 62 65 63 6f 6d 65 73 20 63 6f 6d 70 6c 65 74   becomes complet
6d20: 65 20 61 66 74 65 72 20 69 74 20 63 6f 6e 74 69  e after it conti
6d30: 62 75 74 65 73 20 74 6f 20 61 20 73 75 63 63 65  butes to a succe
6d40: 73 73 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 2e  ssor.  ** state.
6d50: 20 20 49 6e 69 74 69 61 6c 6c 79 2c 20 61 6c 6c    Initially, all
6d60: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
6d70: 61 72 65 20 69 6e 63 6f 6d 70 6c 65 74 65 20 2a  are incomplete *
6d80: 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d  /.  for(cfp=stp-
6d90: 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63  >cfp; cfp; cfp=c
6da0: 66 70 2d 3e 6e 65 78 74 29 20 63 66 70 2d 3e 73  fp->next) cfp->s
6db0: 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45  tatus = INCOMPLE
6dc0: 54 45 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20 74  TE;..  /* Loop t
6dd0: 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6e 66 69  hrough all confi
6de0: 67 75 72 61 74 69 6f 6e 73 20 6f 66 20 74 68 65  gurations of the
6df0: 20 73 74 61 74 65 20 22 73 74 70 22 20 2a 2f 0a   state "stp" */.
6e00: 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63    for(cfp=stp->c
6e10: 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  fp; cfp; cfp=cfp
6e20: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  ->next){.    if(
6e30: 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f   cfp->status==CO
6e40: 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75  MPLETE ) continu
6e50: 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79  e;    /* Already
6e60: 20 75 73 65 64 20 62 79 20 69 6e 6e 65 72 20 6c   used by inner l
6e70: 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20 63  oop */.    if( c
6e80: 66 70 2d 3e 64 6f 74 3e 3d 63 66 70 2d 3e 72 70  fp->dot>=cfp->rp
6e90: 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75  ->nrhs ) continu
6ea0: 65 3b 20 20 2f 2a 20 43 61 6e 27 74 20 73 68 69  e;  /* Can't shi
6eb0: 66 74 20 74 68 69 73 20 63 6f 6e 66 69 67 20 2a  ft this config *
6ec0: 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74  /.    Configlist
6ed0: 5f 72 65 73 65 74 28 29 3b 20 20 20 20 20 20 20  _reset();       
6ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6ef0: 2a 20 52 65 73 65 74 20 74 68 65 20 6e 65 77 20  * Reset the new 
6f00: 63 6f 6e 66 69 67 20 73 65 74 20 2a 2f 0a 20 20  config set */.  
6f10: 20 20 73 70 20 3d 20 63 66 70 2d 3e 72 70 2d 3e    sp = cfp->rp->
6f20: 72 68 73 5b 63 66 70 2d 3e 64 6f 74 5d 3b 20 20  rhs[cfp->dot];  
6f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79             /* Sy
6f40: 6d 62 6f 6c 20 61 66 74 65 72 20 74 68 65 20 64  mbol after the d
6f50: 6f 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 6f  ot */..    /* Fo
6f60: 72 20 65 76 65 72 79 20 63 6f 6e 66 69 67 75 72  r every configur
6f70: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74 61  ation in the sta
6f80: 74 65 20 22 73 74 70 22 20 77 68 69 63 68 20 68  te "stp" which h
6f90: 61 73 20 74 68 65 20 73 79 6d 62 6f 6c 20 22 73  as the symbol "s
6fa0: 70 22 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77  p".    ** follow
6fb0: 69 6e 67 20 69 74 73 20 64 6f 74 2c 20 61 64 64  ing its dot, add
6fc0: 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 66 69 67   the same config
6fd0: 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 62  uration to the b
6fe0: 61 73 69 73 20 73 65 74 20 75 6e 64 65 72 0a 20  asis set under. 
6ff0: 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 69     ** constructi
7000: 6f 6e 20 62 75 74 20 77 69 74 68 20 74 68 65 20  on but with the 
7010: 64 6f 74 20 73 68 69 66 74 65 64 20 6f 6e 65 20  dot shifted one 
7020: 73 79 6d 62 6f 6c 20 74 6f 20 74 68 65 20 72 69  symbol to the ri
7030: 67 68 74 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ght. */.    for(
7040: 62 63 66 70 3d 63 66 70 3b 20 62 63 66 70 3b 20  bcfp=cfp; bcfp; 
7050: 62 63 66 70 3d 62 63 66 70 2d 3e 6e 65 78 74 29  bcfp=bcfp->next)
7060: 7b 0a 20 20 20 20 20 20 69 66 28 20 62 63 66 70  {.      if( bcfp
7070: 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45  ->status==COMPLE
7080: 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20  TE ) continue;  
7090: 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 75 73 65    /* Already use
70a0: 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62  d */.      if( b
70b0: 63 66 70 2d 3e 64 6f 74 3e 3d 62 63 66 70 2d 3e  cfp->dot>=bcfp->
70c0: 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69  rp->nrhs ) conti
70d0: 6e 75 65 3b 20 2f 2a 20 43 61 6e 27 74 20 73 68  nue; /* Can't sh
70e0: 69 66 74 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a  ift this one */.
70f0: 20 20 20 20 20 20 62 73 70 20 3d 20 62 63 66 70        bsp = bcfp
7100: 2d 3e 72 70 2d 3e 72 68 73 5b 62 63 66 70 2d 3e  ->rp->rhs[bcfp->
7110: 64 6f 74 5d 3b 20 20 20 20 20 20 20 20 20 20 20  dot];           
7120: 2f 2a 20 47 65 74 20 73 79 6d 62 6f 6c 20 61 66  /* Get symbol af
7130: 74 65 72 20 64 6f 74 20 2a 2f 0a 20 20 20 20 20  ter dot */.     
7140: 20 69 66 28 20 21 73 61 6d 65 5f 73 79 6d 62 6f   if( !same_symbo
7150: 6c 28 62 73 70 2c 73 70 29 20 29 20 63 6f 6e 74  l(bsp,sp) ) cont
7160: 69 6e 75 65 3b 20 20 20 20 20 20 2f 2a 20 4d 75  inue;      /* Mu
7170: 73 74 20 62 65 20 73 61 6d 65 20 61 73 20 66 6f  st be same as fo
7180: 72 20 22 63 66 70 22 20 2a 2f 0a 20 20 20 20 20  r "cfp" */.     
7190: 20 62 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20   bcfp->status = 
71a0: 43 4f 4d 50 4c 45 54 45 3b 20 20 20 20 20 20 20  COMPLETE;       
71b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
71c0: 72 6b 20 74 68 69 73 20 63 6f 6e 66 69 67 20 61  rk this config a
71d0: 73 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20  s used */.      
71e0: 6e 65 77 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74  new = Configlist
71f0: 5f 61 64 64 62 61 73 69 73 28 62 63 66 70 2d 3e  _addbasis(bcfp->
7200: 72 70 2c 62 63 66 70 2d 3e 64 6f 74 2b 31 29 3b  rp,bcfp->dot+1);
7210: 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 61 64 64  .      Plink_add
7220: 28 26 6e 65 77 2d 3e 62 70 6c 70 2c 62 63 66 70  (&new->bplp,bcfp
7230: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
7240: 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20 74   Get a pointer t
7250: 6f 20 74 68 65 20 73 74 61 74 65 20 64 65 73 63  o the state desc
7260: 72 69 62 65 64 20 62 79 20 74 68 65 20 62 61 73  ribed by the bas
7270: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
7280: 20 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f 6e 73   set.    ** cons
7290: 74 72 75 63 74 65 64 20 69 6e 20 74 68 65 20 70  tructed in the p
72a0: 72 65 63 65 64 69 6e 67 20 6c 6f 6f 70 20 2a 2f  receding loop */
72b0: 0a 20 20 20 20 6e 65 77 73 74 70 20 3d 20 67 65  .    newstp = ge
72c0: 74 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 0a 20  tstate(lemp);.. 
72d0: 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65 20     /* The state 
72e0: 22 6e 65 77 73 74 70 22 20 69 73 20 72 65 61 63  "newstp" is reac
72f0: 68 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61  hed from the sta
7300: 74 65 20 22 73 74 70 22 20 62 79 20 61 20 73 68  te "stp" by a sh
7310: 69 66 74 20 61 63 74 69 6f 6e 0a 20 20 20 20 2a  ift action.    *
7320: 2a 20 6f 6e 20 74 68 65 20 73 79 6d 62 6f 6c 20  * on the symbol 
7330: 22 73 70 22 20 2a 2f 0a 20 20 20 20 69 66 28 20  "sp" */.    if( 
7340: 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54  sp->type==MULTIT
7350: 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
7360: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f   int i;.      fo
7370: 72 28 69 3d 30 3b 20 69 3c 73 70 2d 3e 6e 73 75  r(i=0; i<sp->nsu
7380: 62 73 79 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  bsym; i++){.    
7390: 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26      Action_add(&
73a0: 73 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c 73 70  stp->ap,SHIFT,sp
73b0: 2d 3e 73 75 62 73 79 6d 5b 69 5d 2c 28 63 68 61  ->subsym[i],(cha
73c0: 72 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20 20 20  r*)newstp);.    
73d0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
73e0: 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28       Action_add(
73f0: 26 73 74 70 2d 3e 61 70 2c 53 48 49 46 54 2c 73  &stp->ap,SHIFT,s
7400: 70 2c 28 63 68 61 72 20 2a 29 6e 65 77 73 74 70  p,(char *)newstp
7410: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
7420: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
7430: 74 68 65 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  the propagation 
7440: 6c 69 6e 6b 73 0a 2a 2f 0a 76 6f 69 64 20 46 69  links.*/.void Fi
7450: 6e 64 4c 69 6e 6b 73 28 6c 65 6d 70 29 0a 73 74  ndLinks(lemp).st
7460: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
7470: 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  ;.{.  int i;.  s
7480: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
7490: 70 2c 20 2a 6f 74 68 65 72 3b 0a 20 20 73 74 72  p, *other;.  str
74a0: 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a  uct state *stp;.
74b0: 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
74c0: 70 6c 70 3b 0a 0a 20 20 2f 2a 20 48 6f 75 73 65  plp;..  /* House
74d0: 6b 65 65 70 69 6e 67 20 64 65 74 61 69 6c 3a 0a  keeping detail:.
74e0: 20 20 2a 2a 20 41 64 64 20 74 6f 20 65 76 65 72    ** Add to ever
74f0: 79 20 70 72 6f 70 61 67 61 74 65 20 6c 69 6e 6b  y propagate link
7500: 20 61 20 70 6f 69 6e 74 65 72 20 62 61 63 6b 20   a pointer back 
7510: 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 6f 0a  to the state to.
7520: 20 20 2a 2a 20 77 68 69 63 68 20 74 68 65 20 6c    ** which the l
7530: 69 6e 6b 20 69 73 20 61 74 74 61 63 68 65 64 2e  ink is attached.
7540: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
7550: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
7560: 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c  ++){.    stp = l
7570: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
7580: 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d      for(cfp=stp-
7590: 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63  >cfp; cfp; cfp=c
75a0: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  fp->next){.     
75b0: 20 63 66 70 2d 3e 73 74 70 20 3d 20 73 74 70 3b   cfp->stp = stp;
75c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
75d0: 20 43 6f 6e 76 65 72 74 20 61 6c 6c 20 62 61 63   Convert all bac
75e0: 6b 6c 69 6e 6b 73 20 69 6e 74 6f 20 66 6f 72 77  klinks into forw
75f0: 61 72 64 20 6c 69 6e 6b 73 2e 20 20 4f 6e 6c 79  ard links.  Only
7600: 20 74 68 65 20 66 6f 72 77 61 72 64 0a 20 20 2a   the forward.  *
7610: 2a 20 6c 69 6e 6b 73 20 61 72 65 20 75 73 65 64  * links are used
7620: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73   in the follow-s
7630: 65 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e 2e 20  et computation. 
7640: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
7650: 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
7660: 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  +){.    stp = le
7670: 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
7680: 20 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e     for(cfp=stp->
7690: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
76a0: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  p->next){.      
76b0: 66 6f 72 28 70 6c 70 3d 63 66 70 2d 3e 62 70 6c  for(plp=cfp->bpl
76c0: 70 3b 20 70 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d  p; plp; plp=plp-
76d0: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
76e0: 6f 74 68 65 72 20 3d 20 70 6c 70 2d 3e 63 66 70  other = plp->cfp
76f0: 3b 0a 20 20 20 20 20 20 20 20 50 6c 69 6e 6b 5f  ;.        Plink_
7700: 61 64 64 28 26 6f 74 68 65 72 2d 3e 66 70 6c 70  add(&other->fplp
7710: 2c 63 66 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ,cfp);.      }. 
7720: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43     }.  }.}../* C
7730: 6f 6d 70 75 74 65 20 61 6c 6c 20 66 6f 6c 6c 6f  ompute all follo
7740: 77 73 65 74 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 66  wsets..**.** A f
7750: 6f 6c 6c 6f 77 73 65 74 20 69 73 20 74 68 65 20  ollowset is the 
7760: 73 65 74 20 6f 66 20 61 6c 6c 20 73 79 6d 62 6f  set of all symbo
7770: 6c 73 20 77 68 69 63 68 20 63 61 6e 20 63 6f 6d  ls which can com
7780: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  e immediately.**
7790: 20 61 66 74 65 72 20 61 20 63 6f 6e 66 69 67 75   after a configu
77a0: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ration..*/.void 
77b0: 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28 6c  FindFollowSets(l
77c0: 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
77d0: 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74  n *lemp;.{.  int
77e0: 20 69 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   i;.  struct con
77f0: 66 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72 75  fig *cfp;.  stru
7800: 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 20  ct plink *plp;. 
7810: 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 20   int progress;. 
7820: 20 69 6e 74 20 63 68 61 6e 67 65 3b 0a 0a 20 20   int change;..  
7830: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
7840: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
7850: 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d     for(cfp=lemp-
7860: 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b  >sorted[i]->cfp;
7870: 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e   cfp; cfp=cfp->n
7880: 65 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d  ext){.      cfp-
7890: 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50  >status = INCOMP
78a0: 4c 45 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LETE;.    }.  }.
78b0: 20 20 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f    .  do{.    pro
78c0: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66  gress = 0;.    f
78d0: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
78e0: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
78f0: 20 20 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70      for(cfp=lemp
7900: 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70  ->sorted[i]->cfp
7910: 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e  ; cfp; cfp=cfp->
7920: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  next){.        i
7930: 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d  f( cfp->status==
7940: 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69  COMPLETE ) conti
7950: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  nue;.        for
7960: 28 70 6c 70 3d 63 66 70 2d 3e 66 70 6c 70 3b 20  (plp=cfp->fplp; 
7970: 70 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65  plp; plp=plp->ne
7980: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  xt){.          c
7990: 68 61 6e 67 65 20 3d 20 53 65 74 55 6e 69 6f 6e  hange = SetUnion
79a0: 28 70 6c 70 2d 3e 63 66 70 2d 3e 66 77 73 2c 63  (plp->cfp->fws,c
79b0: 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20 20 20  fp->fws);.      
79c0: 20 20 20 20 69 66 28 20 63 68 61 6e 67 65 20 29      if( change )
79d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 6c  {.            pl
79e0: 70 2d 3e 63 66 70 2d 3e 73 74 61 74 75 73 20 3d  p->cfp->status =
79f0: 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20   INCOMPLETE;.   
7a00: 20 20 20 20 20 20 20 20 20 70 72 6f 67 72 65 73           progres
7a10: 73 20 3d 20 31 3b 0a 09 20 20 7d 0a 09 7d 0a 20  s = 1;..  }..}. 
7a20: 20 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61 74         cfp->stat
7a30: 75 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 0a 20  us = COMPLETE;. 
7a40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7a50: 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20  while( progress 
7a60: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
7a70: 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63   resolve_conflic
7a80: 74 28 29 3b 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65  t();../* Compute
7a90: 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69   the reduce acti
7aa0: 6f 6e 73 2c 20 61 6e 64 20 72 65 73 6f 6c 76 65  ons, and resolve
7ab0: 20 63 6f 6e 66 6c 69 63 74 73 2e 0a 2a 2f 0a 76   conflicts..*/.v
7ac0: 6f 69 64 20 46 69 6e 64 41 63 74 69 6f 6e 73 28  oid FindActions(
7ad0: 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
7ae0: 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e  on *lemp;.{.  in
7af0: 74 20 69 2c 6a 3b 0a 20 20 73 74 72 75 63 74 20  t i,j;.  struct 
7b00: 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 20 20 73  config *cfp;.  s
7b10: 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
7b20: 3b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  ;.  struct symbo
7b30: 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63 74 20  l *sp;.  struct 
7b40: 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 2f 2a 20  rule *rp;..  /* 
7b50: 41 64 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 72  Add all of the r
7b60: 65 64 75 63 65 20 61 63 74 69 6f 6e 73 20 0a 20  educe actions . 
7b70: 20 2a 2a 20 41 20 72 65 64 75 63 65 20 61 63 74   ** A reduce act
7b80: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 66 6f 72  ion is added for
7b90: 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f 66   each element of
7ba0: 20 74 68 65 20 66 6f 6c 6c 6f 77 73 65 74 20 6f   the followset o
7bb0: 66 0a 20 20 2a 2a 20 61 20 63 6f 6e 66 69 67 75  f.  ** a configu
7bc0: 72 61 74 69 6f 6e 20 77 68 69 63 68 20 68 61 73  ration which has
7bd0: 20 69 74 73 20 64 6f 74 20 61 74 20 74 68 65 20   its dot at the 
7be0: 65 78 74 72 65 6d 65 20 72 69 67 68 74 2e 0a 20  extreme right.. 
7bf0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
7c00: 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69  <lemp->nstate; i
7c10: 2b 2b 29 7b 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f  ++){   /* Loop o
7c20: 76 65 72 20 61 6c 6c 20 73 74 61 74 65 73 20 2a  ver all states *
7c30: 2f 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  /.    stp = lemp
7c40: 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
7c50: 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66   for(cfp=stp->cf
7c60: 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  p; cfp; cfp=cfp-
7c70: 3e 6e 65 78 74 29 7b 20 20 2f 2a 20 4c 6f 6f 70  >next){  /* Loop
7c80: 20 6f 76 65 72 20 61 6c 6c 20 63 6f 6e 66 69 67   over all config
7c90: 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20  urations */.    
7ca0: 20 20 69 66 28 20 63 66 70 2d 3e 72 70 2d 3e 6e    if( cfp->rp->n
7cb0: 72 68 73 3d 3d 63 66 70 2d 3e 64 6f 74 20 29 7b  rhs==cfp->dot ){
7cc0: 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20 64 6f          /* Is do
7cd0: 74 20 61 74 20 65 78 74 72 65 6d 65 20 72 69 67  t at extreme rig
7ce0: 68 74 3f 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ht? */.        f
7cf0: 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65 6d 70 2d 3e  or(j=0; j<lemp->
7d00: 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a 2b 2b 29 7b  nterminal; j++){
7d10: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53  .          if( S
7d20: 65 74 46 69 6e 64 28 63 66 70 2d 3e 66 77 73 2c  etFind(cfp->fws,
7d30: 6a 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j) ){.          
7d40: 20 20 2f 2a 20 41 64 64 20 61 20 72 65 64 75 63    /* Add a reduc
7d50: 65 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  e action to the 
7d60: 73 74 61 74 65 20 22 73 74 70 22 20 77 68 69 63  state "stp" whic
7d70: 68 20 77 69 6c 6c 20 72 65 64 75 63 65 20 62 79  h will reduce by
7d80: 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
7d90: 20 2a 2a 20 72 75 6c 65 20 22 63 66 70 2d 3e 72   ** rule "cfp->r
7da0: 70 22 20 69 66 20 74 68 65 20 6c 6f 6f 6b 61 68  p" if the lookah
7db0: 65 61 64 20 73 79 6d 62 6f 6c 20 69 73 20 22 6c  ead symbol is "l
7dc0: 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 22  emp->symbols[j]"
7dd0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
7de0: 41 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d  Action_add(&stp-
7df0: 3e 61 70 2c 52 45 44 55 43 45 2c 6c 65 6d 70 2d  >ap,REDUCE,lemp-
7e00: 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2c 28 63 68 61  >symbols[j],(cha
7e10: 72 20 2a 29 63 66 70 2d 3e 72 70 29 3b 0a 20 20  r *)cfp->rp);.  
7e20: 20 20 20 20 20 20 20 20 7d 0a 09 7d 0a 20 20 20          }..}.   
7e30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
7e40: 20 20 2f 2a 20 41 64 64 20 74 68 65 20 61 63 63    /* Add the acc
7e50: 65 70 74 69 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a  epting token */.
7e60: 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72    if( lemp->star
7e70: 74 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79  t ){.    sp = Sy
7e80: 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e  mbol_find(lemp->
7e90: 73 74 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20  start);.    if( 
7ea0: 73 70 3d 3d 30 20 29 20 73 70 20 3d 20 6c 65 6d  sp==0 ) sp = lem
7eb0: 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20  p->rule->lhs;.  
7ec0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 20 3d 20  }else{.    sp = 
7ed0: 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b  lemp->rule->lhs;
7ee0: 0a 20 20 7d 0a 20 20 2f 2a 20 41 64 64 20 74 6f  .  }.  /* Add to
7ef0: 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65   the first state
7f00: 20 28 77 68 69 63 68 20 69 73 20 61 6c 77 61 79   (which is alway
7f10: 73 20 74 68 65 20 73 74 61 72 74 69 6e 67 20 73  s the starting s
7f20: 74 61 74 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tate of the.  **
7f30: 20 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61   finite state ma
7f40: 63 68 69 6e 65 29 20 61 6e 20 61 63 74 69 6f 6e  chine) an action
7f50: 20 74 6f 20 41 43 43 45 50 54 20 69 66 20 74 68   to ACCEPT if th
7f60: 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 73 20 74  e lookahead is t
7f70: 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20 6e 6f  he.  ** start no
7f80: 6e 74 65 72 6d 69 6e 61 6c 2e 20 20 2a 2f 0a 20  nterminal.  */. 
7f90: 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 6c 65 6d   Action_add(&lem
7fa0: 70 2d 3e 73 6f 72 74 65 64 5b 30 5d 2d 3e 61 70  p->sorted[0]->ap
7fb0: 2c 41 43 43 45 50 54 2c 73 70 2c 30 29 3b 0a 0a  ,ACCEPT,sp,0);..
7fc0: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 63 6f 6e    /* Resolve con
7fd0: 66 6c 69 63 74 73 20 2a 2f 0a 20 20 66 6f 72 28  flicts */.  for(
7fe0: 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
7ff0: 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ate; i++){.    s
8000: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
8010: 2c 20 2a 6e 61 70 3b 0a 20 20 20 20 73 74 72 75  , *nap;.    stru
8020: 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
8030: 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
8040: 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 2f 2a  orted[i];.    /*
8050: 20 61 73 73 65 72 74 28 20 73 74 70 2d 3e 61 70   assert( stp->ap
8060: 20 29 3b 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e   ); */.    stp->
8070: 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74  ap = Action_sort
8080: 28 73 74 70 2d 3e 61 70 29 3b 0a 20 20 20 20 66  (stp->ap);.    f
8090: 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61  or(ap=stp->ap; a
80a0: 70 20 26 26 20 61 70 2d 3e 6e 65 78 74 3b 20 61  p && ap->next; a
80b0: 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
80c0: 20 20 20 66 6f 72 28 6e 61 70 3d 61 70 2d 3e 6e     for(nap=ap->n
80d0: 65 78 74 3b 20 6e 61 70 20 26 26 20 6e 61 70 2d  ext; nap && nap-
80e0: 3e 73 70 3d 3d 61 70 2d 3e 73 70 3b 20 6e 61 70  >sp==ap->sp; nap
80f0: 3d 6e 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =nap->next){.   
8100: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f        /* The two
8110: 20 61 63 74 69 6f 6e 73 20 22 61 70 22 20 61 6e   actions "ap" an
8120: 64 20 22 6e 61 70 22 20 68 61 76 65 20 74 68 65  d "nap" have the
8130: 20 73 61 6d 65 20 6c 6f 6f 6b 61 68 65 61 64 2e   same lookahead.
8140: 0a 20 20 20 20 20 20 20 20 20 2a 2a 20 46 69 67  .         ** Fig
8150: 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e  ure out which on
8160: 65 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  e should be used
8170: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 6c 65 6d   */.         lem
8180: 70 2d 3e 6e 63 6f 6e 66 6c 69 63 74 20 2b 3d 20  p->nconflict += 
8190: 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74  resolve_conflict
81a0: 28 61 70 2c 6e 61 70 2c 6c 65 6d 70 2d 3e 65 72  (ap,nap,lemp->er
81b0: 72 73 79 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rsym);.      }. 
81c0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52     }.  }..  /* R
81d0: 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 66  eport an error f
81e0: 6f 72 20 65 61 63 68 20 72 75 6c 65 20 74 68 61  or each rule tha
81f0: 74 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 72  t can never be r
8200: 65 64 75 63 65 64 2e 20 2a 2f 0a 20 20 66 6f 72  educed. */.  for
8210: 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20  (rp=lemp->rule; 
8220: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29  rp; rp=rp->next)
8230: 20 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d   rp->canReduce =
8240: 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20   LEMON_FALSE;.  
8250: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
8260: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
8270: 20 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e     struct action
8280: 20 2a 61 70 3b 0a 20 20 20 20 66 6f 72 28 61 70   *ap;.    for(ap
8290: 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d  =lemp->sorted[i]
82a0: 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
82b0: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
82c0: 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55  ( ap->type==REDU
82d0: 43 45 20 29 20 61 70 2d 3e 78 2e 72 70 2d 3e 63  CE ) ap->x.rp->c
82e0: 61 6e 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e  anReduce = LEMON
82f0: 5f 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _TRUE;.    }.  }
8300: 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
8310: 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
8320: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  >next){.    if( 
8330: 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 29 20  rp->canReduce ) 
8340: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 45 72  continue;.    Er
8350: 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
8360: 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69  ename,rp->ruleli
8370: 6e 65 2c 22 54 68 69 73 20 72 75 6c 65 20 63 61  ne,"This rule ca
8380: 6e 20 6e 6f 74 20 62 65 20 72 65 64 75 63 65 64  n not be reduced
8390: 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c 65 6d 70 2d  .\n");.    lemp-
83a0: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d  >errorcnt++;.  }
83b0: 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65 20 61  .}../* Resolve a
83c0: 20 63 6f 6e 66 6c 69 63 74 20 62 65 74 77 65 65   conflict betwee
83d0: 6e 20 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20  n the two given 
83e0: 61 63 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65  actions.  If the
83f0: 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74 20 63 61 6e  .** conflict can
8400: 27 74 20 62 65 20 72 65 73 6f 6c 76 65 2c 20 72  't be resolve, r
8410: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
8420: 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e 47 45 52 20  **.** NO LONGER 
8430: 54 52 55 45 3a 0a 2a 2a 20 20 20 54 6f 20 72 65  TRUE:.**   To re
8440: 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69 63 74  solve a conflict
8450: 2c 20 66 69 72 73 74 20 6c 6f 6f 6b 20 74 6f 20  , first look to 
8460: 73 65 65 20 69 66 20 65 69 74 68 65 72 20 61 63  see if either ac
8470: 74 69 6f 6e 0a 2a 2a 20 20 20 69 73 20 6f 6e 20  tion.**   is on 
8480: 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2e 20 20  an error rule.  
8490: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 61  In that case, ta
84a0: 6b 65 20 74 68 65 20 61 63 74 69 6f 6e 20 77 68  ke the action wh
84b0: 69 63 68 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ich.**   is not 
84c0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
84d0: 74 68 65 20 65 72 72 6f 72 20 72 75 6c 65 2e 20  the error rule. 
84e0: 20 49 66 20 6e 65 69 74 68 65 72 20 6f 72 20 62   If neither or b
84f0: 6f 74 68 0a 2a 2a 20 20 20 61 63 74 69 6f 6e 73  oth.**   actions
8500: 20 61 72 65 20 61 73 73 6f 63 69 61 74 65 64 20   are associated 
8510: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 72 75  with an error ru
8520: 6c 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 0a  le, then try to.
8530: 2a 2a 20 20 20 75 73 65 20 70 72 65 63 65 64 65  **   use precede
8540: 6e 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74  nce to resolve t
8550: 68 65 20 63 6f 6e 66 6c 69 63 74 2e 0a 2a 2a 0a  he conflict..**.
8560: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 61 63 74  ** If either act
8570: 69 6f 6e 20 69 73 20 61 20 53 48 49 46 54 2c 20  ion is a SHIFT, 
8580: 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65 20  then it must be 
8590: 61 70 78 2e 20 20 54 68 69 73 0a 2a 2a 20 66 75  apx.  This.** fu
85a0: 6e 63 74 69 6f 6e 20 77 6f 6e 27 74 20 77 6f 72  nction won't wor
85b0: 6b 20 69 66 20 61 70 78 2d 3e 74 79 70 65 3d 3d  k if apx->type==
85c0: 52 45 44 55 43 45 20 61 6e 64 20 61 70 79 2d 3e  REDUCE and apy->
85d0: 74 79 70 65 3d 3d 53 48 49 46 54 2e 0a 2a 2f 0a  type==SHIFT..*/.
85e0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
85f0: 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70 78 2c  ve_conflict(apx,
8600: 61 70 79 2c 65 72 72 73 79 6d 29 0a 73 74 72 75  apy,errsym).stru
8610: 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 78 3b 0a  ct action *apx;.
8620: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
8630: 70 79 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  py;.struct symbo
8640: 6c 20 2a 65 72 72 73 79 6d 3b 20 20 20 2f 2a 20  l *errsym;   /* 
8650: 54 68 65 20 65 72 72 6f 72 20 73 79 6d 62 6f 6c  The error symbol
8660: 20 28 69 66 20 64 65 66 69 6e 65 64 2e 20 20 4e   (if defined.  N
8670: 55 4c 4c 20 6f 74 68 65 72 77 69 73 65 29 20 2a  ULL otherwise) *
8680: 2f 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  /.{.  struct sym
8690: 62 6f 6c 20 2a 73 70 78 2c 20 2a 73 70 79 3b 0a  bol *spx, *spy;.
86a0: 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30    int errcnt = 0
86b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 70 78 2d  ;.  assert( apx-
86c0: 3e 73 70 3d 3d 61 70 79 2d 3e 73 70 20 29 3b 20  >sp==apy->sp ); 
86d0: 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 74 68   /* Otherwise th
86e0: 65 72 65 20 77 6f 75 6c 64 20 62 65 20 6e 6f 20  ere would be no 
86f0: 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 69 66  conflict */.  if
8700: 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 49  ( apx->type==SHI
8710: 46 54 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d  FT && apy->type=
8720: 3d 53 48 49 46 54 20 29 7b 0a 20 20 20 20 61 70  =SHIFT ){.    ap
8730: 79 2d 3e 74 79 70 65 20 3d 20 53 53 43 4f 4e 46  y->type = SSCONF
8740: 4c 49 43 54 3b 0a 20 20 20 20 65 72 72 63 6e 74  LICT;.    errcnt
8750: 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 70  ++;.  }.  if( ap
8760: 78 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 26  x->type==SHIFT &
8770: 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45 44  & apy->type==RED
8780: 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78 20 3d  UCE ){.    spx =
8790: 20 61 70 78 2d 3e 73 70 3b 0a 20 20 20 20 73 70   apx->sp;.    sp
87a0: 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e 70  y = apy->x.rp->p
87b0: 72 65 63 73 79 6d 3b 0a 20 20 20 20 69 66 28 20  recsym;.    if( 
87c0: 73 70 79 3d 3d 30 20 7c 7c 20 73 70 78 2d 3e 70  spy==0 || spx->p
87d0: 72 65 63 3c 30 20 7c 7c 20 73 70 79 2d 3e 70 72  rec<0 || spy->pr
87e0: 65 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ec<0 ){.      /*
87f0: 20 4e 6f 74 20 65 6e 6f 75 67 68 20 70 72 65 63   Not enough prec
8800: 65 64 65 6e 63 65 20 69 6e 66 6f 72 6d 61 74 69  edence informati
8810: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 61 70 79  on. */.      apy
8820: 2d 3e 74 79 70 65 20 3d 20 53 52 43 4f 4e 46 4c  ->type = SRCONFL
8830: 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63 6e  ICT;.      errcn
8840: 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  t++;.    }else i
8850: 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73 70 79  f( spx->prec>spy
8860: 2d 3e 70 72 65 63 20 29 7b 20 20 20 20 2f 2a 20  ->prec ){    /* 
8870: 4c 6f 77 65 72 20 70 72 65 63 65 64 65 6e 63 65  Lower precedence
8880: 20 77 69 6e 73 20 2a 2f 0a 20 20 20 20 20 20 61   wins */.      a
8890: 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52 45  py->type = RD_RE
88a0: 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73  SOLVED;.    }els
88b0: 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3c  e if( spx->prec<
88c0: 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20  spy->prec ){.   
88d0: 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 53     apx->type = S
88e0: 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20  H_RESOLVED;.    
88f0: 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70  }else if( spx->p
8900: 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26  rec==spy->prec &
8910: 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d 3d 52 49  & spx->assoc==RI
8920: 47 48 54 20 29 7b 20 2f 2a 20 55 73 65 20 6f 70  GHT ){ /* Use op
8930: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
8940: 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52  apy->type = RD_R
8950: 45 53 4f 4c 56 45 44 3b 20 20 20 20 20 20 20 20  ESOLVED;        
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8970: 20 20 20 20 20 2f 2a 20 61 73 73 6f 63 69 61 74       /* associat
8980: 69 76 69 74 79 20 2a 2f 0a 20 20 20 20 7d 65 6c  ivity */.    }el
8990: 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63  se if( spx->prec
89a0: 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73  ==spy->prec && s
89b0: 70 78 2d 3e 61 73 73 6f 63 3d 3d 4c 45 46 54 20  px->assoc==LEFT 
89c0: 29 7b 20 20 2f 2a 20 74 6f 20 62 72 65 61 6b 20  ){  /* to break 
89d0: 74 69 65 20 2a 2f 0a 20 20 20 20 20 20 61 70 78  tie */.      apx
89e0: 2d 3e 74 79 70 65 20 3d 20 53 48 5f 52 45 53 4f  ->type = SH_RESO
89f0: 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LVED;.    }else{
8a00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
8a10: 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70  px->prec==spy->p
8a20: 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f  rec && spx->asso
8a30: 63 3d 3d 4e 4f 4e 45 20 29 3b 0a 20 20 20 20 20  c==NONE );.     
8a40: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 53 52 43   apy->type = SRC
8a50: 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65  ONFLICT;.      e
8a60: 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20  rrcnt++;.    }. 
8a70: 20 7d 65 6c 73 65 20 69 66 28 20 61 70 78 2d 3e   }else if( apx->
8a80: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20  type==REDUCE && 
8a90: 61 70 79 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43  apy->type==REDUC
8aa0: 45 20 29 7b 0a 20 20 20 20 73 70 78 20 3d 20 61  E ){.    spx = a
8ab0: 70 78 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79  px->x.rp->precsy
8ac0: 6d 3b 0a 20 20 20 20 73 70 79 20 3d 20 61 70 79  m;.    spy = apy
8ad0: 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b  ->x.rp->precsym;
8ae0: 0a 20 20 20 20 69 66 28 20 73 70 78 3d 3d 30 20  .    if( spx==0 
8af0: 7c 7c 20 73 70 79 3d 3d 30 20 7c 7c 20 73 70 78  || spy==0 || spx
8b00: 2d 3e 70 72 65 63 3c 30 20 7c 7c 0a 20 20 20 20  ->prec<0 ||.    
8b10: 73 70 79 2d 3e 70 72 65 63 3c 30 20 7c 7c 20 73  spy->prec<0 || s
8b20: 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70  px->prec==spy->p
8b30: 72 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70 79  rec ){.      apy
8b40: 2d 3e 74 79 70 65 20 3d 20 52 52 43 4f 4e 46 4c  ->type = RRCONFL
8b50: 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72 63 6e  ICT;.      errcn
8b60: 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  t++;.    }else i
8b70: 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73 70 79  f( spx->prec>spy
8b80: 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20 20  ->prec ){.      
8b90: 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44 5f 52  apy->type = RD_R
8ba0: 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d 65 6c  ESOLVED;.    }el
8bb0: 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63  se if( spx->prec
8bc0: 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20  <spy->prec ){.  
8bd0: 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20      apx->type = 
8be0: 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20  RD_RESOLVED;.   
8bf0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
8c00: 61 73 73 65 72 74 28 20 0a 20 20 20 20 20 20 61  assert( .      a
8c10: 70 78 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53  px->type==SH_RES
8c20: 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61  OLVED ||.      a
8c30: 70 78 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53  px->type==RD_RES
8c40: 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61  OLVED ||.      a
8c50: 70 78 2d 3e 74 79 70 65 3d 3d 53 53 43 4f 4e 46  px->type==SSCONF
8c60: 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70  LICT ||.      ap
8c70: 78 2d 3e 74 79 70 65 3d 3d 53 52 43 4f 4e 46 4c  x->type==SRCONFL
8c80: 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 78  ICT ||.      apx
8c90: 2d 3e 74 79 70 65 3d 3d 52 52 43 4f 4e 46 4c 49  ->type==RRCONFLI
8ca0: 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d  CT ||.      apy-
8cb0: 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f 4c 56  >type==SH_RESOLV
8cc0: 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d  ED ||.      apy-
8cd0: 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56  >type==RD_RESOLV
8ce0: 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d  ED ||.      apy-
8cf0: 3e 74 79 70 65 3d 3d 53 53 43 4f 4e 46 4c 49 43  >type==SSCONFLIC
8d00: 54 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e  T ||.      apy->
8d10: 74 79 70 65 3d 3d 53 52 43 4f 4e 46 4c 49 43 54  type==SRCONFLICT
8d20: 20 7c 7c 0a 20 20 20 20 20 20 61 70 79 2d 3e 74   ||.      apy->t
8d30: 79 70 65 3d 3d 52 52 43 4f 4e 46 4c 49 43 54 0a  ype==RRCONFLICT.
8d40: 20 20 20 20 29 3b 0a 20 20 20 20 2f 2a 20 54 68      );.    /* Th
8d50: 65 20 52 45 44 55 43 45 2f 53 48 49 46 54 20 63  e REDUCE/SHIFT c
8d60: 61 73 65 20 63 61 6e 6e 6f 74 20 68 61 70 70 65  ase cannot happe
8d70: 6e 20 62 65 63 61 75 73 65 20 53 48 49 46 54 73  n because SHIFTs
8d80: 20 63 6f 6d 65 20 62 65 66 6f 72 65 0a 20 20 20   come before.   
8d90: 20 2a 2a 20 52 45 44 55 43 45 73 20 6f 6e 20 74   ** REDUCEs on t
8da0: 68 65 20 6c 69 73 74 2e 20 20 49 66 20 77 65 20  he list.  If we 
8db0: 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e 74  reach this point
8dc0: 20 69 74 20 6d 75 73 74 20 62 65 20 62 65 63 61   it must be beca
8dd0: 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  use.    ** the p
8de0: 61 72 73 65 72 20 63 6f 6e 66 6c 69 63 74 20 68  arser conflict h
8df0: 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ad already been 
8e00: 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 7d  resolved. */.  }
8e10: 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74  .  return errcnt
8e20: 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
8e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
8e40: 74 68 65 20 66 69 6c 65 20 22 63 6f 6e 66 69 67  the file "config
8e50: 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  list.c" ********
8e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8e70: 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65  */./*.** Routine
8e80: 73 20 74 6f 20 70 72 6f 63 65 73 73 69 6e 67 20  s to processing 
8e90: 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  a configuration 
8ea0: 6c 69 73 74 20 61 6e 64 20 62 75 69 6c 64 69 6e  list and buildin
8eb0: 67 20 61 20 73 74 61 74 65 0a 2a 2a 20 69 6e 20  g a state.** in 
8ec0: 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
8ed0: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
8ee0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f  static struct co
8ef0: 6e 66 69 67 20 2a 66 72 65 65 6c 69 73 74 20 3d  nfig *freelist =
8f00: 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74   0;      /* List
8f10: 20 6f 66 20 66 72 65 65 20 63 6f 6e 66 69 67 75   of free configu
8f20: 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  rations */.stati
8f30: 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  c struct config 
8f40: 2a 63 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20  *current = 0;   
8f50: 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20 6c 69      /* Top of li
8f60: 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72 61 74  st of configurat
8f70: 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63 20 73  ions */.static s
8f80: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 2a 63  truct config **c
8f90: 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 20 20  urrentend = 0;  
8fa0: 20 2f 2a 20 4c 61 73 74 20 6f 6e 20 6c 69 73 74   /* Last on list
8fb0: 20 6f 66 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73   of configs */.s
8fc0: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e  tatic struct con
8fd0: 66 69 67 20 2a 62 61 73 69 73 20 3d 20 30 3b 20  fig *basis = 0; 
8fe0: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f          /* Top o
8ff0: 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73 20  f list of basis 
9000: 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61 74 69  configs */.stati
9010: 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  c struct config 
9020: 2a 2a 62 61 73 69 73 65 6e 64 20 3d 20 30 3b 20  **basisend = 0; 
9030: 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 6c 69      /* End of li
9040: 73 74 20 6f 66 20 62 61 73 69 73 20 63 6f 6e 66  st of basis conf
9050: 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52 65 74 75 72  igs */../* Retur
9060: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
9070: 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61 74 69   new configurati
9080: 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 73 74  on */.PRIVATE st
9090: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77  ruct config *new
90a0: 63 6f 6e 66 69 67 28 29 7b 0a 20 20 73 74 72 75  config(){.  stru
90b0: 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 3b 0a  ct config *new;.
90c0: 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d 3d    if( freelist==
90d0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
90e0: 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 33 3b      int amt = 3;
90f0: 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20 3d 20  .    freelist = 
9100: 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  (struct config *
9110: 29 63 61 6c 6c 6f 63 28 20 61 6d 74 2c 20 73 69  )calloc( amt, si
9120: 7a 65 6f 66 28 73 74 72 75 63 74 20 63 6f 6e 66  zeof(struct conf
9130: 69 67 29 20 29 3b 0a 20 20 20 20 69 66 28 20 66  ig) );.    if( f
9140: 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  reelist==0 ){.  
9150: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
9160: 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c  rr,"Unable to al
9170: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
9180: 72 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72  r a new configur
9190: 61 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20 20  ation.");.      
91a0: 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20  exit(1);.    }. 
91b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 6d     for(i=0; i<am
91c0: 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c 69  t-1; i++) freeli
91d0: 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66 72  st[i].next = &fr
91e0: 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20  eelist[i+1];.   
91f0: 20 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31 5d   freelist[amt-1]
9200: 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  .next = 0;.  }. 
9210: 20 6e 65 77 20 3d 20 66 72 65 65 6c 69 73 74 3b   new = freelist;
9220: 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72  .  freelist = fr
9230: 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20  eelist->next;.  
9240: 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f  return new;.}../
9250: 2a 20 54 68 65 20 63 6f 6e 66 69 67 75 72 61 74  * The configurat
9260: 69 6f 6e 20 22 6f 6c 64 22 20 69 73 20 6e 6f 20  ion "old" is no 
9270: 6c 6f 6e 67 65 72 20 75 73 65 64 20 2a 2f 0a 50  longer used */.P
9280: 52 49 56 41 54 45 20 76 6f 69 64 20 64 65 6c 65  RIVATE void dele
9290: 74 65 63 6f 6e 66 69 67 28 6f 6c 64 29 0a 73 74  teconfig(old).st
92a0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64  ruct config *old
92b0: 3b 0a 7b 0a 20 20 6f 6c 64 2d 3e 6e 65 78 74 20  ;.{.  old->next 
92c0: 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72  = freelist;.  fr
92d0: 65 65 6c 69 73 74 20 3d 20 6f 6c 64 3b 0a 7d 0a  eelist = old;.}.
92e0: 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64 20  ./* Initialized 
92f0: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
9300: 6e 20 6c 69 73 74 20 62 75 69 6c 64 65 72 20 2a  n list builder *
9310: 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  /.void Configlis
9320: 74 5f 69 6e 69 74 28 29 7b 0a 20 20 63 75 72 72  t_init(){.  curr
9330: 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72 65  ent = 0;.  curre
9340: 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65 6e 74  ntend = &current
9350: 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a 20  ;.  basis = 0;. 
9360: 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62 61 73   basisend = &bas
9370: 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62 6c  is;.  Configtabl
9380: 65 5f 69 6e 69 74 28 29 3b 0a 20 20 72 65 74 75  e_init();.  retu
9390: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61  rn;.}../* Initia
93a0: 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69 67  lized the config
93b0: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75 69  uration list bui
93c0: 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e  lder */.void Con
93d0: 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28 29 7b  figlist_reset(){
93e0: 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a  .  current = 0;.
93f0: 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26    currentend = &
9400: 63 75 72 72 65 6e 74 3b 0a 20 20 62 61 73 69 73  current;.  basis
9410: 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e 64   = 0;.  basisend
9420: 20 3d 20 26 62 61 73 69 73 3b 0a 20 20 43 6f 6e   = &basis;.  Con
9430: 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 30  figtable_clear(0
9440: 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  );.  return;.}..
9450: 2f 2a 20 41 64 64 20 61 6e 6f 74 68 65 72 20 63  /* Add another c
9460: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20  onfiguration to 
9470: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
9480: 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63 74  n list */.struct
9490: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c   config *Configl
94a0: 69 73 74 5f 61 64 64 28 72 70 2c 64 6f 74 29 0a  ist_add(rp,dot).
94b0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
94c0: 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65 20      /* The rule 
94d0: 2a 2f 0a 69 6e 74 20 64 6f 74 3b 20 20 20 20 20  */.int dot;     
94e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
94f0: 69 6e 74 6f 20 74 68 65 20 52 48 53 20 6f 66 20  into the RHS of 
9500: 74 68 65 20 72 75 6c 65 20 77 68 65 72 65 20 74  the rule where t
9510: 68 65 20 64 6f 74 20 67 6f 65 73 20 2a 2f 0a 7b  he dot goes */.{
9520: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
9530: 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a 20   *cfp, model;.. 
9540: 20 61 73 73 65 72 74 28 20 63 75 72 72 65 6e 74   assert( current
9550: 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65  end!=0 );.  mode
9560: 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64  l.rp = rp;.  mod
9570: 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20  el.dot = dot;.  
9580: 63 66 70 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c  cfp = Configtabl
9590: 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a  e_find(&model);.
95a0: 20 20 69 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a    if( cfp==0 ){.
95b0: 20 20 20 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e      cfp = newcon
95c0: 66 69 67 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e  fig();.    cfp->
95d0: 72 70 20 3d 20 72 70 3b 0a 20 20 20 20 63 66 70  rp = rp;.    cfp
95e0: 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20  ->dot = dot;.   
95f0: 20 63 66 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e   cfp->fws = SetN
9600: 65 77 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73  ew();.    cfp->s
9610: 74 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d  tp = 0;.    cfp-
9620: 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c  >fplp = cfp->bpl
9630: 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e  p = 0;.    cfp->
9640: 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 63 66  next = 0;.    cf
9650: 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a  p->bp = 0;.    *
9660: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 63 66 70  currentend = cfp
9670: 3b 0a 20 20 20 20 63 75 72 72 65 6e 74 65 6e 64  ;.    currentend
9680: 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20   = &cfp->next;. 
9690: 20 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69     Configtable_i
96a0: 6e 73 65 72 74 28 63 66 70 29 3b 0a 20 20 7d 0a  nsert(cfp);.  }.
96b0: 20 20 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d 0a    return cfp;.}.
96c0: 0a 2f 2a 20 41 64 64 20 61 20 62 61 73 69 73 20  ./* Add a basis 
96d0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f  configuration to
96e0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
96f0: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63  on list */.struc
9700: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
9710: 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 72 70  list_addbasis(rp
9720: 2c 64 6f 74 29 0a 73 74 72 75 63 74 20 72 75 6c  ,dot).struct rul
9730: 65 20 2a 72 70 3b 0a 69 6e 74 20 64 6f 74 3b 0a  e *rp;.int dot;.
9740: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
9750: 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a  g *cfp, model;..
9760: 20 20 61 73 73 65 72 74 28 20 62 61 73 69 73 65    assert( basise
9770: 6e 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  nd!=0 );.  asser
9780: 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30  t( currentend!=0
9790: 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20 3d   );.  model.rp =
97a0: 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74   rp;.  model.dot
97b0: 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d 20   = dot;.  cfp = 
97c0: 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64  Configtable_find
97d0: 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28 20  (&model);.  if( 
97e0: 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 66  cfp==0 ){.    cf
97f0: 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29 3b  p = newconfig();
9800: 0a 20 20 20 20 63 66 70 2d 3e 72 70 20 3d 20 72  .    cfp->rp = r
9810: 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74 20  p;.    cfp->dot 
9820: 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d 3e  = dot;.    cfp->
9830: 66 77 73 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a  fws = SetNew();.
9840: 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 30      cfp->stp = 0
9850: 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c 70 20  ;.    cfp->fplp 
9860: 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30 3b  = cfp->bplp = 0;
9870: 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78 74 20 3d  .    cfp->next =
9880: 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70 20   0;.    cfp->bp 
9890: 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72 72 65 6e  = 0;.    *curren
98a0: 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20  tend = cfp;.    
98b0: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 66  currentend = &cf
98c0: 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 2a 62 61  p->next;.    *ba
98d0: 73 69 73 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20  sisend = cfp;.  
98e0: 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26 63 66    basisend = &cf
98f0: 70 2d 3e 62 70 3b 0a 20 20 20 20 43 6f 6e 66 69  p->bp;.    Confi
9900: 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 63 66  gtable_insert(cf
9910: 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
9920: 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70   cfp;.}../* Comp
9930: 75 74 65 20 74 68 65 20 63 6c 6f 73 75 72 65 20  ute the closure 
9940: 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  of the configura
9950: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69  tion list */.voi
9960: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f  d Configlist_clo
9970: 73 75 72 65 28 6c 65 6d 70 29 0a 73 74 72 75 63  sure(lemp).struc
9980: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
9990: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
99a0: 20 2a 63 66 70 2c 20 2a 6e 65 77 63 66 70 3b 0a   *cfp, *newcfp;.
99b0: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
99c0: 70 2c 20 2a 6e 65 77 72 70 3b 0a 20 20 73 74 72  p, *newrp;.  str
99d0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 20  uct symbol *sp, 
99e0: 2a 78 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20 64  *xsp;.  int i, d
99f0: 6f 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  ot;..  assert( c
9a00: 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a  urrentend!=0 );.
9a10: 20 20 66 6f 72 28 63 66 70 3d 63 75 72 72 65 6e    for(cfp=curren
9a20: 74 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d  t; cfp; cfp=cfp-
9a30: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 72 70 20 3d  >next){.    rp =
9a40: 20 63 66 70 2d 3e 72 70 3b 0a 20 20 20 20 64 6f   cfp->rp;.    do
9a50: 74 20 3d 20 63 66 70 2d 3e 64 6f 74 3b 0a 20 20  t = cfp->dot;.  
9a60: 20 20 69 66 28 20 64 6f 74 3e 3d 72 70 2d 3e 6e    if( dot>=rp->n
9a70: 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  rhs ) continue;.
9a80: 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68 73      sp = rp->rhs
9a90: 5b 64 6f 74 5d 3b 0a 20 20 20 20 69 66 28 20 73  [dot];.    if( s
9aa0: 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d  p->type==NONTERM
9ab0: 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 66  INAL ){.      if
9ac0: 28 20 73 70 2d 3e 72 75 6c 65 3d 3d 30 20 26 26  ( sp->rule==0 &&
9ad0: 20 73 70 21 3d 6c 65 6d 70 2d 3e 65 72 72 73 79   sp!=lemp->errsy
9ae0: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  m ){.        Err
9af0: 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
9b00: 6e 61 6d 65 2c 72 70 2d 3e 6c 69 6e 65 2c 22 4e  name,rp->line,"N
9b10: 6f 6e 74 65 72 6d 69 6e 61 6c 20 5c 22 25 73 5c  onterminal \"%s\
9b20: 22 20 68 61 73 20 6e 6f 20 72 75 6c 65 73 2e 22  " has no rules."
9b30: 2c 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e  ,.          sp->
9b40: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6c  name);.        l
9b50: 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
9b60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
9b70: 6f 72 28 6e 65 77 72 70 3d 73 70 2d 3e 72 75 6c  or(newrp=sp->rul
9b80: 65 3b 20 6e 65 77 72 70 3b 20 6e 65 77 72 70 3d  e; newrp; newrp=
9b90: 6e 65 77 72 70 2d 3e 6e 65 78 74 6c 68 73 29 7b  newrp->nextlhs){
9ba0: 0a 20 20 20 20 20 20 20 20 6e 65 77 63 66 70 20  .        newcfp 
9bb0: 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64  = Configlist_add
9bc0: 28 6e 65 77 72 70 2c 30 29 3b 0a 20 20 20 20 20  (newrp,0);.     
9bd0: 20 20 20 66 6f 72 28 69 3d 64 6f 74 2b 31 3b 20     for(i=dot+1; 
9be0: 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
9bf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 78 73 70 20  {.          xsp 
9c00: 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20  = rp->rhs[i];.  
9c10: 20 20 20 20 20 20 20 20 69 66 28 20 78 73 70 2d          if( xsp-
9c20: 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20  >type==TERMINAL 
9c30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  ){.            S
9c40: 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77  etAdd(newcfp->fw
9c50: 73 2c 78 73 70 2d 3e 69 6e 64 65 78 29 3b 0a 20  s,xsp->index);. 
9c60: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9c70: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
9c80: 65 20 69 66 28 20 78 73 70 2d 3e 74 79 70 65 3d  e if( xsp->type=
9c90: 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29  =MULTITERMINAL )
9ca0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
9cb0: 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t k;.           
9cc0: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 78 73 70 2d   for(k=0; k<xsp-
9cd0: 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b 0a  >nsubsym; k++){.
9ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 65                Se
9cf0: 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77 73  tAdd(newcfp->fws
9d00: 2c 20 78 73 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d  , xsp->subsym[k]
9d10: 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
9d20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9d30: 20 20 20 20 62 72 65 61 6b 3b 0a 09 20 20 7d 65      break;..  }e
9d40: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
9d50: 20 53 65 74 55 6e 69 6f 6e 28 6e 65 77 63 66 70   SetUnion(newcfp
9d60: 2d 3e 66 77 73 2c 78 73 70 2d 3e 66 69 72 73 74  ->fws,xsp->first
9d70: 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  set);.          
9d80: 20 20 69 66 28 20 78 73 70 2d 3e 6c 61 6d 62 64    if( xsp->lambd
9d90: 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29  a==LEMON_FALSE )
9da0: 20 62 72 65 61 6b 3b 0a 09 20 20 7d 0a 09 7d 0a   break;..  }..}.
9db0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d 72          if( i==r
9dc0: 70 2d 3e 6e 72 68 73 20 29 20 50 6c 69 6e 6b 5f  p->nrhs ) Plink_
9dd0: 61 64 64 28 26 63 66 70 2d 3e 66 70 6c 70 2c 6e  add(&cfp->fplp,n
9de0: 65 77 63 66 70 29 3b 0a 20 20 20 20 20 20 7d 0a  ewcfp);.      }.
9df0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
9e00: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 74  rn;.}../* Sort t
9e10: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
9e20: 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f   list */.void Co
9e30: 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 29 7b  nfiglist_sort(){
9e40: 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 28 73 74  .  current = (st
9e50: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 6d 73  ruct config *)ms
9e60: 6f 72 74 28 28 63 68 61 72 20 2a 29 63 75 72 72  ort((char *)curr
9e70: 65 6e 74 2c 28 63 68 61 72 20 2a 2a 29 26 28 63  ent,(char **)&(c
9e80: 75 72 72 65 6e 74 2d 3e 6e 65 78 74 29 2c 43 6f  urrent->next),Co
9e90: 6e 66 69 67 63 6d 70 29 3b 0a 20 20 63 75 72 72  nfigcmp);.  curr
9ea0: 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65  entend = 0;.  re
9eb0: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74  turn;.}../* Sort
9ec0: 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69   the basis confi
9ed0: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  guration list */
9ee0: 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74  .void Configlist
9ef0: 5f 73 6f 72 74 62 61 73 69 73 28 29 7b 0a 20 20  _sortbasis(){.  
9f00: 62 61 73 69 73 20 3d 20 28 73 74 72 75 63 74 20  basis = (struct 
9f10: 63 6f 6e 66 69 67 20 2a 29 6d 73 6f 72 74 28 28  config *)msort((
9f20: 63 68 61 72 20 2a 29 63 75 72 72 65 6e 74 2c 28  char *)current,(
9f30: 63 68 61 72 20 2a 2a 29 26 28 63 75 72 72 65 6e  char **)&(curren
9f40: 74 2d 3e 62 70 29 2c 43 6f 6e 66 69 67 63 6d 70  t->bp),Configcmp
9f50: 29 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20  );.  basisend = 
9f60: 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  0;.  return;.}..
9f70: 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
9f80: 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
9f90: 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  of the configura
9fa0: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a 2a 2a  tion list and.**
9fb0: 20 72 65 73 65 74 20 74 68 65 20 6c 69 73 74 20   reset the list 
9fc0: 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  */.struct config
9fd0: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74   *Configlist_ret
9fe0: 75 72 6e 28 29 7b 0a 20 20 73 74 72 75 63 74 20  urn(){.  struct 
9ff0: 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20 6f  config *old;.  o
a000: 6c 64 20 3d 20 63 75 72 72 65 6e 74 3b 0a 20 20  ld = current;.  
a010: 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63  current = 0;.  c
a020: 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20  urrentend = 0;. 
a030: 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a   return old;.}..
a040: 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
a050: 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20  ter to the head 
a060: 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  of the configura
a070: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a 2a 2a  tion list and.**
a080: 20 72 65 73 65 74 20 74 68 65 20 6c 69 73 74 20   reset the list 
a090: 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  */.struct config
a0a0: 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73   *Configlist_bas
a0b0: 69 73 28 29 7b 0a 20 20 73 74 72 75 63 74 20 63  is(){.  struct c
a0c0: 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20 6f 6c  onfig *old;.  ol
a0d0: 64 20 3d 20 62 61 73 69 73 3b 0a 20 20 62 61 73  d = basis;.  bas
a0e0: 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65  is = 0;.  basise
a0f0: 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  nd = 0;.  return
a100: 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 46 72 65 65   old;.}../* Free
a110: 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f 66   all elements of
a120: 20 74 68 65 20 67 69 76 65 6e 20 63 6f 6e 66 69   the given confi
a130: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f  guration list */
a140: 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74  .void Configlist
a150: 5f 65 61 74 28 63 66 70 29 0a 73 74 72 75 63 74  _eat(cfp).struct
a160: 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 7b 0a   config *cfp;.{.
a170: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
a180: 2a 6e 65 78 74 63 66 70 3b 0a 20 20 66 6f 72 28  *nextcfp;.  for(
a190: 3b 20 63 66 70 3b 20 63 66 70 3d 6e 65 78 74 63  ; cfp; cfp=nextc
a1a0: 66 70 29 7b 0a 20 20 20 20 6e 65 78 74 63 66 70  fp){.    nextcfp
a1b0: 20 3d 20 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20   = cfp->next;.  
a1c0: 20 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e 66    assert( cfp->f
a1d0: 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  plp==0 );.    as
a1e0: 73 65 72 74 28 20 63 66 70 2d 3e 62 70 6c 70 3d  sert( cfp->bplp=
a1f0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 63 66  =0 );.    if( cf
a200: 70 2d 3e 66 77 73 20 29 20 53 65 74 46 72 65 65  p->fws ) SetFree
a210: 28 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20 20 20  (cfp->fws);.    
a220: 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 63 66 70  deleteconfig(cfp
a230: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b  );.  }.  return;
a240: 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}./************
a250: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
a260: 69 6c 65 20 22 65 72 72 6f 72 2e 63 22 20 2a 2a  ile "error.c" **
a270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a280: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
a290: 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20  ./*.** Code for 
a2a0: 70 72 69 6e 74 69 6e 67 20 65 72 72 6f 72 20 6d  printing error m
a2b0: 65 73 73 61 67 65 2e 0a 2a 2f 0a 0a 2f 2a 20 46  essage..*/../* F
a2c0: 69 6e 64 20 61 20 67 6f 6f 64 20 70 6c 61 63 65  ind a good place
a2d0: 20 74 6f 20 62 72 65 61 6b 20 22 6d 73 67 22 20   to break "msg" 
a2e0: 73 6f 20 74 68 61 74 20 69 74 73 20 6c 65 6e 67  so that its leng
a2f0: 74 68 20 69 73 20 61 74 20 6c 65 61 73 74 20 22  th is at least "
a300: 6d 69 6e 22 0a 2a 2a 20 62 75 74 20 6e 6f 20 6d  min".** but no m
a310: 6f 72 65 20 74 68 61 6e 20 22 6d 61 78 22 2e 20  ore than "max". 
a320: 20 4d 61 6b 65 20 74 68 65 20 70 6f 69 6e 74 20   Make the point 
a330: 61 73 20 63 6c 6f 73 65 20 74 6f 20 6d 61 78 20  as close to max 
a340: 61 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a 2f 0a  as possible..*/.
a350: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 62  static int findb
a360: 72 65 61 6b 28 6d 73 67 2c 6d 69 6e 2c 6d 61 78  reak(msg,min,max
a370: 29 0a 63 68 61 72 20 2a 6d 73 67 3b 0a 69 6e 74  ).char *msg;.int
a380: 20 6d 69 6e 3b 0a 69 6e 74 20 6d 61 78 3b 0a 7b   min;.int max;.{
a390: 0a 20 20 69 6e 74 20 69 2c 73 70 6f 74 3b 0a 20  .  int i,spot;. 
a3a0: 20 63 68 61 72 20 63 3b 0a 20 20 66 6f 72 28 69   char c;.  for(i
a3b0: 3d 73 70 6f 74 3d 6d 69 6e 3b 20 69 3c 3d 6d 61  =spot=min; i<=ma
a3c0: 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 20 3d  x; i++){.    c =
a3d0: 20 6d 73 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28   msg[i];.    if(
a3e0: 20 63 3d 3d 27 5c 74 27 20 29 20 6d 73 67 5b 69   c=='\t' ) msg[i
a3f0: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 69 66 28  ] = ' ';.    if(
a400: 20 63 3d 3d 27 5c 6e 27 20 29 7b 20 6d 73 67 5b   c=='\n' ){ msg[
a410: 69 5d 20 3d 20 27 20 27 3b 20 73 70 6f 74 20 3d  i] = ' '; spot =
a420: 20 69 3b 20 62 72 65 61 6b 3b 20 7d 0a 20 20 20   i; break; }.   
a430: 20 69 66 28 20 63 3d 3d 30 20 29 7b 20 73 70 6f   if( c==0 ){ spo
a440: 74 20 3d 20 69 3b 20 62 72 65 61 6b 3b 20 7d 0a  t = i; break; }.
a450: 20 20 20 20 69 66 28 20 63 3d 3d 27 2d 27 20 26      if( c=='-' &
a460: 26 20 69 3c 6d 61 78 2d 31 20 29 20 73 70 6f 74  & i<max-1 ) spot
a470: 20 3d 20 69 2b 31 3b 0a 20 20 20 20 69 66 28 20   = i+1;.    if( 
a480: 63 3d 3d 27 20 27 20 29 20 73 70 6f 74 20 3d 20  c==' ' ) spot = 
a490: 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  i;.  }.  return 
a4a0: 73 70 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  spot;.}../*.** T
a4b0: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
a4c0: 20 69 73 20 73 70 6c 69 74 20 61 63 72 6f 73 73   is split across
a4d0: 20 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 65 73 20   multiple lines 
a4e0: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  if necessary.  T
a4f0: 68 65 0a 2a 2a 20 73 70 6c 69 74 73 20 6f 63 63  he.** splits occ
a500: 75 72 20 61 74 20 61 20 73 70 61 63 65 2c 20 69  ur at a space, i
a510: 66 20 74 68 65 72 65 20 69 73 20 61 20 73 70 61  f there is a spa
a520: 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6e 65 61  ce available nea
a530: 72 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20  r the end.** of 
a540: 74 68 65 20 6c 69 6e 65 2e 0a 2a 2f 0a 23 64 65  the line..*/.#de
a550: 66 69 6e 65 20 45 52 52 4d 53 47 53 49 5a 45 20  fine ERRMSGSIZE 
a560: 20 31 30 30 30 30 20 2f 2a 20 48 6f 70 65 20 74   10000 /* Hope t
a570: 68 69 73 20 69 73 20 62 69 67 20 65 6e 6f 75 67  his is big enoug
a580: 68 2e 20 20 4e 6f 20 77 61 79 20 74 6f 20 65 72  h.  No way to er
a590: 72 6f 72 20 63 68 65 63 6b 20 2a 2f 0a 23 64 65  ror check */.#de
a5a0: 66 69 6e 65 20 4c 49 4e 45 57 49 44 54 48 20 20  fine LINEWIDTH  
a5b0: 20 20 20 20 37 39 20 2f 2a 20 4d 61 78 20 77 69      79 /* Max wi
a5c0: 64 74 68 20 6f 66 20 61 6e 79 20 6f 75 74 70 75  dth of any outpu
a5d0: 74 20 6c 69 6e 65 20 2a 2f 0a 23 64 65 66 69 6e  t line */.#defin
a5e0: 65 20 50 52 45 46 49 58 4c 49 4d 49 54 20 20 20  e PREFIXLIMIT   
a5f0: 20 33 30 20 2f 2a 20 4d 61 78 20 77 69 64 74 68   30 /* Max width
a600: 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 6f   of the prefix o
a610: 6e 20 65 61 63 68 20 6c 69 6e 65 20 2a 2f 0a 76  n each line */.v
a620: 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63 6f 6e  oid ErrorMsg(con
a630: 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  st char *filenam
a640: 65 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c 20 63  e, int lineno, c
a650: 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f 72 6d 61  onst char *forma
a660: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20  t, ...){.  char 
a670: 65 72 72 6d 73 67 5b 45 52 52 4d 53 47 53 49 5a  errmsg[ERRMSGSIZ
a680: 45 5d 3b 0a 20 20 63 68 61 72 20 70 72 65 66 69  E];.  char prefi
a690: 78 5b 50 52 45 46 49 58 4c 49 4d 49 54 2b 31 30  x[PREFIXLIMIT+10
a6a0: 5d 3b 0a 20 20 69 6e 74 20 65 72 72 6d 73 67 73  ];.  int errmsgs
a6b0: 69 7a 65 3b 0a 20 20 69 6e 74 20 70 72 65 66 69  ize;.  int prefi
a6c0: 78 73 69 7a 65 3b 0a 20 20 69 6e 74 20 61 76 61  xsize;.  int ava
a6d0: 69 6c 61 62 6c 65 77 69 64 74 68 3b 0a 20 20 76  ilablewidth;.  v
a6e0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74  a_list ap;.  int
a6f0: 20 65 6e 64 2c 20 72 65 73 74 61 72 74 2c 20 62   end, restart, b
a700: 61 73 65 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  ase;..  va_start
a710: 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a 20 20  (ap, format);.  
a720: 2f 2a 20 50 72 65 70 61 72 65 20 61 20 70 72 65  /* Prepare a pre
a730: 66 69 78 20 74 6f 20 62 65 20 70 72 65 70 65 6e  fix to be prepen
a740: 64 65 64 20 74 6f 20 65 76 65 72 79 20 6f 75 74  ded to every out
a750: 70 75 74 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 66  put line */.  if
a760: 28 20 6c 69 6e 65 6e 6f 3e 30 20 29 7b 0a 20 20  ( lineno>0 ){.  
a770: 20 20 73 70 72 69 6e 74 66 28 70 72 65 66 69 78    sprintf(prefix
a780: 2c 22 25 2e 2a 73 3a 25 64 3a 20 22 2c 50 52 45  ,"%.*s:%d: ",PRE
a790: 46 49 58 4c 49 4d 49 54 2d 31 30 2c 66 69 6c 65  FIXLIMIT-10,file
a7a0: 6e 61 6d 65 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20  name,lineno);.  
a7b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69 6e  }else{.    sprin
a7c0: 74 66 28 70 72 65 66 69 78 2c 22 25 2e 2a 73 3a  tf(prefix,"%.*s:
a7d0: 20 22 2c 50 52 45 46 49 58 4c 49 4d 49 54 2d 31   ",PREFIXLIMIT-1
a7e0: 30 2c 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  0,filename);.  }
a7f0: 0a 20 20 70 72 65 66 69 78 73 69 7a 65 20 3d 20  .  prefixsize = 
a800: 73 74 72 6c 65 6e 28 70 72 65 66 69 78 29 3b 0a  strlen(prefix);.
a810: 20 20 61 76 61 69 6c 61 62 6c 65 77 69 64 74 68    availablewidth
a820: 20 3d 20 4c 49 4e 45 57 49 44 54 48 20 2d 20 70   = LINEWIDTH - p
a830: 72 65 66 69 78 73 69 7a 65 3b 0a 0a 20 20 2f 2a  refixsize;..  /*
a840: 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 65 72   Generate the er
a850: 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20  ror message */. 
a860: 20 76 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67   vsprintf(errmsg
a870: 2c 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20 20 76  ,format,ap);.  v
a880: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 65 72 72  a_end(ap);.  err
a890: 6d 73 67 73 69 7a 65 20 3d 20 73 74 72 6c 65 6e  msgsize = strlen
a8a0: 28 65 72 72 6d 73 67 29 3b 0a 20 20 2f 2a 20 52  (errmsg);.  /* R
a8b0: 65 6d 6f 76 65 20 74 72 61 69 6c 69 6e 67 20 27  emove trailing '
a8c0: 5c 6e 27 73 20 66 72 6f 6d 20 74 68 65 20 65 72  \n's from the er
a8d0: 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 2a 2f 0a  ror message. */.
a8e0: 20 20 77 68 69 6c 65 28 20 65 72 72 6d 73 67 73    while( errmsgs
a8f0: 69 7a 65 3e 30 20 26 26 20 65 72 72 6d 73 67 5b  ize>0 && errmsg[
a900: 65 72 72 6d 73 67 73 69 7a 65 2d 31 5d 3d 3d 27  errmsgsize-1]=='
a910: 5c 6e 27 20 29 7b 0a 20 20 20 20 20 65 72 72 6d  \n' ){.     errm
a920: 73 67 5b 2d 2d 65 72 72 6d 73 67 73 69 7a 65 5d  sg[--errmsgsize]
a930: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 0;.  }..  /* 
a940: 50 72 69 6e 74 20 74 68 65 20 65 72 72 6f 72 20  Print the error 
a950: 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 62 61 73  message */.  bas
a960: 65 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  e = 0;.  while( 
a970: 65 72 72 6d 73 67 5b 62 61 73 65 5d 21 3d 30 20  errmsg[base]!=0 
a980: 29 7b 0a 20 20 20 20 65 6e 64 20 3d 20 72 65 73  ){.    end = res
a990: 74 61 72 74 20 3d 20 66 69 6e 64 62 72 65 61 6b  tart = findbreak
a9a0: 28 26 65 72 72 6d 73 67 5b 62 61 73 65 5d 2c 30  (&errmsg[base],0
a9b0: 2c 61 76 61 69 6c 61 62 6c 65 77 69 64 74 68 29  ,availablewidth)
a9c0: 3b 0a 20 20 20 20 72 65 73 74 61 72 74 20 2b 3d  ;.    restart +=
a9d0: 20 62 61 73 65 3b 0a 20 20 20 20 77 68 69 6c 65   base;.    while
a9e0: 28 20 65 72 72 6d 73 67 5b 72 65 73 74 61 72 74  ( errmsg[restart
a9f0: 5d 3d 3d 27 20 27 20 29 20 72 65 73 74 61 72 74  ]==' ' ) restart
aa00: 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ++;.    fprintf(
aa10: 73 74 64 6f 75 74 2c 22 25 73 25 2e 2a 73 5c 6e  stdout,"%s%.*s\n
aa20: 22 2c 70 72 65 66 69 78 2c 65 6e 64 2c 26 65 72  ",prefix,end,&er
aa30: 72 6d 73 67 5b 62 61 73 65 5d 29 3b 0a 20 20 20  rmsg[base]);.   
aa40: 20 62 61 73 65 20 3d 20 72 65 73 74 61 72 74 3b   base = restart;
aa50: 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  .  }.}./********
aa60: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
aa70: 65 20 66 69 6c 65 20 22 6d 61 69 6e 2e 63 22 20  e file "main.c" 
aa80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aa90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aaa0: 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61 69 6e  ****/./*.** Main
aab0: 20 70 72 6f 67 72 61 6d 20 66 69 6c 65 20 66 6f   program file fo
aac0: 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  r the LEMON pars
aad0: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
aae0: 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 61 6e 20 6f  ../* Report an o
aaf0: 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63 6f 6e  ut-of-memory con
ab00: 64 69 74 69 6f 6e 20 61 6e 64 20 61 62 6f 72 74  dition and abort
ab10: 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  .  This function
ab20: 0a 2a 2a 20 69 73 20 75 73 65 64 20 6d 6f 73 74  .** is used most
ab30: 6c 79 20 62 79 20 74 68 65 20 22 4d 65 6d 6f 72  ly by the "Memor
ab40: 79 43 68 65 63 6b 22 20 6d 61 63 72 6f 20 69 6e  yCheck" macro in
ab50: 20 73 74 72 75 63 74 2e 68 0a 2a 2f 0a 76 6f 69   struct.h.*/.voi
ab60: 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29  d memory_error()
ab70: 7b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  {.  fprintf(stde
ab80: 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72  rr,"Out of memor
ab90: 79 2e 20 20 41 62 6f 72 74 69 6e 67 2e 2e 2e 5c  y.  Aborting...\
aba0: 6e 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a  n");.  exit(1);.
abb0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 44  }..static int nD
abc0: 65 66 69 6e 65 20 3d 20 30 3b 20 20 20 20 20 20  efine = 0;      
abd0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 2d 44 20  /* Number of -D 
abe0: 6f 70 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 63  options on the c
abf0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a 73  ommand line */.s
ac00: 74 61 74 69 63 20 63 68 61 72 20 2a 2a 61 7a 44  tatic char **azD
ac10: 65 66 69 6e 65 20 3d 20 30 3b 20 20 2f 2a 20 4e  efine = 0;  /* N
ac20: 61 6d 65 20 6f 66 20 74 68 65 20 2d 44 20 6d 61  ame of the -D ma
ac30: 63 72 6f 73 20 2a 2f 0a 0a 2f 2a 20 54 68 69 73  cros */../* This
ac40: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
ac50: 65 64 20 77 69 74 68 20 74 68 65 20 61 72 67 75  ed with the argu
ac60: 6d 65 6e 74 20 74 6f 20 65 61 63 68 20 2d 44 20  ment to each -D 
ac70: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  command-line opt
ac80: 69 6f 6e 2e 0a 2a 2a 20 41 64 64 20 74 68 65 20  ion..** Add the 
ac90: 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 20 74 6f  macro defined to
aca0: 20 74 68 65 20 61 7a 44 65 66 69 6e 65 20 61 72   the azDefine ar
acb0: 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ray..*/.static v
acc0: 6f 69 64 20 68 61 6e 64 6c 65 5f 44 5f 6f 70 74  oid handle_D_opt
acd0: 69 6f 6e 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  ion(char *z){.  
ace0: 63 68 61 72 20 2a 2a 70 61 7a 3b 0a 20 20 6e 44  char **paz;.  nD
acf0: 65 66 69 6e 65 2b 2b 3b 0a 20 20 61 7a 44 65 66  efine++;.  azDef
ad00: 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 61 7a  ine = realloc(az
ad10: 44 65 66 69 6e 65 2c 20 73 69 7a 65 6f 66 28 61  Define, sizeof(a
ad20: 7a 44 65 66 69 6e 65 5b 30 5d 29 2a 6e 44 65 66  zDefine[0])*nDef
ad30: 69 6e 65 29 3b 0a 20 20 69 66 28 20 61 7a 44 65  ine);.  if( azDe
ad40: 66 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66  fine==0 ){.    f
ad50: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6f  printf(stderr,"o
ad60: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29  ut of memory\n")
ad70: 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
ad80: 20 7d 0a 20 20 70 61 7a 20 3d 20 26 61 7a 44 65   }.  paz = &azDe
ad90: 66 69 6e 65 5b 6e 44 65 66 69 6e 65 2d 31 5d 3b  fine[nDefine-1];
ada0: 0a 20 20 2a 70 61 7a 20 3d 20 6d 61 6c 6c 6f 63  .  *paz = malloc
adb0: 28 20 73 74 72 6c 65 6e 28 7a 29 2b 31 20 29 3b  ( strlen(z)+1 );
adc0: 0a 20 20 69 66 28 20 2a 70 61 7a 3d 3d 30 20 29  .  if( *paz==0 )
add0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
ade0: 64 65 72 72 2c 22 6f 75 74 20 6f 66 20 6d 65 6d  derr,"out of mem
adf0: 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  ory\n");.    exi
ae00: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63  t(1);.  }.  strc
ae10: 70 79 28 2a 70 61 7a 2c 20 7a 29 3b 0a 20 20 66  py(*paz, z);.  f
ae20: 6f 72 28 7a 3d 2a 70 61 7a 3b 20 2a 7a 20 26 26  or(z=*paz; *z &&
ae30: 20 2a 7a 21 3d 27 3d 27 3b 20 7a 2b 2b 29 7b 7d   *z!='='; z++){}
ae40: 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f  .  *z = 0;.}.../
ae50: 2a 20 54 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  * The main progr
ae60: 61 6d 2e 20 20 50 61 72 73 65 20 74 68 65 20 63  am.  Parse the c
ae70: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 6e 64 20  ommand line and 
ae80: 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a 69 6e 74 20  do it... */.int 
ae90: 6d 61 69 6e 28 61 72 67 63 2c 61 72 67 76 29 0a  main(argc,argv).
aea0: 69 6e 74 20 61 72 67 63 3b 0a 63 68 61 72 20 2a  int argc;.char *
aeb0: 2a 61 72 67 76 3b 0a 7b 0a 20 20 73 74 61 74 69  *argv;.{.  stati
aec0: 63 20 69 6e 74 20 76 65 72 73 69 6f 6e 20 3d 20  c int version = 
aed0: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
aee0: 72 70 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74  rpflag = 0;.  st
aef0: 61 74 69 63 20 69 6e 74 20 62 61 73 69 73 66 6c  atic int basisfl
af00: 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  ag = 0;.  static
af10: 20 69 6e 74 20 63 6f 6d 70 72 65 73 73 20 3d 20   int compress = 
af20: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
af30: 71 75 69 65 74 20 3d 20 30 3b 0a 20 20 73 74 61  quiet = 0;.  sta
af40: 74 69 63 20 69 6e 74 20 73 74 61 74 69 73 74 69  tic int statisti
af50: 63 73 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  cs = 0;.  static
af60: 20 69 6e 74 20 6d 68 66 6c 61 67 20 3d 20 30 3b   int mhflag = 0;
af70: 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
af80: 20 73 5f 6f 70 74 69 6f 6e 73 20 6f 70 74 69 6f   s_options optio
af90: 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 4f 50  ns[] = {.    {OP
afa0: 54 5f 46 4c 41 47 2c 20 22 62 22 2c 20 28 63 68  T_FLAG, "b", (ch
afb0: 61 72 2a 29 26 62 61 73 69 73 66 6c 61 67 2c 20  ar*)&basisflag, 
afc0: 22 50 72 69 6e 74 20 6f 6e 6c 79 20 74 68 65 20  "Print only the 
afd0: 62 61 73 69 73 20 69 6e 20 72 65 70 6f 72 74 2e  basis in report.
afe0: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
aff0: 47 2c 20 22 63 22 2c 20 28 63 68 61 72 2a 29 26  G, "c", (char*)&
b000: 63 6f 6d 70 72 65 73 73 2c 20 22 44 6f 6e 27 74  compress, "Don't
b010: 20 63 6f 6d 70 72 65 73 73 20 74 68 65 20 61 63   compress the ac
b020: 74 69 6f 6e 20 74 61 62 6c 65 2e 22 7d 2c 0a 20  tion table."},. 
b030: 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22 44     {OPT_FSTR, "D
b040: 22 2c 20 28 63 68 61 72 2a 29 68 61 6e 64 6c 65  ", (char*)handle
b050: 5f 44 5f 6f 70 74 69 6f 6e 2c 20 22 44 65 66 69  _D_option, "Defi
b060: 6e 65 20 61 6e 20 25 69 66 64 65 66 20 6d 61 63  ne an %ifdef mac
b070: 72 6f 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  ro."},.    {OPT_
b080: 46 4c 41 47 2c 20 22 67 22 2c 20 28 63 68 61 72  FLAG, "g", (char
b090: 2a 29 26 72 70 66 6c 61 67 2c 20 22 50 72 69 6e  *)&rpflag, "Prin
b0a0: 74 20 67 72 61 6d 6d 61 72 20 77 69 74 68 6f 75  t grammar withou
b0b0: 74 20 61 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20 20  t actions."},.  
b0c0: 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 6d 22    {OPT_FLAG, "m"
b0d0: 2c 20 28 63 68 61 72 2a 29 26 6d 68 66 6c 61 67  , (char*)&mhflag
b0e0: 2c 20 22 4f 75 74 70 75 74 20 61 20 6d 61 6b 65  , "Output a make
b0f0: 68 65 61 64 65 72 73 20 63 6f 6d 70 61 74 69 62  headers compatib
b100: 6c 65 20 66 69 6c 65 22 7d 2c 0a 20 20 20 20 7b  le file"},.    {
b110: 4f 50 54 5f 46 4c 41 47 2c 20 22 71 22 2c 20 28  OPT_FLAG, "q", (
b120: 63 68 61 72 2a 29 26 71 75 69 65 74 2c 20 22 28  char*)&quiet, "(
b130: 51 75 69 65 74 29 20 44 6f 6e 27 74 20 70 72 69  Quiet) Don't pri
b140: 6e 74 20 74 68 65 20 72 65 70 6f 72 74 20 66 69  nt the report fi
b150: 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  le."},.    {OPT_
b160: 46 4c 41 47 2c 20 22 73 22 2c 20 28 63 68 61 72  FLAG, "s", (char
b170: 2a 29 26 73 74 61 74 69 73 74 69 63 73 2c 0a 20  *)&statistics,. 
b180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1a0: 20 20 22 50 72 69 6e 74 20 70 61 72 73 65 72 20    "Print parser 
b1b0: 73 74 61 74 73 20 74 6f 20 73 74 61 6e 64 61 72  stats to standar
b1c0: 64 20 6f 75 74 70 75 74 2e 22 7d 2c 0a 20 20 20  d output."},.   
b1d0: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 78 22 2c   {OPT_FLAG, "x",
b1e0: 20 28 63 68 61 72 2a 29 26 76 65 72 73 69 6f 6e   (char*)&version
b1f0: 2c 20 22 50 72 69 6e 74 20 74 68 65 20 76 65 72  , "Print the ver
b200: 73 69 6f 6e 20 6e 75 6d 62 65 72 2e 22 7d 2c 0a  sion number."},.
b210: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 30 2c      {OPT_FLAG,0,
b220: 30 2c 30 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  0,0}.  };.  int 
b230: 69 3b 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f  i;.  struct lemo
b240: 6e 20 6c 65 6d 3b 0a 0a 20 20 4f 70 74 49 6e 69  n lem;..  OptIni
b250: 74 28 61 72 67 76 2c 6f 70 74 69 6f 6e 73 2c 73  t(argv,options,s
b260: 74 64 65 72 72 29 3b 0a 20 20 69 66 28 20 76 65  tderr);.  if( ve
b270: 72 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 70 72  rsion ){.     pr
b280: 69 6e 74 66 28 22 4c 65 6d 6f 6e 20 76 65 72 73  intf("Lemon vers
b290: 69 6f 6e 20 31 2e 30 5c 6e 22 29 3b 0a 20 20 20  ion 1.0\n");.   
b2a0: 20 20 65 78 69 74 28 30 29 3b 20 0a 20 20 7d 0a    exit(0); .  }.
b2b0: 20 20 69 66 28 20 4f 70 74 4e 41 72 67 73 28 29    if( OptNArgs()
b2c0: 21 3d 31 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  !=1 ){.    fprin
b2d0: 74 66 28 73 74 64 65 72 72 2c 22 45 78 61 63 74  tf(stderr,"Exact
b2e0: 6c 79 20 6f 6e 65 20 66 69 6c 65 6e 61 6d 65 20  ly one filename 
b2f0: 61 72 67 75 6d 65 6e 74 20 69 73 20 72 65 71 75  argument is requ
b300: 69 72 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 65  ired.\n");.    e
b310: 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6d 65  xit(1);.  }.  me
b320: 6d 73 65 74 28 26 6c 65 6d 2c 20 30 2c 20 73 69  mset(&lem, 0, si
b330: 7a 65 6f 66 28 6c 65 6d 29 29 3b 0a 20 20 6c 65  zeof(lem));.  le
b340: 6d 2e 65 72 72 6f 72 63 6e 74 20 3d 20 30 3b 0a  m.errorcnt = 0;.
b350: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
b360: 20 74 68 65 20 6d 61 63 68 69 6e 65 20 2a 2f 0a   the machine */.
b370: 20 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28 29    Strsafe_init()
b380: 3b 0a 20 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28  ;.  Symbol_init(
b390: 29 3b 0a 20 20 53 74 61 74 65 5f 69 6e 69 74 28  );.  State_init(
b3a0: 29 3b 0a 20 20 6c 65 6d 2e 61 72 67 76 30 20 3d  );.  lem.argv0 =
b3b0: 20 61 72 67 76 5b 30 5d 3b 0a 20 20 6c 65 6d 2e   argv[0];.  lem.
b3c0: 66 69 6c 65 6e 61 6d 65 20 3d 20 4f 70 74 41 72  filename = OptAr
b3d0: 67 28 30 29 3b 0a 20 20 6c 65 6d 2e 62 61 73 69  g(0);.  lem.basi
b3e0: 73 66 6c 61 67 20 3d 20 62 61 73 69 73 66 6c 61  sflag = basisfla
b3f0: 67 3b 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  g;.  Symbol_new(
b400: 22 24 22 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 73  "$");.  lem.errs
b410: 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  ym = Symbol_new(
b420: 22 65 72 72 6f 72 22 29 3b 0a 20 20 6c 65 6d 2e  "error");.  lem.
b430: 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74 20 3d  errsym->useCnt =
b440: 20 30 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20   0;..  /* Parse 
b450: 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a  the input file *
b460: 2f 0a 20 20 50 61 72 73 65 28 26 6c 65 6d 29 3b  /.  Parse(&lem);
b470: 0a 20 20 69 66 28 20 6c 65 6d 2e 65 72 72 6f 72  .  if( lem.error
b480: 63 6e 74 20 29 20 65 78 69 74 28 6c 65 6d 2e 65  cnt ) exit(lem.e
b490: 72 72 6f 72 63 6e 74 29 3b 0a 20 20 69 66 28 20  rrorcnt);.  if( 
b4a0: 6c 65 6d 2e 6e 72 75 6c 65 3d 3d 30 20 29 7b 0a  lem.nrule==0 ){.
b4b0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
b4c0: 72 72 2c 22 45 6d 70 74 79 20 67 72 61 6d 6d 61  rr,"Empty gramma
b4d0: 72 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  r.\n");.    exit
b4e0: 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  (1);.  }..  /* C
b4f0: 6f 75 6e 74 20 61 6e 64 20 69 6e 64 65 78 20 74  ount and index t
b500: 68 65 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74 68  he symbols of th
b510: 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 6c  e grammar */.  l
b520: 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 53 79 6d  em.nsymbol = Sym
b530: 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b 0a 20 20 53  bol_count();.  S
b540: 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61  ymbol_new("{defa
b550: 75 6c 74 7d 22 29 3b 0a 20 20 6c 65 6d 2e 73 79  ult}");.  lem.sy
b560: 6d 62 6f 6c 73 20 3d 20 53 79 6d 62 6f 6c 5f 61  mbols = Symbol_a
b570: 72 72 61 79 6f 66 28 29 3b 0a 20 20 66 6f 72 28  rrayof();.  for(
b580: 69 3d 30 3b 20 69 3c 3d 6c 65 6d 2e 6e 73 79 6d  i=0; i<=lem.nsym
b590: 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e 73 79  bol; i++) lem.sy
b5a0: 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65 78 20  mbols[i]->index 
b5b0: 3d 20 69 3b 0a 20 20 71 73 6f 72 74 28 6c 65 6d  = i;.  qsort(lem
b5c0: 2e 73 79 6d 62 6f 6c 73 2c 6c 65 6d 2e 6e 73 79  .symbols,lem.nsy
b5d0: 6d 62 6f 6c 2b 31 2c 73 69 7a 65 6f 66 28 73 74  mbol+1,sizeof(st
b5e0: 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2c 0a 20  ruct symbol*),. 
b5f0: 20 20 20 20 20 20 20 28 69 6e 74 28 2a 29 28 29         (int(*)()
b600: 29 53 79 6d 62 6f 6c 63 6d 70 70 29 3b 0a 20 20  )Symbolcmpp);.  
b610: 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6c 65 6d 2e  for(i=0; i<=lem.
b620: 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65  nsymbol; i++) le
b630: 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e  m.symbols[i]->in
b640: 64 65 78 20 3d 20 69 3b 0a 20 20 66 6f 72 28 69  dex = i;.  for(i
b650: 3d 31 3b 20 69 73 75 70 70 65 72 28 6c 65 6d 2e  =1; isupper(lem.
b660: 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65  symbols[i]->name
b670: 5b 30 5d 29 3b 20 69 2b 2b 29 3b 0a 20 20 6c 65  [0]); i++);.  le
b680: 6d 2e 6e 74 65 72 6d 69 6e 61 6c 20 3d 20 69 3b  m.nterminal = i;
b690: 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
b6a0: 61 20 72 65 70 72 69 6e 74 20 6f 66 20 74 68 65  a reprint of the
b6b0: 20 67 72 61 6d 6d 61 72 2c 20 69 66 20 72 65 71   grammar, if req
b6c0: 75 65 73 74 65 64 20 6f 6e 20 74 68 65 20 63 6f  uested on the co
b6d0: 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a 20 20  mmand line */.  
b6e0: 69 66 28 20 72 70 66 6c 61 67 20 29 7b 0a 20 20  if( rpflag ){.  
b6f0: 20 20 52 65 70 72 69 6e 74 28 26 6c 65 6d 29 3b    Reprint(&lem);
b700: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
b710: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
b720: 73 69 7a 65 20 66 6f 72 20 61 6c 6c 20 66 6f 6c  size for all fol
b730: 6c 6f 77 20 61 6e 64 20 66 69 72 73 74 20 73 65  low and first se
b740: 74 73 20 2a 2f 0a 20 20 20 20 53 65 74 53 69 7a  ts */.    SetSiz
b750: 65 28 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2b  e(lem.nterminal+
b760: 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64  1);..    /* Find
b770: 20 74 68 65 20 70 72 65 63 65 64 65 6e 63 65 20   the precedence 
b780: 66 6f 72 20 65 76 65 72 79 20 70 72 6f 64 75 63  for every produc
b790: 74 69 6f 6e 20 72 75 6c 65 20 28 74 68 61 74 20  tion rule (that 
b7a0: 68 61 73 20 6f 6e 65 29 20 2a 2f 0a 20 20 20 20  has one) */.    
b7b0: 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e  FindRulePreceden
b7c0: 63 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  ces(&lem);..    
b7d0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c  /* Compute the l
b7e0: 61 6d 62 64 61 2d 6e 6f 6e 74 65 72 6d 69 6e 61  ambda-nontermina
b7f0: 6c 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  ls and the first
b800: 2d 73 65 74 73 20 66 6f 72 20 65 76 65 72 79 0a  -sets for every.
b810: 20 20 20 20 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e      ** nontermin
b820: 61 6c 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46 69  al */.    FindFi
b830: 72 73 74 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a  rstSets(&lem);..
b840: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61      /* Compute a
b850: 6c 6c 20 4c 52 28 30 29 20 73 74 61 74 65 73 2e  ll LR(0) states.
b860: 20 20 41 6c 73 6f 20 72 65 63 6f 72 64 20 66 6f    Also record fo
b870: 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61  llow-set propaga
b880: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6c 69 6e 6b  tion.    ** link
b890: 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 6f  s so that the fo
b8a0: 6c 6c 6f 77 2d 73 65 74 20 63 61 6e 20 62 65 20  llow-set can be 
b8b0: 63 6f 6d 70 75 74 65 64 20 6c 61 74 65 72 20 2a  computed later *
b8c0: 2f 0a 20 20 20 20 6c 65 6d 2e 6e 73 74 61 74 65  /.    lem.nstate
b8d0: 20 3d 20 30 3b 0a 20 20 20 20 46 69 6e 64 53 74   = 0;.    FindSt
b8e0: 61 74 65 73 28 26 6c 65 6d 29 3b 0a 20 20 20 20  ates(&lem);.    
b8f0: 6c 65 6d 2e 73 6f 72 74 65 64 20 3d 20 53 74 61  lem.sorted = Sta
b900: 74 65 5f 61 72 72 61 79 6f 66 28 29 3b 0a 0a 20  te_arrayof();.. 
b910: 20 20 20 2f 2a 20 54 69 65 20 75 70 20 6c 6f 6f     /* Tie up loo
b920: 73 65 20 65 6e 64 73 20 6f 6e 20 74 68 65 20 70  se ends on the p
b930: 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73  ropagation links
b940: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 4c 69 6e 6b   */.    FindLink
b950: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
b960: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66 6f 6c   Compute the fol
b970: 6c 6f 77 20 73 65 74 20 6f 66 20 65 76 65 72 79  low set of every
b980: 20 72 65 64 75 63 69 62 6c 65 20 63 6f 6e 66 69   reducible confi
b990: 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  guration */.    
b9a0: 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28 26  FindFollowSets(&
b9b0: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  lem);..    /* Co
b9c0: 6d 70 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e  mpute the action
b9d0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 46   tables */.    F
b9e0: 69 6e 64 41 63 74 69 6f 6e 73 28 26 6c 65 6d 29  indActions(&lem)
b9f0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65  ;..    /* Compre
ba00: 73 73 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  ss the action ta
ba10: 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  bles */.    if( 
ba20: 63 6f 6d 70 72 65 73 73 3d 3d 30 20 29 20 43 6f  compress==0 ) Co
ba30: 6d 70 72 65 73 73 54 61 62 6c 65 73 28 26 6c 65  mpressTables(&le
ba40: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6f 72  m);..    /* Reor
ba50: 64 65 72 20 61 6e 64 20 72 65 6e 75 6d 62 65 72  der and renumber
ba60: 20 74 68 65 20 73 74 61 74 65 73 20 73 6f 20 74   the states so t
ba70: 68 61 74 20 73 74 61 74 65 73 20 77 69 74 68 20  hat states with 
ba80: 66 65 77 65 72 20 63 68 6f 69 63 65 73 0a 20 20  fewer choices.  
ba90: 20 20 2a 2a 20 6f 63 63 75 72 20 61 74 20 74 68    ** occur at th
baa0: 65 20 65 6e 64 2e 20 2a 2f 0a 20 20 20 20 52 65  e end. */.    Re
bab0: 73 6f 72 74 53 74 61 74 65 73 28 26 6c 65 6d 29  sortStates(&lem)
bac0: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65 72 61  ;..    /* Genera
bad0: 74 65 20 61 20 72 65 70 6f 72 74 20 6f 66 20 74  te a report of t
bae0: 68 65 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  he parser genera
baf0: 74 65 64 2e 20 20 28 74 68 65 20 22 79 2e 6f 75  ted.  (the "y.ou
bb00: 74 70 75 74 22 20 66 69 6c 65 29 20 2a 2f 0a 20  tput" file) */. 
bb10: 20 20 20 69 66 28 20 21 71 75 69 65 74 20 29 20     if( !quiet ) 
bb20: 52 65 70 6f 72 74 4f 75 74 70 75 74 28 26 6c 65  ReportOutput(&le
bb30: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65  m);..    /* Gene
bb40: 72 61 74 65 20 74 68 65 20 73 6f 75 72 63 65 20  rate the source 
bb50: 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70 61 72  code for the par
bb60: 73 65 72 20 2a 2f 0a 20 20 20 20 52 65 70 6f 72  ser */.    Repor
bb70: 74 54 61 62 6c 65 28 26 6c 65 6d 2c 20 6d 68 66  tTable(&lem, mhf
bb80: 6c 61 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72  lag);..    /* Pr
bb90: 6f 64 75 63 65 20 61 20 68 65 61 64 65 72 20 66  oduce a header f
bba0: 69 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20 74  ile for use by t
bbb0: 68 65 20 73 63 61 6e 6e 65 72 2e 20 20 28 54 68  he scanner.  (Th
bbc0: 69 73 20 73 74 65 70 20 69 73 0a 20 20 20 20 2a  is step is.    *
bbd0: 2a 20 6f 6d 69 74 74 65 64 20 69 66 20 74 68 65  * omitted if the
bbe0: 20 22 2d 6d 22 20 6f 70 74 69 6f 6e 20 69 73 20   "-m" option is 
bbf0: 75 73 65 64 20 62 65 63 61 75 73 65 20 6d 61 6b  used because mak
bc00: 65 68 65 61 64 65 72 73 20 77 69 6c 6c 0a 20 20  eheaders will.  
bc10: 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 20 74 68    ** generate th
bc20: 65 20 66 69 6c 65 20 66 6f 72 20 75 73 2e 29 20  e file for us.) 
bc30: 2a 2f 0a 20 20 20 20 69 66 28 20 21 6d 68 66 6c  */.    if( !mhfl
bc40: 61 67 20 29 20 52 65 70 6f 72 74 48 65 61 64 65  ag ) ReportHeade
bc50: 72 28 26 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20 69  r(&lem);.  }.  i
bc60: 66 28 20 73 74 61 74 69 73 74 69 63 73 20 29 7b  f( statistics ){
bc70: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 61 72  .    printf("Par
bc80: 73 65 72 20 73 74 61 74 69 73 74 69 63 73 3a 20  ser statistics: 
bc90: 25 64 20 74 65 72 6d 69 6e 61 6c 73 2c 20 25 64  %d terminals, %d
bca0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2c 20 25   nonterminals, %
bcb0: 64 20 72 75 6c 65 73 5c 6e 22 2c 0a 20 20 20 20  d rules\n",.    
bcc0: 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2c    lem.nterminal,
bcd0: 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 2d 20 6c   lem.nsymbol - l
bce0: 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2c 20 6c 65  em.nterminal, le
bcf0: 6d 2e 6e 72 75 6c 65 29 3b 0a 20 20 20 20 70 72  m.nrule);.    pr
bd00: 69 6e 74 66 28 22 20 20 20 20 20 20 20 20 20 20  intf("          
bd10: 20 20 20 20 20 20 20 20 20 25 64 20 73 74 61 74           %d stat
bd20: 65 73 2c 20 25 64 20 70 61 72 73 65 72 20 74 61  es, %d parser ta
bd30: 62 6c 65 20 65 6e 74 72 69 65 73 2c 20 25 64 20  ble entries, %d 
bd40: 63 6f 6e 66 6c 69 63 74 73 5c 6e 22 2c 0a 20 20  conflicts\n",.  
bd50: 20 20 20 20 6c 65 6d 2e 6e 73 74 61 74 65 2c 20      lem.nstate, 
bd60: 6c 65 6d 2e 74 61 62 6c 65 73 69 7a 65 2c 20 6c  lem.tablesize, l
bd70: 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20  em.nconflict);. 
bd80: 20 7d 0a 20 20 69 66 28 20 6c 65 6d 2e 6e 63 6f   }.  if( lem.nco
bd90: 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20 20 66 70  nflict ){.    fp
bda0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 64  rintf(stderr,"%d
bdb0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63   parsing conflic
bdc0: 74 73 2e 5c 6e 22 2c 6c 65 6d 2e 6e 63 6f 6e 66  ts.\n",lem.nconf
bdd0: 6c 69 63 74 29 3b 0a 20 20 7d 0a 20 20 65 78 69  lict);.  }.  exi
bde0: 74 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 20 2b  t(lem.errorcnt +
bdf0: 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b   lem.nconflict);
be00: 0a 20 20 72 65 74 75 72 6e 20 28 6c 65 6d 2e 65  .  return (lem.e
be10: 72 72 6f 72 63 6e 74 20 2b 20 6c 65 6d 2e 6e 63  rrorcnt + lem.nc
be20: 6f 6e 66 6c 69 63 74 29 3b 0a 7d 0a 2f 2a 2a 2a  onflict);.}./***
be30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be40: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
be50: 22 6d 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  "msort.c" ******
be60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
be70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
be80: 20 41 20 67 65 6e 65 72 69 63 20 6d 65 72 67 65   A generic merge
be90: 2d 73 6f 72 74 20 70 72 6f 67 72 61 6d 2e 0a 2a  -sort program..*
bea0: 2a 0a 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a 20 4c  *.** USAGE:.** L
beb0: 65 74 20 22 70 74 72 22 20 62 65 20 61 20 70 6f  et "ptr" be a po
bec0: 69 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20 73 74  inter to some st
bed0: 72 75 63 74 75 72 65 20 77 68 69 63 68 20 69 73  ructure which is
bee0: 20 61 74 20 74 68 65 20 68 65 61 64 20 6f 66 0a   at the head of.
bef0: 2a 2a 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e  ** a null-termin
bf00: 61 74 65 64 20 6c 69 73 74 2e 20 20 54 68 65 6e  ated list.  Then
bf10: 20 74 6f 20 73 6f 72 74 20 74 68 65 20 6c 69 73   to sort the lis
bf20: 74 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  t call:.**.**   
bf30: 20 20 70 74 72 20 3d 20 6d 73 6f 72 74 28 70 74    ptr = msort(pt
bf40: 72 2c 26 28 70 74 72 2d 3e 6e 65 78 74 29 2c 63  r,&(ptr->next),c
bf50: 6d 70 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e  mpfnc);.**.** In
bf60: 20 74 68 65 20 61 62 6f 76 65 2c 20 22 63 6d 70   the above, "cmp
bf70: 66 6e 63 22 20 69 73 20 61 20 70 6f 69 6e 74 65  fnc" is a pointe
bf80: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
bf90: 77 68 69 63 68 20 63 6f 6d 70 61 72 65 73 0a 2a  which compares.*
bfa0: 2a 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20  * two instances 
bfb0: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
bfc0: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 6e 20   and returns an 
bfd0: 69 6e 74 65 67 65 72 2c 20 61 73 20 69 6e 0a 2a  integer, as in.*
bfe0: 2a 20 73 74 72 63 6d 70 2e 20 20 54 68 65 20 73  * strcmp.  The s
bff0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
c000: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
c010: 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  he pointer to th
c020: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d  e.** second elem
c030: 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65  ent of the linke
c040: 64 20 6c 69 73 74 2e 20 20 54 68 69 73 20 61 64  d list.  This ad
c050: 64 72 65 73 73 20 69 73 20 75 73 65 64 20 74 6f  dress is used to
c060: 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20   compute.** the 
c070: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 22 6e  offset to the "n
c080: 65 78 74 22 20 66 69 65 6c 64 20 77 69 74 68 69  ext" field withi
c090: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  n the structure.
c0a0: 20 20 54 68 65 20 6f 66 66 73 65 74 20 74 6f 0a    The offset to.
c0b0: 2a 2a 20 74 68 65 20 22 6e 65 78 74 22 20 66 69  ** the "next" fi
c0c0: 65 6c 64 20 6d 75 73 74 20 62 65 20 63 6f 6e 73  eld must be cons
c0d0: 74 61 6e 74 20 66 6f 72 20 61 6c 6c 20 73 74 72  tant for all str
c0e0: 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 6c  uctures in the l
c0f0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ist..**.** The f
c100: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
c110: 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 77 68  a new pointer wh
c120: 69 63 68 20 69 73 20 74 68 65 20 68 65 61 64 20  ich is the head 
c130: 6f 66 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 61  of the list.** a
c140: 66 74 65 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a  fter sorting..**
c150: 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a  .** ALGORITHM:.*
c160: 2a 20 4d 65 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f  * Merge-sort..*/
c170: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
c180: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
c190: 6e 65 78 74 20 73 74 72 75 63 74 75 72 65 20 69  next structure i
c1a0: 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
c1b0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 45  t..*/.#define NE
c1c0: 58 54 28 41 29 20 28 2a 28 63 68 61 72 2a 2a 29  XT(A) (*(char**)
c1d0: 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  (((unsigned long
c1e0: 29 41 29 2b 6f 66 66 73 65 74 29 29 0a 0a 2f 2a  )A)+offset))../*
c1f0: 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20  .** Inputs:.**  
c200: 20 61 3a 20 20 20 20 20 20 20 41 20 73 6f 72 74   a:       A sort
c210: 65 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61  ed, null-termina
c220: 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  ted linked list.
c230: 20 20 28 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e    (May be null).
c240: 0a 2a 2a 20 20 20 62 3a 20 20 20 20 20 20 20 41  .**   b:       A
c250: 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65   sorted, null-te
c260: 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20  rminated linked 
c270: 6c 69 73 74 2e 20 20 28 4d 61 79 20 62 65 20 6e  list.  (May be n
c280: 75 6c 6c 29 2e 0a 2a 2a 20 20 20 63 6d 70 3a 20  ull)..**   cmp: 
c290: 20 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f      A pointer to
c2a0: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
c2b0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 20 20 6f  function..**   o
c2c0: 66 66 73 65 74 3a 20 20 4f 66 66 73 65 74 20 69  ffset:  Offset i
c2d0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
c2e0: 74 6f 20 74 68 65 20 22 6e 65 78 74 22 20 66 69  to the "next" fi
c2f0: 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eld..**.** Retur
c300: 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41 20  n Value:.**   A 
c310: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
c320: 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65 64 20  ead of a sorted 
c330: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
c340: 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20  the elements.** 
c350: 20 20 6f 66 20 62 6f 74 68 20 61 20 61 6e 64 20    of both a and 
c360: 62 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66  b..**.** Side ef
c370: 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20  fects:.**   The 
c380: 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72 73 20  "next" pointers 
c390: 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  for elements in 
c3a0: 74 68 65 20 6c 69 73 74 73 20 61 20 61 6e 64 20  the lists a and 
c3b0: 62 20 61 72 65 0a 2a 2a 20 20 20 63 68 61 6e 67  b are.**   chang
c3c0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ed..*/.static ch
c3d0: 61 72 20 2a 6d 65 72 67 65 28 0a 20 20 63 68 61  ar *merge(.  cha
c3e0: 72 20 2a 61 2c 0a 20 20 63 68 61 72 20 2a 62 2c  r *a,.  char *b,
c3f0: 0a 20 20 69 6e 74 20 28 2a 63 6d 70 29 28 63 6f  .  int (*cmp)(co
c400: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
c410: 63 68 61 72 2a 29 2c 0a 20 20 69 6e 74 20 6f 66  char*),.  int of
c420: 66 73 65 74 0a 29 7b 0a 20 20 63 68 61 72 20 2a  fset.){.  char *
c430: 70 74 72 2c 20 2a 68 65 61 64 3b 0a 0a 20 20 69  ptr, *head;..  i
c440: 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 68  f( a==0 ){.    h
c450: 65 61 64 20 3d 20 62 3b 0a 20 20 7d 65 6c 73 65  ead = b;.  }else
c460: 20 69 66 28 20 62 3d 3d 30 20 29 7b 0a 20 20 20   if( b==0 ){.   
c470: 20 68 65 61 64 20 3d 20 61 3b 0a 20 20 7d 65 6c   head = a;.  }el
c480: 73 65 7b 0a 20 20 20 20 69 66 28 20 28 2a 63 6d  se{.    if( (*cm
c490: 70 29 28 61 2c 62 29 3c 30 20 29 7b 0a 20 20 20  p)(a,b)<0 ){.   
c4a0: 20 20 20 70 74 72 20 3d 20 61 3b 0a 20 20 20 20     ptr = a;.    
c4b0: 20 20 61 20 3d 20 4e 45 58 54 28 61 29 3b 0a 20    a = NEXT(a);. 
c4c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c4d0: 70 74 72 20 3d 20 62 3b 0a 20 20 20 20 20 20 62  ptr = b;.      b
c4e0: 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20 20 20 20   = NEXT(b);.    
c4f0: 7d 0a 20 20 20 20 68 65 61 64 20 3d 20 70 74 72  }.    head = ptr
c500: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 61 20 26  ;.    while( a &
c510: 26 20 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28  & b ){.      if(
c520: 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c 30 20 29   (*cmp)(a,b)<0 )
c530: 7b 0a 20 20 20 20 20 20 20 20 4e 45 58 54 28 70  {.        NEXT(p
c540: 74 72 29 20 3d 20 61 3b 0a 20 20 20 20 20 20 20  tr) = a;.       
c550: 20 70 74 72 20 3d 20 61 3b 0a 20 20 20 20 20 20   ptr = a;.      
c560: 20 20 61 20 3d 20 4e 45 58 54 28 61 29 3b 0a 20    a = NEXT(a);. 
c570: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c580: 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20      NEXT(ptr) = 
c590: 62 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d  b;.        ptr =
c5a0: 20 62 3b 0a 20 20 20 20 20 20 20 20 62 20 3d 20   b;.        b = 
c5b0: 4e 45 58 54 28 62 29 3b 0a 20 20 20 20 20 20 7d  NEXT(b);.      }
c5c0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61  .    }.    if( a
c5d0: 20 29 20 4e 45 58 54 28 70 74 72 29 20 3d 20 61   ) NEXT(ptr) = a
c5e0: 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 4e 45  ;.    else    NE
c5f0: 58 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 7d  XT(ptr) = b;.  }
c600: 0a 20 20 72 65 74 75 72 6e 20 68 65 61 64 3b 0a  .  return head;.
c610: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a  }../*.** Inputs:
c620: 0a 2a 2a 20 20 20 6c 69 73 74 3a 20 20 20 20 20  .**   list:     
c630: 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69   Pointer to a si
c640: 6e 67 6c 79 2d 6c 69 6e 6b 65 64 20 6c 69 73 74  ngly-linked list
c650: 20 6f 66 20 73 74 72 75 63 74 75 72 65 73 2e 0a   of structures..
c660: 2a 2a 20 20 20 6e 65 78 74 3a 20 20 20 20 20 20  **   next:      
c670: 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  Pointer to point
c680: 65 72 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64  er to the second
c690: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
c6a0: 6c 69 73 74 2e 0a 2a 2a 20 20 20 63 6d 70 3a 20  list..**   cmp: 
c6b0: 20 20 20 20 20 20 41 20 63 6f 6d 70 61 72 69 73        A comparis
c6c0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  on function..**.
c6d0: 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a  ** Return Value:
c6e0: 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20  .**   A pointer 
c6f0: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 61  to the head of a
c700: 20 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e   sorted list con
c710: 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d  taining the elem
c720: 65 6e 74 73 0a 2a 2a 20 20 20 6f 72 67 69 6e 61  ents.**   orgina
c730: 6c 6c 79 20 69 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  lly in list..**.
c740: 2a 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a  ** Side effects:
c750: 0a 2a 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22  .**   The "next"
c760: 20 70 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c   pointers for el
c770: 65 6d 65 6e 74 73 20 69 6e 20 6c 69 73 74 20 61  ements in list a
c780: 72 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23  re changed..*/.#
c790: 64 65 66 69 6e 65 20 4c 49 53 54 53 49 5a 45 20  define LISTSIZE 
c7a0: 33 30 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  30.static char *
c7b0: 6d 73 6f 72 74 28 0a 20 20 63 68 61 72 20 2a 6c  msort(.  char *l
c7c0: 69 73 74 2c 0a 20 20 63 68 61 72 20 2a 2a 6e 65  ist,.  char **ne
c7d0: 78 74 2c 0a 20 20 69 6e 74 20 28 2a 63 6d 70 29  xt,.  int (*cmp)
c7e0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e  (const char*,con
c7f0: 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20 75  st char*).){.  u
c800: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6f 66 66  nsigned long off
c810: 73 65 74 3b 0a 20 20 63 68 61 72 20 2a 65 70 3b  set;.  char *ep;
c820: 0a 20 20 63 68 61 72 20 2a 73 65 74 5b 4c 49 53  .  char *set[LIS
c830: 54 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 69 3b  TSIZE];.  int i;
c840: 0a 20 20 6f 66 66 73 65 74 20 3d 20 28 75 6e 73  .  offset = (uns
c850: 69 67 6e 65 64 20 6c 6f 6e 67 29 6e 65 78 74 20  igned long)next 
c860: 2d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  - (unsigned long
c870: 29 6c 69 73 74 3b 0a 20 20 66 6f 72 28 69 3d 30  )list;.  for(i=0
c880: 3b 20 69 3c 4c 49 53 54 53 49 5a 45 3b 20 69 2b  ; i<LISTSIZE; i+
c890: 2b 29 20 73 65 74 5b 69 5d 20 3d 20 30 3b 0a 20  +) set[i] = 0;. 
c8a0: 20 77 68 69 6c 65 28 20 6c 69 73 74 20 29 7b 0a   while( list ){.
c8b0: 20 20 20 20 65 70 20 3d 20 6c 69 73 74 3b 0a 20      ep = list;. 
c8c0: 20 20 20 6c 69 73 74 20 3d 20 4e 45 58 54 28 6c     list = NEXT(l
c8d0: 69 73 74 29 3b 0a 20 20 20 20 4e 45 58 54 28 65  ist);.    NEXT(e
c8e0: 70 29 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  p) = 0;.    for(
c8f0: 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 2d  i=0; i<LISTSIZE-
c900: 31 20 26 26 20 73 65 74 5b 69 5d 21 3d 30 3b 20  1 && set[i]!=0; 
c910: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 65 70 20 3d  i++){.      ep =
c920: 20 6d 65 72 67 65 28 65 70 2c 73 65 74 5b 69 5d   merge(ep,set[i]
c930: 2c 63 6d 70 2c 6f 66 66 73 65 74 29 3b 0a 20 20  ,cmp,offset);.  
c940: 20 20 20 20 73 65 74 5b 69 5d 20 3d 20 30 3b 0a      set[i] = 0;.
c950: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 5b 69 5d      }.    set[i]
c960: 20 3d 20 65 70 3b 0a 20 20 7d 0a 20 20 65 70 20   = ep;.  }.  ep 
c970: 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
c980: 69 3c 4c 49 53 54 53 49 5a 45 3b 20 69 2b 2b 29  i<LISTSIZE; i++)
c990: 20 69 66 28 20 73 65 74 5b 69 5d 20 29 20 65 70   if( set[i] ) ep
c9a0: 20 3d 20 6d 65 72 67 65 28 65 70 2c 73 65 74 5b   = merge(ep,set[
c9b0: 69 5d 2c 63 6d 70 2c 6f 66 66 73 65 74 29 3b 0a  i],cmp,offset);.
c9c0: 20 20 72 65 74 75 72 6e 20 65 70 3b 0a 7d 0a 2f    return ep;.}./
c9d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c9e0: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
c9f0: 65 20 66 69 6c 65 20 22 6f 70 74 69 6f 6e 2e 63  e file "option.c
ca00: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
ca10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74  ************/.st
ca20: 61 74 69 63 20 63 68 61 72 20 2a 2a 61 72 67 76  atic char **argv
ca30: 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ;.static struct 
ca40: 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f 70 3b 0a 73  s_options *op;.s
ca50: 74 61 74 69 63 20 46 49 4c 45 20 2a 65 72 72 73  tatic FILE *errs
ca60: 74 72 65 61 6d 3b 0a 0a 23 64 65 66 69 6e 65 20  tream;..#define 
ca70: 49 53 4f 50 54 28 58 29 20 28 28 58 29 5b 30 5d  ISOPT(X) ((X)[0]
ca80: 3d 3d 27 2d 27 7c 7c 28 58 29 5b 30 5d 3d 3d 27  =='-'||(X)[0]=='
ca90: 2b 27 7c 7c 73 74 72 63 68 72 28 28 58 29 2c 27  +'||strchr((X),'
caa0: 3d 27 29 21 3d 30 29 0a 0a 2f 2a 0a 2a 2a 20 50  =')!=0)../*.** P
cab0: 72 69 6e 74 20 74 68 65 20 63 6f 6d 6d 61 6e 64  rint the command
cac0: 20 6c 69 6e 65 20 77 69 74 68 20 61 20 63 61 72   line with a car
cad0: 72 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  rot pointing to 
cae0: 74 68 65 20 6b 2d 74 68 20 63 68 61 72 61 63 74  the k-th charact
caf0: 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20 6e 2d 74  er.** of the n-t
cb00: 68 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74  h field..*/.stat
cb10: 69 63 20 76 6f 69 64 20 65 72 72 6c 69 6e 65 28  ic void errline(
cb20: 6e 2c 6b 2c 65 72 72 29 0a 69 6e 74 20 6e 3b 0a  n,k,err).int n;.
cb30: 69 6e 74 20 6b 3b 0a 46 49 4c 45 20 2a 65 72 72  int k;.FILE *err
cb40: 3b 0a 7b 0a 20 20 69 6e 74 20 73 70 63 6e 74 2c  ;.{.  int spcnt,
cb50: 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76 5b 30   i;.  if( argv[0
cb60: 5d 20 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c  ] ) fprintf(err,
cb70: 22 25 73 22 2c 61 72 67 76 5b 30 5d 29 3b 0a 20  "%s",argv[0]);. 
cb80: 20 73 70 63 6e 74 20 3d 20 73 74 72 6c 65 6e 28   spcnt = strlen(
cb90: 61 72 67 76 5b 30 5d 29 20 2b 20 31 3b 0a 20 20  argv[0]) + 1;.  
cba0: 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26 20  for(i=1; i<n && 
cbb0: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  argv[i]; i++){. 
cbc0: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
cbd0: 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20   %s",argv[i]);. 
cbe0: 20 20 20 73 70 63 6e 74 20 2b 3d 20 73 74 72 6c     spcnt += strl
cbf0: 65 6e 28 61 72 67 76 5b 69 5d 29 2b 31 3b 0a 20  en(argv[i])+1;. 
cc00: 20 7d 0a 20 20 73 70 63 6e 74 20 2b 3d 20 6b 3b   }.  spcnt += k;
cc10: 0a 20 20 66 6f 72 28 3b 20 61 72 67 76 5b 69 5d  .  for(; argv[i]
cc20: 3b 20 69 2b 2b 29 20 66 70 72 69 6e 74 66 28 65  ; i++) fprintf(e
cc30: 72 72 2c 22 20 25 73 22 2c 61 72 67 76 5b 69 5d  rr," %s",argv[i]
cc40: 29 3b 0a 20 20 69 66 28 20 73 70 63 6e 74 3c 32  );.  if( spcnt<2
cc50: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
cc60: 28 65 72 72 2c 22 5c 6e 25 2a 73 5e 2d 2d 20 68  (err,"\n%*s^-- h
cc70: 65 72 65 5c 6e 22 2c 73 70 63 6e 74 2c 22 22 29  ere\n",spcnt,"")
cc80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
cc90: 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25 2a  printf(err,"\n%*
cca0: 73 68 65 72 65 20 2d 2d 5e 5c 6e 22 2c 73 70 63  shere --^\n",spc
ccb0: 6e 74 2d 37 2c 22 22 29 3b 0a 20 20 7d 0a 7d 0a  nt-7,"");.  }.}.
ccc0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
ccd0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 4e  e index of the N
cce0: 2d 74 68 20 6e 6f 6e 2d 73 77 69 74 63 68 20 61  -th non-switch a
ccf0: 72 67 75 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  rgument.  Return
cd00: 20 2d 31 0a 2a 2a 20 69 66 20 4e 20 69 73 20 6f   -1.** if N is o
cd10: 75 74 20 6f 66 20 72 61 6e 67 65 2e 0a 2a 2f 0a  ut of range..*/.
cd20: 73 74 61 74 69 63 20 69 6e 74 20 61 72 67 69 6e  static int argin
cd30: 64 65 78 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a  dex(n).int n;.{.
cd40: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 64    int i;.  int d
cd50: 61 73 68 64 61 73 68 20 3d 20 30 3b 0a 20 20 69  ashdash = 0;.  i
cd60: 66 28 20 61 72 67 76 21 3d 30 20 26 26 20 2a 61  f( argv!=0 && *a
cd70: 72 67 76 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f  rgv!=0 ){.    fo
cd80: 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20  r(i=1; argv[i]; 
cd90: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
cda0: 64 61 73 68 64 61 73 68 20 7c 7c 20 21 49 53 4f  dashdash || !ISO
cdb0: 50 54 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20  PT(argv[i]) ){. 
cdc0: 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20         if( n==0 
cdd0: 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20  ) return i;.    
cde0: 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d      n--;.      }
cdf0: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
ce00: 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d  p(argv[i],"--")=
ce10: 3d 30 20 29 20 64 61 73 68 64 61 73 68 20 3d 20  =0 ) dashdash = 
ce20: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
ce30: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 73 74 61  eturn -1;.}..sta
ce40: 74 69 63 20 63 68 61 72 20 65 6d 73 67 5b 5d 20  tic char emsg[] 
ce50: 3d 20 22 43 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  = "Command line 
ce60: 73 79 6e 74 61 78 20 65 72 72 6f 72 3a 20 22 3b  syntax error: ";
ce70: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20  ../*.** Process 
ce80: 61 20 66 6c 61 67 20 63 6f 6d 6d 61 6e 64 20 6c  a flag command l
ce90: 69 6e 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ine argument..*/
cea0: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 6e 64  .static int hand
ceb0: 6c 65 66 6c 61 67 73 28 69 2c 65 72 72 29 0a 69  leflags(i,err).i
cec0: 6e 74 20 69 3b 0a 46 49 4c 45 20 2a 65 72 72 3b  nt i;.FILE *err;
ced0: 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20 69 6e  .{.  int v;.  in
cee0: 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20  t errcnt = 0;.  
cef0: 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30  int j;.  for(j=0
cf00: 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a  ; op[j].label; j
cf10: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
cf20: 6e 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b 31 5d  ncmp(&argv[i][1]
cf30: 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 73 74 72  ,op[j].label,str
cf40: 6c 65 6e 28 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29  len(op[j].label)
cf50: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
cf60: 7d 0a 20 20 76 20 3d 20 61 72 67 76 5b 69 5d 5b  }.  v = argv[i][
cf70: 30 5d 3d 3d 27 2d 27 20 3f 20 31 20 3a 20 30 3b  0]=='-' ? 1 : 0;
cf80: 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62  .  if( op[j].lab
cf90: 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  el==0 ){.    if(
cfa0: 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70   err ){.      fp
cfb0: 72 69 6e 74 66 28 65 72 72 2c 22 25 73 75 6e 64  rintf(err,"%sund
cfc0: 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e  efined option.\n
cfd0: 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65  ",emsg);.      e
cfe0: 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29 3b  rrline(i,1,err);
cff0: 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e  .    }.    errcn
d000: 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  t++;.  }else if(
d010: 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54   op[j].type==OPT
d020: 5f 46 4c 41 47 20 29 7b 0a 20 20 20 20 2a 28 28  _FLAG ){.    *((
d030: 69 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72 67 29 20  int*)op[j].arg) 
d040: 3d 20 76 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = v;.  }else if(
d050: 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54   op[j].type==OPT
d060: 5f 46 46 4c 41 47 20 29 7b 0a 20 20 20 20 28 2a  _FFLAG ){.    (*
d070: 28 76 6f 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a  (void(*)())(op[j
d080: 5d 2e 61 72 67 29 29 28 76 29 3b 0a 20 20 7d 65  ].arg))(v);.  }e
d090: 6c 73 65 20 69 66 28 20 6f 70 5b 6a 5d 2e 74 79  lse if( op[j].ty
d0a0: 70 65 3d 3d 4f 50 54 5f 46 53 54 52 20 29 7b 0a  pe==OPT_FSTR ){.
d0b0: 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 29      (*(void(*)()
d0c0: 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 26 61  )(op[j].arg))(&a
d0d0: 72 67 76 5b 69 5d 5b 32 5d 29 3b 0a 20 20 7d 65  rgv[i][2]);.  }e
d0e0: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 65 72 72  lse{.    if( err
d0f0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
d100: 66 28 65 72 72 2c 22 25 73 6d 69 73 73 69 6e 67  f(err,"%smissing
d110: 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 73 77 69   argument on swi
d120: 74 63 68 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20  tch.\n",emsg);. 
d130: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 31       errline(i,1
d140: 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ,err);.    }.   
d150: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20   errcnt++;.  }. 
d160: 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a   return errcnt;.
d170: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73  }../*.** Process
d180: 20 61 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20   a command line 
d190: 73 77 69 74 63 68 20 77 68 69 63 68 20 68 61 73  switch which has
d1a0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f   an argument..*/
d1b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 6e 64  .static int hand
d1c0: 6c 65 73 77 69 74 63 68 28 69 2c 65 72 72 29 0a  leswitch(i,err).
d1d0: 69 6e 74 20 69 3b 0a 46 49 4c 45 20 2a 65 72 72  int i;.FILE *err
d1e0: 3b 0a 7b 0a 20 20 69 6e 74 20 6c 76 20 3d 20 30  ;.{.  int lv = 0
d1f0: 3b 0a 20 20 64 6f 75 62 6c 65 20 64 76 20 3d 20  ;.  double dv = 
d200: 30 2e 30 3b 0a 20 20 63 68 61 72 20 2a 73 76 20  0.0;.  char *sv 
d210: 3d 20 30 2c 20 2a 65 6e 64 3b 0a 20 20 63 68 61  = 0, *end;.  cha
d220: 72 20 2a 63 70 3b 0a 20 20 69 6e 74 20 6a 3b 0a  r *cp;.  int j;.
d230: 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d 20 30    int errcnt = 0
d240: 3b 0a 20 20 63 70 20 3d 20 73 74 72 63 68 72 28  ;.  cp = strchr(
d250: 61 72 67 76 5b 69 5d 2c 27 3d 27 29 3b 0a 20 20  argv[i],'=');.  
d260: 61 73 73 65 72 74 28 20 63 70 21 3d 30 20 29 3b  assert( cp!=0 );
d270: 0a 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 66 6f  .  *cp = 0;.  fo
d280: 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62  r(j=0; op[j].lab
d290: 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  el; j++){.    if
d2a0: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d  ( strcmp(argv[i]
d2b0: 2c 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d 3d 30  ,op[j].label)==0
d2c0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
d2d0: 2a 63 70 20 3d 20 27 3d 27 3b 0a 20 20 69 66 28  *cp = '=';.  if(
d2e0: 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20   op[j].label==0 
d2f0: 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20 29  ){.    if( err )
d300: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
d310: 65 72 72 2c 22 25 73 75 6e 64 65 66 69 6e 65 64  err,"%sundefined
d320: 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67   option.\n",emsg
d330: 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e 65  );.      errline
d340: 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20 20 7d  (i,0,err);.    }
d350: 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20  .    errcnt++;. 
d360: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 70 2b 2b   }else{.    cp++
d370: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70  ;.    switch( op
d380: 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20  [j].type ){.    
d390: 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a    case OPT_FLAG:
d3a0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
d3b0: 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 69  FFLAG:.        i
d3c0: 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
d3d0: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c      fprintf(err,
d3e0: 22 25 73 6f 70 74 69 6f 6e 20 72 65 71 75 69 72  "%soption requir
d3f0: 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 5c  es an argument.\
d400: 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20  n",emsg);.      
d410: 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c      errline(i,0,
d420: 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  err);.        }.
d430: 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b          errcnt++
d440: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
d450: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
d460: 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20  DBL:.      case 
d470: 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20  OPT_FDBL:.      
d480: 20 20 64 76 20 3d 20 73 74 72 74 6f 64 28 63 70    dv = strtod(cp
d490: 2c 26 65 6e 64 29 3b 0a 20 20 20 20 20 20 20 20  ,&end);.        
d4a0: 69 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20  if( *end ){.    
d4b0: 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b        if( err ){
d4c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72  .            fpr
d4d0: 69 6e 74 66 28 65 72 72 2c 22 25 73 69 6c 6c 65  intf(err,"%sille
d4e0: 67 61 6c 20 63 68 61 72 61 63 74 65 72 20 69 6e  gal character in
d4f0: 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20   floating-point 
d500: 61 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73  argument.\n",ems
d510: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
d520: 65 72 72 6c 69 6e 65 28 69 2c 28 28 75 6e 73 69  errline(i,((unsi
d530: 67 6e 65 64 20 6c 6f 6e 67 29 65 6e 64 29 2d 28  gned long)end)-(
d540: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 61 72  unsigned long)ar
d550: 67 76 5b 69 5d 2c 65 72 72 29 3b 0a 20 20 20 20  gv[i],err);.    
d560: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d570: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20    errcnt++;.    
d580: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
d590: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
d5a0: 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63  OPT_INT:.      c
d5b0: 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20  ase OPT_FINT:.  
d5c0: 20 20 20 20 20 20 6c 76 20 3d 20 73 74 72 74 6f        lv = strto
d5d0: 6c 28 63 70 2c 26 65 6e 64 2c 30 29 3b 0a 20 20  l(cp,&end,0);.  
d5e0: 20 20 20 20 20 20 69 66 28 20 2a 65 6e 64 20 29        if( *end )
d5f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
d600: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  err ){.         
d610: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
d620: 25 73 69 6c 6c 65 67 61 6c 20 63 68 61 72 61 63  %sillegal charac
d630: 74 65 72 20 69 6e 20 69 6e 74 65 67 65 72 20 61  ter in integer a
d640: 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67  rgument.\n",emsg
d650: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  );.            e
d660: 72 72 6c 69 6e 65 28 69 2c 28 28 75 6e 73 69 67  rrline(i,((unsig
d670: 6e 65 64 20 6c 6f 6e 67 29 65 6e 64 29 2d 28 75  ned long)end)-(u
d680: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 61 72 67  nsigned long)arg
d690: 76 5b 69 5d 2c 65 72 72 29 3b 0a 20 20 20 20 20  v[i],err);.     
d6a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d6b0: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20   errcnt++;.     
d6c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
d6d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
d6e0: 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61  PT_STR:.      ca
d6f0: 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20  se OPT_FSTR:.   
d700: 20 20 20 20 20 73 76 20 3d 20 63 70 3b 0a 20 20       sv = cp;.  
d710: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d720: 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f   }.    switch( o
d730: 70 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20  p[j].type ){.   
d740: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47     case OPT_FLAG
d750: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
d760: 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20  _FFLAG:.        
d770: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
d780: 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20  e OPT_DBL:.     
d790: 20 20 20 2a 28 64 6f 75 62 6c 65 2a 29 28 6f 70     *(double*)(op
d7a0: 5b 6a 5d 2e 61 72 67 29 20 3d 20 64 76 3b 0a 20  [j].arg) = dv;. 
d7b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d7c0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42      case OPT_FDB
d7d0: 4c 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76 6f  L:.        (*(vo
d7e0: 69 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61  id(*)())(op[j].a
d7f0: 72 67 29 29 28 64 76 29 3b 0a 20 20 20 20 20 20  rg))(dv);.      
d800: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
d810: 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20  ase OPT_INT:.   
d820: 20 20 20 20 20 2a 28 69 6e 74 2a 29 28 6f 70 5b       *(int*)(op[
d830: 6a 5d 2e 61 72 67 29 20 3d 20 6c 76 3b 0a 20 20  j].arg) = lv;.  
d840: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d850: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54     case OPT_FINT
d860: 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69  :.        (*(voi
d870: 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72  d(*)())(op[j].ar
d880: 67 29 29 28 28 69 6e 74 29 6c 76 29 3b 0a 20 20  g))((int)lv);.  
d890: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d8a0: 20 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a     case OPT_STR:
d8b0: 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a  .        *(char*
d8c0: 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20  *)(op[j].arg) = 
d8d0: 73 76 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  sv;.        brea
d8e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
d8f0: 54 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20  T_FSTR:.        
d900: 28 2a 28 76 6f 69 64 28 2a 29 28 29 29 28 6f 70  (*(void(*)())(op
d910: 5b 6a 5d 2e 61 72 67 29 29 28 73 76 29 3b 0a 20  [j].arg))(sv);. 
d920: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d930: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
d940: 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 69 6e 74 20   errcnt;.}..int 
d950: 4f 70 74 49 6e 69 74 28 61 2c 6f 2c 65 72 72 29  OptInit(a,o,err)
d960: 0a 63 68 61 72 20 2a 2a 61 3b 0a 73 74 72 75 63  .char **a;.struc
d970: 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f 3b 0a  t s_options *o;.
d980: 46 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69  FILE *err;.{.  i
d990: 6e 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20  nt errcnt = 0;. 
d9a0: 20 61 72 67 76 20 3d 20 61 3b 0a 20 20 6f 70 20   argv = a;.  op 
d9b0: 3d 20 6f 3b 0a 20 20 65 72 72 73 74 72 65 61 6d  = o;.  errstream
d9c0: 20 3d 20 65 72 72 3b 0a 20 20 69 66 28 20 61 72   = err;.  if( ar
d9d0: 67 76 20 26 26 20 2a 61 72 67 76 20 26 26 20 6f  gv && *argv && o
d9e0: 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  p ){.    int i;.
d9f0: 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67      for(i=1; arg
da00: 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  v[i]; i++){.    
da10: 20 20 69 66 28 20 61 72 67 76 5b 69 5d 5b 30 5d    if( argv[i][0]
da20: 3d 3d 27 2b 27 20 7c 7c 20 61 72 67 76 5b 69 5d  =='+' || argv[i]
da30: 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
da40: 20 20 20 20 65 72 72 63 6e 74 20 2b 3d 20 68 61      errcnt += ha
da50: 6e 64 6c 65 66 6c 61 67 73 28 69 2c 65 72 72 29  ndleflags(i,err)
da60: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
da70: 28 20 73 74 72 63 68 72 28 61 72 67 76 5b 69 5d  ( strchr(argv[i]
da80: 2c 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20  ,'=') ){.       
da90: 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c   errcnt += handl
daa0: 65 73 77 69 74 63 68 28 69 2c 65 72 72 29 3b 0a  eswitch(i,err);.
dab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
dac0: 7d 0a 20 20 69 66 28 20 65 72 72 63 6e 74 3e 30  }.  if( errcnt>0
dad0: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
dae0: 65 72 72 2c 22 56 61 6c 69 64 20 63 6f 6d 6d 61  err,"Valid comma
daf0: 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 20  nd line options 
db00: 66 6f 72 20 5c 22 25 73 5c 22 20 61 72 65 3a 5c  for \"%s\" are:\
db10: 6e 22 2c 2a 61 29 3b 0a 20 20 20 20 4f 70 74 50  n",*a);.    OptP
db20: 72 69 6e 74 28 29 3b 0a 20 20 20 20 65 78 69 74  rint();.    exit
db30: 28 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (1);.  }.  retur
db40: 6e 20 30 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 4e  n 0;.}..int OptN
db50: 41 72 67 73 28 29 7b 0a 20 20 69 6e 74 20 63 6e  Args(){.  int cn
db60: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 64 61 73  t = 0;.  int das
db70: 68 64 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74  hdash = 0;.  int
db80: 20 69 3b 0a 20 20 69 66 28 20 61 72 67 76 21 3d   i;.  if( argv!=
db90: 30 20 26 26 20 61 72 67 76 5b 30 5d 21 3d 30 20  0 && argv[0]!=0 
dba0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  ){.    for(i=1; 
dbb0: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  argv[i]; i++){. 
dbc0: 20 20 20 20 20 69 66 28 20 64 61 73 68 64 61 73       if( dashdas
dbd0: 68 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76  h || !ISOPT(argv
dbe0: 5b 69 5d 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20  [i]) ) cnt++;.  
dbf0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
dc00: 72 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20  rgv[i],"--")==0 
dc10: 29 20 64 61 73 68 64 61 73 68 20 3d 20 31 3b 0a  ) dashdash = 1;.
dc20: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
dc30: 72 6e 20 63 6e 74 3b 0a 7d 0a 0a 63 68 61 72 20  rn cnt;.}..char 
dc40: 2a 4f 70 74 41 72 67 28 6e 29 0a 69 6e 74 20 6e  *OptArg(n).int n
dc50: 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ;.{.  int i;.  i
dc60: 20 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a   = argindex(n);.
dc70: 20 20 72 65 74 75 72 6e 20 69 3e 3d 30 20 3f 20    return i>=0 ? 
dc80: 61 72 67 76 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a  argv[i] : 0;.}..
dc90: 76 6f 69 64 20 4f 70 74 45 72 72 28 6e 29 0a 69  void OptErr(n).i
dca0: 6e 74 20 6e 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b  nt n;.{.  int i;
dcb0: 0a 20 20 69 20 3d 20 61 72 67 69 6e 64 65 78 28  .  i = argindex(
dcc0: 6e 29 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29  n);.  if( i>=0 )
dcd0: 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72   errline(i,0,err
dce0: 73 74 72 65 61 6d 29 3b 0a 7d 0a 0a 76 6f 69 64  stream);.}..void
dcf0: 20 4f 70 74 50 72 69 6e 74 28 29 7b 0a 20 20 69   OptPrint(){.  i
dd00: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6d 61 78 2c  nt i;.  int max,
dd10: 20 6c 65 6e 3b 0a 20 20 6d 61 78 20 3d 20 30 3b   len;.  max = 0;
dd20: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69  .  for(i=0; op[i
dd30: 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20  ].label; i++){. 
dd40: 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28     len = strlen(
dd50: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 20 2b 20 31  op[i].label) + 1
dd60: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70  ;.    switch( op
dd70: 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20  [i].type ){.    
dd80: 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a    case OPT_FLAG:
dd90: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
dda0: 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 62  FFLAG:.        b
ddb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
ddc0: 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20   OPT_INT:.      
ddd0: 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20  case OPT_FINT:. 
dde0: 20 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 39 3b         len += 9;
ddf0: 20 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68         /* length
de00: 20 6f 66 20 22 3c 69 6e 74 65 67 65 72 3e 22 20   of "<integer>" 
de10: 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  */.        break
de20: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
de30: 5f 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65  _DBL:.      case
de40: 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20   OPT_FDBL:.     
de50: 20 20 20 6c 65 6e 20 2b 3d 20 36 3b 20 20 20 20     len += 6;    
de60: 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20     /* length of 
de70: 22 3c 72 65 61 6c 3e 22 20 2a 2f 0a 20 20 20 20  "<real>" */.    
de80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
de90: 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20   case OPT_STR:. 
dea0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53       case OPT_FS
deb0: 54 52 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20  TR:.        len 
dec0: 2b 3d 20 38 3b 20 20 20 20 20 20 20 2f 2a 20 6c  += 8;       /* l
ded0: 65 6e 67 74 68 20 6f 66 20 22 3c 73 74 72 69 6e  ength of "<strin
dee0: 67 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62  g>" */.        b
def0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
df00: 69 66 28 20 6c 65 6e 3e 6d 61 78 20 29 20 6d 61  if( len>max ) ma
df10: 78 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 66  x = len;.  }.  f
df20: 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61  or(i=0; op[i].la
df30: 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  bel; i++){.    s
df40: 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70  witch( op[i].typ
df50: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
df60: 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20  OPT_FLAG:.      
df70: 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a  case OPT_FFLAG:.
df80: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
df90: 65 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 2d  errstream,"  -%-
dfa0: 2a 73 20 20 25 73 5c 6e 22 2c 6d 61 78 2c 6f 70  *s  %s\n",max,op
dfb0: 5b 69 5d 2e 6c 61 62 65 6c 2c 6f 70 5b 69 5d 2e  [i].label,op[i].
dfc0: 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20  message);.      
dfd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
dfe0: 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20  ase OPT_INT:.   
dff0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54     case OPT_FINT
e000: 3a 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  :.        fprint
e010: 66 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 25  f(errstream,"  %
e020: 73 3d 3c 69 6e 74 65 67 65 72 3e 25 2a 73 20 20  s=<integer>%*s  
e030: 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65  %s\n",op[i].labe
e040: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e  l,.          (in
e050: 74 29 28 6d 61 78 2d 73 74 72 6c 65 6e 28 6f 70  t)(max-strlen(op
e060: 5b 69 5d 2e 6c 61 62 65 6c 29 2d 39 29 2c 22 22  [i].label)-9),""
e070: 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b  ,op[i].message);
e080: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e090: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44        case OPT_D
e0a0: 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  BL:.      case O
e0b0: 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20  PT_FDBL:.       
e0c0: 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65   fprintf(errstre
e0d0: 61 6d 2c 22 20 20 25 73 3d 3c 72 65 61 6c 3e 25  am,"  %s=<real>%
e0e0: 2a 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e  *s  %s\n",op[i].
e0f0: 6c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20  label,.         
e100: 20 28 69 6e 74 29 28 6d 61 78 2d 73 74 72 6c 65   (int)(max-strle
e110: 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 36  n(op[i].label)-6
e120: 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61  ),"",op[i].messa
e130: 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  ge);.        bre
e140: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
e150: 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61  PT_STR:.      ca
e160: 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20  se OPT_FSTR:.   
e170: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
e180: 73 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 73 74  stream,"  %s=<st
e190: 72 69 6e 67 3e 25 2a 73 20 20 25 73 5c 6e 22 2c  ring>%*s  %s\n",
e1a0: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20  op[i].label,.   
e1b0: 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78         (int)(max
e1c0: 2d 73 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61  -strlen(op[i].la
e1d0: 62 65 6c 29 2d 38 29 2c 22 22 2c 6f 70 5b 69 5d  bel)-8),"",op[i]
e1e0: 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20  .message);.     
e1f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e200: 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a    }.}./*********
e210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
e220: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 61  rom the file "pa
e230: 72 73 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  rse.c" *********
e240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e250: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74  ***/./*.** Input
e260: 20 66 69 6c 65 20 70 61 72 73 65 72 20 66 6f 72   file parser for
e270: 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
e280: 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
e290: 0a 2f 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66  ./* The state of
e2a0: 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 73   the parser */.s
e2b0: 74 72 75 63 74 20 70 73 74 61 74 65 20 7b 0a 20  truct pstate {. 
e2c0: 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b   char *filename;
e2d0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
e2e0: 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
e2f0: 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 6b 65 6e 6c   */.  int tokenl
e300: 69 6e 65 6e 6f 3b 20 20 20 20 20 20 2f 2a 20 4c  ineno;      /* L
e310: 69 6e 65 6e 75 6d 62 65 72 20 61 74 20 77 68 69  inenumber at whi
e320: 63 68 20 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e  ch current token
e330: 20 73 74 61 72 74 73 20 2a 2f 0a 20 20 69 6e 74   starts */.  int
e340: 20 65 72 72 6f 72 63 6e 74 3b 20 20 20 20 20 20   errorcnt;      
e350: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
e360: 65 72 72 6f 72 73 20 73 6f 20 66 61 72 20 2a 2f  errors so far */
e370: 0a 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 73 74  .  char *tokenst
e380: 61 72 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74  art;     /* Text
e390: 20 6f 66 20 63 75 72 72 65 6e 74 20 74 6f 6b 65   of current toke
e3a0: 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 65  n */.  struct le
e3b0: 6d 6f 6e 20 2a 67 70 3b 20 20 20 20 20 2f 2a 20  mon *gp;     /* 
e3c0: 47 6c 6f 62 61 6c 20 73 74 61 74 65 20 76 65 63  Global state vec
e3d0: 74 6f 72 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f  tor */.  enum e_
e3e0: 73 74 61 74 65 20 7b 0a 20 20 20 20 49 4e 49 54  state {.    INIT
e3f0: 49 41 4c 49 5a 45 2c 0a 20 20 20 20 57 41 49 54  IALIZE,.    WAIT
e400: 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
e410: 52 55 4c 45 2c 0a 20 20 20 20 57 41 49 54 49 4e  RULE,.    WAITIN
e420: 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f  G_FOR_DECL_KEYWO
e430: 52 44 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f  RD,.    WAITING_
e440: 46 4f 52 5f 44 45 43 4c 5f 41 52 47 2c 0a 20 20  FOR_DECL_ARG,.  
e450: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52    WAITING_FOR_PR
e460: 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 2c  ECEDENCE_SYMBOL,
e470: 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  .    WAITING_FOR
e480: 5f 41 52 52 4f 57 2c 0a 20 20 20 20 49 4e 5f 52  _ARROW,.    IN_R
e490: 48 53 2c 0a 20 20 20 20 4c 48 53 5f 41 4c 49 41  HS,.    LHS_ALIA
e4a0: 53 5f 31 2c 0a 20 20 20 20 4c 48 53 5f 41 4c 49  S_1,.    LHS_ALI
e4b0: 41 53 5f 32 2c 0a 20 20 20 20 4c 48 53 5f 41 4c  AS_2,.    LHS_AL
e4c0: 49 41 53 5f 33 2c 0a 20 20 20 20 52 48 53 5f 41  IAS_3,.    RHS_A
e4d0: 4c 49 41 53 5f 31 2c 0a 20 20 20 20 52 48 53 5f  LIAS_1,.    RHS_
e4e0: 41 4c 49 41 53 5f 32 2c 0a 20 20 20 20 50 52 45  ALIAS_2,.    PRE
e4f0: 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 2c 0a  CEDENCE_MARK_1,.
e500: 20 20 20 20 50 52 45 43 45 44 45 4e 43 45 5f 4d      PRECEDENCE_M
e510: 41 52 4b 5f 32 2c 0a 20 20 20 20 52 45 53 59 4e  ARK_2,.    RESYN
e520: 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
e530: 4f 52 2c 0a 20 20 20 20 52 45 53 59 4e 43 5f 41  OR,.    RESYNC_A
e540: 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 2c  FTER_DECL_ERROR,
e550: 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52  .    WAITING_FOR
e560: 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d 42  _DESTRUCTOR_SYMB
e570: 4f 4c 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f  OL,.    WAITING_
e580: 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d  FOR_DATATYPE_SYM
e590: 42 4f 4c 2c 0a 20 20 20 20 57 41 49 54 49 4e 47  BOL,.    WAITING
e5a0: 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44  _FOR_FALLBACK_ID
e5b0: 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f  ,.    WAITING_FO
e5c0: 52 5f 57 49 4c 44 43 41 52 44 5f 49 44 0a 20 20  R_WILDCARD_ID.  
e5d0: 7d 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  } state;        
e5e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
e5f0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
e600: 61 72 73 65 72 20 2a 2f 0a 20 20 73 74 72 75 63  arser */.  struc
e610: 74 20 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61  t symbol *fallba
e620: 63 6b 3b 20 20 20 2f 2a 20 54 68 65 20 66 61 6c  ck;   /* The fal
e630: 6c 62 61 63 6b 20 74 6f 6b 65 6e 20 2a 2f 0a 20  lback token */. 
e640: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
e650: 6c 68 73 3b 20 20 20 20 20 20 20 20 2f 2a 20 4c  lhs;        /* L
e660: 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  eft-hand side of
e670: 20 63 75 72 72 65 6e 74 20 72 75 6c 65 20 2a 2f   current rule */
e680: 0a 20 20 63 68 61 72 20 2a 6c 68 73 61 6c 69 61  .  char *lhsalia
e690: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  s;            /*
e6a0: 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c   Alias for the L
e6b0: 48 53 20 2a 2f 0a 20 20 69 6e 74 20 6e 72 68 73  HS */.  int nrhs
e6c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e6d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
e6e0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
e6f0: 73 79 6d 62 6f 6c 73 20 73 65 65 6e 20 2a 2f 0a  symbols seen */.
e700: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
e710: 2a 72 68 73 5b 4d 41 58 52 48 53 5d 3b 20 20 2f  *rhs[MAXRHS];  /
e720: 2a 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 2a 2f  * RHS symbols */
e730: 0a 20 20 63 68 61 72 20 2a 61 6c 69 61 73 5b 4d  .  char *alias[M
e740: 41 58 52 48 53 5d 3b 20 20 20 20 20 20 20 2f 2a  AXRHS];       /*
e750: 20 41 6c 69 61 73 65 73 20 66 6f 72 20 65 61 63   Aliases for eac
e760: 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28 6f 72  h RHS symbol (or
e770: 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73 74 72 75   NULL) */.  stru
e780: 63 74 20 72 75 6c 65 20 2a 70 72 65 76 72 75 6c  ct rule *prevrul
e790: 65 3b 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f  e;     /* Previo
e7a0: 75 73 20 72 75 6c 65 20 70 61 72 73 65 64 20 2a  us rule parsed *
e7b0: 2f 0a 20 20 63 68 61 72 20 2a 64 65 63 6c 6b 65  /.  char *declke
e7c0: 79 77 6f 72 64 3b 20 20 20 20 20 20 20 20 20 2f  yword;         /
e7d0: 2a 20 4b 65 79 77 6f 72 64 20 6f 66 20 61 20 64  * Keyword of a d
e7e0: 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  eclaration */.  
e7f0: 63 68 61 72 20 2a 2a 64 65 63 6c 61 72 67 73 6c  char **declargsl
e800: 6f 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ot;        /* Wh
e810: 65 72 65 20 74 68 65 20 64 65 63 6c 61 72 61 74  ere the declarat
e820: 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  ion argument sho
e830: 75 6c 64 20 62 65 20 70 75 74 20 2a 2f 0a 20 20  uld be put */.  
e840: 69 6e 74 20 69 6e 73 65 72 74 4c 69 6e 65 4d 61  int insertLineMa
e850: 63 72 6f 3b 20 20 20 20 20 20 20 2f 2a 20 41 64  cro;       /* Ad
e860: 64 20 23 6c 69 6e 65 20 62 65 66 6f 72 65 20 64  d #line before d
e870: 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e 73 65 72  eclaration inser
e880: 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 64 65 63 6c  t */.  int *decl
e890: 6c 69 6e 65 6e 6f 73 6c 6f 74 3b 20 20 20 20 20  linenoslot;     
e8a0: 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72    /* Where to wr
e8b0: 69 74 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ite declaration 
e8c0: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  line number */. 
e8d0: 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 64 65   enum e_assoc de
e8e0: 63 6c 61 73 73 6f 63 3b 20 20 20 20 2f 2a 20 41  classoc;    /* A
e8f0: 73 73 69 67 6e 20 74 68 69 73 20 61 73 73 6f 63  ssign this assoc
e900: 69 61 74 69 6f 6e 20 74 6f 20 64 65 63 6c 20 61  iation to decl a
e910: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 6e  rguments */.  in
e920: 74 20 70 72 65 63 63 6f 75 6e 74 65 72 3b 20 20  t preccounter;  
e930: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 69           /* Assi
e940: 67 6e 20 74 68 69 73 20 70 72 65 63 65 64 65 6e  gn this preceden
e950: 63 65 20 74 6f 20 64 65 63 6c 20 61 72 67 75 6d  ce to decl argum
e960: 65 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  ents */.  struct
e970: 20 72 75 6c 65 20 2a 66 69 72 73 74 72 75 6c 65   rule *firstrule
e980: 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ;    /* Pointer 
e990: 74 6f 20 66 69 72 73 74 20 72 75 6c 65 20 69 6e  to first rule in
e9a0: 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a   the grammar */.
e9b0: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 6c    struct rule *l
e9c0: 61 73 74 72 75 6c 65 3b 20 20 20 20 20 2f 2a 20  astrule;     /* 
e9d0: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6d  Pointer to the m
e9e0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70 61 72  ost recently par
e9f0: 73 65 64 20 72 75 6c 65 20 2a 2f 0a 7d 3b 0a 0a  sed rule */.};..
ea00: 2f 2a 20 50 61 72 73 65 20 61 20 73 69 6e 67 6c  /* Parse a singl
ea10: 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73 74 61 74 69  e token */.stati
ea20: 63 20 76 6f 69 64 20 70 61 72 73 65 6f 6e 65 74  c void parseonet
ea30: 6f 6b 65 6e 28 70 73 70 29 0a 73 74 72 75 63 74  oken(psp).struct
ea40: 20 70 73 74 61 74 65 20 2a 70 73 70 3b 0a 7b 0a   pstate *psp;.{.
ea50: 20 20 63 68 61 72 20 2a 78 3b 0a 20 20 78 20 3d    char *x;.  x =
ea60: 20 53 74 72 73 61 66 65 28 70 73 70 2d 3e 74 6f   Strsafe(psp->to
ea70: 6b 65 6e 73 74 61 72 74 29 3b 20 20 20 20 20 2f  kenstart);     /
ea80: 2a 20 53 61 76 65 20 74 68 65 20 74 6f 6b 65 6e  * Save the token
ea90: 20 70 65 72 6d 61 6e 65 6e 74 6c 79 20 2a 2f 0a   permanently */.
eaa0: 23 69 66 20 30 0a 20 20 70 72 69 6e 74 66 28 22  #if 0.  printf("
eab0: 25 73 3a 25 64 3a 20 54 6f 6b 65 6e 3d 5b 25 73  %s:%d: Token=[%s
eac0: 5d 20 73 74 61 74 65 3d 25 64 5c 6e 22 2c 70 73  ] state=%d\n",ps
ead0: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
eae0: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
eaf0: 20 20 78 2c 70 73 70 2d 3e 73 74 61 74 65 29 3b    x,psp->state);
eb00: 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68  .#endif.  switch
eb10: 28 20 70 73 70 2d 3e 73 74 61 74 65 20 29 7b 0a  ( psp->state ){.
eb20: 20 20 20 20 63 61 73 65 20 49 4e 49 54 49 41 4c      case INITIAL
eb30: 49 5a 45 3a 0a 20 20 20 20 20 20 70 73 70 2d 3e  IZE:.      psp->
eb40: 70 72 65 76 72 75 6c 65 20 3d 20 30 3b 0a 20 20  prevrule = 0;.  
eb50: 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75      psp->preccou
eb60: 6e 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  nter = 0;.      
eb70: 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d  psp->firstrule =
eb80: 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d   psp->lastrule =
eb90: 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 67   0;.      psp->g
eba0: 70 2d 3e 6e 72 75 6c 65 20 3d 20 30 3b 0a 20 20  p->nrule = 0;.  
ebb0: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75      /* Fall thru
ebc0: 20 74 6f 20 6e 65 78 74 20 63 61 73 65 20 2a 2f   to next case */
ebd0: 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
ebe0: 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
ebf0: 4c 45 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b  LE:.      if( x[
ec00: 30 5d 3d 3d 27 25 27 20 29 7b 0a 20 20 20 20 20  0]=='%' ){.     
ec10: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
ec20: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
ec30: 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20 20  _KEYWORD;.      
ec40: 7d 65 6c 73 65 20 69 66 28 20 69 73 6c 6f 77 65  }else if( islowe
ec50: 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  r(x[0]) ){.     
ec60: 20 20 20 70 73 70 2d 3e 6c 68 73 20 3d 20 53 79     psp->lhs = Sy
ec70: 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
ec80: 20 20 20 20 20 70 73 70 2d 3e 6e 72 68 73 20 3d       psp->nrhs =
ec90: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   0;.        psp-
eca0: 3e 6c 68 73 61 6c 69 61 73 20 3d 20 30 3b 0a 20  >lhsalias = 0;. 
ecb0: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
ecc0: 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
ecd0: 41 52 52 4f 57 3b 0a 20 20 20 20 20 20 7d 65 6c  ARROW;.      }el
ece0: 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 7b 27  se if( x[0]=='{'
ecf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
ed00: 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30  psp->prevrule==0
ed10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72   ){.          Er
ed20: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
ed30: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
ed40: 69 6e 65 6e 6f 2c 0a 22 54 68 65 72 65 20 69 73  ineno,."There is
ed50: 20 6e 6f 74 20 70 72 69 6f 72 20 72 75 6c 65 20   not prior rule 
ed60: 6f 70 6f 6e 20 77 68 69 63 68 20 74 6f 20 61 74  opon which to at
ed70: 74 61 63 68 20 74 68 65 20 63 6f 64 65 20 5c 0a  tach the code \.
ed80: 66 72 61 67 6d 65 6e 74 20 77 68 69 63 68 20 62  fragment which b
ed90: 65 67 69 6e 73 20 6f 6e 20 74 68 69 73 20 6c 69  egins on this li
eda0: 6e 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ne.");.         
edb0: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
edc0: 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 70 73 70  ;..}else if( psp
edd0: 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64 65  ->prevrule->code
ede0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
edf0: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
ee00: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
ee10: 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 6f 64 65 20  enlineno,."Code 
ee20: 66 72 61 67 6d 65 6e 74 20 62 65 67 69 6e 6e 69  fragment beginni
ee30: 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20  ng on this line 
ee40: 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  is not the first
ee50: 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65   \.to follow the
ee60: 20 70 72 65 76 69 6f 75 73 20 72 75 6c 65 2e 22   previous rule."
ee70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
ee80: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
ee90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
eea0: 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76         psp->prev
eeb0: 72 75 6c 65 2d 3e 6c 69 6e 65 20 3d 20 70 73 70  rule->line = psp
eec0: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20  ->tokenlineno;. 
eed0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
eee0: 65 76 72 75 6c 65 2d 3e 63 6f 64 65 20 3d 20 26  evrule->code = &
eef0: 78 5b 31 5d 3b 0a 09 7d 0a 20 20 20 20 20 20 7d  x[1];..}.      }
ef00: 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27  else if( x[0]=='
ef10: 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  [' ){.        ps
ef20: 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43 45  p->state = PRECE
ef30: 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3b 0a 20 20  DENCE_MARK_1;.  
ef40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ef50: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
ef60: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
ef70: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
ef80: 20 20 20 20 20 20 22 54 6f 6b 65 6e 20 5c 22 25        "Token \"%
ef90: 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 65 69  s\" should be ei
efa0: 74 68 65 72 20 5c 22 25 25 5c 22 20 6f 72 20 61  ther \"%%\" or a
efb0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6e 61 6d   nonterminal nam
efc0: 65 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78  e.",.          x
efd0: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
efe0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
eff0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
f000: 0a 20 20 20 20 63 61 73 65 20 50 52 45 43 45 44  .    case PRECED
f010: 45 4e 43 45 5f 4d 41 52 4b 5f 31 3a 0a 20 20 20  ENCE_MARK_1:.   
f020: 20 20 20 69 66 28 20 21 69 73 75 70 70 65 72 28     if( !isupper(
f030: 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
f040: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
f050: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
f060: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
f070: 20 20 20 20 22 54 68 65 20 70 72 65 63 65 64 65      "The precede
f080: 6e 63 65 20 73 79 6d 62 6f 6c 20 6d 75 73 74 20  nce symbol must 
f090: 62 65 20 61 20 74 65 72 6d 69 6e 61 6c 2e 22 29  be a terminal.")
f0a0: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
f0b0: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
f0c0: 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e   }else if( psp->
f0d0: 70 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a 20  prevrule==0 ){. 
f0e0: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
f0f0: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
f100: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
f110: 20 20 20 20 20 20 20 20 20 20 22 54 68 65 72 65            "There
f120: 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c   is no prior rul
f130: 65 20 74 6f 20 61 73 73 69 67 6e 20 70 72 65 63  e to assign prec
f140: 65 64 65 6e 63 65 20 5c 22 5b 25 73 5d 5c 22 2e  edence \"[%s]\".
f150: 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ",x);.        ps
f160: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
f170: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
f180: 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72  sp->prevrule->pr
f190: 65 63 73 79 6d 21 3d 30 20 29 7b 0a 20 20 20 20  ecsym!=0 ){.    
f1a0: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
f1b0: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
f1c0: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 50 72  tokenlineno,."Pr
f1d0: 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 20 6f 6e  ecedence mark on
f1e0: 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f   this line is no
f1f0: 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f  t the first \.to
f200: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76   follow the prev
f210: 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20  ious rule.");.  
f220: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
f230: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  cnt++;.      }el
f240: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  se{.        psp-
f250: 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63 73  >prevrule->precs
f260: 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  ym = Symbol_new(
f270: 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
f280: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50    psp->state = P
f290: 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32  RECEDENCE_MARK_2
f2a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f2b0: 20 20 20 63 61 73 65 20 50 52 45 43 45 44 45 4e     case PRECEDEN
f2c0: 43 45 5f 4d 41 52 4b 5f 32 3a 0a 20 20 20 20 20  CE_MARK_2:.     
f2d0: 20 69 66 28 20 78 5b 30 5d 21 3d 27 5d 27 20 29   if( x[0]!=']' )
f2e0: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
f2f0: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
f300: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
f310: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69  o,.          "Mi
f320: 73 73 69 6e 67 20 5c 22 5d 5c 22 20 6f 6e 20 70  ssing \"]\" on p
f330: 72 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 2e 22  recedence mark."
f340: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
f350: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
f360: 20 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73    }.      psp->s
f370: 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
f380: 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
f390: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f3a0: 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
f3b0: 4f 52 5f 41 52 52 4f 57 3a 0a 20 20 20 20 20 20  OR_ARROW:.      
f3c0: 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26 26  if( x[0]==':' &&
f3d0: 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78 5b   x[1]==':' && x[
f3e0: 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20  2]=='=' ){.     
f3f0: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f400: 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65  IN_RHS;.      }e
f410: 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28  lse if( x[0]=='(
f420: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
f430: 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c  ->state = LHS_AL
f440: 49 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c  IAS_1;.      }el
f450: 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
f460: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
f470: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
f480: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
f490: 45 78 70 65 63 74 65 64 20 74 6f 20 73 65 65 20  Expected to see 
f4a0: 61 20 5c 22 3a 5c 22 20 66 6f 6c 6c 6f 77 69 6e  a \":\" followin
f4b0: 67 20 74 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c  g the LHS symbol
f4c0: 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20   \"%s\".",.     
f4d0: 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e       psp->lhs->n
f4e0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ame);.        ps
f4f0: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
f500: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
f510: 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
f520: 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20  _RULE_ERROR;.   
f530: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
f540: 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41  ;.    case LHS_A
f550: 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66  LIAS_1:.      if
f560: 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20  ( isalpha(x[0]) 
f570: 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
f580: 6c 68 73 61 6c 69 61 73 20 3d 20 78 3b 0a 20 20  lhsalias = x;.  
f590: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
f5a0: 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3b 0a   = LHS_ALIAS_2;.
f5b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
f5c0: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
f5d0: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
f5e0: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
f5f0: 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20          "\"%s\" 
f600: 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61  is not a valid a
f610: 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53  lias for the LHS
f620: 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20   \"%s\"\n",.    
f630: 20 20 20 20 20 20 78 2c 70 73 70 2d 3e 6c 68 73        x,psp->lhs
f640: 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
f650: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
f660: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
f670: 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
f680: 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
f690: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
f6a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48  eak;.    case LH
f6b0: 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20  S_ALIAS_2:.     
f6c0: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29   if( x[0]==')' )
f6d0: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
f6e0: 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53  tate = LHS_ALIAS
f6f0: 5f 33 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _3;.      }else{
f700: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
f710: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
f720: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
f730: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73  ,.          "Mis
f740: 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f  sing \")\" follo
f750: 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e  wing LHS alias n
f760: 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70  ame \"%s\".",psp
f770: 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->lhsalias);.   
f780: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
f790: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
f7a0: 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
f7b0: 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
f7c0: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
f7d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
f7e0: 65 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3a 0a 20  e LHS_ALIAS_3:. 
f7f0: 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
f800: 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20  :' && x[1]==':' 
f810: 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a  && x[2]=='=' ){.
f820: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
f830: 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20  te = IN_RHS;.   
f840: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f850: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
f860: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
f870: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
f880: 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22       "Missing \"
f890: 2d 3e 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20  ->\" following: 
f8a0: 5c 22 25 73 28 25 73 29 5c 22 2e 22 2c 0a 20 20  \"%s(%s)\".",.  
f8b0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68           psp->lh
f8c0: 73 2d 3e 6e 61 6d 65 2c 70 73 70 2d 3e 6c 68 73  s->name,psp->lhs
f8d0: 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20  alias);.        
f8e0: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
f8f0: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
f900: 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
f910: 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20  ER_RULE_ERROR;. 
f920: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
f930: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 49 4e 5f  ak;.    case IN_
f940: 52 48 53 3a 0a 20 20 20 20 20 20 69 66 28 20 78  RHS:.      if( x
f950: 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]=='.' ){.    
f960: 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65 20      struct rule 
f970: 2a 72 70 3b 0a 20 20 20 20 20 20 20 20 72 70 20  *rp;.        rp 
f980: 3d 20 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a  = (struct rule *
f990: 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )calloc( sizeof(
f9a0: 73 74 72 75 63 74 20 72 75 6c 65 29 20 2b 20 0a  struct rule) + .
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
f9c0: 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
f9d0: 6c 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 20 2b 20  l*)*psp->nrhs + 
f9e0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 73  sizeof(char*)*ps
f9f0: 70 2d 3e 6e 72 68 73 2c 20 31 29 3b 0a 20 20 20  p->nrhs, 1);.   
fa00: 20 20 20 20 20 69 66 28 20 72 70 3d 3d 30 20 29       if( rp==0 )
fa10: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
fa20: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
fa30: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
fa40: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
fa50: 20 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65   "Can't allocate
fa60: 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 66   enough memory f
fa70: 6f 72 20 74 68 69 73 20 72 75 6c 65 2e 22 29 3b  or this rule.");
fa80: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
fa90: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
faa0: 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72        psp->prevr
fab0: 75 6c 65 20 3d 20 30 3b 0a 09 7d 65 6c 73 65 7b  ule = 0;..}else{
fac0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
fad0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
fae0: 72 75 6c 65 6c 69 6e 65 20 3d 20 70 73 70 2d 3e  ruleline = psp->
faf0: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20  tokenlineno;.   
fb00: 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 20 3d         rp->rhs =
fb10: 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a   (struct symbol*
fb20: 2a 29 26 72 70 5b 31 5d 3b 0a 20 20 20 20 20 20  *)&rp[1];.      
fb30: 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73      rp->rhsalias
fb40: 20 3d 20 28 63 68 61 72 2a 2a 29 26 28 72 70 2d   = (char**)&(rp-
fb50: 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 29  >rhs[psp->nrhs])
fb60: 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
fb70: 69 3d 30 3b 20 69 3c 70 73 70 2d 3e 6e 72 68 73  i=0; i<psp->nrhs
fb80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
fb90: 20 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 20 3d      rp->rhs[i] =
fba0: 20 70 73 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20   psp->rhs[i];.  
fbb0: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
fbc0: 73 61 6c 69 61 73 5b 69 5d 20 3d 20 70 73 70 2d  salias[i] = psp-
fbd0: 3e 61 6c 69 61 73 5b 69 5d 3b 0a 09 20 20 7d 0a  >alias[i];..  }.
fbe0: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68            rp->lh
fbf0: 73 20 3d 20 70 73 70 2d 3e 6c 68 73 3b 0a 20 20  s = psp->lhs;.  
fc00: 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 61          rp->lhsa
fc10: 6c 69 61 73 20 3d 20 70 73 70 2d 3e 6c 68 73 61  lias = psp->lhsa
fc20: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
fc30: 72 70 2d 3e 6e 72 68 73 20 3d 20 70 73 70 2d 3e  rp->nrhs = psp->
fc40: 6e 72 68 73 3b 0a 20 20 20 20 20 20 20 20 20 20  nrhs;.          
fc50: 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20 20  rp->code = 0;.  
fc60: 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72 65 63          rp->prec
fc70: 73 79 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  sym = 0;.       
fc80: 20 20 20 72 70 2d 3e 69 6e 64 65 78 20 3d 20 70     rp->index = p
fc90: 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 2b 2b 3b  sp->gp->nrule++;
fca0: 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e  .          rp->n
fcb0: 65 78 74 6c 68 73 20 3d 20 72 70 2d 3e 6c 68 73  extlhs = rp->lhs
fcc0: 2d 3e 72 75 6c 65 3b 0a 20 20 20 20 20 20 20 20  ->rule;.        
fcd0: 20 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65 20    rp->lhs->rule 
fce0: 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20  = rp;.          
fcf0: 72 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  rp->next = 0;.  
fd00: 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d          if( psp-
fd10: 3e 66 69 72 73 74 72 75 6c 65 3d 3d 30 20 29 7b  >firstrule==0 ){
fd20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 73 70  .            psp
fd30: 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d 20 70 73  ->firstrule = ps
fd40: 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72 70  p->lastrule = rp
fd50: 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ;..  }else{.    
fd60: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61 73          psp->las
fd70: 74 72 75 6c 65 2d 3e 6e 65 78 74 20 3d 20 72 70  trule->next = rp
fd80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 73  ;.            ps
fd90: 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 72 70  p->lastrule = rp
fda0: 3b 0a 09 20 20 7d 0a 20 20 20 20 20 20 20 20 20  ;..  }.         
fdb0: 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d   psp->prevrule =
fdc0: 20 72 70 3b 0a 09 7d 0a 20 20 20 20 20 20 20 20   rp;..}.        
fdd0: 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49  psp->state = WAI
fde0: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
fdf0: 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c  _RULE;.      }el
fe00: 73 65 20 69 66 28 20 69 73 61 6c 70 68 61 28 78  se if( isalpha(x
fe10: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
fe20: 69 66 28 20 70 73 70 2d 3e 6e 72 68 73 3e 3d 4d  if( psp->nrhs>=M
fe30: 41 58 52 48 53 20 29 7b 0a 20 20 20 20 20 20 20  AXRHS ){.       
fe40: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
fe50: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
fe60: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
fe70: 20 20 20 20 20 20 20 20 22 54 6f 6f 20 6d 61 6e          "Too man
fe80: 79 20 73 79 6d 62 6f 6c 73 20 6f 6e 20 52 48 53  y symbols on RHS
fe90: 20 6f 66 20 72 75 6c 65 20 62 65 67 69 6e 6e 69   of rule beginni
fea0: 6e 67 20 61 74 20 5c 22 25 73 5c 22 2e 22 2c 0a  ng at \"%s\".",.
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 78 29 3b 0a              x);.
fec0: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65            psp->e
fed0: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
fee0: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
fef0: 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
ff00: 55 4c 45 5f 45 52 52 4f 52 3b 0a 09 7d 65 6c 73  ULE_ERROR;..}els
ff10: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  e{.          psp
ff20: 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d  ->rhs[psp->nrhs]
ff30: 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
ff40: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
ff50: 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73  >alias[psp->nrhs
ff60: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
ff70: 20 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 09 7d   psp->nrhs++;..}
ff80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
ff90: 20 28 78 5b 30 5d 3d 3d 27 7c 27 20 7c 7c 20 78   (x[0]=='|' || x
ffa0: 5b 30 5d 3d 3d 27 2f 27 29 20 26 26 20 70 73 70  [0]=='/') && psp
ffb0: 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20 20 20 20  ->nrhs>0 ){.    
ffc0: 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
ffd0: 6c 20 2a 6d 73 70 20 3d 20 70 73 70 2d 3e 72 68  l *msp = psp->rh
ffe0: 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 3b 0a  s[psp->nrhs-1];.
fff0: 20 20 20 20 20 20 20 20 69 66 28 20 6d 73 70 2d          if( msp-
10000 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54 45 52 4d  >type!=MULTITERM
10010 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
10020 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
10030 2a 6f 72 69 67 73 70 20 3d 20 6d 73 70 3b 0a 20  *origsp = msp;. 
10040 20 20 20 20 20 20 20 20 20 6d 73 70 20 3d 20 63           msp = c
10050 61 6c 6c 6f 63 28 31 2c 73 69 7a 65 6f 66 28 2a  alloc(1,sizeof(*
10060 6d 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20 20  msp));.         
10070 20 6d 65 6d 73 65 74 28 6d 73 70 2c 20 30 2c 20   memset(msp, 0, 
10080 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a 20  sizeof(*msp));. 
10090 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 74 79           msp->ty
100a0 70 65 20 3d 20 4d 55 4c 54 49 54 45 52 4d 49 4e  pe = MULTITERMIN
100b0 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 73  AL;.          ms
100c0 70 2d 3e 6e 73 75 62 73 79 6d 20 3d 20 31 3b 0a  p->nsubsym = 1;.
100d0 20 20 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 73            msp->s
100e0 75 62 73 79 6d 20 3d 20 63 61 6c 6c 6f 63 28 31  ubsym = calloc(1
100f0 2c 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73  ,sizeof(struct s
10100 79 6d 62 6f 6c 2a 29 29 3b 0a 20 20 20 20 20 20  ymbol*));.      
10110 20 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b      msp->subsym[
10120 30 5d 20 3d 20 6f 72 69 67 73 70 3b 0a 20 20 20  0] = origsp;.   
10130 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 61 6d 65         msp->name
10140 20 3d 20 6f 72 69 67 73 70 2d 3e 6e 61 6d 65 3b   = origsp->name;
10150 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10160 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d  rhs[psp->nrhs-1]
10170 20 3d 20 6d 73 70 3b 0a 20 20 20 20 20 20 20 20   = msp;.        
10180 7d 0a 20 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e  }.        msp->n
10190 73 75 62 73 79 6d 2b 2b 3b 0a 20 20 20 20 20 20  subsym++;.      
101a0 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d 20    msp->subsym = 
101b0 72 65 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62  realloc(msp->sub
101c0 73 79 6d 2c 20 73 69 7a 65 6f 66 28 73 74 72 75  sym, sizeof(stru
101d0 63 74 20 73 79 6d 62 6f 6c 2a 29 2a 6d 73 70 2d  ct symbol*)*msp-
101e0 3e 6e 73 75 62 73 79 6d 29 3b 0a 20 20 20 20 20  >nsubsym);.     
101f0 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 6d     msp->subsym[m
10200 73 70 2d 3e 6e 73 75 62 73 79 6d 2d 31 5d 20 3d  sp->nsubsym-1] =
10210 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 26 78 5b 31   Symbol_new(&x[1
10220 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
10230 69 73 6c 6f 77 65 72 28 78 5b 31 5d 29 20 7c 7c  islower(x[1]) ||
10240 20 69 73 6c 6f 77 65 72 28 6d 73 70 2d 3e 73 75   islower(msp->su
10250 62 73 79 6d 5b 30 5d 2d 3e 6e 61 6d 65 5b 30 5d  bsym[0]->name[0]
10260 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ) ){.          E
10270 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
10280 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
10290 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
102a0 20 20 20 20 22 43 61 6e 6e 6f 74 20 66 6f 72 6d      "Cannot form
102b0 20 61 20 63 6f 6d 70 6f 75 6e 64 20 63 6f 6e 74   a compound cont
102c0 61 69 6e 69 6e 67 20 61 20 6e 6f 6e 2d 74 65 72  aining a non-ter
102d0 6d 69 6e 61 6c 22 29 3b 0a 20 20 20 20 20 20 20  minal");.       
102e0 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
102f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
10300 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b      }else if( x[
10310 30 5d 3d 3d 27 28 27 20 26 26 20 70 73 70 2d 3e  0]=='(' && psp->
10320 6e 72 68 73 3e 30 20 29 7b 0a 20 20 20 20 20 20  nrhs>0 ){.      
10330 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
10340 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20  HS_ALIAS_1;.    
10350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10360 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
10370 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
10380 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
10390 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 63 68 61      "Illegal cha
103a0 72 61 63 74 65 72 20 6f 6e 20 52 48 53 20 6f 66  racter on RHS of
103b0 20 72 75 6c 65 3a 20 5c 22 25 73 5c 22 2e 22 2c   rule: \"%s\".",
103c0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
103d0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
103e0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
103f0 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
10400 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
10410 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
10420 20 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c 49      case RHS_ALI
10430 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20  AS_1:.      if( 
10440 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b  isalpha(x[0]) ){
10450 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 61 6c  .        psp->al
10460 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31 5d  ias[psp->nrhs-1]
10470 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73   = x;.        ps
10480 70 2d 3e 73 74 61 74 65 20 3d 20 52 48 53 5f 41  p->state = RHS_A
10490 4c 49 41 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65  LIAS_2;.      }e
104a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
104b0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
104c0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
104d0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
104e0 22 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61  "\"%s\" is not a
104f0 20 76 61 6c 69 64 20 61 6c 69 61 73 20 66 6f 72   valid alias for
10500 20 74 68 65 20 52 48 53 20 73 79 6d 62 6f 6c 20   the RHS symbol 
10510 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20  \"%s\"\n",.     
10520 20 20 20 20 20 78 2c 70 73 70 2d 3e 72 68 73 5b       x,psp->rhs[
10530 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 2d 3e 6e 61  psp->nrhs-1]->na
10540 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  me);.        psp
10550 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
10560 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10570 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
10580 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
10590 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
105a0 0a 20 20 20 20 63 61 73 65 20 52 48 53 5f 41 4c  .    case RHS_AL
105b0 49 41 53 5f 32 3a 0a 20 20 20 20 20 20 69 66 28  IAS_2:.      if(
105c0 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20 20   x[0]==')' ){.  
105d0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
105e0 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20   = IN_RHS;.     
105f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10600 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
10610 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
10620 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
10630 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c     "Missing \")\
10640 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20  " following LHS 
10650 61 6c 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c  alias name \"%s\
10660 22 2e 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61  ".",psp->lhsalia
10670 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  s);.        psp-
10680 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
10690 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
106a0 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
106b0 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
106c0 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
106d0 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
106e0 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52  _FOR_DECL_KEYWOR
106f0 44 3a 0a 20 20 20 20 20 20 69 66 28 20 69 73 61  D:.      if( isa
10700 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20  lpha(x[0]) ){.  
10710 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6b        psp->declk
10720 65 79 77 6f 72 64 20 3d 20 78 3b 0a 20 20 20 20  eyword = x;.    
10730 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
10740 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  slot = 0;.      
10750 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e    psp->decllinen
10760 6f 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20 20  oslot = 0;.     
10770 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
10780 6e 65 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20 20  neMacro = 1;.   
10790 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
107a0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
107b0 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 20 20  CL_ARG;.        
107c0 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 61  if( strcmp(x,"na
107d0 6d 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  me")==0 ){.     
107e0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
107f0 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10800 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p->name);.      
10810 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c      psp->insertL
10820 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 09 7d  ineMacro = 0;..}
10830 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10840 78 2c 22 69 6e 63 6c 75 64 65 22 29 3d 3d 30 20  x,"include")==0 
10850 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
10860 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
10870 26 28 70 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75  &(psp->gp->inclu
10880 64 65 29 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  de);..}else if( 
10890 73 74 72 63 6d 70 28 78 2c 22 63 6f 64 65 22 29  strcmp(x,"code")
108a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
108b0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
108c0 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65  t = &(psp->gp->e
108d0 78 74 72 61 63 6f 64 65 29 3b 0a 09 7d 65 6c 73  xtracode);..}els
108e0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
108f0 74 6f 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f 72  token_destructor
10900 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10910 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
10920 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e  lot = &psp->gp->
10930 74 6f 6b 65 6e 64 65 73 74 3b 0a 09 7d 65 6c 73  tokendest;..}els
10940 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
10950 64 65 66 61 75 6c 74 5f 64 65 73 74 72 75 63 74  default_destruct
10960 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  or")==0 ){.     
10970 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10980 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70  gslot = &psp->gp
10990 2d 3e 76 61 72 64 65 73 74 3b 0a 09 7d 65 6c 73  ->vardest;..}els
109a0 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
109b0 74 6f 6b 65 6e 5f 70 72 65 66 69 78 22 29 3d 3d  token_prefix")==
109c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
109d0 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
109e0 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65  = &psp->gp->toke
109f0 6e 70 72 65 66 69 78 3b 0a 20 20 20 20 20 20 20  nprefix;.       
10a00 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
10a10 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 09 7d 65  neMacro = 0;..}e
10a20 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
10a30 2c 22 73 79 6e 74 61 78 5f 65 72 72 6f 72 22 29  ,"syntax_error")
10a40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10a50 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10a60 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65  t = &(psp->gp->e
10a70 72 72 6f 72 29 3b 0a 09 7d 65 6c 73 65 20 69 66  rror);..}else if
10a80 28 20 73 74 72 63 6d 70 28 78 2c 22 70 61 72 73  ( strcmp(x,"pars
10a90 65 5f 61 63 63 65 70 74 22 29 3d 3d 30 20 29 7b  e_accept")==0 ){
10aa0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10ab0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
10ac0 70 73 70 2d 3e 67 70 2d 3e 61 63 63 65 70 74 29  psp->gp->accept)
10ad0 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72  ;..}else if( str
10ae0 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 66 61 69  cmp(x,"parse_fai
10af0 6c 75 72 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  lure")==0 ){.   
10b00 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
10b10 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
10b20 3e 67 70 2d 3e 66 61 69 6c 75 72 65 29 3b 0a 09  >gp->failure);..
10b30 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10b40 28 78 2c 22 73 74 61 63 6b 5f 6f 76 65 72 66 6c  (x,"stack_overfl
10b50 6f 77 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ow")==0 ){.     
10b60 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10b70 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10b80 70 2d 3e 6f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  p->overflow);.  
10b90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10ba0 73 74 72 63 6d 70 28 78 2c 22 65 78 74 72 61 5f  strcmp(x,"extra_
10bb0 61 72 67 75 6d 65 6e 74 22 29 3d 3d 30 20 29 7b  argument")==0 ){
10bc0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10bd0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
10be0 70 73 70 2d 3e 67 70 2d 3e 61 72 67 29 3b 0a 20  psp->gp->arg);. 
10bf0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e           psp->in
10c00 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20  sertLineMacro = 
10c10 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
10c20 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74   if( strcmp(x,"t
10c30 6f 6b 65 6e 5f 74 79 70 65 22 29 3d 3d 30 20 29  oken_type")==0 )
10c40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
10c50 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
10c60 28 70 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 74  (psp->gp->tokent
10c70 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ype);.          
10c80 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d  psp->insertLineM
10c90 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  acro = 0;.      
10ca0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
10cb0 6d 70 28 78 2c 22 64 65 66 61 75 6c 74 5f 74 79  mp(x,"default_ty
10cc0 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pe")==0 ){.     
10cd0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10ce0 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10cf0 70 2d 3e 76 61 72 74 79 70 65 29 3b 0a 20 20 20  p->vartype);.   
10d00 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65         psp->inse
10d10 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b  rtLineMacro = 0;
10d20 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
10d30 66 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61  f( strcmp(x,"sta
10d40 63 6b 5f 73 69 7a 65 22 29 3d 3d 30 20 29 7b 0a  ck_size")==0 ){.
10d50 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
10d60 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70  eclargslot = &(p
10d70 73 70 2d 3e 67 70 2d 3e 73 74 61 63 6b 73 69 7a  sp->gp->stacksiz
10d80 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  e);.          ps
10d90 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63  p->insertLineMac
10da0 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ro = 0;.        
10db0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10dc0 28 78 2c 22 73 74 61 72 74 5f 73 79 6d 62 6f 6c  (x,"start_symbol
10dd0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10de0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
10df0 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
10e00 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20  >start);.       
10e10 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
10e20 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20  neMacro = 0;.   
10e30 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
10e40 74 72 63 6d 70 28 78 2c 22 6c 65 66 74 22 29 3d  trcmp(x,"left")=
10e50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10e60 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72  psp->preccounter
10e70 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
10e80 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 4c  p->declassoc = L
10e90 45 46 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70  EFT;.          p
10ea0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
10eb0 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
10ec0 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20  CE_SYMBOL;.     
10ed0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
10ee0 63 6d 70 28 78 2c 22 72 69 67 68 74 22 29 3d 3d  cmp(x,"right")==
10ef0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
10f00 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b  sp->preccounter+
10f10 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  +;.          psp
10f20 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 52 49  ->declassoc = RI
10f30 47 48 54 3b 0a 20 20 20 20 20 20 20 20 20 20 70  GHT;.          p
10f40 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
10f50 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e  ING_FOR_PRECEDEN
10f60 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20  CE_SYMBOL;.     
10f70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
10f80 63 6d 70 28 78 2c 22 6e 6f 6e 61 73 73 6f 63 22  cmp(x,"nonassoc"
10f90 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
10fa0 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74    psp->preccount
10fb0 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  er++;.          
10fc0 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d  psp->declassoc =
10fd0 20 4e 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 20   NONE;.         
10fe0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
10ff0 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44  ITING_FOR_PRECED
11000 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65  ENCE_SYMBOL;..}e
11010 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
11020 2c 22 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d  ,"destructor")==
11030 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
11040 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
11050 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54  ING_FOR_DESTRUCT
11060 4f 52 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73  OR_SYMBOL;..}els
11070 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22  e if( strcmp(x,"
11080 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  type")==0 ){.   
11090 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
110a0 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
110b0 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3b  DATATYPE_SYMBOL;
110c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
110d0 66 28 20 73 74 72 63 6d 70 28 78 2c 22 66 61 6c  f( strcmp(x,"fal
110e0 6c 62 61 63 6b 22 29 3d 3d 30 20 29 7b 0a 20 20  lback")==0 ){.  
110f0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66 61 6c          psp->fal
11100 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20  lback = 0;.     
11110 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11120 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41  = WAITING_FOR_FA
11130 4c 4c 42 41 43 4b 5f 49 44 3b 0a 20 20 20 20 20  LLBACK_ID;.     
11140 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
11150 63 6d 70 28 78 2c 22 77 69 6c 64 63 61 72 64 22  cmp(x,"wildcard"
11160 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
11170 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
11180 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43  AITING_FOR_WILDC
11190 41 52 44 5f 49 44 3b 0a 20 20 20 20 20 20 20 20  ARD_ID;.        
111a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
111b0 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
111c0 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
111d0 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
111e0 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20 64        "Unknown d
111f0 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f  eclaration keywo
11200 72 64 3a 20 5c 22 25 25 25 73 5c 22 2e 22 2c 78  rd: \"%%%s\".",x
11210 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
11220 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
11230 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11240 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
11250 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  R_DECL_ERROR;..}
11260 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11270 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
11280 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
11290 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
112a0 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61           "Illega
112b0 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65  l declaration ke
112c0 79 77 6f 72 64 3a 20 5c 22 25 73 5c 22 2e 22 2c  yword: \"%s\".",
112d0 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
112e0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
112f0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
11300 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
11310 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
11320 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
11330 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
11340 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f  _FOR_DESTRUCTOR_
11350 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66  SYMBOL:.      if
11360 28 20 21 69 73 61 6c 70 68 61 28 78 5b 30 5d 29  ( !isalpha(x[0])
11370 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
11380 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
11390 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
113a0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
113b0 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73  Symbol name miss
113c0 69 6e 67 20 61 66 74 65 72 20 25 64 65 73 74 72  ing after %destr
113d0 75 63 74 6f 72 20 6b 65 79 77 6f 72 64 22 29 3b  uctor keyword");
113e0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
113f0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
11400 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
11410 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
11420 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
11430 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72  lse{.        str
11440 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
11450 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
11460 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
11470 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e  largslot = &sp->
11480 64 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 20 20  destructor;.    
11490 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e      psp->decllin
114a0 65 6e 6f 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64  enoslot = &sp->d
114b0 65 73 74 4c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20  estLineno;.     
114c0 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69     psp->insertLi
114d0 6e 65 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20 20  neMacro = 1;.   
114e0 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
114f0 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
11500 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 7d 0a  CL_ARG;.      }.
11510 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11520 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
11530 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f  R_DATATYPE_SYMBO
11540 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69 73  L:.      if( !is
11550 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20  alpha(x[0]) ){. 
11560 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
11570 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
11580 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
11590 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f            "Symbo
115a0 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61  l name missing a
115b0 66 74 65 72 20 25 64 65 73 74 72 75 63 74 6f 72  fter %destructor
115c0 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20 20 20 20   keyword");.    
115d0 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
115e0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70  t++;.        psp
115f0 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43  ->state = RESYNC
11600 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
11610 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
11620 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20 73          struct s
11630 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62  ymbol *sp = Symb
11640 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
11650 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
11660 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 61 74 61 74  lot = &sp->datat
11670 79 70 65 3b 0a 20 20 20 20 20 20 20 20 70 73 70  ype;.        psp
11680 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
11690 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  o = 0;.        p
116a0 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
116b0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47  ING_FOR_DECL_ARG
116c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
116d0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
116e0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43  WAITING_FOR_PREC
116f0 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3a 0a 20  EDENCE_SYMBOL:. 
11700 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
11710 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  .' ){.        ps
11720 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
11730 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
11740 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
11750 20 69 66 28 20 69 73 75 70 70 65 72 28 78 5b 30   if( isupper(x[0
11760 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  ]) ){.        st
11770 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
11780 0a 20 20 20 20 20 20 20 20 73 70 20 3d 20 53 79  .        sp = Sy
11790 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20  mbol_new(x);.   
117a0 20 20 20 20 20 69 66 28 20 73 70 2d 3e 70 72 65       if( sp->pre
117b0 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c>=0 ){.        
117c0 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
117d0 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
117e0 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
117f0 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 5c         "Symbol \
11800 22 25 73 5c 22 20 68 61 73 20 61 6c 72 65 61 64  "%s\" has alread
11810 79 20 62 65 20 67 69 76 65 6e 20 61 20 70 72 65  y be given a pre
11820 63 65 64 65 6e 63 65 2e 22 2c 78 29 3b 0a 20 20  cedence.",x);.  
11830 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
11840 6f 72 63 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65 7b  orcnt++;..}else{
11850 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 70  .          sp->p
11860 72 65 63 20 3d 20 70 73 70 2d 3e 70 72 65 63 63  rec = psp->precc
11870 6f 75 6e 74 65 72 3b 0a 20 20 20 20 20 20 20 20  ounter;.        
11880 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20 70 73    sp->assoc = ps
11890 70 2d 3e 64 65 63 6c 61 73 73 6f 63 3b 0a 09 7d  p->declassoc;..}
118a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
118b0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
118c0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
118d0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
118e0 20 20 20 20 20 20 20 20 20 22 43 61 6e 27 74 20           "Can't 
118f0 61 73 73 69 67 6e 20 61 20 70 72 65 63 65 64 65  assign a precede
11900 6e 63 65 20 74 6f 20 5c 22 25 73 5c 22 2e 22 2c  nce to \"%s\".",
11910 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
11920 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
11930 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
11940 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49  ;.    case WAITI
11950 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3a  NG_FOR_DECL_ARG:
11960 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
11970 3d 27 7b 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c  ='{' || x[0]=='\
11980 22 27 20 7c 7c 20 69 73 61 6c 6e 75 6d 28 78 5b  "' || isalnum(x[
11990 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  0]) ){.        c
119a0 68 61 72 20 2a 7a 4f 6c 64 2c 20 2a 7a 4e 65 77  har *zOld, *zNew
119b0 2c 20 2a 7a 42 75 66 2c 20 2a 7a 3b 0a 20 20 20  , *zBuf, *z;.   
119c0 20 20 20 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 6e       int nOld, n
119d0 2c 20 6e 4c 69 6e 65 2c 20 6e 4e 65 77 2c 20 6e  , nLine, nNew, n
119e0 42 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 63 68  Back;.        ch
119f0 61 72 20 7a 4c 69 6e 65 5b 35 30 5d 3b 0a 20 20  ar zLine[50];.  
11a00 20 20 20 20 20 20 7a 4e 65 77 20 3d 20 78 3b 0a        zNew = x;.
11a10 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e 65 77          if( zNew
11a20 5b 30 5d 3d 3d 27 22 27 20 7c 7c 20 7a 4e 65 77  [0]=='"' || zNew
11a30 5b 30 5d 3d 3d 27 7b 27 20 29 20 7a 4e 65 77 2b  [0]=='{' ) zNew+
11a40 2b 3b 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 20  +;.        nNew 
11a50 3d 20 73 74 72 6c 65 6e 28 7a 4e 65 77 29 3b 0a  = strlen(zNew);.
11a60 20 20 20 20 20 20 20 20 69 66 28 20 2a 70 73 70          if( *psp
11a70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 29 7b  ->declargslot ){
11a80 0a 20 20 20 20 20 20 20 20 20 20 7a 4f 6c 64 20  .          zOld 
11a90 3d 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67 73  = *psp->declargs
11aa0 6c 6f 74 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  lot;.        }el
11ab0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f  se{.          zO
11ac0 6c 64 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20  ld = "";.       
11ad0 20 7d 0a 20 20 20 20 20 20 20 20 6e 4f 6c 64 20   }.        nOld 
11ae0 3d 20 73 74 72 6c 65 6e 28 7a 4f 6c 64 29 3b 0a  = strlen(zOld);.
11af0 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 4f 6c 64          n = nOld
11b00 20 2b 20 6e 4e 65 77 20 2b 20 32 30 3b 0a 20 20   + nNew + 20;.  
11b10 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 69        if( psp->i
11b20 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 26  nsertLineMacro &
11b30 26 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e  & psp->decllinen
11b40 6f 73 6c 6f 74 0a 20 20 20 20 20 20 20 20 20 20  oslot.          
11b50 20 20 26 26 20 70 73 70 2d 3e 64 65 63 6c 6c 69    && psp->declli
11b60 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 20 29 7b 0a 20  nenoslot[0] ){. 
11b70 20 20 20 20 20 20 20 20 20 66 6f 72 28 7a 3d 70           for(z=p
11b80 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 6e 42  sp->filename, nB
11b90 61 63 6b 3d 30 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b  ack=0; *z; z++){
11ba0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
11bb0 20 2a 7a 3d 3d 27 5c 5c 27 20 29 20 6e 42 61 63   *z=='\\' ) nBac
11bc0 6b 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  k++;.          }
11bd0 0a 20 20 20 20 20 20 20 20 20 20 73 70 72 69 6e  .          sprin
11be0 74 66 28 7a 4c 69 6e 65 2c 20 22 23 6c 69 6e 65  tf(zLine, "#line
11bf0 20 25 64 20 22 2c 20 70 73 70 2d 3e 74 6f 6b 65   %d ", psp->toke
11c00 6e 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20  nlineno);.      
11c10 20 20 20 20 6e 4c 69 6e 65 20 3d 20 73 74 72 6c      nLine = strl
11c20 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20  en(zLine);.     
11c30 20 20 20 20 20 6e 20 2b 3d 20 6e 4c 69 6e 65 20       n += nLine 
11c40 2b 20 73 74 72 6c 65 6e 28 70 73 70 2d 3e 66 69  + strlen(psp->fi
11c50 6c 65 6e 61 6d 65 29 20 2b 20 6e 42 61 63 6b 3b  lename) + nBack;
11c60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11c70 20 20 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72 67     *psp->declarg
11c80 73 6c 6f 74 20 3d 20 7a 42 75 66 20 3d 20 72 65  slot = zBuf = re
11c90 61 6c 6c 6f 63 28 2a 70 73 70 2d 3e 64 65 63 6c  alloc(*psp->decl
11ca0 61 72 67 73 6c 6f 74 2c 20 6e 29 3b 0a 20 20 20  argslot, n);.   
11cb0 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 6e 4f 6c       zBuf += nOl
11cc0 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  d;.        if( p
11cd0 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
11ce0 63 72 6f 20 26 26 20 70 73 70 2d 3e 64 65 63 6c  cro && psp->decl
11cf0 6c 69 6e 65 6e 6f 73 6c 6f 74 0a 20 20 20 20 20  linenoslot.     
11d00 20 20 20 20 20 20 20 26 26 20 70 73 70 2d 3e 64         && psp->d
11d10 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d  ecllinenoslot[0]
11d20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
11d30 28 20 6e 4f 6c 64 20 26 26 20 7a 42 75 66 5b 2d  ( nOld && zBuf[-
11d40 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20  1]!='\n' ){.    
11d50 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b          *(zBuf++
11d60 29 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20  ) = '\n';.      
11d70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
11d80 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a 4c 69  memcpy(zBuf, zLi
11d90 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20  ne, nLine);.    
11da0 20 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 6e 4c        zBuf += nL
11db0 69 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  ine;.          *
11dc0 28 7a 42 75 66 2b 2b 29 20 3d 20 27 22 27 3b 0a  (zBuf++) = '"';.
11dd0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 7a 3d            for(z=
11de0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 3b 20 2a  psp->filename; *
11df0 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  z; z++){.       
11e00 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 5c 5c       if( *z=='\\
11e10 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
11e20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27     *(zBuf++) = '
11e30 5c 5c 27 3b 0a 20 20 20 20 20 20 20 20 20 20 20  \\';.           
11e40 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a   }.            *
11e50 28 7a 42 75 66 2b 2b 29 20 3d 20 2a 7a 3b 0a 20  (zBuf++) = *z;. 
11e60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
11e70 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
11e80 20 27 22 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '"';.          
11e90 2a 28 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 6e 27  *(zBuf++) = '\n'
11ea0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11eb0 20 20 20 20 69 66 28 20 70 73 70 2d 3e 64 65 63      if( psp->dec
11ec0 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 26 26 20 70  llinenoslot && p
11ed0 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c  sp->decllinenosl
11ee0 6f 74 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ot[0]==0 ){.    
11ef0 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c        psp->decll
11f00 69 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 20 3d 20 70  inenoslot[0] = p
11f10 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b  sp->tokenlineno;
11f20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11f30 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20     memcpy(zBuf, 
11f40 7a 4e 65 77 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  zNew, nNew);.   
11f50 20 20 20 20 20 7a 42 75 66 20 2b 3d 20 6e 4e 65       zBuf += nNe
11f60 77 3b 0a 20 20 20 20 20 20 20 20 2a 7a 42 75 66  w;.        *zBuf
11f70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73   = 0;.        ps
11f80 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
11f90 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
11fa0 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
11fb0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
11fc0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
11fd0 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
11fe0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c  o,.          "Il
11ff0 6c 65 67 61 6c 20 61 72 67 75 6d 65 6e 74 20 74  legal argument t
12000 6f 20 25 25 25 73 3a 20 25 73 22 2c 70 73 70 2d  o %%%s: %s",psp-
12010 3e 64 65 63 6c 6b 65 79 77 6f 72 64 2c 78 29 3b  >declkeyword,x);
12020 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
12030 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
12040 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
12050 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
12060 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
12070 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12080 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
12090 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3a 0a 20  R_FALLBACK_ID:. 
120a0 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
120b0 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  .' ){.        ps
120c0 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
120d0 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
120e0 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ULE;.      }else
120f0 20 69 66 28 20 21 69 73 75 70 70 65 72 28 78 5b   if( !isupper(x[
12100 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45  0]) ){.        E
12110 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
12120 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65  ename, psp->toke
12130 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
12140 20 20 20 22 25 25 66 61 6c 6c 62 61 63 6b 20 61     "%%fallback a
12150 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20 73  rgument \"%s\" s
12160 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65 6e  hould be a token
12170 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ", x);.        p
12180 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
12190 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
121a0 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
121b0 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f  ol *sp = Symbol_
121c0 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20  new(x);.        
121d0 69 66 28 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63  if( psp->fallbac
121e0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
121f0 20 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20    psp->fallback 
12200 3d 20 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 65  = sp;.        }e
12210 6c 73 65 20 69 66 28 20 73 70 2d 3e 66 61 6c 6c  lse if( sp->fall
12220 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  back ){.        
12230 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
12240 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74  filename, psp->t
12250 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
12260 20 20 20 20 20 20 20 20 22 4d 6f 72 65 20 74 68          "More th
12270 61 6e 20 6f 6e 65 20 66 61 6c 6c 62 61 63 6b 20  an one fallback 
12280 61 73 73 69 67 6e 65 64 20 74 6f 20 74 6f 6b 65  assigned to toke
12290 6e 20 25 73 22 2c 20 78 29 3b 0a 20 20 20 20 20  n %s", x);.     
122a0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
122b0 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  nt++;.        }e
122c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73  lse{.          s
122d0 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 70 73  p->fallback = ps
122e0 70 2d 3e 66 61 6c 6c 62 61 63 6b 3b 0a 20 20 20  p->fallback;.   
122f0 20 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e         psp->gp->
12300 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 3d 20 31  has_fallback = 1
12310 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12320 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
12330 0a 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e  .    case WAITIN
12340 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52 44 5f 49  G_FOR_WILDCARD_I
12350 44 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  D:.      if( x[0
12360 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20  ]=='.' ){.      
12370 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
12380 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
12390 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d  OR_RULE;.      }
123a0 65 6c 73 65 20 69 66 28 20 21 69 73 75 70 70 65  else if( !isuppe
123b0 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  r(x[0]) ){.     
123c0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
123d0 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e  >filename, psp->
123e0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
123f0 20 20 20 20 20 20 20 22 25 25 77 69 6c 64 63 61         "%%wildca
12400 72 64 20 61 72 67 75 6d 65 6e 74 20 5c 22 25 73  rd argument \"%s
12410 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61 20 74  \" should be a t
12420 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20  oken", x);.     
12430 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
12440 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ++;.      }else{
12450 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
12460 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d  symbol *sp = Sym
12470 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20  bol_new(x);.    
12480 20 20 20 20 69 66 28 20 70 73 70 2d 3e 67 70 2d      if( psp->gp-
12490 3e 77 69 6c 64 63 61 72 64 3d 3d 30 20 29 7b 0a  >wildcard==0 ){.
124a0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 67            psp->g
124b0 70 2d 3e 77 69 6c 64 63 61 72 64 20 3d 20 73 70  p->wildcard = sp
124c0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
124d0 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72  .          Error
124e0 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
124f0 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  e, psp->tokenlin
12500 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
12510 20 22 45 78 74 72 61 20 77 69 6c 64 63 61 72 64   "Extra wildcard
12520 20 74 6f 20 74 6f 6b 65 6e 3a 20 25 73 22 2c 20   to token: %s", 
12530 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
12540 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
12550 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
12560 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
12570 20 20 63 61 73 65 20 52 45 53 59 4e 43 5f 41 46    case RESYNC_AF
12580 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3a 0a  TER_RULE_ERROR:.
12590 2f 2a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  /*      if( x[0]
125a0 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73 74 61  =='.' ) psp->sta
125b0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
125c0 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 2a  _DECL_OR_RULE;.*
125d0 2a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 2a 2f  *      break; */
125e0 0a 20 20 20 20 63 61 73 65 20 52 45 53 59 4e 43  .    case RESYNC
125f0 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f  _AFTER_DECL_ERRO
12600 52 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  R:.      if( x[0
12610 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d 3e 73 74  ]=='.' ) psp->st
12620 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
12630 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
12640 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
12650 27 25 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65  '%' ) psp->state
12660 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
12670 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20  ECL_KEYWORD;.   
12680 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a     break;.  }.}.
12690 0a 2f 2a 20 52 75 6e 20 74 68 65 20 70 72 6f 70  ./* Run the prop
126a0 72 6f 63 65 73 73 6f 72 20 6f 76 65 72 20 74 68  rocessor over th
126b0 65 20 69 6e 70 75 74 20 66 69 6c 65 20 74 65 78  e input file tex
126c0 74 2e 20 20 54 68 65 20 67 6c 6f 62 61 6c 20 76  t.  The global v
126d0 61 72 69 61 62 6c 65 73 0a 2a 2a 20 61 7a 44 65  ariables.** azDe
126e0 66 69 6e 65 5b 30 5d 20 74 68 72 6f 75 67 68 20  fine[0] through 
126f0 61 7a 44 65 66 69 6e 65 5b 6e 44 65 66 69 6e 65  azDefine[nDefine
12700 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  -1] contains the
12710 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 64 65   names of all de
12720 66 69 6e 65 64 0a 2a 2a 20 6d 61 63 72 6f 73 2e  fined.** macros.
12730 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6c    This routine l
12740 6f 6f 6b 73 20 66 6f 72 20 22 25 69 66 64 65 66  ooks for "%ifdef
12750 22 20 61 6e 64 20 22 25 69 66 6e 64 65 66 22 20  " and "%ifndef" 
12760 61 6e 64 20 22 25 65 6e 64 69 66 22 20 61 6e 64  and "%endif" and
12770 0a 2a 2a 20 63 6f 6d 6d 65 6e 74 73 20 74 68 65  .** comments the
12780 6d 20 6f 75 74 2e 20 20 54 65 78 74 20 69 6e 20  m out.  Text in 
12790 62 65 74 77 65 65 6e 20 69 73 20 61 6c 73 6f 20  between is also 
127a0 63 6f 6d 6d 65 6e 74 65 64 20 6f 75 74 20 61 73  commented out as
127b0 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2f   appropriate..*/
127c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 65  .static void pre
127d0 70 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 63 68  process_input(ch
127e0 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c  ar *z){.  int i,
127f0 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 69 6e 74 20   j, k, n;.  int 
12800 65 78 63 6c 75 64 65 20 3d 20 30 3b 0a 20 20 69  exclude = 0;.  i
12810 6e 74 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  nt start = 0;.  
12820 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a  int lineno = 1;.
12830 20 20 69 6e 74 20 73 74 61 72 74 5f 6c 69 6e 65    int start_line
12840 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72 28 69 3d  no = 1;.  for(i=
12850 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
12860 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e     if( z[i]=='\n
12870 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
12880 20 20 69 66 28 20 7a 5b 69 5d 21 3d 27 25 27 20    if( z[i]!='%' 
12890 7c 7c 20 28 69 3e 30 20 26 26 20 7a 5b 69 2d 31  || (i>0 && z[i-1
128a0 5d 21 3d 27 5c 6e 27 29 20 29 20 63 6f 6e 74 69  ]!='\n') ) conti
128b0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74 72  nue;.    if( str
128c0 6e 63 6d 70 28 26 7a 5b 69 5d 2c 22 25 65 6e 64  ncmp(&z[i],"%end
128d0 69 66 22 2c 36 29 3d 3d 30 20 26 26 20 69 73 73  if",6)==0 && iss
128e0 70 61 63 65 28 7a 5b 69 2b 36 5d 29 20 29 7b 0a  pace(z[i+6]) ){.
128f0 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64        if( exclud
12900 65 20 29 7b 0a 20 20 20 20 20 20 20 20 65 78 63  e ){.        exc
12910 6c 75 64 65 2d 2d 3b 0a 20 20 20 20 20 20 20 20  lude--;.        
12920 69 66 28 20 65 78 63 6c 75 64 65 3d 3d 30 20 29  if( exclude==0 )
12930 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
12940 6a 3d 73 74 61 72 74 3b 20 6a 3c 69 3b 20 6a 2b  j=start; j<i; j+
12950 2b 29 20 69 66 28 20 7a 5b 6a 5d 21 3d 27 5c 6e  +) if( z[j]!='\n
12960 27 20 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a  ' ) z[j] = ' ';.
12970 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12980 7d 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 3b  }.      for(j=i;
12990 20 7a 5b 6a 5d 20 26 26 20 7a 5b 6a 5d 21 3d 27   z[j] && z[j]!='
129a0 5c 6e 27 3b 20 6a 2b 2b 29 20 7a 5b 6a 5d 20 3d  \n'; j++) z[j] =
129b0 20 27 20 27 3b 0a 20 20 20 20 7d 65 6c 73 65 20   ' ';.    }else 
129c0 69 66 28 20 28 73 74 72 6e 63 6d 70 28 26 7a 5b  if( (strncmp(&z[
129d0 69 5d 2c 22 25 69 66 64 65 66 22 2c 36 29 3d 3d  i],"%ifdef",6)==
129e0 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 69  0 && isspace(z[i
129f0 2b 36 5d 29 29 0a 20 20 20 20 20 20 20 20 20 20  +6])).          
12a00 7c 7c 20 28 73 74 72 6e 63 6d 70 28 26 7a 5b 69  || (strncmp(&z[i
12a10 5d 2c 22 25 69 66 6e 64 65 66 22 2c 37 29 3d 3d  ],"%ifndef",7)==
12a20 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 69  0 && isspace(z[i
12a30 2b 37 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 69  +7])) ){.      i
12a40 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20 20  f( exclude ){.  
12a50 20 20 20 20 20 20 65 78 63 6c 75 64 65 2b 2b 3b        exclude++;
12a60 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12a70 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 37 3b        for(j=i+7;
12a80 20 69 73 73 70 61 63 65 28 7a 5b 6a 5d 29 3b 20   isspace(z[j]); 
12a90 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 20 20 66  j++){}.        f
12aa0 6f 72 28 6e 3d 30 3b 20 7a 5b 6a 2b 6e 5d 20 26  or(n=0; z[j+n] &
12ab0 26 20 21 69 73 73 70 61 63 65 28 7a 5b 6a 2b 6e  & !isspace(z[j+n
12ac0 5d 29 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 20  ]); n++){}.     
12ad0 20 20 20 65 78 63 6c 75 64 65 20 3d 20 31 3b 0a     exclude = 1;.
12ae0 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 30 3b          for(k=0;
12af0 20 6b 3c 6e 44 65 66 69 6e 65 3b 20 6b 2b 2b 29   k<nDefine; k++)
12b00 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
12b10 73 74 72 6e 63 6d 70 28 61 7a 44 65 66 69 6e 65  strncmp(azDefine
12b20 5b 6b 5d 2c 26 7a 5b 6a 5d 2c 6e 29 3d 3d 30 20  [k],&z[j],n)==0 
12b30 26 26 20 73 74 72 6c 65 6e 28 61 7a 44 65 66 69  && strlen(azDefi
12b40 6e 65 5b 6b 5d 29 3d 3d 6e 20 29 7b 0a 20 20 20  ne[k])==n ){.   
12b50 20 20 20 20 20 20 20 20 20 65 78 63 6c 75 64 65           exclude
12b60 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
12b70 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
12b80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
12b90 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 33         if( z[i+3
12ba0 5d 3d 3d 27 6e 27 20 29 20 65 78 63 6c 75 64 65  ]=='n' ) exclude
12bb0 20 3d 20 21 65 78 63 6c 75 64 65 3b 0a 20 20 20   = !exclude;.   
12bc0 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64 65       if( exclude
12bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
12be0 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  art = i;.       
12bf0 20 20 20 73 74 61 72 74 5f 6c 69 6e 65 6e 6f 20     start_lineno 
12c00 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20  = lineno;.      
12c10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12c20 20 20 66 6f 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20    for(j=i; z[j] 
12c30 26 26 20 7a 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a  && z[j]!='\n'; j
12c40 2b 2b 29 20 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a  ++) z[j] = ' ';.
12c50 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
12c60 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 66  exclude ){.    f
12c70 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 75  printf(stderr,"u
12c80 6e 74 65 72 6d 69 6e 61 74 65 64 20 25 25 69 66  nterminated %%if
12c90 64 65 66 20 73 74 61 72 74 69 6e 67 20 6f 6e 20  def starting on 
12ca0 6c 69 6e 65 20 25 64 5c 6e 22 2c 20 73 74 61 72  line %d\n", star
12cb0 74 5f 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 65  t_lineno);.    e
12cc0 78 69 74 28 31 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  xit(1);.  }.}../
12cd0 2a 20 49 6e 20 73 70 69 74 65 20 6f 66 20 69 74  * In spite of it
12ce0 73 20 6e 61 6d 65 2c 20 74 68 69 73 20 66 75 6e  s name, this fun
12cf0 63 74 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20  ction is really 
12d00 61 20 73 63 61 6e 6e 65 72 2e 20 20 49 74 20 72  a scanner.  It r
12d10 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 65 6e  ead.** in the en
12d20 74 69 72 65 20 69 6e 70 75 74 20 66 69 6c 65 20  tire input file 
12d30 28 61 6c 6c 20 61 74 20 6f 6e 63 65 29 20 74 68  (all at once) th
12d40 65 6e 20 74 6f 6b 65 6e 69 7a 65 73 20 69 74 2e  en tokenizes it.
12d50 20 20 45 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e 20    Each.** token 
12d60 69 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  is passed to the
12d70 20 66 75 6e 63 74 69 6f 6e 20 22 70 61 72 73 65   function "parse
12d80 6f 6e 65 74 6f 6b 65 6e 22 20 77 68 69 63 68 20  onetoken" which 
12d90 62 75 69 6c 64 73 20 61 6c 6c 0a 2a 2a 20 74 68  builds all.** th
12da0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 61  e appropriate da
12db0 74 61 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ta structures in
12dc0 20 74 68 65 20 67 6c 6f 62 61 6c 20 73 74 61 74   the global stat
12dd0 65 20 76 65 63 74 6f 72 20 22 67 70 22 2e 0a 2a  e vector "gp"..*
12de0 2f 0a 76 6f 69 64 20 50 61 72 73 65 28 67 70 29  /.void Parse(gp)
12df0 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 67  .struct lemon *g
12e00 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 73  p;.{.  struct ps
12e10 74 61 74 65 20 70 73 3b 0a 20 20 46 49 4c 45 20  tate ps;.  FILE 
12e20 2a 66 70 3b 0a 20 20 63 68 61 72 20 2a 66 69 6c  *fp;.  char *fil
12e30 65 62 75 66 3b 0a 20 20 69 6e 74 20 66 69 6c 65  ebuf;.  int file
12e40 73 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e 65  size;.  int line
12e50 6e 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63  no;.  int c;.  c
12e60 68 61 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63 70  har *cp, *nextcp
12e70 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e  ;.  int startlin
12e80 65 20 3d 20 30 3b 0a 0a 20 20 6d 65 6d 73 65 74  e = 0;..  memset
12e90 28 26 70 73 2c 20 27 5c 30 27 2c 20 73 69 7a 65  (&ps, '\0', size
12ea0 6f 66 28 70 73 29 29 3b 0a 20 20 70 73 2e 67 70  of(ps));.  ps.gp
12eb0 20 3d 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c 65   = gp;.  ps.file
12ec0 6e 61 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65 6e  name = gp->filen
12ed0 61 6d 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72 63  ame;.  ps.errorc
12ee0 6e 74 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74 61  nt = 0;.  ps.sta
12ef0 74 65 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45 3b  te = INITIALIZE;
12f00 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20  ..  /* Begin by 
12f10 72 65 61 64 69 6e 67 20 74 68 65 20 69 6e 70 75  reading the inpu
12f20 74 20 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20 3d  t file */.  fp =
12f30 20 66 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e 61   fopen(ps.filena
12f40 6d 65 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20  me,"rb");.  if( 
12f50 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72  fp==0 ){.    Err
12f60 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d  orMsg(ps.filenam
12f70 65 2c 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20  e,0,"Can't open 
12f80 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 72 65  this file for re
12f90 61 64 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67 70  ading.");.    gp
12fa0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
12fb0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
12fc0 66 73 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a 20  fseek(fp,0,2);. 
12fd0 20 66 69 6c 65 73 69 7a 65 20 3d 20 66 74 65 6c   filesize = ftel
12fe0 6c 28 66 70 29 3b 0a 20 20 72 65 77 69 6e 64 28  l(fp);.  rewind(
12ff0 66 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 20 3d  fp);.  filebuf =
13000 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28   (char *)malloc(
13010 20 66 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a 20   filesize+1 );. 
13020 20 69 66 28 20 66 69 6c 65 62 75 66 3d 3d 30 20   if( filebuf==0 
13030 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28  ){.    ErrorMsg(
13040 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43  ps.filename,0,"C
13050 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20 25 64  an't allocate %d
13060 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 68 6f   of memory to ho
13070 6c 64 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a  ld this file.",.
13080 20 20 20 20 20 20 66 69 6c 65 73 69 7a 65 2b 31        filesize+1
13090 29 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72  );.    gp->error
130a0 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  cnt++;.    retur
130b0 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65  n;.  }.  if( fre
130c0 61 64 28 66 69 6c 65 62 75 66 2c 31 2c 66 69 6c  ad(filebuf,1,fil
130d0 65 73 69 7a 65 2c 66 70 29 21 3d 66 69 6c 65 73  esize,fp)!=files
130e0 69 7a 65 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ize ){.    Error
130f0 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
13100 30 2c 22 43 61 6e 27 74 20 72 65 61 64 20 69 6e  0,"Can't read in
13110 20 61 6c 6c 20 25 64 20 62 79 74 65 73 20 6f 66   all %d bytes of
13120 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20   this file.",.  
13130 20 20 20 20 66 69 6c 65 73 69 7a 65 29 3b 0a 20      filesize);. 
13140 20 20 20 66 72 65 65 28 66 69 6c 65 62 75 66 29     free(filebuf)
13150 3b 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63  ;.    gp->errorc
13160 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt++;.    return
13170 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66  ;.  }.  fclose(f
13180 70 29 3b 0a 20 20 66 69 6c 65 62 75 66 5b 66 69  p);.  filebuf[fi
13190 6c 65 73 69 7a 65 5d 20 3d 20 30 3b 0a 0a 20 20  lesize] = 0;..  
131a0 2f 2a 20 4d 61 6b 65 20 61 6e 20 69 6e 69 74 69  /* Make an initi
131b0 61 6c 20 70 61 73 73 20 74 68 72 6f 75 67 68 20  al pass through 
131c0 74 68 65 20 66 69 6c 65 20 74 6f 20 68 61 6e 64  the file to hand
131d0 6c 65 20 25 69 66 64 65 66 20 61 6e 64 20 25 69  le %ifdef and %i
131e0 66 6e 64 65 66 20 2a 2f 0a 20 20 70 72 65 70 72  fndef */.  prepr
131f0 6f 63 65 73 73 5f 69 6e 70 75 74 28 66 69 6c 65  ocess_input(file
13200 62 75 66 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20  buf);..  /* Now 
13210 73 63 61 6e 20 74 68 65 20 74 65 78 74 20 6f 66  scan the text of
13220 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   the input file 
13230 2a 2f 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b  */.  lineno = 1;
13240 0a 20 20 66 6f 72 28 63 70 3d 66 69 6c 65 62 75  .  for(cp=filebu
13250 66 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 3b 20  f; (c= *cp)!=0; 
13260 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  ){.    if( c=='\
13270 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 20  n' ) lineno++;  
13280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4b              /* K
13290 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65  eep track of the
132a0 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
132b0 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28      if( isspace(
132c0 63 29 20 29 7b 20 63 70 2b 2b 3b 20 63 6f 6e 74  c) ){ cp++; cont
132d0 69 6e 75 65 3b 20 7d 20 20 2f 2a 20 53 6b 69 70  inue; }  /* Skip
132e0 20 61 6c 6c 20 77 68 69 74 65 20 73 70 61 63 65   all white space
132f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   */.    if( c=='
13300 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27  /' && cp[1]=='/'
13310 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   ){          /* 
13320 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65 20 63  Skip C++ style c
13330 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  omments */.     
13340 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68   cp+=2;.      wh
13350 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
13360 20 26 26 20 63 21 3d 27 5c 6e 27 20 29 20 63 70   && c!='\n' ) cp
13370 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ++;.      contin
13380 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ue;.    }.    if
13390 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31  ( c=='/' && cp[1
133a0 5d 3d 3d 27 2a 27 20 29 7b 20 20 20 20 20 20 20  ]=='*' ){       
133b0 20 20 20 2f 2a 20 53 6b 69 70 20 43 20 73 74 79     /* Skip C sty
133c0 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20  le comments */. 
133d0 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20 20       cp+=2;.    
133e0 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70    while( (c= *cp
133f0 29 21 3d 30 20 26 26 20 28 63 21 3d 27 2f 27 20  )!=0 && (c!='/' 
13400 7c 7c 20 63 70 5b 2d 31 5d 21 3d 27 2a 27 29 20  || cp[-1]!='*') 
13410 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
13420 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
13430 2b 3b 0a 20 20 20 20 20 20 20 20 63 70 2b 2b 3b  +;.        cp++;
13440 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
13450 66 28 20 63 20 29 20 63 70 2b 2b 3b 0a 20 20 20  f( c ) cp++;.   
13460 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
13470 20 7d 0a 20 20 20 20 70 73 2e 74 6f 6b 65 6e 73   }.    ps.tokens
13480 74 61 72 74 20 3d 20 63 70 3b 20 20 20 20 20 20  tart = cp;      
13490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 72            /* Mar
134a0 6b 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  k the beginning 
134b0 6f 66 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a  of the token */.
134c0 20 20 20 20 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65      ps.tokenline
134d0 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 20 20 20 20  no = lineno;    
134e0 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75         /* Linenu
134f0 6d 62 65 72 20 6f 6e 20 77 68 69 63 68 20 74 6f  mber on which to
13500 6b 65 6e 20 62 65 67 69 6e 73 20 2a 2f 0a 20 20  ken begins */.  
13510 20 20 69 66 28 20 63 3d 3d 27 5c 22 27 20 29 7b    if( c=='\"' ){
13520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13530 20 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6c       /* String l
13540 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20 20  iterals */.     
13550 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69   cp++;.      whi
13560 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
13570 26 26 20 63 21 3d 27 5c 22 27 20 29 7b 0a 20 20  && c!='\"' ){.  
13580 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
13590 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
135a0 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20        cp++;.    
135b0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
135c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  =0 ){.        Er
135d0 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61  rorMsg(ps.filena
135e0 6d 65 2c 73 74 61 72 74 6c 69 6e 65 2c 0a 22 53  me,startline,."S
135f0 74 72 69 6e 67 20 73 74 61 72 74 69 6e 67 20 6f  tring starting o
13600 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e  n this line is n
13610 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62 65  ot terminated be
13620 66 6f 72 65 20 74 68 65 20 65 6e 64 20 6f 66 20  fore the end of 
13630 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20 20  the file.");.   
13640 20 20 20 20 20 70 73 2e 65 72 72 6f 72 63 6e 74       ps.errorcnt
13650 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65 78 74  ++;.        next
13660 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 20 20 7d  cp = cp;.      }
13670 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 65  else{.        ne
13680 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20 20  xtcp = cp+1;.   
13690 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
136a0 66 28 20 63 3d 3d 27 7b 27 20 29 7b 20 20 20 20  f( c=='{' ){    
136b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
136c0 62 6c 6f 63 6b 20 6f 66 20 43 20 63 6f 64 65 20  block of C code 
136d0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 76  */.      int lev
136e0 65 6c 3b 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a  el;.      cp++;.
136f0 20 20 20 20 20 20 66 6f 72 28 6c 65 76 65 6c 3d        for(level=
13700 31 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26  1; (c= *cp)!=0 &
13710 26 20 28 6c 65 76 65 6c 3e 31 20 7c 7c 20 63 21  & (level>1 || c!
13720 3d 27 7d 27 29 3b 20 63 70 2b 2b 29 7b 0a 20 20  ='}'); cp++){.  
13730 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
13740 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
13750 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63        else if( c
13760 3d 3d 27 7b 27 20 29 20 6c 65 76 65 6c 2b 2b 3b  =='{' ) level++;
13770 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
13780 28 20 63 3d 3d 27 7d 27 20 29 20 6c 65 76 65 6c  ( c=='}' ) level
13790 2d 2d 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65  --;.        else
137a0 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63   if( c=='/' && c
137b0 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20 2f 2a  p[1]=='*' ){  /*
137c0 20 53 6b 69 70 20 63 6f 6d 6d 65 6e 74 73 20 2a   Skip comments *
137d0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  /.          int 
137e0 70 72 65 76 63 3b 0a 20 20 20 20 20 20 20 20 20  prevc;.         
137f0 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20   cp = &cp[2];.  
13800 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d 20          prevc = 
13810 30 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  0;.          whi
13820 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20  le( (c= *cp)!=0 
13830 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 70 72  && (c!='/' || pr
13840 65 76 63 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20  evc!='*') ){.   
13850 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
13860 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b  '\n' ) lineno++;
13870 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65  .            pre
13880 76 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  vc = c;.        
13890 20 20 20 20 63 70 2b 2b 3b 0a 09 20 20 7d 0a 09      cp++;..  }..
138a0 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2f 27  }else if( c=='/'
138b0 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29   && cp[1]=='/' )
138c0 7b 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b 20 73  {  /* Skip C++ s
138d0 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 74 6f  tyle comments to
138e0 6f 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63  o */.          c
138f0 70 20 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20  p = &cp[2];.    
13900 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d        while( (c=
13910 20 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27   *cp)!=0 && c!='
13920 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20  \n' ) cp++;.    
13930 20 20 20 20 20 20 69 66 28 20 63 20 29 20 6c 69        if( c ) li
13940 6e 65 6e 6f 2b 2b 3b 0a 09 7d 65 6c 73 65 20 69  neno++;..}else i
13950 66 28 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d  f( c=='\'' || c=
13960 3d 27 5c 22 27 20 29 7b 20 20 20 20 2f 2a 20 53  ='\"' ){    /* S
13970 74 72 69 6e 67 20 61 20 63 68 61 72 61 63 74 65  tring a characte
13980 72 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a 20 20  r literals */.  
13990 20 20 20 20 20 20 20 20 69 6e 74 20 73 74 61 72          int star
139a0 74 63 68 61 72 2c 20 70 72 65 76 63 3b 0a 20 20  tchar, prevc;.  
139b0 20 20 20 20 20 20 20 20 73 74 61 72 74 63 68 61          startcha
139c0 72 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  r = c;.         
139d0 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20   prevc = 0;.    
139e0 20 20 20 20 20 20 66 6f 72 28 63 70 2b 2b 3b 20        for(cp++; 
139f0 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28  (c= *cp)!=0 && (
13a00 63 21 3d 73 74 61 72 74 63 68 61 72 20 7c 7c 20  c!=startchar || 
13a10 70 72 65 76 63 3d 3d 27 5c 5c 27 29 3b 20 63 70  prevc=='\\'); cp
13a20 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
13a30 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c   if( c=='\n' ) l
13a40 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20  ineno++;.       
13a50 20 20 20 20 20 69 66 28 20 70 72 65 76 63 3d 3d       if( prevc==
13a60 27 5c 5c 27 20 29 20 70 72 65 76 63 20 3d 20 30  '\\' ) prevc = 0
13a70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  ;.            el
13a80 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
13a90 70 72 65 76 63 20 3d 20 63 3b 0a 09 20 20 7d 0a  prevc = c;..  }.
13aa0 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .}.      }.     
13ab0 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
13ac0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
13ad0 2e 66 69 6c 65 6e 61 6d 65 2c 70 73 2e 74 6f 6b  .filename,ps.tok
13ae0 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 43 20 63 6f 64  enlineno,."C cod
13af0 65 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68  e starting on th
13b00 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74  is line is not t
13b10 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65  erminated before
13b20 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
13b30 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20  file.");.       
13b40 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a   ps.errorcnt++;.
13b50 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d          nextcp =
13b60 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   cp;.      }else
13b70 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70  {.        nextcp
13b80 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d   = cp+1;.      }
13b90 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
13ba0 73 61 6c 6e 75 6d 28 63 29 20 29 7b 20 20 20 20  salnum(c) ){    
13bb0 20 20 20 20 20 20 2f 2a 20 49 64 65 6e 74 69 66        /* Identif
13bc0 69 65 72 73 20 2a 2f 0a 20 20 20 20 20 20 77 68  iers */.      wh
13bd0 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
13be0 20 26 26 20 28 69 73 61 6c 6e 75 6d 28 63 29 20   && (isalnum(c) 
13bf0 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b  || c=='_') ) cp+
13c00 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20  +;.      nextcp 
13c10 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20  = cp;.    }else 
13c20 69 66 28 20 63 3d 3d 27 3a 27 20 26 26 20 63 70  if( c==':' && cp
13c30 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 63 70 5b 32  [1]==':' && cp[2
13c40 5d 3d 3d 27 3d 27 20 29 7b 20 2f 2a 20 54 68 65  ]=='=' ){ /* The
13c50 20 6f 70 65 72 61 74 6f 72 20 22 3a 3a 3d 22 20   operator "::=" 
13c60 2a 2f 0a 20 20 20 20 20 20 63 70 20 2b 3d 20 33  */.      cp += 3
13c70 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d  ;.      nextcp =
13c80 20 63 70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69   cp;.    }else i
13c90 66 28 20 28 63 3d 3d 27 2f 27 20 7c 7c 20 63 3d  f( (c=='/' || c=
13ca0 3d 27 7c 27 29 20 26 26 20 69 73 61 6c 70 68 61  ='|') && isalpha
13cb0 28 63 70 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20  (cp[1]) ){.     
13cc0 20 63 70 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20   cp += 2;.      
13cd0 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 63 70 29  while( (c = *cp)
13ce0 21 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d 28  !=0 && (isalnum(
13cf0 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20 29 20  c) || c=='_') ) 
13d00 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74  cp++;.      next
13d10 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65 6c  cp = cp;.    }el
13d20 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
13d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13d40 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65 20 63  All other (one c
13d50 68 61 72 61 63 74 65 72 29 20 6f 70 65 72 61 74  haracter) operat
13d60 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b  ors */.      cp+
13d70 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70 20  +;.      nextcp 
13d80 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = cp;.    }.    
13d90 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63 70  c = *cp;.    *cp
13da0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13db0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13dc0 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20 74  Null terminate t
13dd0 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20  he token */.    
13de0 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 26 70  parseonetoken(&p
13df0 73 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  s);             
13e00 2f 2a 20 50 61 72 73 65 20 74 68 65 20 74 6f 6b  /* Parse the tok
13e10 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20 3d 20  en */.    *cp = 
13e20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
13e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
13e40 74 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20  tore the buffer 
13e50 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65 78 74  */.    cp = next
13e60 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28 66  cp;.  }.  free(f
13e70 69 6c 65 62 75 66 29 3b 20 20 20 20 20 20 20 20  ilebuf);        
13e80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
13e90 65 6c 65 61 73 65 20 74 68 65 20 62 75 66 66 65  elease the buffe
13ea0 72 20 61 66 74 65 72 20 70 61 72 73 69 6e 67 20  r after parsing 
13eb0 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20 3d 20  */.  gp->rule = 
13ec0 70 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a 20 20  ps.firstrule;.  
13ed0 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d 20 70  gp->errorcnt = p
13ee0 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a 2f 2a  s.errorcnt;.}./*
13ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
13f10 74 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b 2e  the file "plink.
13f20 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
13f30 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
13f40 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73  Routines process
13f50 69 6e 67 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ing configuratio
13f60 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f  n follow-set pro
13f70 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a 2a  pagation links.*
13f80 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70  * in the LEMON p
13f90 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
13fa0 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
13fb0 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b 5f 66  t plink *plink_f
13fc0 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  reelist = 0;../*
13fd0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
13fe0 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63 74 20  plink */.struct 
13ff0 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77  plink *Plink_new
14000 28 29 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  (){.  struct pli
14010 6e 6b 20 2a 6e 65 77 3b 0a 0a 20 20 69 66 28 20  nk *new;..  if( 
14020 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d 3d  plink_freelist==
14030 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  0 ){.    int i;.
14040 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30      int amt = 10
14050 30 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65  0;.    plink_fre
14060 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74 20  elist = (struct 
14070 70 6c 69 6e 6b 20 2a 29 63 61 6c 6c 6f 63 28 20  plink *)calloc( 
14080 61 6d 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75  amt, sizeof(stru
14090 63 74 20 70 6c 69 6e 6b 29 20 29 3b 0a 20 20 20  ct plink) );.   
140a0 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c   if( plink_freel
140b0 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
140c0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a  fprintf(stderr,.
140d0 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f        "Unable to
140e0 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
140f0 20 66 6f 72 20 61 20 6e 65 77 20 66 6f 6c 6c 6f   for a new follo
14100 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f  w-set propagatio
14110 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20 20 20  n link.\n");.   
14120 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
14130 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
14140 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 70 6c 69  <amt-1; i++) pli
14150 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e  nk_freelist[i].n
14160 65 78 74 20 3d 20 26 70 6c 69 6e 6b 5f 66 72 65  ext = &plink_fre
14170 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20  elist[i+1];.    
14180 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 61  plink_freelist[a
14190 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a  mt-1].next = 0;.
141a0 20 20 7d 0a 20 20 6e 65 77 20 3d 20 70 6c 69 6e    }.  new = plin
141b0 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 70 6c  k_freelist;.  pl
141c0 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 70  ink_freelist = p
141d0 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 2d 3e 6e  link_freelist->n
141e0 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65  ext;.  return ne
141f0 77 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 70  w;.}../* Add a p
14200 6c 69 6e 6b 20 74 6f 20 61 20 70 6c 69 6e 6b 20  link to a plink 
14210 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69  list */.void Pli
14220 6e 6b 5f 61 64 64 28 70 6c 70 70 2c 63 66 70 29  nk_add(plpp,cfp)
14230 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a  .struct plink **
14240 70 6c 70 70 3b 0a 73 74 72 75 63 74 20 63 6f 6e  plpp;.struct con
14250 66 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74  fig *cfp;.{.  st
14260 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 3b  ruct plink *new;
14270 0a 20 20 6e 65 77 20 3d 20 50 6c 69 6e 6b 5f 6e  .  new = Plink_n
14280 65 77 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e 65 78  ew();.  new->nex
14290 74 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c  t = *plpp;.  *pl
142a0 70 70 20 3d 20 6e 65 77 3b 0a 20 20 6e 65 77 2d  pp = new;.  new-
142b0 3e 63 66 70 20 3d 20 63 66 70 3b 0a 7d 0a 0a 2f  >cfp = cfp;.}../
142c0 2a 20 54 72 61 6e 73 66 65 72 20 65 76 65 72 79  * Transfer every
142d0 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69   plink on the li
142e0 73 74 20 22 66 72 6f 6d 22 20 74 6f 20 74 68 65  st "from" to the
142f0 20 6c 69 73 74 20 22 74 6f 22 20 2a 2f 0a 76 6f   list "to" */.vo
14300 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 74 6f  id Plink_copy(to
14310 2c 66 72 6f 6d 29 0a 73 74 72 75 63 74 20 70 6c  ,from).struct pl
14320 69 6e 6b 20 2a 2a 74 6f 3b 0a 73 74 72 75 63 74  ink **to;.struct
14330 20 70 6c 69 6e 6b 20 2a 66 72 6f 6d 3b 0a 7b 0a   plink *from;.{.
14340 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
14350 6e 65 78 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28  nextpl;.  while(
14360 20 66 72 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78   from ){.    nex
14370 74 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74  tpl = from->next
14380 3b 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74  ;.    from->next
14390 20 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20   = *to;.    *to 
143a0 3d 20 66 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d  = from;.    from
143b0 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d   = nextpl;.  }.}
143c0 0a 0a 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72  ../* Delete ever
143d0 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c  y plink on the l
143e0 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  ist */.void Plin
143f0 6b 5f 64 65 6c 65 74 65 28 70 6c 70 29 0a 73 74  k_delete(plp).st
14400 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b  ruct plink *plp;
14410 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  .{.  struct plin
14420 6b 20 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20 77 68  k *nextpl;..  wh
14430 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20  ile( plp ){.    
14440 6e 65 78 74 70 6c 20 3d 20 70 6c 70 2d 3e 6e 65  nextpl = plp->ne
14450 78 74 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e 65 78  xt;.    plp->nex
14460 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  t = plink_freeli
14470 73 74 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72  st;.    plink_fr
14480 65 65 6c 69 73 74 20 3d 20 70 6c 70 3b 0a 20 20  eelist = plp;.  
14490 20 20 70 6c 70 20 3d 20 6e 65 78 74 70 6c 3b 0a    plp = nextpl;.
144a0 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a    }.}./*********
144b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
144c0 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65  rom the file "re
144d0 70 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  port.c" ********
144e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144f0 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 64  **/./*.** Proced
14500 75 72 65 73 20 66 6f 72 20 67 65 6e 65 72 61 74  ures for generat
14510 69 6e 67 20 72 65 70 6f 72 74 73 20 61 6e 64 20  ing reports and 
14520 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45  tables in the LE
14530 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
14540 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47 65 6e  ator..*/../* Gen
14550 65 72 61 74 65 20 61 20 66 69 6c 65 6e 61 6d 65  erate a filename
14560 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
14570 73 75 66 66 69 78 2e 20 20 53 70 61 63 65 20 74  suffix.  Space t
14580 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 6e 61  o hold the.** na
14590 6d 65 20 63 6f 6d 65 73 20 66 72 6f 6d 20 6d 61  me comes from ma
145a0 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
145b0 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
145c0 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
145d0 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ion..*/.PRIVATE 
145e0 63 68 61 72 20 2a 66 69 6c 65 5f 6d 61 6b 65 6e  char *file_maken
145f0 61 6d 65 28 6c 65 6d 70 2c 73 75 66 66 69 78 29  ame(lemp,suffix)
14600 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
14610 65 6d 70 3b 0a 63 68 61 72 20 2a 73 75 66 66 69  emp;.char *suffi
14620 78 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d  x;.{.  char *nam
14630 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a  e;.  char *cp;..
14640 20 20 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28    name = malloc(
14650 20 73 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69   strlen(lemp->fi
14660 6c 65 6e 61 6d 65 29 20 2b 20 73 74 72 6c 65 6e  lename) + strlen
14670 28 73 75 66 66 69 78 29 20 2b 20 35 20 29 3b 0a  (suffix) + 5 );.
14680 20 20 69 66 28 20 6e 61 6d 65 3d 3d 30 20 29 7b    if( name==0 ){
14690 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
146a0 65 72 72 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63  err,"Can't alloc
146b0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20  ate space for a 
146c0 66 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20  filename.\n");. 
146d0 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
146e0 20 20 73 74 72 63 70 79 28 6e 61 6d 65 2c 6c 65    strcpy(name,le
146f0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
14700 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 6e 61   cp = strrchr(na
14710 6d 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63  me,'.');.  if( c
14720 70 20 29 20 2a 63 70 20 3d 20 30 3b 0a 20 20 73  p ) *cp = 0;.  s
14730 74 72 63 61 74 28 6e 61 6d 65 2c 73 75 66 66 69  trcat(name,suffi
14740 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 61 6d  x);.  return nam
14750 65 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20  e;.}../* Open a 
14760 66 69 6c 65 20 77 69 74 68 20 61 20 6e 61 6d 65  file with a name
14770 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6e 61   based on the na
14780 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  me of the input 
14790 66 69 6c 65 2c 0a 2a 2a 20 62 75 74 20 77 69 74  file,.** but wit
147a0 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 28 73  h a different (s
147b0 70 65 63 69 66 69 65 64 29 20 73 75 66 66 69 78  pecified) suffix
147c0 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  , and return a p
147d0 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
147e0 20 73 74 72 65 61 6d 20 2a 2f 0a 50 52 49 56 41   stream */.PRIVA
147f0 54 45 20 46 49 4c 45 20 2a 66 69 6c 65 5f 6f 70  TE FILE *file_op
14800 65 6e 28 6c 65 6d 70 2c 73 75 66 66 69 78 2c 6d  en(lemp,suffix,m
14810 6f 64 65 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  ode).struct lemo
14820 6e 20 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73  n *lemp;.char *s
14830 75 66 66 69 78 3b 0a 63 68 61 72 20 2a 6d 6f 64  uffix;.char *mod
14840 65 3b 0a 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b  e;.{.  FILE *fp;
14850 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75  ..  if( lemp->ou
14860 74 6e 61 6d 65 20 29 20 66 72 65 65 28 6c 65 6d  tname ) free(lem
14870 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c  p->outname);.  l
14880 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66  emp->outname = f
14890 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d  ile_makename(lem
148a0 70 2c 20 73 75 66 66 69 78 29 3b 0a 20 20 66 70  p, suffix);.  fp
148b0 20 3d 20 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f   = fopen(lemp->o
148c0 75 74 6e 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20  utname,mode);.  
148d0 69 66 28 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f  if( fp==0 && *mo
148e0 64 65 3d 3d 27 77 27 20 29 7b 0a 20 20 20 20 66  de=='w' ){.    f
148f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43  printf(stderr,"C
14900 61 6e 27 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c  an't open file \
14910 22 25 73 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e  "%s\".\n",lemp->
14920 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65  outname);.    le
14930 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
14940 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
14950 7d 0a 20 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d  }.  return fp;.}
14960 0a 0a 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74  ../* Duplicate t
14970 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 77 69  he input file wi
14980 74 68 6f 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61  thout comments a
14990 6e 64 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f  nd without actio
149a0 6e 73 20 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20  ns .** on rules 
149b0 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28  */.void Reprint(
149c0 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
149d0 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74  on *lemp;.{.  st
149e0 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20  ruct rule *rp;. 
149f0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
14a00 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  sp;.  int i, j, 
14a10 6d 61 78 6c 65 6e 2c 20 6c 65 6e 2c 20 6e 63 6f  maxlen, len, nco
14a20 6c 75 6d 6e 73 2c 20 73 6b 69 70 3b 0a 20 20 70  lumns, skip;.  p
14a30 72 69 6e 74 66 28 22 2f 2f 20 52 65 70 72 69 6e  rintf("// Reprin
14a40 74 20 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20  t of input file 
14a50 5c 22 25 73 5c 22 2e 5c 6e 2f 2f 20 53 79 6d 62  \"%s\".\n// Symb
14a60 6f 6c 73 3a 5c 6e 22 2c 6c 65 6d 70 2d 3e 66 69  ols:\n",lemp->fi
14a70 6c 65 6e 61 6d 65 29 3b 0a 20 20 6d 61 78 6c 65  lename);.  maxle
14a80 6e 20 3d 20 31 30 3b 0a 20 20 66 6f 72 28 69 3d  n = 10;.  for(i=
14a90 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
14aa0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70  ol; i++){.    sp
14ab0 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
14ac0 5b 69 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  [i];.    len = s
14ad0 74 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b  trlen(sp->name);
14ae0 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78  .    if( len>max
14af0 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c  len ) maxlen = l
14b00 65 6e 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d  en;.  }.  ncolum
14b10 6e 73 20 3d 20 37 36 2f 28 6d 61 78 6c 65 6e 2b  ns = 76/(maxlen+
14b20 35 29 3b 0a 20 20 69 66 28 20 6e 63 6f 6c 75 6d  5);.  if( ncolum
14b30 6e 73 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e 73 20  ns<1 ) ncolumns 
14b40 3d 20 31 3b 0a 20 20 73 6b 69 70 20 3d 20 28 6c  = 1;.  skip = (l
14b50 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e  emp->nsymbol + n
14b60 63 6f 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f  columns - 1)/nco
14b70 6c 75 6d 6e 73 3b 0a 20 20 66 6f 72 28 69 3d 30  lumns;.  for(i=0
14b80 3b 20 69 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a  ; i<skip; i++){.
14b90 20 20 20 20 70 72 69 6e 74 66 28 22 2f 2f 22 29      printf("//")
14ba0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a  ;.    for(j=i; j
14bb0 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
14bc0 6a 2b 3d 73 6b 69 70 29 7b 0a 20 20 20 20 20 20  j+=skip){.      
14bd0 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
14be0 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73  ls[j];.      ass
14bf0 65 72 74 28 20 73 70 2d 3e 69 6e 64 65 78 3d 3d  ert( sp->index==
14c00 6a 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74  j );.      print
14c10 66 28 22 20 25 33 64 20 25 2d 2a 2e 2a 73 22 2c  f(" %3d %-*.*s",
14c20 6a 2c 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c  j,maxlen,maxlen,
14c30 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  sp->name);.    }
14c40 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22  .    printf("\n"
14c50 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d  );.  }.  for(rp=
14c60 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
14c70 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
14c80 20 20 70 72 69 6e 74 66 28 22 25 73 22 2c 72 70    printf("%s",rp
14c90 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ->lhs->name);.  
14ca0 20 20 2f 2a 20 20 20 20 69 66 28 20 72 70 2d 3e    /*    if( rp->
14cb0 6c 68 73 61 6c 69 61 73 20 29 20 70 72 69 6e 74  lhsalias ) print
14cc0 66 28 22 28 25 73 29 22 2c 72 70 2d 3e 6c 68 73  f("(%s)",rp->lhs
14cd0 61 6c 69 61 73 29 3b 20 2a 2f 0a 20 20 20 20 70  alias); */.    p
14ce0 72 69 6e 74 66 28 22 20 3a 3a 3d 22 29 3b 0a 20  rintf(" ::=");. 
14cf0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
14d00 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
14d10 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68 73      sp = rp->rhs
14d20 5b 69 5d 3b 0a 20 20 20 20 20 20 70 72 69 6e 74  [i];.      print
14d30 66 28 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d  f(" %s", sp->nam
14d40 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70  e);.      if( sp
14d50 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52  ->type==MULTITER
14d60 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  MINAL ){.       
14d70 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e   for(j=1; j<sp->
14d80 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20  nsubsym; j++){. 
14d90 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28           printf(
14da0 22 7c 25 73 22 2c 20 73 70 2d 3e 73 75 62 73 79  "|%s", sp->subsy
14db0 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  m[j]->name);.   
14dc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14dd0 20 20 20 20 20 2f 2a 20 69 66 28 20 72 70 2d 3e       /* if( rp->
14de0 72 68 73 61 6c 69 61 73 5b 69 5d 20 29 20 70 72  rhsalias[i] ) pr
14df0 69 6e 74 66 28 22 28 25 73 29 22 2c 72 70 2d 3e  intf("(%s)",rp->
14e00 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 20 2a 2f  rhsalias[i]); */
14e10 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74  .    }.    print
14e20 66 28 22 2e 22 29 3b 0a 20 20 20 20 69 66 28 20  f(".");.    if( 
14e30 72 70 2d 3e 70 72 65 63 73 79 6d 20 29 20 70 72  rp->precsym ) pr
14e40 69 6e 74 66 28 22 20 5b 25 73 5d 22 2c 72 70 2d  intf(" [%s]",rp-
14e50 3e 70 72 65 63 73 79 6d 2d 3e 6e 61 6d 65 29 3b  >precsym->name);
14e60 0a 20 20 20 20 2f 2a 20 69 66 28 20 72 70 2d 3e  .    /* if( rp->
14e70 63 6f 64 65 20 29 20 70 72 69 6e 74 66 28 22 5c  code ) printf("\
14e80 6e 20 20 20 20 25 73 22 2c 72 70 2d 3e 63 6f 64  n    %s",rp->cod
14e90 65 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74  e); */.    print
14ea0 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  f("\n");.  }.}..
14eb0 76 6f 69 64 20 43 6f 6e 66 69 67 50 72 69 6e 74  void ConfigPrint
14ec0 28 66 70 2c 63 66 70 29 0a 46 49 4c 45 20 2a 66  (fp,cfp).FILE *f
14ed0 70 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  p;.struct config
14ee0 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72 75 63   *cfp;.{.  struc
14ef0 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74  t rule *rp;.  st
14f00 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
14f10 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 72  .  int i, j;.  r
14f20 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20 66  p = cfp->rp;.  f
14f30 70 72 69 6e 74 66 28 66 70 2c 22 25 73 20 3a 3a  printf(fp,"%s ::
14f40 3d 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65  =",rp->lhs->name
14f50 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
14f60 3d 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  =rp->nrhs; i++){
14f70 0a 20 20 20 20 69 66 28 20 69 3d 3d 63 66 70 2d  .    if( i==cfp-
14f80 3e 64 6f 74 20 29 20 66 70 72 69 6e 74 66 28 66  >dot ) fprintf(f
14f90 70 2c 22 20 2a 22 29 3b 0a 20 20 20 20 69 66 28  p," *");.    if(
14fa0 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 62   i==rp->nrhs ) b
14fb0 72 65 61 6b 3b 0a 20 20 20 20 73 70 20 3d 20 72  reak;.    sp = r
14fc0 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 66  p->rhs[i];.    f
14fd0 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73 22 2c  printf(fp," %s",
14fe0 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20   sp->name);.    
14ff0 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55  if( sp->type==MU
15000 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
15010 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c       for(j=1; j<
15020 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b  sp->nsubsym; j++
15030 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
15040 74 66 28 66 70 2c 22 7c 25 73 22 2c 73 70 2d 3e  tf(fp,"|%s",sp->
15050 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e 61 6d 65 29  subsym[j]->name)
15060 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15070 20 20 7d 0a 7d 0a 0a 2f 2a 20 23 64 65 66 69 6e    }.}../* #defin
15080 65 20 54 45 53 54 20 2a 2f 0a 23 69 66 20 30 0a  e TEST */.#if 0.
15090 2f 2a 20 50 72 69 6e 74 20 61 20 73 65 74 20 2a  /* Print a set *
150a0 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 53  /.PRIVATE void S
150b0 65 74 50 72 69 6e 74 28 6f 75 74 2c 73 65 74 2c  etPrint(out,set,
150c0 6c 65 6d 70 29 0a 46 49 4c 45 20 2a 6f 75 74 3b  lemp).FILE *out;
150d0 0a 63 68 61 72 20 2a 73 65 74 3b 0a 73 74 72 75  .char *set;.stru
150e0 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
150f0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  {.  int i;.  cha
15100 72 20 2a 73 70 61 63 65 72 3b 0a 20 20 73 70 61  r *spacer;.  spa
15110 63 65 72 20 3d 20 22 22 3b 0a 20 20 66 70 72 69  cer = "";.  fpri
15120 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 5b 22 2c  ntf(out,"%12s[",
15130 22 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  "");.  for(i=0; 
15140 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  i<lemp->ntermina
15150 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; i++){.    if(
15160 20 53 65 74 46 69 6e 64 28 73 65 74 2c 69 29 20   SetFind(set,i) 
15170 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
15180 28 6f 75 74 2c 22 25 73 25 73 22 2c 73 70 61 63  (out,"%s%s",spac
15190 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  er,lemp->symbols
151a0 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  [i]->name);.    
151b0 20 20 73 70 61 63 65 72 20 3d 20 22 20 22 3b 0a    spacer = " ";.
151c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69      }.  }.  fpri
151d0 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e 22 29 3b 0a  ntf(out,"]\n");.
151e0 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 70 6c  }../* Print a pl
151f0 69 6e 6b 20 63 68 61 69 6e 20 2a 2f 0a 50 52 49  ink chain */.PRI
15200 56 41 54 45 20 76 6f 69 64 20 50 6c 69 6e 6b 50  VATE void PlinkP
15210 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2c 74 61 67  rint(out,plp,tag
15220 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72  ).FILE *out;.str
15230 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a  uct plink *plp;.
15240 63 68 61 72 20 2a 74 61 67 3b 0a 7b 0a 20 20 77  char *tag;.{.  w
15250 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20 20  hile( plp ){.   
15260 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 31   fprintf(out,"%1
15270 32 73 25 73 20 28 73 74 61 74 65 20 25 32 64 29  2s%s (state %2d)
15280 20 22 2c 22 22 2c 74 61 67 2c 70 6c 70 2d 3e 63   ","",tag,plp->c
15290 66 70 2d 3e 73 74 70 2d 3e 73 74 61 74 65 6e 75  fp->stp->statenu
152a0 6d 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 50 72  m);.    ConfigPr
152b0 69 6e 74 28 6f 75 74 2c 70 6c 70 2d 3e 63 66 70  int(out,plp->cfp
152c0 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
152d0 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 70 6c  ut,"\n");.    pl
152e0 70 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20  p = plp->next;. 
152f0 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20   }.}.#endif../* 
15300 50 72 69 6e 74 20 61 6e 20 61 63 74 69 6f 6e 20  Print an action 
15310 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c  to the given fil
15320 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52  e descriptor.  R
15330 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a 2a  eturn FALSE if.*
15340 2a 20 6e 6f 74 68 69 6e 67 20 77 61 73 20 61 63  * nothing was ac
15350 74 75 61 6c 6c 79 20 70 72 69 6e 74 65 64 2e 0a  tually printed..
15360 2a 2f 0a 69 6e 74 20 50 72 69 6e 74 41 63 74 69  */.int PrintActi
15370 6f 6e 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e  on(struct action
15380 20 2a 61 70 2c 20 46 49 4c 45 20 2a 66 70 2c 20   *ap, FILE *fp, 
15390 69 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 69  int indent){.  i
153a0 6e 74 20 72 65 73 75 6c 74 20 3d 20 31 3b 0a 20  nt result = 1;. 
153b0 20 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70   switch( ap->typ
153c0 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48  e ){.    case SH
153d0 49 46 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e  IFT:.      fprin
153e0 74 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74  tf(fp,"%*s shift
153f0 20 20 25 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d    %d",indent,ap-
15400 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e  >sp->name,ap->x.
15410 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d 29 3b 0a  stp->statenum);.
15420 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15430 20 63 61 73 65 20 52 45 44 55 43 45 3a 0a 20 20   case REDUCE:.  
15440 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
15450 25 2a 73 20 72 65 64 75 63 65 20 25 64 22 2c 69  %*s reduce %d",i
15460 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61  ndent,ap->sp->na
15470 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64  me,ap->x.rp->ind
15480 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
15490 3b 0a 20 20 20 20 63 61 73 65 20 41 43 43 45 50  ;.    case ACCEP
154a0 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  T:.      fprintf
154b0 28 66 70 2c 22 25 2a 73 20 61 63 63 65 70 74 22  (fp,"%*s accept"
154c0 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e  ,indent,ap->sp->
154d0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  name);.      bre
154e0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 52 52  ak;.    case ERR
154f0 4f 52 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74  OR:.      fprint
15500 66 28 66 70 2c 22 25 2a 73 20 65 72 72 6f 72 22  f(fp,"%*s error"
15510 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e  ,indent,ap->sp->
15520 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65  name);.      bre
15530 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 52 43  ak;.    case SRC
15540 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 63 61 73  ONFLICT:.    cas
15550 65 20 52 52 43 4f 4e 46 4c 49 43 54 3a 0a 20 20  e RRCONFLICT:.  
15560 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
15570 25 2a 73 20 72 65 64 75 63 65 20 25 2d 33 64 20  %*s reduce %-3d 
15580 2a 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c  ** Parsing confl
15590 69 63 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20 20  ict **",.       
155a0 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e   indent,ap->sp->
155b0 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69  name,ap->x.rp->i
155c0 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65  ndex);.      bre
155d0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 43  ak;.    case SSC
155e0 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20 20 20 66  ONFLICT:.      f
155f0 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73  printf(fp,"%*s s
15600 68 69 66 74 20 20 25 64 20 2a 2a 20 50 61 72 73  hift  %d ** Pars
15610 69 6e 67 20 63 6f 6e 66 6c 69 63 74 20 2a 2a 22  ing conflict **"
15620 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 64 65 6e  , .        inden
15630 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61  t,ap->sp->name,a
15640 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e  p->x.stp->staten
15650 75 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  um);.      break
15660 3b 0a 20 20 20 20 63 61 73 65 20 53 48 5f 52 45  ;.    case SH_RE
15670 53 4f 4c 56 45 44 3a 0a 20 20 20 20 63 61 73 65  SOLVED:.    case
15680 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20   RD_RESOLVED:.  
15690 20 20 63 61 73 65 20 4e 4f 54 5f 55 53 45 44 3a    case NOT_USED:
156a0 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20  .      result = 
156b0 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
156c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
156d0 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72  ult;.}../* Gener
156e0 61 74 65 20 74 68 65 20 22 79 2e 6f 75 74 70 75  ate the "y.outpu
156f0 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 76  t" log file */.v
15700 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74  oid ReportOutput
15710 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65  (lemp).struct le
15720 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69  mon *lemp;.{.  i
15730 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
15740 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72  tate *stp;.  str
15750 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
15760 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
15770 20 2a 61 70 3b 0a 20 20 46 49 4c 45 20 2a 66 70   *ap;.  FILE *fp
15780 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65 5f 6f  ;..  fp = file_o
15790 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74 22 2c  pen(lemp,".out",
157a0 22 77 62 22 29 3b 0a 20 20 69 66 28 20 66 70 3d  "wb");.  if( fp=
157b0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66  =0 ) return;.  f
157c0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
157d0 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
157e0 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
157f0 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 70 72  rted[i];.    fpr
15800 69 6e 74 66 28 66 70 2c 22 53 74 61 74 65 20 25  intf(fp,"State %
15810 64 3a 5c 6e 22 2c 73 74 70 2d 3e 73 74 61 74 65  d:\n",stp->state
15820 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 6c 65  num);.    if( le
15830 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29 20  mp->basisflag ) 
15840 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a 20 20 20  cfp=stp->bp;.   
15850 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20   else           
15860 20 20 20 20 20 20 20 63 66 70 3d 73 74 70 2d 3e         cfp=stp->
15870 63 66 70 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  cfp;.    while( 
15880 63 66 70 20 29 7b 0a 20 20 20 20 20 20 63 68 61  cfp ){.      cha
15890 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20 20 20 20  r buf[20];.     
158a0 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3d 3d 63   if( cfp->dot==c
158b0 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 7b 0a  fp->rp->nrhs ){.
158c0 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
158d0 62 75 66 2c 22 28 25 64 29 22 2c 63 66 70 2d 3e  buf,"(%d)",cfp->
158e0 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  rp->index);.    
158f0 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22      fprintf(fp,"
15900 20 20 20 20 25 35 73 20 22 2c 62 75 66 29 3b 0a      %5s ",buf);.
15910 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15920 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
15930 22 20 20 20 20 20 20 20 20 20 20 22 29 3b 0a 20  "          ");. 
15940 20 20 20 20 20 7d 0a 20 20 20 20 20 20 43 6f 6e       }.      Con
15950 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66 70 29  figPrint(fp,cfp)
15960 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
15970 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 20 30 0a  fp,"\n");.#if 0.
15980 20 20 20 20 20 20 53 65 74 50 72 69 6e 74 28 66        SetPrint(f
15990 70 2c 63 66 70 2d 3e 66 77 73 2c 6c 65 6d 70 29  p,cfp->fws,lemp)
159a0 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69  ;.      PlinkPri
159b0 6e 74 28 66 70 2c 63 66 70 2d 3e 66 70 6c 70 2c  nt(fp,cfp->fplp,
159c0 22 54 6f 20 20 22 29 3b 0a 20 20 20 20 20 20 50  "To  ");.      P
159d0 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66 70  linkPrint(fp,cfp
159e0 2d 3e 62 70 6c 70 2c 22 46 72 6f 6d 22 29 3b 0a  ->bplp,"From");.
159f0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
15a00 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67   lemp->basisflag
15a10 20 29 20 63 66 70 3d 63 66 70 2d 3e 62 70 3b 0a   ) cfp=cfp->bp;.
15a20 20 20 20 20 20 20 65 6c 73 65 20 20 20 20 20 20        else      
15a30 20 20 20 20 20 20 20 20 20 20 20 20 63 66 70 3d              cfp=
15a40 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d  cfp->next;.    }
15a50 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c  .    fprintf(fp,
15a60 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 61  "\n");.    for(a
15a70 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
15a80 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
15a90 20 20 20 69 66 28 20 50 72 69 6e 74 41 63 74 69     if( PrintActi
15aa0 6f 6e 28 61 70 2c 66 70 2c 33 30 29 20 29 20 66  on(ap,fp,30) ) f
15ab0 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b  printf(fp,"\n");
15ac0 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e  .    }.    fprin
15ad0 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 7d  tf(fp,"\n");.  }
15ae0 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22  .  fprintf(fp, "
15af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b20 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 66 70 72 69  ----\n");.  fpri
15b30 6e 74 66 28 66 70 2c 20 22 53 79 6d 62 6f 6c 73  ntf(fp, "Symbols
15b40 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  :\n");.  for(i=0
15b50 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
15b60 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  l; i++){.    int
15b70 20 6a 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73   j;.    struct s
15b80 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 20 20  ymbol *sp;..    
15b90 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
15ba0 6c 73 5b 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e  ls[i];.    fprin
15bb0 74 66 28 66 70 2c 20 22 20 20 25 33 64 3a 20 25  tf(fp, "  %3d: %
15bc0 73 22 2c 20 69 2c 20 73 70 2d 3e 6e 61 6d 65 29  s", i, sp->name)
15bd0 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  ;.    if( sp->ty
15be0 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20  pe==NONTERMINAL 
15bf0 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
15c00 28 66 70 2c 20 22 3a 22 29 3b 0a 20 20 20 20 20  (fp, ":");.     
15c10 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61 20   if( sp->lambda 
15c20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
15c30 74 66 28 66 70 2c 20 22 20 3c 6c 61 6d 62 64 61  tf(fp, " <lambda
15c40 3e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >");.      }.   
15c50 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 65     for(j=0; j<le
15c60 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 6a  mp->nterminal; j
15c70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
15c80 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20 26 26   sp->firstset &&
15c90 20 53 65 74 46 69 6e 64 28 73 70 2d 3e 66 69 72   SetFind(sp->fir
15ca0 73 74 73 65 74 2c 20 6a 29 20 29 7b 0a 20 20 20  stset, j) ){.   
15cb0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
15cc0 70 2c 20 22 20 25 73 22 2c 20 6c 65 6d 70 2d 3e  p, " %s", lemp->
15cd0 73 79 6d 62 6f 6c 73 5b 6a 5d 2d 3e 6e 61 6d 65  symbols[j]->name
15ce0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15cf0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
15d00 70 72 69 6e 74 66 28 66 70 2c 20 22 5c 6e 22 29  printf(fp, "\n")
15d10 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66  ;.  }.  fclose(f
15d20 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  p);.  return;.}.
15d30 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74  ./* Search for t
15d40 68 65 20 66 69 6c 65 20 22 6e 61 6d 65 22 20 77  he file "name" w
15d50 68 69 63 68 20 69 73 20 69 6e 20 74 68 65 20 73  hich is in the s
15d60 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73  ame directory as
15d70 0a 2a 2a 20 74 68 65 20 65 78 61 63 75 74 61 62  .** the exacutab
15d80 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 63 68  le */.PRIVATE ch
15d90 61 72 20 2a 70 61 74 68 73 65 61 72 63 68 28 61  ar *pathsearch(a
15da0 72 67 76 30 2c 6e 61 6d 65 2c 6d 6f 64 65 6d 61  rgv0,name,modema
15db0 73 6b 29 0a 63 68 61 72 20 2a 61 72 67 76 30 3b  sk).char *argv0;
15dc0 0a 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 69 6e 74  .char *name;.int
15dd0 20 6d 6f 64 65 6d 61 73 6b 3b 0a 7b 0a 20 20 63   modemask;.{.  c
15de0 68 61 72 20 2a 70 61 74 68 6c 69 73 74 3b 0a 20  har *pathlist;. 
15df0 20 63 68 61 72 20 2a 70 61 74 68 2c 2a 63 70 3b   char *path,*cp;
15e00 0a 20 20 63 68 61 72 20 63 3b 0a 0a 23 69 66 64  .  char c;..#ifd
15e10 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 20 20 63  ef __WIN32__.  c
15e20 70 20 3d 20 73 74 72 72 63 68 72 28 61 72 67 76  p = strrchr(argv
15e30 30 2c 27 5c 5c 27 29 3b 0a 23 65 6c 73 65 0a 20  0,'\\');.#else. 
15e40 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 61 72   cp = strrchr(ar
15e50 67 76 30 2c 27 2f 27 29 3b 0a 23 65 6e 64 69 66  gv0,'/');.#endif
15e60 0a 20 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20  .  if( cp ){.   
15e70 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63   c = *cp;.    *c
15e80 70 20 3d 20 30 3b 0a 20 20 20 20 70 61 74 68 20  p = 0;.    path 
15e90 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63  = (char *)malloc
15ea0 28 20 73 74 72 6c 65 6e 28 61 72 67 76 30 29 20  ( strlen(argv0) 
15eb0 2b 20 73 74 72 6c 65 6e 28 6e 61 6d 65 29 20 2b  + strlen(name) +
15ec0 20 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61   2 );.    if( pa
15ed0 74 68 20 29 20 73 70 72 69 6e 74 66 28 70 61 74  th ) sprintf(pat
15ee0 68 2c 22 25 73 2f 25 73 22 2c 61 72 67 76 30 2c  h,"%s/%s",argv0,
15ef0 6e 61 6d 65 29 3b 0a 20 20 20 20 2a 63 70 20 3d  name);.    *cp =
15f00 20 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   c;.  }else{.   
15f10 20 65 78 74 65 72 6e 20 63 68 61 72 20 2a 67 65   extern char *ge
15f20 74 65 6e 76 28 29 3b 0a 20 20 20 20 70 61 74 68  tenv();.    path
15f30 6c 69 73 74 20 3d 20 67 65 74 65 6e 76 28 22 50  list = getenv("P
15f40 41 54 48 22 29 3b 0a 20 20 20 20 69 66 28 20 70  ATH");.    if( p
15f50 61 74 68 6c 69 73 74 3d 3d 30 20 29 20 70 61 74  athlist==0 ) pat
15f60 68 6c 69 73 74 20 3d 20 22 2e 3a 2f 62 69 6e 3a  hlist = ".:/bin:
15f70 2f 75 73 72 2f 62 69 6e 22 3b 0a 20 20 20 20 70  /usr/bin";.    p
15f80 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 6d 61  ath = (char *)ma
15f90 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 70 61 74  lloc( strlen(pat
15fa0 68 6c 69 73 74 29 2b 73 74 72 6c 65 6e 28 6e 61  hlist)+strlen(na
15fb0 6d 65 29 2b 32 20 29 3b 0a 20 20 20 20 69 66 28  me)+2 );.    if(
15fc0 20 70 61 74 68 21 3d 30 20 29 7b 0a 20 20 20 20   path!=0 ){.    
15fd0 20 20 77 68 69 6c 65 28 20 2a 70 61 74 68 6c 69    while( *pathli
15fe0 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 63 70  st ){.        cp
15ff0 20 3d 20 73 74 72 63 68 72 28 70 61 74 68 6c 69   = strchr(pathli
16000 73 74 2c 27 3a 27 29 3b 0a 20 20 20 20 20 20 20  st,':');.       
16010 20 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20   if( cp==0 ) cp 
16020 3d 20 26 70 61 74 68 6c 69 73 74 5b 73 74 72 6c  = &pathlist[strl
16030 65 6e 28 70 61 74 68 6c 69 73 74 29 5d 3b 0a 20  en(pathlist)];. 
16040 20 20 20 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a         c = *cp;.
16050 20 20 20 20 20 20 20 20 2a 63 70 20 3d 20 30 3b          *cp = 0;
16060 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
16070 28 70 61 74 68 2c 22 25 73 2f 25 73 22 2c 70 61  (path,"%s/%s",pa
16080 74 68 6c 69 73 74 2c 6e 61 6d 65 29 3b 0a 20 20  thlist,name);.  
16090 20 20 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20        *cp = c;. 
160a0 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20         if( c==0 
160b0 29 20 70 61 74 68 6c 69 73 74 20 3d 20 22 22 3b  ) pathlist = "";
160c0 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 70 61  .        else pa
160d0 74 68 6c 69 73 74 20 3d 20 26 63 70 5b 31 5d 3b  thlist = &cp[1];
160e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 63 63  .        if( acc
160f0 65 73 73 28 70 61 74 68 2c 6d 6f 64 65 6d 61 73  ess(path,modemas
16100 6b 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  k)==0 ) break;. 
16110 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16120 0a 20 20 72 65 74 75 72 6e 20 70 61 74 68 3b 0a  .  return path;.
16130 7d 0a 0a 2f 2a 20 47 69 76 65 6e 20 61 6e 20 61  }../* Given an a
16140 63 74 69 6f 6e 2c 20 63 6f 6d 70 75 74 65 20 74  ction, compute t
16150 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
16160 20 66 6f 72 20 74 68 61 74 20 61 63 74 69 6f 6e   for that action
16170 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 74 6f 20  .** which is to 
16180 62 65 20 70 75 74 20 69 6e 20 74 68 65 20 61 63  be put in the ac
16190 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74 68  tion table of th
161a0 65 20 67 65 6e 65 72 61 74 65 64 20 6d 61 63 68  e generated mach
161b0 69 6e 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ine..** Return n
161c0 65 67 61 74 69 76 65 20 69 66 20 6e 6f 20 61 63  egative if no ac
161d0 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 67  tion should be g
161e0 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 50 52 49  enerated..*/.PRI
161f0 56 41 54 45 20 69 6e 74 20 63 6f 6d 70 75 74 65  VATE int compute
16200 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70 29  _action(lemp,ap)
16210 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
16220 65 6d 70 3b 0a 73 74 72 75 63 74 20 61 63 74 69  emp;.struct acti
16230 6f 6e 20 2a 61 70 3b 0a 7b 0a 20 20 69 6e 74 20  on *ap;.{.  int 
16240 61 63 74 3b 0a 20 20 73 77 69 74 63 68 28 20 61  act;.  switch( a
16250 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20 20 20 63  p->type ){.    c
16260 61 73 65 20 53 48 49 46 54 3a 20 20 61 63 74 20  ase SHIFT:  act 
16270 3d 20 61 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61  = ap->x.stp->sta
16280 74 65 6e 75 6d 3b 20 20 20 20 20 20 20 20 20 20  tenum;          
16290 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
162a0 65 20 52 45 44 55 43 45 3a 20 61 63 74 20 3d 20  e REDUCE: act = 
162b0 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20  ap->x.rp->index 
162c0 2b 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  + lemp->nstate; 
162d0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
162e0 45 52 52 4f 52 3a 20 20 61 63 74 20 3d 20 6c 65  ERROR:  act = le
162f0 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d  mp->nstate + lem
16300 70 2d 3e 6e 72 75 6c 65 3b 20 20 20 20 20 62 72  p->nrule;     br
16310 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 43  eak;.    case AC
16320 43 45 50 54 3a 20 61 63 74 20 3d 20 6c 65 6d 70  CEPT: act = lemp
16330 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d  ->nstate + lemp-
16340 3e 6e 72 75 6c 65 20 2b 20 31 3b 20 62 72 65 61  >nrule + 1; brea
16350 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
16360 20 20 20 20 61 63 74 20 3d 20 2d 31 3b 20 62 72      act = -1; br
16370 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
16380 6e 20 61 63 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e  n act;.}..#defin
16390 65 20 4c 49 4e 45 53 49 5a 45 20 31 30 30 30 0a  e LINESIZE 1000.
163a0 2f 2a 20 54 68 65 20 6e 65 78 74 20 63 6c 75 73  /* The next clus
163b0 74 65 72 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  ter of routines 
163c0 61 72 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  are for reading 
163d0 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  the template fil
163e0 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 69 6e 67  e.** and writing
163f0 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20   the results to 
16400 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 70 61  the generated pa
16410 72 73 65 72 20 2a 2f 0a 2f 2a 20 54 68 65 20 66  rser */./* The f
16420 69 72 73 74 20 66 75 6e 63 74 69 6f 6e 20 74 72  irst function tr
16430 61 6e 73 66 65 72 73 20 64 61 74 61 20 66 72 6f  ansfers data fro
16440 6d 20 22 69 6e 22 20 74 6f 20 22 6f 75 74 22 20  m "in" to "out" 
16450 75 6e 74 69 6c 0a 2a 2a 20 61 20 6c 69 6e 65 20  until.** a line 
16460 69 73 20 73 65 65 6e 20 77 68 69 63 68 20 62 65  is seen which be
16470 67 69 6e 73 20 77 69 74 68 20 22 25 25 22 2e 20  gins with "%%". 
16480 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72   The line number
16490 20 69 73 0a 2a 2a 20 74 72 61 63 6b 65 64 2e 0a   is.** tracked..
164a0 2a 2a 0a 2a 2a 20 69 66 20 6e 61 6d 65 21 3d 30  **.** if name!=0
164b0 2c 20 74 68 65 6e 20 61 6e 79 20 77 6f 72 64 20  , then any word 
164c0 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
164d0 22 50 61 72 73 65 22 20 69 73 20 63 68 61 6e 67  "Parse" is chang
164e0 65 64 20 74 6f 0a 2a 2a 20 62 65 67 69 6e 20 77  ed to.** begin w
164f0 69 74 68 20 2a 6e 61 6d 65 20 69 6e 73 74 65 61  ith *name instea
16500 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  d..*/.PRIVATE vo
16510 69 64 20 74 70 6c 74 5f 78 66 65 72 28 6e 61 6d  id tplt_xfer(nam
16520 65 2c 69 6e 2c 6f 75 74 2c 6c 69 6e 65 6e 6f 29  e,in,out,lineno)
16530 0a 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 46 49 4c  .char *name;.FIL
16540 45 20 2a 69 6e 3b 0a 46 49 4c 45 20 2a 6f 75 74  E *in;.FILE *out
16550 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b  ;.int *lineno;.{
16560 0a 20 20 69 6e 74 20 69 2c 20 69 53 74 61 72 74  .  int i, iStart
16570 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49  ;.  char line[LI
16580 4e 45 53 49 5a 45 5d 3b 0a 20 20 77 68 69 6c 65  NESIZE];.  while
16590 28 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e  ( fgets(line,LIN
165a0 45 53 49 5a 45 2c 69 6e 29 20 26 26 20 28 6c 69  ESIZE,in) && (li
165b0 6e 65 5b 30 5d 21 3d 27 25 27 20 7c 7c 20 6c 69  ne[0]!='%' || li
165c0 6e 65 5b 31 5d 21 3d 27 25 27 29 20 29 7b 0a 20  ne[1]!='%') ){. 
165d0 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a     (*lineno)++;.
165e0 20 20 20 20 69 53 74 61 72 74 20 3d 20 30 3b 0a      iStart = 0;.
165f0 20 20 20 20 69 66 28 20 6e 61 6d 65 20 29 7b 0a      if( name ){.
16600 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6c        for(i=0; l
16610 69 6e 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ine[i]; i++){.  
16620 20 20 20 20 20 20 69 66 28 20 6c 69 6e 65 5b 69        if( line[i
16630 5d 3d 3d 27 50 27 20 26 26 20 73 74 72 6e 63 6d  ]=='P' && strncm
16640 70 28 26 6c 69 6e 65 5b 69 5d 2c 22 50 61 72 73  p(&line[i],"Pars
16650 65 22 2c 35 29 3d 3d 30 0a 20 20 20 20 20 20 20  e",5)==0.       
16660 20 20 20 26 26 20 28 69 3d 3d 30 20 7c 7c 20 21     && (i==0 || !
16670 69 73 61 6c 70 68 61 28 6c 69 6e 65 5b 69 2d 31  isalpha(line[i-1
16680 5d 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ])).        ){. 
16690 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 69           if( i>i
166a0 53 74 61 72 74 20 29 20 66 70 72 69 6e 74 66 28  Start ) fprintf(
166b0 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2d 69 53 74  out,"%.*s",i-iSt
166c0 61 72 74 2c 26 6c 69 6e 65 5b 69 53 74 61 72 74  art,&line[iStart
166d0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70  ]);.          fp
166e0 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 6e  rintf(out,"%s",n
166f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
16700 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  i += 4;.        
16710 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a    iStart = i+1;.
16720 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16730 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  }.    }.    fpri
16740 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 26 6c 69  ntf(out,"%s",&li
16750 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 7d  ne[iStart]);.  }
16760 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6e 65 78 74 20  .}../* The next 
16770 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74  function finds t
16780 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  he template file
16790 20 61 6e 64 20 6f 70 65 6e 73 20 69 74 2c 20 72   and opens it, r
167a0 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 20 70 6f  eturning.** a po
167b0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 70 65  inter to the ope
167c0 6e 65 64 20 66 69 6c 65 2e 20 2a 2f 0a 50 52 49  ned file. */.PRI
167d0 56 41 54 45 20 46 49 4c 45 20 2a 74 70 6c 74 5f  VATE FILE *tplt_
167e0 6f 70 65 6e 28 6c 65 6d 70 29 0a 73 74 72 75 63  open(lemp).struc
167f0 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
16800 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 74  .  static char t
16810 65 6d 70 6c 61 74 65 6e 61 6d 65 5b 5d 20 3d 20  emplatename[] = 
16820 22 6c 65 6d 70 61 72 2e 63 22 3b 0a 20 20 63 68  "lempar.c";.  ch
16830 61 72 20 62 75 66 5b 31 30 30 30 5d 3b 0a 20 20  ar buf[1000];.  
16840 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72  FILE *in;.  char
16850 20 2a 74 70 6c 74 6e 61 6d 65 3b 0a 20 20 63 68   *tpltname;.  ch
16860 61 72 20 2a 63 70 3b 0a 0a 20 20 63 70 20 3d 20  ar *cp;..  cp = 
16870 73 74 72 72 63 68 72 28 6c 65 6d 70 2d 3e 66 69  strrchr(lemp->fi
16880 6c 65 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20 69  lename,'.');.  i
16890 66 28 20 63 70 20 29 7b 0a 20 20 20 20 73 70 72  f( cp ){.    spr
168a0 69 6e 74 66 28 62 75 66 2c 22 25 2e 2a 73 2e 6c  intf(buf,"%.*s.l
168b0 74 22 2c 28 69 6e 74 29 28 63 70 2d 6c 65 6d 70  t",(int)(cp-lemp
168c0 2d 3e 66 69 6c 65 6e 61 6d 65 29 2c 6c 65 6d 70  ->filename),lemp
168d0 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  ->filename);.  }
168e0 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74  else{.    sprint
168f0 66 28 62 75 66 2c 22 25 73 2e 6c 74 22 2c 6c 65  f(buf,"%s.lt",le
16900 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
16910 20 7d 0a 20 20 69 66 28 20 61 63 63 65 73 73 28   }.  if( access(
16920 62 75 66 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20  buf,004)==0 ){. 
16930 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 62 75     tpltname = bu
16940 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  f;.  }else if( a
16950 63 63 65 73 73 28 74 65 6d 70 6c 61 74 65 6e 61  ccess(templatena
16960 6d 65 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20  me,004)==0 ){.  
16970 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 74 65 6d    tpltname = tem
16980 70 6c 61 74 65 6e 61 6d 65 3b 0a 20 20 7d 65 6c  platename;.  }el
16990 73 65 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65  se{.    tpltname
169a0 20 3d 20 70 61 74 68 73 65 61 72 63 68 28 6c 65   = pathsearch(le
169b0 6d 70 2d 3e 61 72 67 76 30 2c 74 65 6d 70 6c 61  mp->argv0,templa
169c0 74 65 6e 61 6d 65 2c 30 29 3b 0a 20 20 7d 0a 20  tename,0);.  }. 
169d0 20 69 66 28 20 74 70 6c 74 6e 61 6d 65 3d 3d 30   if( tpltname==0
169e0 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
169f0 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 66 69  stderr,"Can't fi
16a00 6e 64 20 74 68 65 20 70 61 72 73 65 72 20 64 72  nd the parser dr
16a10 69 76 65 72 20 74 65 6d 70 6c 61 74 65 20 66 69  iver template fi
16a20 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20  le \"%s\".\n",. 
16a30 20 20 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29     templatename)
16a40 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f  ;.    lemp->erro
16a50 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  rcnt++;.    retu
16a60 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d  rn 0;.  }.  in =
16a70 20 66 6f 70 65 6e 28 74 70 6c 74 6e 61 6d 65 2c   fopen(tpltname,
16a80 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d  "rb");.  if( in=
16a90 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
16aa0 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
16ab0 6f 70 65 6e 20 74 68 65 20 74 65 6d 70 6c 61 74  open the templat
16ac0 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e  e file \"%s\".\n
16ad0 22 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b  ",templatename);
16ae0 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72  .    lemp->error
16af0 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  cnt++;.    retur
16b00 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
16b10 6e 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e  n in;.}../* Prin
16b20 74 20 61 20 23 6c 69 6e 65 20 64 69 72 65 63 74  t a #line direct
16b30 69 76 65 20 6c 69 6e 65 20 74 6f 20 74 68 65 20  ive line to the 
16b40 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 2a 2f 0a  output file. */.
16b50 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c  PRIVATE void tpl
16b60 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 6c 69  t_linedir(out,li
16b70 6e 65 6e 6f 2c 66 69 6c 65 6e 61 6d 65 29 0a 46  neno,filename).F
16b80 49 4c 45 20 2a 6f 75 74 3b 0a 69 6e 74 20 6c 69  ILE *out;.int li
16b90 6e 65 6e 6f 3b 0a 63 68 61 72 20 2a 66 69 6c 65  neno;.char *file
16ba0 6e 61 6d 65 3b 0a 7b 0a 20 20 66 70 72 69 6e 74  name;.{.  fprint
16bb0 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25 64 20  f(out,"#line %d 
16bc0 5c 22 22 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 77  \"",lineno);.  w
16bd0 68 69 6c 65 28 20 2a 66 69 6c 65 6e 61 6d 65 20  hile( *filename 
16be0 29 7b 0a 20 20 20 20 69 66 28 20 2a 66 69 6c 65  ){.    if( *file
16bf0 6e 61 6d 65 20 3d 3d 20 27 5c 5c 27 20 29 20 70  name == '\\' ) p
16c00 75 74 63 28 27 5c 5c 27 2c 6f 75 74 29 3b 0a 20  utc('\\',out);. 
16c10 20 20 20 70 75 74 63 28 2a 66 69 6c 65 6e 61 6d     putc(*filenam
16c20 65 2c 6f 75 74 29 3b 0a 20 20 20 20 66 69 6c 65  e,out);.    file
16c30 6e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70  name++;.  }.  fp
16c40 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22 5c 6e 22  rintf(out,"\"\n"
16c50 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61  );.}../* Print a
16c60 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65 20 66   string to the f
16c70 69 6c 65 20 61 6e 64 20 6b 65 65 70 20 74 68 65  ile and keep the
16c80 20 6c 69 6e 65 6e 75 6d 62 65 72 20 75 70 20 74   linenumber up t
16c90 6f 20 64 61 74 65 20 2a 2f 0a 50 52 49 56 41 54  o date */.PRIVAT
16ca0 45 20 76 6f 69 64 20 74 70 6c 74 5f 70 72 69 6e  E void tplt_prin
16cb0 74 28 6f 75 74 2c 6c 65 6d 70 2c 73 74 72 2c 6c  t(out,lemp,str,l
16cc0 69 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a 6f 75 74  ineno).FILE *out
16cd0 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ;.struct lemon *
16ce0 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73 74 72 3b  lemp;.char *str;
16cf0 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a  .int *lineno;.{.
16d00 20 20 69 66 28 20 73 74 72 3d 3d 30 20 29 20 72    if( str==0 ) r
16d10 65 74 75 72 6e 3b 0a 20 20 28 2a 6c 69 6e 65 6e  eturn;.  (*linen
16d20 6f 29 2b 2b 3b 0a 20 20 77 68 69 6c 65 28 20 2a  o)++;.  while( *
16d30 73 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20 2a  str ){.    if( *
16d40 73 74 72 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69  str=='\n' ) (*li
16d50 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 70 75 74  neno)++;.    put
16d60 63 28 2a 73 74 72 2c 6f 75 74 29 3b 0a 20 20 20  c(*str,out);.   
16d70 20 73 74 72 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66   str++;.  }.  if
16d80 28 20 73 74 72 5b 2d 31 5d 21 3d 27 5c 6e 27 20  ( str[-1]!='\n' 
16d90 29 7b 0a 20 20 20 20 70 75 74 63 28 27 5c 6e 27  ){.    putc('\n'
16da0 2c 6f 75 74 29 3b 0a 20 20 20 20 28 2a 6c 69 6e  ,out);.    (*lin
16db0 65 6e 6f 29 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70  eno)++;.  }.  tp
16dc0 6c 74 5f 6c 69 6e 65 64 69 72 28 6f 75 74 2c 2a  lt_linedir(out,*
16dd0 6c 69 6e 65 6e 6f 2b 32 2c 6c 65 6d 70 2d 3e 6f  lineno+2,lemp->o
16de0 75 74 6e 61 6d 65 29 3b 20 0a 20 20 28 2a 6c 69  utname); .  (*li
16df0 6e 65 6e 6f 29 2b 3d 32 3b 0a 20 20 72 65 74 75  neno)+=2;.  retu
16e00 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rn;.}../*.** The
16e10 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69   following routi
16e20 6e 65 20 65 6d 69 74 73 20 63 6f 64 65 20 66 6f  ne emits code fo
16e30 72 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  r the destructor
16e40 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 79 6d 62   for the.** symb
16e50 6f 6c 20 73 70 0a 2a 2f 0a 76 6f 69 64 20 65 6d  ol sp.*/.void em
16e60 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  it_destructor_co
16e70 64 65 28 6f 75 74 2c 73 70 2c 6c 65 6d 70 2c 6c  de(out,sp,lemp,l
16e80 69 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a 6f 75 74  ineno).FILE *out
16e90 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  ;.struct symbol 
16ea0 2a 73 70 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f  *sp;.struct lemo
16eb0 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20 2a 6c 69  n *lemp;.int *li
16ec0 6e 65 6e 6f 3b 0a 7b 0a 20 63 68 61 72 20 2a 63  neno;.{. char *c
16ed0 70 20 3d 20 30 3b 0a 0a 20 69 6e 74 20 6c 69 6e  p = 0;.. int lin
16ee0 65 63 6e 74 20 3d 20 30 3b 0a 20 69 66 28 20 73  ecnt = 0;. if( s
16ef0 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41  p->type==TERMINA
16f00 4c 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d  L ){.   cp = lem
16f10 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a 20 20  p->tokendest;.  
16f20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65 74   if( cp==0 ) ret
16f30 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66 28  urn;.   fprintf(
16f40 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c 69  out,"{\n"); (*li
16f50 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65 20  neno)++;. }else 
16f60 69 66 28 20 73 70 2d 3e 64 65 73 74 72 75 63 74  if( sp->destruct
16f70 6f 72 20 29 7b 0a 20 20 20 63 70 20 3d 20 73 70  or ){.   cp = sp
16f80 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a 20 20  ->destructor;.  
16f90 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c   fprintf(out,"{\
16fa0 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  n"); (*lineno)++
16fb0 3b 0a 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69  ;.   tplt_linedi
16fc0 72 28 6f 75 74 2c 73 70 2d 3e 64 65 73 74 4c 69  r(out,sp->destLi
16fd0 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61  neno,lemp->outna
16fe0 6d 65 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b  me); (*lineno)++
16ff0 3b 0a 20 7d 65 6c 73 65 20 69 66 28 20 6c 65 6d  ;. }else if( lem
17000 70 2d 3e 76 61 72 64 65 73 74 20 29 7b 0a 20 20  p->vardest ){.  
17010 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 64   cp = lemp->vard
17020 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70 3d 3d  est;.   if( cp==
17030 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 66  0 ) return;.   f
17040 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e 22  printf(out,"{\n"
17050 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a  ); (*lineno)++;.
17060 20 7d 65 6c 73 65 7b 0a 20 20 20 61 73 73 65 72   }else{.   asser
17070 74 28 20 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e  t( 0 );  /* Cann
17080 6f 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20 7d 0a  ot happen */. }.
17090 20 66 6f 72 28 3b 20 2a 63 70 3b 20 63 70 2b 2b   for(; *cp; cp++
170a0 29 7b 0a 20 20 20 69 66 28 20 2a 63 70 3d 3d 27  ){.   if( *cp=='
170b0 24 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 24 27  $' && cp[1]=='$'
170c0 20 29 7b 0a 20 20 20 20 20 66 70 72 69 6e 74 66   ){.     fprintf
170d0 28 6f 75 74 2c 22 28 79 79 70 6d 69 6e 6f 72 2d  (out,"(yypminor-
170e0 3e 79 79 25 64 29 22 2c 73 70 2d 3e 64 74 6e 75  >yy%d)",sp->dtnu
170f0 6d 29 3b 0a 20 20 20 20 20 63 70 2b 2b 3b 0a 20  m);.     cp++;. 
17100 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
17110 20 7d 0a 20 20 20 69 66 28 20 2a 63 70 3d 3d 27   }.   if( *cp=='
17120 5c 6e 27 20 29 20 6c 69 6e 65 63 6e 74 2b 2b 3b  \n' ) linecnt++;
17130 0a 20 20 20 66 70 75 74 63 28 2a 63 70 2c 6f 75  .   fputc(*cp,ou
17140 74 29 3b 0a 20 7d 0a 20 28 2a 6c 69 6e 65 6e 6f  t);. }. (*lineno
17150 29 20 2b 3d 20 33 20 2b 20 6c 69 6e 65 63 6e 74  ) += 3 + linecnt
17160 3b 0a 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  ;. fprintf(out,"
17170 5c 6e 22 29 3b 0a 20 74 70 6c 74 5f 6c 69 6e 65  \n");. tplt_line
17180 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c  dir(out,*lineno,
17190 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a  lemp->outname);.
171a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c   fprintf(out,"}\
171b0 6e 22 29 3b 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a  n");. return;.}.
171c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
171d0 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66  UE (non-zero) if
171e0 20 74 68 65 20 67 69 76 65 6e 20 73 79 6d 62 6f   the given symbo
171f0 6c 20 68 61 73 20 61 20 64 65 73 74 72 75 63 74  l has a destruct
17200 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 68 61 73 5f 64  or..*/.int has_d
17210 65 73 74 72 75 63 74 6f 72 28 73 70 2c 20 6c 65  estructor(sp, le
17220 6d 70 29 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  mp).struct symbo
17230 6c 20 2a 73 70 3b 0a 73 74 72 75 63 74 20 6c 65  l *sp;.struct le
17240 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69  mon *lemp;.{.  i
17250 6e 74 20 72 65 74 3b 0a 20 20 69 66 28 20 73 70  nt ret;.  if( sp
17260 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
17270 20 29 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c 65   ){.    ret = le
17280 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 21 3d 30  mp->tokendest!=0
17290 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
172a0 65 74 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 64 65  et = lemp->varde
172b0 73 74 21 3d 30 20 7c 7c 20 73 70 2d 3e 64 65 73  st!=0 || sp->des
172c0 74 72 75 63 74 6f 72 21 3d 30 3b 0a 20 20 7d 0a  tructor!=0;.  }.
172d0 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
172e0 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65  ./*.** Append te
172f0 78 74 20 74 6f 20 61 20 64 79 6e 61 6d 69 63 61  xt to a dynamica
17300 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 73 74  lly allocated st
17310 72 69 6e 67 2e 20 20 49 66 20 7a 54 65 78 74 20  ring.  If zText 
17320 69 73 20 30 20 74 68 65 6e 0a 2a 2a 20 72 65 73  is 0 then.** res
17330 65 74 20 74 68 65 20 73 74 72 69 6e 67 20 74 6f  et the string to
17340 20 62 65 20 65 6d 70 74 79 20 61 67 61 69 6e 2e   be empty again.
17350 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20    Always return 
17360 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 65 78  the complete tex
17370 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 69  t.** of the stri
17380 6e 67 20 28 77 68 69 63 68 20 69 73 20 6f 76 65  ng (which is ove
17390 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 65 61  rwritten with ea
173a0 63 68 20 63 61 6c 6c 29 2e 0a 2a 2a 0a 2a 2a 20  ch call)..**.** 
173b0 6e 20 62 79 74 65 73 20 6f 66 20 7a 54 65 78 74  n bytes of zText
173c0 20 61 72 65 20 73 74 6f 72 65 64 2e 20 20 49 66   are stored.  If
173d0 20 6e 3d 3d 30 20 74 68 65 6e 20 61 6c 6c 20 6f   n==0 then all o
173e0 66 20 7a 54 65 78 74 20 75 70 20 74 6f 20 74 68  f zText up to th
173f0 65 20 66 69 72 73 74 0a 2a 2a 20 5c 30 30 30 20  e first.** \000 
17400 74 65 72 6d 69 6e 61 74 6f 72 20 69 73 20 73 74  terminator is st
17410 6f 72 65 64 2e 20 20 7a 54 65 78 74 20 63 61 6e  ored.  zText can
17420 20 63 6f 6e 74 61 69 6e 20 75 70 20 74 6f 20 74   contain up to t
17430 77 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 0a  wo instances of.
17440 2a 2a 20 25 64 2e 20 20 54 68 65 20 76 61 6c 75  ** %d.  The valu
17450 65 73 20 6f 66 20 70 31 20 61 6e 64 20 70 32 20  es of p1 and p2 
17460 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  are written into
17470 20 74 68 65 20 66 69 72 73 74 20 61 6e 64 20 73   the first and s
17480 65 63 6f 6e 64 0a 2a 2a 20 25 64 2e 0a 2a 2a 0a  econd.** %d..**.
17490 2a 2a 20 49 66 20 6e 3d 3d 2d 31 2c 20 74 68 65  ** If n==-1, the
174a0 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  n the previous c
174b0 68 61 72 61 63 74 65 72 20 69 73 20 6f 76 65 72  haracter is over
174c0 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 50 52 49 56  written..*/.PRIV
174d0 41 54 45 20 63 68 61 72 20 2a 61 70 70 65 6e 64  ATE char *append
174e0 5f 73 74 72 28 63 68 61 72 20 2a 7a 54 65 78 74  _str(char *zText
174f0 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 70 31 2c  , int n, int p1,
17500 20 69 6e 74 20 70 32 29 7b 0a 20 20 73 74 61 74   int p2){.  stat
17510 69 63 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a  ic char *z = 0;.
17520 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c    static int all
17530 6f 63 65 64 20 3d 20 30 3b 0a 20 20 73 74 61 74  oced = 0;.  stat
17540 69 63 20 69 6e 74 20 75 73 65 64 20 3d 20 30 3b  ic int used = 0;
17550 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68 61 72  .  int c;.  char
17560 20 7a 49 6e 74 5b 34 30 5d 3b 0a 0a 20 20 69 66   zInt[40];..  if
17570 28 20 7a 54 65 78 74 3d 3d 30 20 29 7b 0a 20 20  ( zText==0 ){.  
17580 20 20 75 73 65 64 20 3d 20 30 3b 0a 20 20 20 20    used = 0;.    
17590 72 65 74 75 72 6e 20 7a 3b 0a 20 20 7d 0a 20 20  return z;.  }.  
175a0 69 66 28 20 6e 3c 3d 30 20 29 7b 0a 20 20 20 20  if( n<=0 ){.    
175b0 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 20  if( n<0 ){.     
175c0 20 75 73 65 64 20 2b 3d 20 6e 3b 0a 20 20 20 20   used += n;.    
175d0 20 20 61 73 73 65 72 74 28 20 75 73 65 64 3e 3d    assert( used>=
175e0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  0 );.    }.    n
175f0 20 3d 20 73 74 72 6c 65 6e 28 7a 54 65 78 74 29   = strlen(zText)
17600 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 2b 73 69  ;.  }.  if( n+si
17610 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 2b 75 73 65  zeof(zInt)*2+use
17620 64 20 3e 3d 20 61 6c 6c 6f 63 65 64 20 29 7b 0a  d >= alloced ){.
17630 20 20 20 20 61 6c 6c 6f 63 65 64 20 3d 20 6e 20      alloced = n 
17640 2b 20 73 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32  + sizeof(zInt)*2
17650 20 2b 20 75 73 65 64 20 2b 20 32 30 30 3b 0a 20   + used + 200;. 
17660 20 20 20 7a 20 3d 20 72 65 61 6c 6c 6f 63 28 7a     z = realloc(z
17670 2c 20 20 61 6c 6c 6f 63 65 64 29 3b 0a 20 20 7d  ,  alloced);.  }
17680 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 72 65  .  if( z==0 ) re
17690 74 75 72 6e 20 22 22 3b 0a 20 20 77 68 69 6c 65  turn "";.  while
176a0 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20  ( n-- > 0 ){.   
176b0 20 63 20 3d 20 2a 28 7a 54 65 78 74 2b 2b 29 3b   c = *(zText++);
176c0 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20  .    if( c=='%' 
176d0 26 26 20 6e 3e 30 20 26 26 20 7a 54 65 78 74 5b  && n>0 && zText[
176e0 30 5d 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20 20  0]=='d' ){.     
176f0 20 73 70 72 69 6e 74 66 28 7a 49 6e 74 2c 20 22   sprintf(zInt, "
17700 25 64 22 2c 20 70 31 29 3b 0a 20 20 20 20 20 20  %d", p1);.      
17710 70 31 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 73  p1 = p2;.      s
17720 74 72 63 70 79 28 26 7a 5b 75 73 65 64 5d 2c 20  trcpy(&z[used], 
17730 7a 49 6e 74 29 3b 0a 20 20 20 20 20 20 75 73 65  zInt);.      use
17740 64 20 2b 3d 20 73 74 72 6c 65 6e 28 26 7a 5b 75  d += strlen(&z[u
17750 73 65 64 5d 29 3b 0a 20 20 20 20 20 20 7a 54 65  sed]);.      zTe
17760 78 74 2b 2b 3b 0a 20 20 20 20 20 20 6e 2d 2d 3b  xt++;.      n--;
17770 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17780 20 20 7a 5b 75 73 65 64 2b 2b 5d 20 3d 20 63 3b    z[used++] = c;
17790 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 5b 75  .    }.  }.  z[u
177a0 73 65 64 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  sed] = 0;.  retu
177b0 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 7a  rn z;.}../*.** z
177c0 43 6f 64 65 20 69 73 20 61 20 73 74 72 69 6e 67  Code is a string
177d0 20 74 68 61 74 20 69 73 20 74 68 65 20 61 63 74   that is the act
177e0 69 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77  ion associated w
177f0 69 74 68 20 61 20 72 75 6c 65 2e 20 20 45 78 70  ith a rule.  Exp
17800 61 6e 64 0a 2a 2a 20 74 68 65 20 73 79 6d 62 6f  and.** the symbo
17810 6c 73 20 69 6e 20 74 68 69 73 20 73 74 72 69 6e  ls in this strin
17820 67 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65  g so that the re
17830 66 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74 73 20  fer to elements 
17840 6f 66 20 74 68 65 20 70 61 72 73 65 72 0a 2a 2a  of the parser.**
17850 20 73 74 61 63 6b 2e 0a 2a 2f 0a 50 52 49 56 41   stack..*/.PRIVA
17860 54 45 20 76 6f 69 64 20 74 72 61 6e 73 6c 61 74  TE void translat
17870 65 5f 63 6f 64 65 28 73 74 72 75 63 74 20 6c 65  e_code(struct le
17880 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63  mon *lemp, struc
17890 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a 20 20 63  t rule *rp){.  c
178a0 68 61 72 20 2a 63 70 2c 20 2a 78 70 3b 0a 20 20  har *cp, *xp;.  
178b0 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 6c 68  int i;.  char lh
178c0 73 75 73 65 64 20 3d 20 30 3b 20 20 20 20 2f 2a  sused = 0;    /*
178d0 20 54 72 75 65 20 69 66 20 74 68 65 20 4c 48 53   True if the LHS
178e0 20 65 6c 65 6d 65 6e 74 20 68 61 73 20 62 65 65   element has bee
178f0 6e 20 75 73 65 64 20 2a 2f 0a 20 20 63 68 61 72  n used */.  char
17900 20 75 73 65 64 5b 4d 41 58 52 48 53 5d 3b 20 20   used[MAXRHS];  
17910 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 65 61 63   /* True for eac
17920 68 20 52 48 53 20 65 6c 65 6d 65 6e 74 20 77 68  h RHS element wh
17930 69 63 68 20 69 73 20 75 73 65 64 20 2a 2f 0a 0a  ich is used */..
17940 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d    for(i=0; i<rp-
17950 3e 6e 72 68 73 3b 20 69 2b 2b 29 20 75 73 65 64  >nrhs; i++) used
17960 5b 69 5d 20 3d 20 30 3b 0a 20 20 6c 68 73 75 73  [i] = 0;.  lhsus
17970 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 72  ed = 0;..  if( r
17980 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  p->code==0 ){.  
17990 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 22 5c 6e    rp->code = "\n
179a0 22 3b 0a 20 20 20 20 72 70 2d 3e 6c 69 6e 65 20  ";.    rp->line 
179b0 3d 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 3b 0a  = rp->ruleline;.
179c0 20 20 7d 0a 0a 20 20 61 70 70 65 6e 64 5f 73 74    }..  append_st
179d0 72 28 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 66 6f  r(0,0,0,0);.  fo
179e0 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65 3b 20 2a  r(cp=rp->code; *
179f0 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 69  cp; cp++){.    i
17a00 66 28 20 69 73 61 6c 70 68 61 28 2a 63 70 29 20  f( isalpha(*cp) 
17a10 26 26 20 28 63 70 3d 3d 72 70 2d 3e 63 6f 64 65  && (cp==rp->code
17a20 20 7c 7c 20 28 21 69 73 61 6c 6e 75 6d 28 63 70   || (!isalnum(cp
17a30 5b 2d 31 5d 29 20 26 26 20 63 70 5b 2d 31 5d 21  [-1]) && cp[-1]!
17a40 3d 27 5f 27 29 29 20 29 7b 0a 20 20 20 20 20 20  ='_')) ){.      
17a50 63 68 61 72 20 73 61 76 65 64 3b 0a 20 20 20 20  char saved;.    
17a60 20 20 66 6f 72 28 78 70 3d 20 26 63 70 5b 31 5d    for(xp= &cp[1]
17a70 3b 20 69 73 61 6c 6e 75 6d 28 2a 78 70 29 20 7c  ; isalnum(*xp) |
17a80 7c 20 2a 78 70 3d 3d 27 5f 27 3b 20 78 70 2b 2b  | *xp=='_'; xp++
17a90 29 3b 0a 20 20 20 20 20 20 73 61 76 65 64 20 3d  );.      saved =
17aa0 20 2a 78 70 3b 0a 20 20 20 20 20 20 2a 78 70 20   *xp;.      *xp 
17ab0 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72  = 0;.      if( r
17ac0 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20 73  p->lhsalias && s
17ad0 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 6c 68 73  trcmp(cp,rp->lhs
17ae0 61 6c 69 61 73 29 3d 3d 30 20 29 7b 0a 20 20 20  alias)==0 ){.   
17af0 20 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28       append_str(
17b00 22 79 79 67 6f 74 6f 6d 69 6e 6f 72 2e 79 79 25  "yygotominor.yy%
17b10 64 22 2c 30 2c 72 70 2d 3e 6c 68 73 2d 3e 64 74  d",0,rp->lhs->dt
17b20 6e 75 6d 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  num,0);.        
17b30 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20 20  cp = xp;.       
17b40 20 6c 68 73 75 73 65 64 20 3d 20 31 3b 0a 20 20   lhsused = 1;.  
17b50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17b60 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70     for(i=0; i<rp
17b70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
17b80 20 20 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e          if( rp->
17b90 72 68 73 61 6c 69 61 73 5b 69 5d 20 26 26 20 73  rhsalias[i] && s
17ba0 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 72 68 73  trcmp(cp,rp->rhs
17bb0 61 6c 69 61 73 5b 69 5d 29 3d 3d 30 20 29 7b 0a  alias[i])==0 ){.
17bc0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
17bd0 63 70 21 3d 72 70 2d 3e 63 6f 64 65 20 26 26 20  cp!=rp->code && 
17be0 63 70 5b 2d 31 5d 3d 3d 27 40 27 20 29 7b 0a 20  cp[-1]=='@' ){. 
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17c00 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  If the argument 
17c10 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 40  is of the form @
17c20 58 20 74 68 65 6e 20 73 75 62 73 74 69 74 75 74  X then substitut
17c30 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ed.             
17c40 20 2a 2a 20 74 68 65 20 74 6f 6b 65 6e 20 6e 75   ** the token nu
17c50 6d 62 65 72 20 6f 66 20 58 2c 20 6e 6f 74 20 74  mber of X, not t
17c60 68 65 20 76 61 6c 75 65 20 6f 66 20 58 20 2a 2f  he value of X */
17c70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
17c80 70 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73 70  ppend_str("yymsp
17c90 5b 25 64 5d 2e 6d 61 6a 6f 72 22 2c 2d 31 2c 69  [%d].major",-1,i
17ca0 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 30 29 3b 0a  -rp->nrhs+1,0);.
17cb0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
17cc0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
17cd0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
17ce0 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
17cf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
17d00 6e 74 20 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20  nt dtnum;.      
17d10 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e          if( sp->
17d20 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49  type==MULTITERMI
17d30 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NAL ){.         
17d40 20 20 20 20 20 20 20 64 74 6e 75 6d 20 3d 20 73         dtnum = s
17d50 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 2d 3e 64 74  p->subsym[0]->dt
17d60 6e 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  num;.           
17d70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17d80 20 20 20 20 20 20 20 20 20 20 64 74 6e 75 6d 20            dtnum 
17d90 3d 20 73 70 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20  = sp->dtnum;.   
17da0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
17db0 20 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e             appen
17dc0 64 5f 73 74 72 28 22 79 79 6d 73 70 5b 25 64 5d  d_str("yymsp[%d]
17dd0 2e 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 30 2c 69  .minor.yy%d",0,i
17de0 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c 20 64 74 6e  -rp->nrhs+1, dtn
17df0 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  um);.           
17e00 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63   }.            c
17e10 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20 20 20  p = xp;.        
17e20 20 20 20 20 75 73 65 64 5b 69 5d 20 3d 20 31 3b      used[i] = 1;
17e30 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
17e40 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
17e50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
17e60 7d 0a 20 20 20 20 20 20 2a 78 70 20 3d 20 73 61  }.      *xp = sa
17e70 76 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ved;.    }.    a
17e80 70 70 65 6e 64 5f 73 74 72 28 63 70 2c 20 31 2c  ppend_str(cp, 1,
17e90 20 30 2c 20 30 29 3b 0a 20 20 7d 20 2f 2a 20 45   0, 0);.  } /* E
17ea0 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 0a 20 20 2f 2a  nd loop */..  /*
17eb0 20 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   Check to make s
17ec0 75 72 65 20 74 68 65 20 4c 48 53 20 68 61 73 20  ure the LHS has 
17ed0 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20 20 69  been used */.  i
17ee0 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20  f( rp->lhsalias 
17ef0 26 26 20 21 6c 68 73 75 73 65 64 20 29 7b 0a 20  && !lhsused ){. 
17f00 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70     ErrorMsg(lemp
17f10 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72  ->filename,rp->r
17f20 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20 22  uleline,.      "
17f30 4c 61 62 65 6c 20 5c 22 25 73 5c 22 20 66 6f 72  Label \"%s\" for
17f40 20 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e   \"%s(%s)\" is n
17f50 65 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20  ever used.",.   
17f60 20 20 20 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61       rp->lhsalia
17f70 73 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c  s,rp->lhs->name,
17f80 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20  rp->lhsalias);. 
17f90 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
17fa0 74 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  t++;.  }..  /* G
17fb0 65 6e 65 72 61 74 65 20 64 65 73 74 72 75 63 74  enerate destruct
17fc0 6f 72 20 63 6f 64 65 20 66 6f 72 20 52 48 53 20  or code for RHS 
17fd0 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 61 72  symbols which ar
17fe0 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 74 68  e not used in th
17ff0 65 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 63 6f  e.  ** reduce co
18000 64 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  de */.  for(i=0;
18010 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
18020 29 7b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e 72  ){.    if( rp->r
18030 68 73 61 6c 69 61 73 5b 69 5d 20 26 26 20 21 75  hsalias[i] && !u
18040 73 65 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  sed[i] ){.      
18050 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66  ErrorMsg(lemp->f
18060 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65  ilename,rp->rule
18070 6c 69 6e 65 2c 0a 20 20 20 20 20 20 20 20 22 4c  line,.        "L
18080 61 62 65 6c 20 25 73 20 66 6f 72 20 5c 22 25 73  abel %s for \"%s
18090 28 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72 20  (%s)\" is never 
180a0 75 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20 20  used.",.        
180b0 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 2c  rp->rhsalias[i],
180c0 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65  rp->rhs[i]->name
180d0 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d  ,rp->rhsalias[i]
180e0 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65  );.      lemp->e
180f0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d  rrorcnt++;.    }
18100 65 6c 73 65 20 69 66 28 20 72 70 2d 3e 72 68 73  else if( rp->rhs
18110 61 6c 69 61 73 5b 69 5d 3d 3d 30 20 29 7b 0a 20  alias[i]==0 ){. 
18120 20 20 20 20 20 69 66 28 20 68 61 73 5f 64 65 73       if( has_des
18130 74 72 75 63 74 6f 72 28 72 70 2d 3e 72 68 73 5b  tructor(rp->rhs[
18140 69 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20 20 20 20  i],lemp) ){.    
18150 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22      append_str("
18160 20 20 79 79 5f 64 65 73 74 72 75 63 74 6f 72 28    yy_destructor(
18170 25 64 2c 26 79 79 6d 73 70 5b 25 64 5d 2e 6d 69  %d,&yymsp[%d].mi
18180 6e 6f 72 29 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20  nor);\n", 0,.   
18190 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b          rp->rhs[
181a0 69 5d 2d 3e 69 6e 64 65 78 2c 69 2d 72 70 2d 3e  i]->index,i-rp->
181b0 6e 72 68 73 2b 31 29 3b 0a 20 20 20 20 20 20 7d  nrhs+1);.      }
181c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
181d0 20 4e 6f 20 64 65 73 74 72 75 63 74 6f 72 20 64   No destructor d
181e0 65 66 69 6e 65 64 20 66 6f 72 20 74 68 69 73 20  efined for this 
181f0 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  term */.      }.
18200 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
18210 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 20  rp->code ){.    
18220 63 70 20 3d 20 61 70 70 65 6e 64 5f 73 74 72 28  cp = append_str(
18230 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 72 70  0,0,0,0);.    rp
18240 2d 3e 63 6f 64 65 20 3d 20 53 74 72 73 61 66 65  ->code = Strsafe
18250 28 63 70 3f 63 70 3a 22 22 29 3b 0a 20 20 7d 0a  (cp?cp:"");.  }.
18260 7d 0a 0a 2f 2a 20 0a 2a 2a 20 47 65 6e 65 72 61  }../* .** Genera
18270 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78  te code which ex
18280 65 63 75 74 65 73 20 77 68 65 6e 20 74 68 65 20  ecutes when the 
18290 72 75 6c 65 20 22 72 70 22 20 69 73 20 72 65 64  rule "rp" is red
182a0 75 63 65 64 2e 20 20 57 72 69 74 65 0a 2a 2a 20  uced.  Write.** 
182b0 74 68 65 20 63 6f 64 65 20 74 6f 20 22 6f 75 74  the code to "out
182c0 22 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6c 69  ".  Make sure li
182d0 6e 65 6e 6f 20 73 74 61 79 73 20 75 70 2d 74 6f  neno stays up-to
182e0 2d 64 61 74 65 2e 0a 2a 2f 0a 50 52 49 56 41 54  -date..*/.PRIVAT
182f0 45 20 76 6f 69 64 20 65 6d 69 74 5f 63 6f 64 65  E void emit_code
18300 28 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c 6c 69 6e  (out,rp,lemp,lin
18310 65 6e 6f 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a  eno).FILE *out;.
18320 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
18330 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
18340 65 6d 70 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f  emp;.int *lineno
18350 3b 0a 7b 0a 20 63 68 61 72 20 2a 63 70 3b 0a 20  ;.{. char *cp;. 
18360 69 6e 74 20 6c 69 6e 65 63 6e 74 20 3d 20 30 3b  int linecnt = 0;
18370 0a 0a 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .. /* Generate c
18380 6f 64 65 20 74 6f 20 64 6f 20 74 68 65 20 72 65  ode to do the re
18390 64 75 63 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20  duce action */. 
183a0 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29 7b 0a  if( rp->code ){.
183b0 20 20 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28     tplt_linedir(
183c0 6f 75 74 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65 6d  out,rp->line,lem
183d0 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  p->filename);.  
183e0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7b 25   fprintf(out,"{%
183f0 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 0a 20 20  s",rp->code);.  
18400 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65   for(cp=rp->code
18410 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20  ; *cp; cp++){.  
18420 20 20 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27     if( *cp=='\n'
18430 20 29 20 6c 69 6e 65 63 6e 74 2b 2b 3b 0a 20 20   ) linecnt++;.  
18440 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a   } /* End loop *
18450 2f 0a 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 20 2b  /.   (*lineno) +
18460 3d 20 33 20 2b 20 6c 69 6e 65 63 6e 74 3b 0a 20  = 3 + linecnt;. 
18470 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d    fprintf(out,"}
18480 5c 6e 22 29 3b 0a 20 20 20 74 70 6c 74 5f 6c 69  \n");.   tplt_li
18490 6e 65 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e  nedir(out,*linen
184a0 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29  o,lemp->outname)
184b0 3b 0a 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20  ;. } /* End if( 
184c0 72 70 2d 3e 63 6f 64 65 20 29 20 2a 2f 0a 0a 20  rp->code ) */.. 
184d0 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
184e0 20 50 72 69 6e 74 20 74 68 65 20 64 65 66 69 6e   Print the defin
184f0 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e 69  ition of the uni
18500 6f 6e 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  on used for the 
18510 70 61 72 73 65 72 27 73 20 64 61 74 61 20 73 74  parser's data st
18520 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 75 6e 69  ack..** This uni
18530 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 66 69 65 6c  on contains fiel
18540 64 73 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73  ds for every pos
18550 73 69 62 6c 65 20 64 61 74 61 20 74 79 70 65 20  sible data type 
18560 66 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e  for tokens.** an
18570 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e 20  d nonterminals. 
18580 20 49 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20   In the process 
18590 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 64  of computing and
185a0 20 70 72 69 6e 74 69 6e 67 20 74 68 69 73 0a 2a   printing this.*
185b0 2a 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73 65  * union, also se
185c0 74 20 74 68 65 20 22 2e 64 74 6e 75 6d 22 20 66  t the ".dtnum" f
185d0 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 74 65  ield of every te
185e0 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65  rminal and nonte
185f0 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c  rminal.** symbol
18600 2e 0a 2a 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f  ..*/.void print_
18610 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c  stack_union(out,
18620 6c 65 6d 70 2c 70 6c 69 6e 65 6e 6f 2c 6d 68 66  lemp,plineno,mhf
18630 6c 61 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 20  lag).FILE *out; 
18640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18650 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 73   /* The output s
18660 74 72 65 61 6d 20 2a 2f 0a 73 74 72 75 63 74 20  tream */.struct 
18670 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 20 20 20 20  lemon *lemp;    
18680 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
18690 20 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20   info structure 
186a0 66 6f 72 20 74 68 69 73 20 70 61 72 73 65 72 20  for this parser 
186b0 2a 2f 0a 69 6e 74 20 2a 70 6c 69 6e 65 6e 6f 3b  */.int *plineno;
186c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
186d0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
186e0 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
186f0 69 6e 74 20 6d 68 66 6c 61 67 3b 20 20 20 20 20  int mhflag;     
18700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18710 72 75 65 20 69 66 20 67 65 6e 65 72 61 74 69 6e  rue if generatin
18720 67 20 6d 61 6b 65 68 65 61 64 65 72 73 20 6f 75  g makeheaders ou
18730 74 70 75 74 20 2a 2f 0a 7b 0a 20 20 69 6e 74 20  tput */.{.  int 
18740 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e  lineno = *plinen
18750 6f 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 6e  o;    /* The lin
18760 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
18770 6f 75 74 70 75 74 20 2a 2f 0a 20 20 63 68 61 72  output */.  char
18780 20 2a 2a 74 79 70 65 73 3b 20 20 20 20 20 20 20   **types;       
18790 20 20 20 20 20 20 2f 2a 20 41 20 68 61 73 68 20        /* A hash 
187a0 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70  table of datatyp
187b0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72 61  es */.  int arra
187c0 79 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  ysize;          
187d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
187e0 20 22 74 79 70 65 73 22 20 61 72 72 61 79 20 2a   "types" array *
187f0 2f 0a 20 20 69 6e 74 20 6d 61 78 64 74 6c 65 6e  /.  int maxdtlen
18800 67 74 68 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  gth;          /*
18810 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20   Maximum length 
18820 6f 66 20 61 6e 79 20 22 2e 64 61 74 61 74 79 70  of any ".datatyp
18830 65 22 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 63  e" field. */.  c
18840 68 61 72 20 2a 73 74 64 64 74 3b 20 20 20 20 20  har *stddt;     
18850 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 6e           /* Stan
18860 64 61 72 64 69 7a 65 64 20 6e 61 6d 65 20 66 6f  dardized name fo
18870 72 20 61 20 64 61 74 61 74 79 70 65 20 2a 2f 0a  r a datatype */.
18880 20 20 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20 20    int i,j;      
18890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
188a0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
188b0 20 20 69 6e 74 20 68 61 73 68 3b 20 20 20 20 20    int hash;     
188c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
188d0 6f 72 20 68 61 73 68 69 6e 67 20 74 68 65 20 6e  or hashing the n
188e0 61 6d 65 20 6f 66 20 61 20 74 79 70 65 20 2a 2f  ame of a type */
188f0 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20  .  char *name;  
18900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18910 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72 73  Name of the pars
18920 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  er */..  /* Allo
18930 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
18940 69 7a 65 20 74 79 70 65 73 5b 5d 20 61 6e 64 20  ize types[] and 
18950 61 6c 6c 6f 63 61 74 65 20 73 74 64 64 74 5b 5d  allocate stddt[]
18960 20 2a 2f 0a 20 20 61 72 72 61 79 73 69 7a 65 20   */.  arraysize 
18970 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20  = lemp->nsymbol 
18980 2a 20 32 3b 0a 20 20 74 79 70 65 73 20 3d 20 28  * 2;.  types = (
18990 63 68 61 72 2a 2a 29 63 61 6c 6c 6f 63 28 20 61  char**)calloc( a
189a0 72 72 61 79 73 69 7a 65 2c 20 73 69 7a 65 6f 66  rraysize, sizeof
189b0 28 63 68 61 72 2a 29 20 29 3b 0a 20 20 66 6f 72  (char*) );.  for
189c0 28 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69 7a  (i=0; i<arraysiz
189d0 65 3b 20 69 2b 2b 29 20 74 79 70 65 73 5b 69 5d  e; i++) types[i]
189e0 20 3d 20 30 3b 0a 20 20 6d 61 78 64 74 6c 65 6e   = 0;.  maxdtlen
189f0 67 74 68 20 3d 20 30 3b 0a 20 20 69 66 28 20 6c  gth = 0;.  if( l
18a00 65 6d 70 2d 3e 76 61 72 74 79 70 65 20 29 7b 0a  emp->vartype ){.
18a10 20 20 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20      maxdtlength 
18a20 3d 20 73 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 76  = strlen(lemp->v
18a30 61 72 74 79 70 65 29 3b 0a 20 20 7d 0a 20 20 66  artype);.  }.  f
18a40 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
18a50 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
18a60 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
18a70 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
18a80 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  p = lemp->symbol
18a90 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70  s[i];.    if( sp
18aa0 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 29 20  ->datatype==0 ) 
18ab0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6c 65  continue;.    le
18ac0 6e 20 3d 20 73 74 72 6c 65 6e 28 73 70 2d 3e 64  n = strlen(sp->d
18ad0 61 74 61 74 79 70 65 29 3b 0a 20 20 20 20 69 66  atatype);.    if
18ae0 28 20 6c 65 6e 3e 6d 61 78 64 74 6c 65 6e 67 74  ( len>maxdtlengt
18af0 68 20 29 20 6d 61 78 64 74 6c 65 6e 67 74 68 20  h ) maxdtlength 
18b00 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 73 74 64  = len;.  }.  std
18b10 64 74 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c  dt = (char*)mall
18b20 6f 63 28 20 6d 61 78 64 74 6c 65 6e 67 74 68 2a  oc( maxdtlength*
18b30 32 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 74  2 + 1 );.  if( t
18b40 79 70 65 73 3d 3d 30 20 7c 7c 20 73 74 64 64 74  ypes==0 || stddt
18b50 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
18b60 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f  tf(stderr,"Out o
18b70 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20  f memory.\n");. 
18b80 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
18b90 0a 20 20 2f 2a 20 42 75 69 6c 64 20 61 20 68 61  .  /* Build a ha
18ba0 73 68 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61  sh table of data
18bb0 74 79 70 65 73 2e 20 54 68 65 20 22 2e 64 74 6e  types. The ".dtn
18bc0 75 6d 22 20 66 69 65 6c 64 20 6f 66 20 65 61 63  um" field of eac
18bd0 68 20 73 79 6d 62 6f 6c 0a 20 20 2a 2a 20 69 73  h symbol.  ** is
18be0 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20   filled in with 
18bf0 74 68 65 20 68 61 73 68 20 69 6e 64 65 78 20 70  the hash index p
18c00 6c 75 73 20 31 2e 20 20 41 20 22 2e 64 74 6e 75  lus 1.  A ".dtnu
18c10 6d 22 20 76 61 6c 75 65 20 6f 66 20 30 20 69 73  m" value of 0 is
18c20 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20 74  .  ** used for t
18c30 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 2e  erminal symbols.
18c40 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f    If there is no
18c50 20 25 64 65 66 61 75 6c 74 5f 74 79 70 65 20 64   %default_type d
18c60 65 66 69 6e 65 64 20 74 68 65 6e 0a 20 20 2a 2a  efined then.  **
18c70 20 30 20 69 73 20 61 6c 73 6f 20 75 73 65 64 20   0 is also used 
18c80 61 73 20 74 68 65 20 2e 64 74 6e 75 6d 20 76 61  as the .dtnum va
18c90 6c 75 65 20 66 6f 72 20 6e 6f 6e 74 65 72 6d 69  lue for nontermi
18ca0 6e 61 6c 73 20 77 68 69 63 68 20 64 6f 20 6e 6f  nals which do no
18cb0 74 20 73 70 65 63 69 66 79 0a 20 20 2a 2a 20 61  t specify.  ** a
18cc0 20 64 61 74 61 74 79 70 65 20 75 73 69 6e 67 20   datatype using 
18cd0 74 68 65 20 25 74 79 70 65 20 64 69 72 65 63 74  the %type direct
18ce0 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  ive..  */.  for(
18cf0 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
18d00 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
18d10 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
18d20 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  p = lemp->symbol
18d30 73 5b 69 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a  s[i];.    char *
18d40 63 70 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d  cp;.    if( sp==
18d50 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29 7b 0a  lemp->errsym ){.
18d60 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20        sp->dtnum 
18d70 3d 20 61 72 72 61 79 73 69 7a 65 2b 31 3b 0a 20  = arraysize+1;. 
18d80 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
18d90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 70 2d     }.    if( sp-
18da0 3e 74 79 70 65 21 3d 4e 4f 4e 54 45 52 4d 49 4e  >type!=NONTERMIN
18db0 41 4c 20 7c 7c 20 28 73 70 2d 3e 64 61 74 61 74  AL || (sp->datat
18dc0 79 70 65 3d 3d 30 20 26 26 20 6c 65 6d 70 2d 3e  ype==0 && lemp->
18dd0 76 61 72 74 79 70 65 3d 3d 30 29 20 29 7b 0a 20  vartype==0) ){. 
18de0 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d       sp->dtnum =
18df0 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e   0;.      contin
18e00 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 70  ue;.    }.    cp
18e10 20 3d 20 73 70 2d 3e 64 61 74 61 74 79 70 65 3b   = sp->datatype;
18e20 0a 20 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29  .    if( cp==0 )
18e30 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 74   cp = lemp->vart
18e40 79 70 65 3b 0a 20 20 20 20 6a 20 3d 20 30 3b 0a  ype;.    j = 0;.
18e50 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70 61      while( isspa
18e60 63 65 28 2a 63 70 29 20 29 20 63 70 2b 2b 3b 0a  ce(*cp) ) cp++;.
18e70 20 20 20 20 77 68 69 6c 65 28 20 2a 63 70 20 29      while( *cp )
18e80 20 73 74 64 64 74 5b 6a 2b 2b 5d 20 3d 20 2a 63   stddt[j++] = *c
18e90 70 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  p++;.    while( 
18ea0 6a 3e 30 20 26 26 20 69 73 73 70 61 63 65 28 73  j>0 && isspace(s
18eb0 74 64 64 74 5b 6a 2d 31 5d 29 20 29 20 6a 2d 2d  tddt[j-1]) ) j--
18ec0 3b 0a 20 20 20 20 73 74 64 64 74 5b 6a 5d 20 3d  ;.    stddt[j] =
18ed0 20 30 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63   0;.    if( strc
18ee0 6d 70 28 73 74 64 64 74 2c 20 6c 65 6d 70 2d 3e  mp(stddt, lemp->
18ef0 74 6f 6b 65 6e 74 79 70 65 29 3d 3d 30 20 29 7b  tokentype)==0 ){
18f00 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d  .      sp->dtnum
18f10 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74   = 0;.      cont
18f20 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
18f30 68 61 73 68 20 3d 20 30 3b 0a 20 20 20 20 66 6f  hash = 0;.    fo
18f40 72 28 6a 3d 30 3b 20 73 74 64 64 74 5b 6a 5d 3b  r(j=0; stddt[j];
18f50 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 68 61 73   j++){.      has
18f60 68 20 3d 20 68 61 73 68 2a 35 33 20 2b 20 73 74  h = hash*53 + st
18f70 64 64 74 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20  ddt[j];.    }.  
18f80 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 20 26    hash = (hash &
18f90 20 30 78 37 66 66 66 66 66 66 66 29 25 61 72 72   0x7fffffff)%arr
18fa0 61 79 73 69 7a 65 3b 0a 20 20 20 20 77 68 69 6c  aysize;.    whil
18fb0 65 28 20 74 79 70 65 73 5b 68 61 73 68 5d 20 29  e( types[hash] )
18fc0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
18fd0 6d 70 28 74 79 70 65 73 5b 68 61 73 68 5d 2c 73  mp(types[hash],s
18fe0 74 64 64 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tddt)==0 ){.    
18ff0 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20      sp->dtnum = 
19000 68 61 73 68 20 2b 20 31 3b 0a 20 20 20 20 20 20  hash + 1;.      
19010 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
19020 0a 20 20 20 20 20 20 68 61 73 68 2b 2b 3b 0a 20  .      hash++;. 
19030 20 20 20 20 20 69 66 28 20 68 61 73 68 3e 3d 61       if( hash>=a
19040 72 72 61 79 73 69 7a 65 20 29 20 68 61 73 68 20  rraysize ) hash 
19050 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
19060 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d  f( types[hash]==
19070 30 20 29 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64  0 ){.      sp->d
19080 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b  tnum = hash + 1;
19090 0a 20 20 20 20 20 20 74 79 70 65 73 5b 68 61 73  .      types[has
190a0 68 5d 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c  h] = (char*)mall
190b0 6f 63 28 20 73 74 72 6c 65 6e 28 73 74 64 64 74  oc( strlen(stddt
190c0 29 2b 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  )+1 );.      if(
190d0 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30 20   types[hash]==0 
190e0 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
190f0 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20 6f  tf(stderr,"Out o
19100 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a 20  f memory.\n");. 
19110 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a         exit(1);.
19120 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74        }.      st
19130 72 63 70 79 28 74 79 70 65 73 5b 68 61 73 68 5d  rcpy(types[hash]
19140 2c 73 74 64 64 74 29 3b 0a 20 20 20 20 7d 0a 20  ,stddt);.    }. 
19150 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e 74 20 6f   }..  /* Print o
19160 75 74 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f  ut the definitio
19170 6e 20 6f 66 20 59 59 54 4f 4b 45 4e 54 59 50 45  n of YYTOKENTYPE
19180 20 61 6e 64 20 59 59 4d 49 4e 4f 52 54 59 50 45   and YYMINORTYPE
19190 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d   */.  name = lem
191a0 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e  p->name ? lemp->
191b0 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b 0a  name : "Parse";.
191c0 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e    lineno = *plin
191d0 65 6e 6f 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61  eno;.  if( mhfla
191e0 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74  g ){ fprintf(out
191f0 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c  ,"#if INTERFACE\
19200 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d  n"); lineno++; }
19210 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
19220 23 64 65 66 69 6e 65 20 25 73 54 4f 4b 45 4e 54  #define %sTOKENT
19230 59 50 45 20 25 73 5c 6e 22 2c 6e 61 6d 65 2c 0a  YPE %s\n",name,.
19240 20 20 20 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74      lemp->tokent
19250 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 74  ype?lemp->tokent
19260 79 70 65 3a 22 76 6f 69 64 2a 22 29 3b 20 20 6c  ype:"void*");  l
19270 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6d  ineno++;.  if( m
19280 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66  hflag ){ fprintf
19290 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29  (out,"#endif\n")
192a0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20  ; lineno++; }.  
192b0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 74 79 70  fprintf(out,"typ
192c0 65 64 65 66 20 75 6e 69 6f 6e 20 7b 5c 6e 22 29  edef union {\n")
192d0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
192e0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25 73 54  rintf(out,"  %sT
192f0 4f 4b 45 4e 54 59 50 45 20 79 79 30 3b 5c 6e 22  OKENTYPE yy0;\n"
19300 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ,name); lineno++
19310 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61  ;.  for(i=0; i<a
19320 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a  rraysize; i++){.
19330 20 20 20 20 69 66 28 20 74 79 70 65 73 5b 69 5d      if( types[i]
19340 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
19350 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
19360 22 20 20 25 73 20 79 79 25 64 3b 5c 6e 22 2c 74  "  %s yy%d;\n",t
19370 79 70 65 73 5b 69 5d 2c 69 2b 31 29 3b 20 6c 69  ypes[i],i+1); li
19380 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65  neno++;.    free
19390 28 74 79 70 65 73 5b 69 5d 29 3b 0a 20 20 7d 0a  (types[i]);.  }.
193a0 20 20 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73    if( lemp->errs
193b0 79 6d 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20  ym->useCnt ){.  
193c0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
193d0 20 69 6e 74 20 79 79 25 64 3b 5c 6e 22 2c 6c 65   int yy%d;\n",le
193e0 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75  mp->errsym->dtnu
193f0 6d 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  m); lineno++;.  
19400 7d 0a 20 20 66 72 65 65 28 73 74 64 64 74 29 3b  }.  free(stddt);
19410 0a 20 20 66 72 65 65 28 74 79 70 65 73 29 3b 0a  .  free(types);.
19420 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d    fprintf(out,"}
19430 20 59 59 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e 22   YYMINORTYPE;\n"
19440 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a  ); lineno++;.  *
19450 70 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f  plineno = lineno
19460 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19470 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
19480 43 20 64 61 74 61 74 79 70 65 20 61 62 6c 65 20  C datatype able 
19490 74 6f 20 72 65 70 72 65 73 65 6e 74 20 76 61 6c  to represent val
194a0 75 65 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 6c  ues between.** l
194b0 77 72 20 61 6e 64 20 75 70 72 2c 20 69 6e 63 6c  wr and upr, incl
194c0 75 73 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  usive..*/.static
194d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e   const char *min
194e0 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69  imum_size_type(i
194f0 6e 74 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 29  nt lwr, int upr)
19500 7b 0a 20 20 69 66 28 20 6c 77 72 3e 3d 30 20 29  {.  if( lwr>=0 )
19510 7b 0a 20 20 20 20 69 66 28 20 75 70 72 3c 3d 32  {.    if( upr<=2
19520 35 35 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  55 ){.      retu
19530 72 6e 20 22 75 6e 73 69 67 6e 65 64 20 63 68 61  rn "unsigned cha
19540 72 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  r";.    }else if
19550 28 20 75 70 72 3c 36 35 35 33 35 20 29 7b 0a 20  ( upr<65535 ){. 
19560 20 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73       return "uns
19570 69 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 22  igned short int"
19580 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19590 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67     return "unsig
195a0 6e 65 64 20 69 6e 74 22 3b 0a 20 20 20 20 7d 0a  ned int";.    }.
195b0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e    }else if( lwr>
195c0 3d 2d 31 32 37 20 26 26 20 75 70 72 3c 3d 31 32  =-127 && upr<=12
195d0 37 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  7 ){.    return 
195e0 22 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20  "signed char";. 
195f0 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
19600 2d 33 32 37 36 37 20 26 26 20 75 70 72 3c 33 32  -32767 && upr<32
19610 37 36 37 20 29 7b 0a 20 20 20 20 72 65 74 75 72  767 ){.    retur
19620 6e 20 22 73 68 6f 72 74 22 3b 0a 20 20 7d 65 6c  n "short";.  }el
19630 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22  se{.    return "
19640 69 6e 74 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  int";.  }.}../*.
19650 2a 2a 20 45 61 63 68 20 73 74 61 74 65 20 63 6f  ** Each state co
19660 6e 74 61 69 6e 73 20 61 20 73 65 74 20 6f 66 20  ntains a set of 
19670 74 6f 6b 65 6e 20 74 72 61 6e 73 61 63 74 69 6f  token transactio
19680 6e 20 61 6e 64 20 61 20 73 65 74 20 6f 66 0a 2a  n and a set of.*
19690 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 74 72  * nonterminal tr
196a0 61 6e 73 61 63 74 69 6f 6e 73 2e 20 20 45 61 63  ansactions.  Eac
196b0 68 20 6f 66 20 74 68 65 73 65 20 73 65 74 73 20  h of these sets 
196c0 6d 61 6b 65 73 20 61 6e 20 69 6e 73 74 61 6e 63  makes an instanc
196d0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
196e0 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
196f0 20 20 41 6e 20 61 72 72 61 79 20 6f 66 20 74 68    An array of th
19700 65 73 65 20 73 74 72 75 63 74 75 72 65 73 20 69  ese structures i
19710 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6f 72 64  s used.** to ord
19720 65 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  er the creation 
19730 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
19740 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61  e yy_action[] ta
19750 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 61  ble..*/.struct a
19760 78 73 65 74 20 7b 0a 20 20 73 74 72 75 63 74 20  xset {.  struct 
19770 73 74 61 74 65 20 2a 73 74 70 3b 20 20 20 2f 2a  state *stp;   /*
19780 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   A pointer to a 
19790 73 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69  state */.  int i
197a0 73 54 6b 6e 3b 20 20 20 20 20 20 20 20 20 20 20  sTkn;           
197b0 2f 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 74  /* True to use t
197c0 6f 6b 65 6e 73 2e 20 20 46 61 6c 73 65 20 66 6f  okens.  False fo
197d0 72 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20  r non-terminals 
197e0 2a 2f 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e  */.  int nAction
197f0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
19800 62 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20 2a  ber of actions *
19810 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  /.};../*.** Comp
19820 61 72 65 20 74 6f 20 61 78 73 65 74 20 73 74 72  are to axset str
19830 75 63 74 75 72 65 73 20 66 6f 72 20 73 6f 72 74  uctures for sort
19840 69 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a  ing purposes.*/.
19850 73 74 61 74 69 63 20 69 6e 74 20 61 78 73 65 74  static int axset
19860 5f 63 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76  _compare(const v
19870 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f  oid *a, const vo
19880 69 64 20 2a 62 29 7b 0a 20 20 73 74 72 75 63 74  id *b){.  struct
19890 20 61 78 73 65 74 20 2a 70 31 20 3d 20 28 73 74   axset *p1 = (st
198a0 72 75 63 74 20 61 78 73 65 74 2a 29 61 3b 0a 20  ruct axset*)a;. 
198b0 20 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 70   struct axset *p
198c0 32 20 3d 20 28 73 74 72 75 63 74 20 61 78 73 65  2 = (struct axse
198d0 74 2a 29 62 3b 0a 20 20 72 65 74 75 72 6e 20 70  t*)b;.  return p
198e0 32 2d 3e 6e 41 63 74 69 6f 6e 20 2d 20 70 31 2d  2->nAction - p1-
198f0 3e 6e 41 63 74 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a  >nAction;.}../*.
19900 2a 2a 20 57 72 69 74 65 20 74 65 78 74 20 6f 6e  ** Write text on
19910 20 22 6f 75 74 22 20 74 68 61 74 20 64 65 73 63   "out" that desc
19920 72 69 62 65 73 20 74 68 65 20 72 75 6c 65 20 22  ribes the rule "
19930 72 70 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rp"..*/.static v
19940 6f 69 64 20 77 72 69 74 65 52 75 6c 65 54 65 78  oid writeRuleTex
19950 74 28 46 49 4c 45 20 2a 6f 75 74 2c 20 73 74 72  t(FILE *out, str
19960 75 63 74 20 72 75 6c 65 20 2a 72 70 29 7b 0a 20  uct rule *rp){. 
19970 20 69 6e 74 20 6a 3b 0a 20 20 66 70 72 69 6e 74   int j;.  fprint
19980 66 28 6f 75 74 2c 22 25 73 20 3a 3a 3d 22 2c 20  f(out,"%s ::=", 
19990 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a  rp->lhs->name);.
199a0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 72 70 2d    for(j=0; j<rp-
199b0 3e 6e 72 68 73 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nrhs; j++){.   
199c0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
199d0 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 6a 5d 3b  sp = rp->rhs[j];
199e0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
199f0 2c 22 20 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65  ," %s", sp->name
19a00 29 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74  );.    if( sp->t
19a10 79 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e  ype==MULTITERMIN
19a20 41 4c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  AL ){.      int 
19a30 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 31  k;.      for(k=1
19a40 3b 20 6b 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b  ; k<sp->nsubsym;
19a50 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   k++){.        f
19a60 70 72 69 6e 74 66 28 6f 75 74 2c 22 7c 25 73 22  printf(out,"|%s"
19a70 2c 73 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d 2d 3e  ,sp->subsym[k]->
19a80 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  name);.      }. 
19a90 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 20     }.  }.}.../* 
19aa0 47 65 6e 65 72 61 74 65 20 43 20 73 6f 75 72 63  Generate C sourc
19ab0 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70  e code for the p
19ac0 61 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65  arser */.void Re
19ad0 70 6f 72 74 54 61 62 6c 65 28 6c 65 6d 70 2c 20  portTable(lemp, 
19ae0 6d 68 66 6c 61 67 29 0a 73 74 72 75 63 74 20 6c  mhflag).struct l
19af0 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20  emon *lemp;.int 
19b00 6d 68 66 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4f  mhflag;     /* O
19b10 75 74 70 75 74 20 69 6e 20 6d 61 6b 65 68 65 61  utput in makehea
19b20 64 65 72 73 20 66 6f 72 6d 61 74 20 69 66 20 74  ders format if t
19b30 72 75 65 20 2a 2f 0a 7b 0a 20 20 46 49 4c 45 20  rue */.{.  FILE 
19b40 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68 61  *out, *in;.  cha
19b50 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d  r line[LINESIZE]
19b60 3b 0a 20 20 69 6e 74 20 20 6c 69 6e 65 6e 6f 3b  ;.  int  lineno;
19b70 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
19b80 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61  *stp;.  struct a
19b90 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 73 74 72  ction *ap;.  str
19ba0 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
19bb0 73 74 72 75 63 74 20 61 63 74 74 61 62 20 2a 70  struct acttab *p
19bc0 41 63 74 74 61 62 3b 0a 20 20 69 6e 74 20 69 2c  Acttab;.  int i,
19bd0 20 6a 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 6e   j, n;.  char *n
19be0 61 6d 65 3b 0a 20 20 69 6e 74 20 6d 6e 54 6b 6e  ame;.  int mnTkn
19bf0 4f 66 73 74 2c 20 6d 78 54 6b 6e 4f 66 73 74 3b  Ofst, mxTknOfst;
19c00 0a 20 20 69 6e 74 20 6d 6e 4e 74 4f 66 73 74 2c  .  int mnNtOfst,
19c10 20 6d 78 4e 74 4f 66 73 74 3b 0a 20 20 73 74 72   mxNtOfst;.  str
19c20 75 63 74 20 61 78 73 65 74 20 2a 61 78 3b 0a 0a  uct axset *ax;..
19c30 20 20 69 6e 20 3d 20 74 70 6c 74 5f 6f 70 65 6e    in = tplt_open
19c40 28 6c 65 6d 70 29 3b 0a 20 20 69 66 28 20 69 6e  (lemp);.  if( in
19c50 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
19c60 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28  out = file_open(
19c70 6c 65 6d 70 2c 22 2e 63 22 2c 22 77 62 22 29 3b  lemp,".c","wb");
19c80 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b  .  if( out==0 ){
19c90 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
19ca0 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
19cb0 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20  .  lineno = 1;. 
19cc0 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
19cd0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
19ce0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
19cf0 65 72 61 74 65 20 74 68 65 20 69 6e 63 6c 75 64  erate the includ
19d00 65 20 63 6f 64 65 2c 20 69 66 20 61 6e 79 20 2a  e code, if any *
19d10 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f  /.  tplt_print(o
19d20 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 69 6e  ut,lemp,lemp->in
19d30 63 6c 75 64 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  clude,&lineno);.
19d40 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a    if( mhflag ){.
19d50 20 20 20 20 63 68 61 72 20 2a 6e 61 6d 65 20 3d      char *name =
19d60 20 66 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c   file_makename(l
19d70 65 6d 70 2c 20 22 2e 68 22 29 3b 0a 20 20 20 20  emp, ".h");.    
19d80 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 6e  fprintf(out,"#in
19d90 63 6c 75 64 65 20 5c 22 25 73 5c 22 5c 6e 22 2c  clude \"%s\"\n",
19da0 20 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b   name); lineno++
19db0 3b 0a 20 20 20 20 66 72 65 65 28 6e 61 6d 65 29  ;.    free(name)
19dc0 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ;.  }.  tplt_xfe
19dd0 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
19de0 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
19df0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 23 64 65   /* Generate #de
19e00 66 69 6e 65 73 20 66 6f 72 20 61 6c 6c 20 74 6f  fines for all to
19e10 6b 65 6e 73 20 2a 2f 0a 20 20 69 66 28 20 6d 68  kens */.  if( mh
19e20 66 6c 61 67 20 29 7b 0a 20 20 20 20 63 68 61 72  flag ){.    char
19e30 20 2a 70 72 65 66 69 78 3b 0a 20 20 20 20 66 70   *prefix;.    fp
19e40 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49  rintf(out,"#if I
19e50 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69  NTERFACE\n"); li
19e60 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20  neno++;.    if( 
19e70 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  lemp->tokenprefi
19e80 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d  x ) prefix = lem
19e90 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a  p->tokenprefix;.
19ea0 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20      else        
19eb0 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66              pref
19ec0 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72  ix = "";.    for
19ed0 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74  (i=1; i<lemp->nt
19ee0 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20  erminal; i++){. 
19ef0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
19f00 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30  ,"#define %s%-30
19f10 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c  s %2d\n",prefix,
19f20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
19f30 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20  ->name,i);.     
19f40 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d   lineno++;.    }
19f50 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
19f60 2c 22 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69  ,"#endif\n"); li
19f70 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70  neno++;.  }.  tp
19f80 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
19f90 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
19fa0 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
19fb0 74 65 20 74 68 65 20 64 65 66 69 6e 65 73 20 2a  te the defines *
19fc0 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  /.  fprintf(out,
19fd0 22 23 64 65 66 69 6e 65 20 59 59 43 4f 44 45 54  "#define YYCODET
19fe0 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20 6d  YPE %s\n",.    m
19ff0 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65  inimum_size_type
1a000 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  (0, lemp->nsymbo
1a010 6c 2b 35 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  l+5)); lineno++;
1a020 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1a030 23 64 65 66 69 6e 65 20 59 59 4e 4f 43 4f 44 45  #define YYNOCODE
1a040 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 79   %d\n",lemp->nsy
1a050 6d 62 6f 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e 6f  mbol+1);  lineno
1a060 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
1a070 74 2c 22 23 64 65 66 69 6e 65 20 59 59 41 43 54  t,"#define YYACT
1a080 49 4f 4e 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20  IONTYPE %s\n",. 
1a090 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f     minimum_size_
1a0a0 74 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73  type(0, lemp->ns
1a0b0 74 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65  tate+lemp->nrule
1a0c0 2b 35 29 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  +5));  lineno++;
1a0d0 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 77 69 6c  .  if( lemp->wil
1a0e0 64 63 61 72 64 20 29 7b 0a 20 20 20 20 66 70 72  dcard ){.    fpr
1a0f0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1a100 65 20 59 59 57 49 4c 44 43 41 52 44 20 25 64 5c  e YYWILDCARD %d\
1a110 6e 22 2c 0a 20 20 20 20 20 20 20 6c 65 6d 70 2d  n",.       lemp-
1a120 3e 77 69 6c 64 63 61 72 64 2d 3e 69 6e 64 65 78  >wildcard->index
1a130 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1a140 0a 20 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75  .  print_stack_u
1a150 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26 6c  nion(out,lemp,&l
1a160 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a 20  ineno,mhflag);. 
1a170 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23   fprintf(out, "#
1a180 69 66 6e 64 65 66 20 59 59 53 54 41 43 4b 44 45  ifndef YYSTACKDE
1a190 50 54 48 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  PTH\n"); lineno+
1a1a0 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73  +;.  if( lemp->s
1a1b0 74 61 63 6b 73 69 7a 65 20 29 7b 0a 20 20 20 20  tacksize ){.    
1a1c0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1a1d0 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54  fine YYSTACKDEPT
1a1e0 48 20 25 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73 74  H %s\n",lemp->st
1a1f0 61 63 6b 73 69 7a 65 29 3b 20 20 6c 69 6e 65 6e  acksize);  linen
1a200 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  o++;.  }else{.  
1a210 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1a220 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45  define YYSTACKDE
1a230 50 54 48 20 31 30 30 5c 6e 22 29 3b 20 20 6c 69  PTH 100\n");  li
1a240 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70  neno++;.  }.  fp
1a250 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 65 6e 64  rintf(out, "#end
1a260 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  if\n"); lineno++
1a270 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29  ;.  if( mhflag )
1a280 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
1a290 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43 45  t,"#if INTERFACE
1a2a0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1a2b0 20 20 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d    }.  name = lem
1a2c0 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e  p->name ? lemp->
1a2d0 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b 0a  name : "Parse";.
1a2e0 20 20 69 66 28 20 6c 65 6d 70 2d 3e 61 72 67 20    if( lemp->arg 
1a2f0 26 26 20 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d 20  && lemp->arg[0] 
1a300 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
1a310 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 6c 65 6d    i = strlen(lem
1a320 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20 77 68 69  p->arg);.    whi
1a330 6c 65 28 20 69 3e 3d 31 20 26 26 20 69 73 73 70  le( i>=1 && issp
1a340 61 63 65 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d  ace(lemp->arg[i-
1a350 31 5d 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20 77  1]) ) i--;.    w
1a360 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 28 69  hile( i>=1 && (i
1a370 73 61 6c 6e 75 6d 28 6c 65 6d 70 2d 3e 61 72 67  salnum(lemp->arg
1a380 5b 69 2d 31 5d 29 20 7c 7c 20 6c 65 6d 70 2d 3e  [i-1]) || lemp->
1a390 61 72 67 5b 69 2d 31 5d 3d 3d 27 5f 27 29 20 29  arg[i-1]=='_') )
1a3a0 20 69 2d 2d 3b 0a 20 20 20 20 66 70 72 69 6e 74   i--;.    fprint
1a3b0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1a3c0 73 41 52 47 5f 53 44 45 43 4c 20 25 73 3b 5c 6e  sARG_SDECL %s;\n
1a3d0 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67  ",name,lemp->arg
1a3e0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1a3f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1a400 64 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44 45  define %sARG_PDE
1a410 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d 65 2c 6c  CL ,%s\n",name,l
1a420 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e 65  emp->arg);  line
1a430 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
1a440 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
1a450 73 41 52 47 5f 46 45 54 43 48 20 25 73 20 3d 20  sARG_FETCH %s = 
1a460 79 79 70 50 61 72 73 65 72 2d 3e 25 73 5c 6e 22  yypParser->%s\n"
1a470 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a480 20 20 20 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72     name,lemp->ar
1a490 67 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29  g,&lemp->arg[i])
1a4a0 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
1a4b0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1a4c0 65 66 69 6e 65 20 25 73 41 52 47 5f 53 54 4f 52  efine %sARG_STOR
1a4d0 45 20 79 79 70 50 61 72 73 65 72 2d 3e 25 73 20  E yypParser->%s 
1a4e0 3d 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  = %s\n",.       
1a4f0 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c 26            name,&
1a500 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 2c 26 6c 65  lemp->arg[i],&le
1a510 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69  mp->arg[i]);  li
1a520 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  neno++;.  }else{
1a530 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1a540 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
1a550 53 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20  SDECL\n",name); 
1a560 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
1a570 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1a580 69 6e 65 20 25 73 41 52 47 5f 50 44 45 43 4c 5c  ine %sARG_PDECL\
1a590 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e  n",name);  linen
1a5a0 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
1a5b0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
1a5c0 41 52 47 5f 46 45 54 43 48 5c 6e 22 2c 6e 61 6d  ARG_FETCH\n",nam
1a5d0 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  e); lineno++;.  
1a5e0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1a5f0 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 54 4f  define %sARG_STO
1a600 52 45 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e  RE\n",name); lin
1a610 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  eno++;.  }.  if(
1a620 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20 66   mhflag ){.    f
1a630 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64  printf(out,"#end
1a640 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  if\n"); lineno++
1a650 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  ;.  }.  fprintf(
1a660 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e  out,"#define YYN
1a670 53 54 41 54 45 20 25 64 5c 6e 22 2c 6c 65 6d 70  STATE %d\n",lemp
1a680 2d 3e 6e 73 74 61 74 65 29 3b 20 20 6c 69 6e 65  ->nstate);  line
1a690 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1a6a0 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e  out,"#define YYN
1a6b0 52 55 4c 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d  RULE %d\n",lemp-
1a6c0 3e 6e 72 75 6c 65 29 3b 20 20 6c 69 6e 65 6e 6f  >nrule);  lineno
1a6d0 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e  ++;.  if( lemp->
1a6e0 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74 20 29  errsym->useCnt )
1a6f0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
1a700 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45 52 52  t,"#define YYERR
1a710 4f 52 53 59 4d 42 4f 4c 20 25 64 5c 6e 22 2c 6c  ORSYMBOL %d\n",l
1a720 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 69 6e 64  emp->errsym->ind
1a730 65 78 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ex);  lineno++;.
1a740 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1a750 22 23 64 65 66 69 6e 65 20 59 59 45 52 52 53 59  "#define YYERRSY
1a760 4d 44 54 20 79 79 25 64 5c 6e 22 2c 6c 65 6d 70  MDT yy%d\n",lemp
1a770 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29  ->errsym->dtnum)
1a780 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ;  lineno++;.  }
1a790 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73  .  if( lemp->has
1a7a0 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  _fallback ){.   
1a7b0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1a7c0 65 66 69 6e 65 20 59 59 46 41 4c 4c 42 41 43 4b  efine YYFALLBACK
1a7d0 20 31 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b   1\n");  lineno+
1a7e0 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  +;.  }.  tplt_xf
1a7f0 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1a800 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1a810 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
1a820 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 61  e action table a
1a830 6e 64 20 69 74 73 20 61 73 73 6f 63 69 61 74 65  nd its associate
1a840 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 79 79  s:.  **.  **  yy
1a850 5f 61 63 74 69 6f 6e 5b 5d 20 20 20 20 20 20 20  _action[]       
1a860 20 41 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20   A single table 
1a870 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c 20 61  containing all a
1a880 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20 79 79  ctions..  **  yy
1a890 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 20 20 20  _lookahead[]    
1a8a0 20 41 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e   A table contain
1a8b0 69 6e 67 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61  ing the lookahea
1a8c0 64 20 66 6f 72 20 65 61 63 68 20 65 6e 74 72 79  d for each entry
1a8d0 20 69 6e 0a 20 20 2a 2a 20 20 20 20 20 20 20 20   in.  **        
1a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 79 79 5f               yy_
1a8f0 61 63 74 69 6f 6e 2e 20 20 55 73 65 64 20 74 6f  action.  Used to
1a900 20 64 65 74 65 63 74 20 68 61 73 68 20 63 6f 6c   detect hash col
1a910 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20 79  lisions..  **  y
1a920 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 20  y_shift_ofst[]  
1a930 20 20 46 6f 72 20 65 61 63 68 20 73 74 61 74 65    For each state
1a940 2c 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74  , the offset int
1a950 6f 20 79 79 5f 61 63 74 69 6f 6e 20 66 6f 72 0a  o yy_action for.
1a960 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
1a970 20 20 20 20 20 20 20 20 20 73 68 69 66 74 69 6e           shiftin
1a980 67 20 74 65 72 6d 69 6e 61 6c 73 2e 0a 20 20 2a  g terminals..  *
1a990 2a 20 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73  *  yy_reduce_ofs
1a9a0 74 5b 5d 20 20 20 46 6f 72 20 65 61 63 68 20 73  t[]   For each s
1a9b0 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74  tate, the offset
1a9c0 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20   into yy_action 
1a9d0 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  for.  **        
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 69               shi
1a9f0 66 74 69 6e 67 20 6e 6f 6e 2d 74 65 72 6d 69 6e  fting non-termin
1aa00 61 6c 73 20 61 66 74 65 72 20 61 20 72 65 64 75  als after a redu
1aa10 63 65 2e 0a 20 20 2a 2a 20 20 79 79 5f 64 65 66  ce..  **  yy_def
1aa20 61 75 6c 74 5b 5d 20 20 20 20 20 20 20 44 65 66  ault[]       Def
1aa30 61 75 6c 74 20 61 63 74 69 6f 6e 20 66 6f 72 20  ault action for 
1aa40 65 61 63 68 20 73 74 61 74 65 2e 0a 20 20 2a 2f  each state..  */
1aa50 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
1aa60 68 65 20 61 63 74 69 6f 6e 73 20 6f 6e 20 61 6c  he actions on al
1aa70 6c 20 73 74 61 74 65 73 20 61 6e 64 20 63 6f 75  l states and cou
1aa80 6e 74 20 74 68 65 6d 20 75 70 20 2a 2f 0a 20 20  nt them up */.  
1aa90 61 78 20 3d 20 63 61 6c 6c 6f 63 28 6c 65 6d 70  ax = calloc(lemp
1aaa0 2d 3e 6e 73 74 61 74 65 2a 32 2c 20 73 69 7a 65  ->nstate*2, size
1aab0 6f 66 28 61 78 5b 30 5d 29 29 3b 0a 20 20 69 66  of(ax[0]));.  if
1aac0 28 20 61 78 3d 3d 30 20 29 7b 0a 20 20 20 20 66  ( ax==0 ){.    f
1aad0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 6d  printf(stderr,"m
1aae0 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e 22 29  alloc failed\n")
1aaf0 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
1ab00 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1ab10 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b  lemp->nstate; i+
1ab20 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  +){.    stp = le
1ab30 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
1ab40 20 20 20 61 78 5b 69 2a 32 5d 2e 73 74 70 20 3d     ax[i*2].stp =
1ab50 20 73 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32   stp;.    ax[i*2
1ab60 5d 2e 69 73 54 6b 6e 20 3d 20 31 3b 0a 20 20 20  ].isTkn = 1;.   
1ab70 20 61 78 5b 69 2a 32 5d 2e 6e 41 63 74 69 6f 6e   ax[i*2].nAction
1ab80 20 3d 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74 3b   = stp->nTknAct;
1ab90 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 73  .    ax[i*2+1].s
1aba0 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61 78  tp = stp;.    ax
1abb0 5b 69 2a 32 2b 31 5d 2e 69 73 54 6b 6e 20 3d 20  [i*2+1].isTkn = 
1abc0 30 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d  0;.    ax[i*2+1]
1abd0 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d 3e  .nAction = stp->
1abe0 6e 4e 74 41 63 74 3b 0a 20 20 7d 0a 20 20 6d 78  nNtAct;.  }.  mx
1abf0 54 6b 6e 4f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f  TknOfst = mnTknO
1ac00 66 73 74 20 3d 20 30 3b 0a 20 20 6d 78 4e 74 4f  fst = 0;.  mxNtO
1ac10 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 3d  fst = mnNtOfst =
1ac20 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74   0;..  /* Comput
1ac30 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  e the action tab
1ac40 6c 65 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f  le.  In order to
1ac50 20 74 72 79 20 74 6f 20 6b 65 65 70 20 74 68 65   try to keep the
1ac60 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 20 20 2a   size of the.  *
1ac70 2a 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 74  * action table t
1ac80 6f 20 61 20 6d 69 6e 69 6d 75 6d 2c 20 74 68 65  o a minimum, the
1ac90 20 68 65 75 72 69 73 74 69 63 20 6f 66 20 70 6c   heuristic of pl
1aca0 61 63 69 6e 67 20 74 68 65 20 6c 61 72 67 65 73  acing the larges
1acb0 74 20 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 73 65  t action.  ** se
1acc0 74 73 20 66 69 72 73 74 20 69 73 20 75 73 65 64  ts first is used
1acd0 2e 0a 20 20 2a 2f 0a 20 20 71 73 6f 72 74 28 61  ..  */.  qsort(a
1ace0 78 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a  x, lemp->nstate*
1acf0 32 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29  2, sizeof(ax[0])
1ad00 2c 20 61 78 73 65 74 5f 63 6f 6d 70 61 72 65 29  , axset_compare)
1ad10 3b 0a 20 20 70 41 63 74 74 61 62 20 3d 20 61 63  ;.  pActtab = ac
1ad20 74 74 61 62 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20  ttab_alloc();.  
1ad30 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
1ad40 3e 6e 73 74 61 74 65 2a 32 20 26 26 20 61 78 5b  >nstate*2 && ax[
1ad50 69 5d 2e 6e 41 63 74 69 6f 6e 3e 30 3b 20 69 2b  i].nAction>0; i+
1ad60 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 61 78  +){.    stp = ax
1ad70 5b 69 5d 2e 73 74 70 3b 0a 20 20 20 20 69 66 28  [i].stp;.    if(
1ad80 20 61 78 5b 69 5d 2e 69 73 54 6b 6e 20 29 7b 0a   ax[i].isTkn ){.
1ad90 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70        for(ap=stp
1ada0 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
1adb0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
1adc0 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20  int action;.    
1add0 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e      if( ap->sp->
1ade0 69 6e 64 65 78 3e 3d 6c 65 6d 70 2d 3e 6e 74 65  index>=lemp->nte
1adf0 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75  rminal ) continu
1ae00 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69 6f  e;.        actio
1ae10 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69  n = compute_acti
1ae20 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20  on(lemp, ap);.  
1ae30 20 20 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e        if( action
1ae40 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  <0 ) continue;. 
1ae50 20 20 20 20 20 20 20 61 63 74 74 61 62 5f 61 63         acttab_ac
1ae60 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61 70  tion(pActtab, ap
1ae70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74  ->sp->index, act
1ae80 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ion);.      }.  
1ae90 20 20 20 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73      stp->iTknOfs
1aea0 74 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72  t = acttab_inser
1aeb0 74 28 70 41 63 74 74 61 62 29 3b 0a 20 20 20 20  t(pActtab);.    
1aec0 20 20 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f    if( stp->iTknO
1aed0 66 73 74 3c 6d 6e 54 6b 6e 4f 66 73 74 20 29 20  fst<mnTknOfst ) 
1aee0 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d  mnTknOfst = stp-
1aef0 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 20  >iTknOfst;.     
1af00 20 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f 66   if( stp->iTknOf
1af10 73 74 3e 6d 78 54 6b 6e 4f 66 73 74 20 29 20 6d  st>mxTknOfst ) m
1af20 78 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d 3e  xTknOfst = stp->
1af30 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 7d 65  iTknOfst;.    }e
1af40 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 61  lse{.      for(a
1af50 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
1af60 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
1af70 20 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b       int action;
1af80 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d  .        if( ap-
1af90 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d  >sp->index<lemp-
1afa0 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e  >nterminal ) con
1afb0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
1afc0 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  f( ap->sp->index
1afd0 3d 3d 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20  ==lemp->nsymbol 
1afe0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1aff0 20 20 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d      action = com
1b000 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70  pute_action(lemp
1b010 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69  , ap);.        i
1b020 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f  f( action<0 ) co
1b030 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
1b040 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 70 41  acttab_action(pA
1b050 63 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69  cttab, ap->sp->i
1b060 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20  ndex, action);. 
1b070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74 70       }.      stp
1b080 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 61 63 74 74  ->iNtOfst = actt
1b090 61 62 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61  ab_insert(pActta
1b0a0 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  b);.      if( st
1b0b0 70 2d 3e 69 4e 74 4f 66 73 74 3c 6d 6e 4e 74 4f  p->iNtOfst<mnNtO
1b0c0 66 73 74 20 29 20 6d 6e 4e 74 4f 66 73 74 20 3d  fst ) mnNtOfst =
1b0d0 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20   stp->iNtOfst;. 
1b0e0 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 4e       if( stp->iN
1b0f0 74 4f 66 73 74 3e 6d 78 4e 74 4f 66 73 74 20 29  tOfst>mxNtOfst )
1b100 20 6d 78 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d   mxNtOfst = stp-
1b110 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 7d 0a  >iNtOfst;.    }.
1b120 20 20 7d 0a 20 20 66 72 65 65 28 61 78 29 3b 0a    }.  free(ax);.
1b130 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
1b140 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65   yy_action table
1b150 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
1b160 74 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20  t,"static const 
1b170 59 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79 5f  YYACTIONTYPE yy_
1b180 61 63 74 69 6f 6e 5b 5d 20 3d 20 7b 5c 6e 22 29  action[] = {\n")
1b190 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20  ; lineno++;.  n 
1b1a0 3d 20 61 63 74 74 61 62 5f 73 69 7a 65 28 70 41  = acttab_size(pA
1b1b0 63 74 74 61 62 29 3b 0a 20 20 66 6f 72 28 69 3d  cttab);.  for(i=
1b1c0 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
1b1d0 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e 20 3d      int action =
1b1e0 20 61 63 74 74 61 62 5f 79 79 61 63 74 69 6f 6e   acttab_yyaction
1b1f0 28 70 41 63 74 74 61 62 2c 20 69 29 3b 0a 20 20  (pActtab, i);.  
1b200 20 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29    if( action<0 )
1b210 20 61 63 74 69 6f 6e 20 3d 20 6c 65 6d 70 2d 3e   action = lemp->
1b220 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e  nstate + lemp->n
1b230 72 75 6c 65 20 2b 20 32 3b 0a 20 20 20 20 69 66  rule + 2;.    if
1b240 28 20 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66  ( j==0 ) fprintf
1b250 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f  (out," /* %5d */
1b260 20 22 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69   ", i);.    fpri
1b270 6e 74 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22  ntf(out, " %4d,"
1b280 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 69  , action);.    i
1b290 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d  f( j==9 || i==n-
1b2a0 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  1 ){.      fprin
1b2b0 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20 6c  tf(out, "\n"); l
1b2c0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a  ineno++;.      j
1b2d0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1b2e0 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
1b2f0 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  }.  }.  fprintf(
1b300 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69  out, "};\n"); li
1b310 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75  neno++;..  /* Ou
1b320 74 70 75 74 20 74 68 65 20 79 79 5f 6c 6f 6f 6b  tput the yy_look
1b330 61 68 65 61 64 20 74 61 62 6c 65 20 2a 2f 0a 20  ahead table */. 
1b340 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 73 74   fprintf(out,"st
1b350 61 74 69 63 20 63 6f 6e 73 74 20 59 59 43 4f 44  atic const YYCOD
1b360 45 54 59 50 45 20 79 79 5f 6c 6f 6f 6b 61 68 65  ETYPE yy_lookahe
1b370 61 64 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69  ad[] = {\n"); li
1b380 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d  neno++;.  for(i=
1b390 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
1b3a0 20 20 20 20 69 6e 74 20 6c 61 20 3d 20 61 63 74      int la = act
1b3b0 74 61 62 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28  tab_yylookahead(
1b3c0 70 41 63 74 74 61 62 2c 20 69 29 3b 0a 20 20 20  pActtab, i);.   
1b3d0 20 69 66 28 20 6c 61 3c 30 20 29 20 6c 61 20 3d   if( la<0 ) la =
1b3e0 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 0a   lemp->nsymbol;.
1b3f0 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66      if( j==0 ) f
1b400 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
1b410 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20  %5d */ ", i);.  
1b420 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1b430 20 25 34 64 2c 22 2c 20 6c 61 29 3b 0a 20 20 20   %4d,", la);.   
1b440 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d   if( j==9 || i==
1b450 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  n-1 ){.      fpr
1b460 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
1b470 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
1b480 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   j = 0;.    }els
1b490 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  e{.      j++;.  
1b4a0 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
1b4b0 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20  f(out, "};\n"); 
1b4c0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20  lineno++;..  /* 
1b4d0 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 73 68  Output the yy_sh
1b4e0 69 66 74 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65  ift_ofst[] table
1b4f0 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
1b500 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53  t, "#define YY_S
1b510 48 49 46 54 5f 55 53 45 5f 44 46 4c 54 20 28 25  HIFT_USE_DFLT (%
1b520 64 29 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74  d)\n", mnTknOfst
1b530 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  -1); lineno++;. 
1b540 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74   n = lemp->nstat
1b550 65 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30 20  e;.  while( n>0 
1b560 26 26 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b  && lemp->sorted[
1b570 6e 2d 31 5d 2d 3e 69 54 6b 6e 4f 66 73 74 3d 3d  n-1]->iTknOfst==
1b580 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6e 2d 2d 3b  NO_OFFSET ) n--;
1b590 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1b5a0 22 23 64 65 66 69 6e 65 20 59 59 5f 53 48 49 46  "#define YY_SHIF
1b5b0 54 5f 4d 41 58 20 25 64 5c 6e 22 2c 20 6e 2d 31  T_MAX %d\n", n-1
1b5c0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1b5d0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61  printf(out, "sta
1b5e0 74 69 63 20 63 6f 6e 73 74 20 25 73 20 79 79 5f  tic const %s yy_
1b5f0 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 3d 20 7b  shift_ofst[] = {
1b600 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
1b610 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
1b620 65 28 6d 6e 54 6b 6e 4f 66 73 74 2d 31 2c 20 6d  e(mnTknOfst-1, m
1b630 78 54 6b 6e 4f 66 73 74 29 29 3b 20 6c 69 6e 65  xTknOfst)); line
1b640 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  no++;.  for(i=j=
1b650 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
1b660 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20    int ofst;.    
1b670 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
1b680 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20  ed[i];.    ofst 
1b690 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b  = stp->iTknOfst;
1b6a0 0a 20 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e  .    if( ofst==N
1b6b0 4f 5f 4f 46 46 53 45 54 20 29 20 6f 66 73 74 20  O_OFFSET ) ofst 
1b6c0 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20 2d 20 31 3b  = mnTknOfst - 1;
1b6d0 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20  .    if( j==0 ) 
1b6e0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
1b6f0 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20   %5d */ ", i);. 
1b700 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
1b710 22 20 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a  " %4d,", ofst);.
1b720 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
1b730 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
1b740 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
1b750 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1b760 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
1b770 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
1b780 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
1b790 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
1b7a0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20  ); lineno++;..  
1b7b0 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79  /* Output the yy
1b7c0 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 74  _reduce_ofst[] t
1b7d0 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74  able */.  fprint
1b7e0 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20  f(out, "#define 
1b7f0 59 59 5f 52 45 44 55 43 45 5f 55 53 45 5f 44 46  YY_REDUCE_USE_DF
1b800 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74  LT (%d)\n", mnNt
1b810 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b  Ofst-1); lineno+
1b820 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e  +;.  n = lemp->n
1b830 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28 20  state;.  while( 
1b840 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 6f 72  n>0 && lemp->sor
1b850 74 65 64 5b 6e 2d 31 5d 2d 3e 69 4e 74 4f 66 73  ted[n-1]->iNtOfs
1b860 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6e  t==NO_OFFSET ) n
1b870 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  --;.  fprintf(ou
1b880 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 52  t, "#define YY_R
1b890 45 44 55 43 45 5f 4d 41 58 20 25 64 5c 6e 22 2c  EDUCE_MAX %d\n",
1b8a0 20 6e 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b   n-1); lineno++;
1b8b0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1b8c0 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 25 73  "static const %s
1b8d0 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b   yy_reduce_ofst[
1b8e0 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20 20 20  ] = {\n", .     
1b8f0 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a       minimum_siz
1b900 65 5f 74 79 70 65 28 6d 6e 4e 74 4f 66 73 74 2d  e_type(mnNtOfst-
1b910 31 2c 20 6d 78 4e 74 4f 66 73 74 29 29 3b 20 6c  1, mxNtOfst)); l
1b920 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69  ineno++;.  for(i
1b930 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
1b940 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20  .    int ofst;. 
1b950 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
1b960 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66  orted[i];.    of
1b970 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73  st = stp->iNtOfs
1b980 74 3b 0a 20 20 20 20 69 66 28 20 6f 66 73 74 3d  t;.    if( ofst=
1b990 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6f 66 73  =NO_OFFSET ) ofs
1b9a0 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 2d 20 31  t = mnNtOfst - 1
1b9b0 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29  ;.    if( j==0 )
1b9c0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f   fprintf(out," /
1b9d0 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a  * %5d */ ", i);.
1b9e0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b9f0 20 22 20 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b   " %4d,", ofst);
1ba00 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
1ba10 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
1ba20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
1ba30 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1ba40 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
1ba50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
1ba60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
1ba70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
1ba80 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20  "); lineno++;.. 
1ba90 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 64   /* Output the d
1baa0 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 74 61  efault action ta
1bab0 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66  ble */.  fprintf
1bac0 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f  (out, "static co
1bad0 6e 73 74 20 59 59 41 43 54 49 4f 4e 54 59 50 45  nst YYACTIONTYPE
1bae0 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 3d 20   yy_default[] = 
1baf0 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  {\n"); lineno++;
1bb00 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74  .  n = lemp->nst
1bb10 61 74 65 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  ate;.  for(i=j=0
1bb20 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
1bb30 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
1bb40 74 65 64 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ted[i];.    if( 
1bb50 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f  j==0 ) fprintf(o
1bb60 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22  ut," /* %5d */ "
1bb70 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , i);.    fprint
1bb80 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20  f(out, " %4d,", 
1bb90 73 74 70 2d 3e 69 44 66 6c 74 29 3b 0a 20 20 20  stp->iDflt);.   
1bba0 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d   if( j==9 || i==
1bbb0 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  n-1 ){.      fpr
1bbc0 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
1bbd0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
1bbe0 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   j = 0;.    }els
1bbf0 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  e{.      j++;.  
1bc00 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
1bc10 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20  f(out, "};\n"); 
1bc20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74  lineno++;.  tplt
1bc30 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1bc40 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1bc50 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1bc60 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 66 61   the table of fa
1bc70 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 73 2e 0a 20  llback tokens.. 
1bc80 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   */.  if( lemp->
1bc90 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a  has_fallback ){.
1bca0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c      for(i=0; i<l
1bcb0 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
1bcc0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
1bcd0 63 74 20 73 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c  ct symbol *p = l
1bce0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
1bcf0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 61  .      if( p->fa
1bd00 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  llback==0 ){.   
1bd10 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1bd20 2c 20 22 20 20 20 20 30 2c 20 20 2f 2a 20 25 31  , "    0,  /* %1
1bd30 30 73 20 3d 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f  0s => nothing */
1bd40 5c 6e 22 2c 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20  \n", p->name);. 
1bd50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1bd60 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1bd70 20 22 20 20 25 33 64 2c 20 20 2f 2a 20 25 31 30   "  %3d,  /* %10
1bd80 73 20 3d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 20 70  s => %s */\n", p
1bd90 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65  ->fallback->inde
1bda0 78 2c 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  x,.          p->
1bdb0 6e 61 6d 65 2c 20 70 2d 3e 66 61 6c 6c 62 61 63  name, p->fallbac
1bdc0 6b 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  k->name);.      
1bdd0 7d 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b  }.      lineno++
1bde0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 74 70  ;.    }.  }.  tp
1bdf0 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
1be00 6d 65 2c 20 69 6e 2c 20 6f 75 74 2c 20 26 6c 69  me, in, out, &li
1be10 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1be20 65 72 61 74 65 20 61 20 74 61 62 6c 65 20 63 6f  erate a table co
1be30 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 79 6d  ntaining the sym
1be40 62 6f 6c 69 63 20 6e 61 6d 65 20 6f 66 20 65 76  bolic name of ev
1be50 65 72 79 20 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a  ery symbol.  */.
1be60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
1be70 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
1be80 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 6c 69  {.    sprintf(li
1be90 6e 65 2c 22 5c 22 25 73 5c 22 2c 22 2c 6c 65 6d  ne,"\"%s\",",lem
1bea0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
1beb0 61 6d 65 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  ame);.    fprint
1bec0 66 28 6f 75 74 2c 22 20 20 25 2d 31 35 73 22 2c  f(out,"  %-15s",
1bed0 6c 69 6e 65 29 3b 0a 20 20 20 20 69 66 28 20 28  line);.    if( (
1bee0 69 26 33 29 3d 3d 33 20 29 7b 20 66 70 72 69 6e  i&3)==3 ){ fprin
1bef0 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69  tf(out,"\n"); li
1bf00 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  neno++; }.  }.  
1bf10 69 66 28 20 28 69 26 33 29 21 3d 30 20 29 7b 20  if( (i&3)!=0 ){ 
1bf20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22  fprintf(out,"\n"
1bf30 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20  ); lineno++; }. 
1bf40 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1bf50 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1bf60 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1bf70 65 72 61 74 65 20 61 20 74 61 62 6c 65 20 63 6f  erate a table co
1bf80 6e 74 61 69 6e 69 6e 67 20 61 20 74 65 78 74 20  ntaining a text 
1bf90 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
1bfa0 72 69 62 65 73 20 65 76 65 72 79 0a 20 20 2a 2a  ribes every.  **
1bfb0 20 72 75 6c 65 20 69 6e 20 74 68 65 20 72 75 6c   rule in the rul
1bfc0 65 20 73 65 74 20 6f 66 20 74 68 65 20 67 72 61  e set of the gra
1bfd0 6d 6d 65 72 2e 20 20 54 68 69 73 20 69 6e 66 6f  mmer.  This info
1bfe0 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 0a  rmation is used.
1bff0 20 20 2a 2a 20 77 68 65 6e 20 74 72 61 63 69 6e    ** when tracin
1c000 67 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 73  g REDUCE actions
1c010 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
1c020 2c 20 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  , rp=lemp->rule;
1c030 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
1c040 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  , i++){.    asse
1c050 72 74 28 20 72 70 2d 3e 69 6e 64 65 78 3d 3d 69  rt( rp->index==i
1c060 20 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   );.    fprintf(
1c070 6f 75 74 2c 22 20 2f 2a 20 25 33 64 20 2a 2f 20  out," /* %3d */ 
1c080 5c 22 22 2c 20 69 29 3b 0a 20 20 20 20 77 72 69  \"", i);.    wri
1c090 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20  teRuleText(out, 
1c0a0 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  rp);.    fprintf
1c0b0 28 6f 75 74 2c 22 5c 22 2c 5c 6e 22 29 3b 20 6c  (out,"\",\n"); l
1c0c0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74  ineno++;.  }.  t
1c0d0 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1c0e0 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1c0f0 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1c100 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
1c110 78 65 63 75 74 65 73 20 65 76 65 72 79 20 74 69  xecutes every ti
1c120 6d 65 20 61 20 73 79 6d 62 6f 6c 20 69 73 20 70  me a symbol is p
1c130 6f 70 70 65 64 20 66 72 6f 6d 0a 20 20 2a 2a 20  opped from.  ** 
1c140 74 68 65 20 73 74 61 63 6b 20 77 68 69 6c 65 20  the stack while 
1c150 70 72 6f 63 65 73 73 69 6e 67 20 65 72 72 6f 72  processing error
1c160 73 20 6f 72 20 77 68 69 6c 65 20 64 65 73 74 72  s or while destr
1c170 6f 79 69 6e 67 20 74 68 65 20 70 61 72 73 65 72  oying the parser
1c180 2e 20 0a 20 20 2a 2a 20 28 49 6e 20 6f 74 68 65  . .  ** (In othe
1c190 72 20 77 6f 72 64 73 2c 20 67 65 6e 65 72 61 74  r words, generat
1c1a0 65 20 74 68 65 20 25 64 65 73 74 72 75 63 74 6f  e the %destructo
1c1b0 72 20 61 63 74 69 6f 6e 73 29 0a 20 20 2a 2f 0a  r actions).  */.
1c1c0 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65    if( lemp->toke
1c1d0 6e 64 65 73 74 20 29 7b 0a 20 20 20 20 69 6e 74  ndest ){.    int
1c1e0 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20 20 66   once = 1;.    f
1c1f0 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
1c200 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  nsymbol; i++){. 
1c210 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
1c220 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73  ol *sp = lemp->s
1c230 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20  ymbols[i];.     
1c240 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70   if( sp==0 || sp
1c250 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c  ->type!=TERMINAL
1c260 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1c270 20 20 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a 20     if( once ){. 
1c280 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
1c290 75 74 2c 20 22 20 20 20 20 20 20 2f 2a 20 54 45  ut, "      /* TE
1c2a0 52 4d 49 4e 41 4c 20 44 65 73 74 72 75 63 74 6f  RMINAL Destructo
1c2b0 72 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  r */\n"); lineno
1c2c0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6f 6e 63 65  ++;.        once
1c2d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1c2e0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1c2f0 22 20 20 20 20 63 61 73 65 20 25 64 3a 20 2f 2a  "    case %d: /*
1c300 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20   %s */\n",.     
1c310 20 20 20 20 20 20 20 20 20 73 70 2d 3e 69 6e 64           sp->ind
1c320 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c  ex, sp->name); l
1c330 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ineno++;.    }. 
1c340 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65     for(i=0; i<le
1c350 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 26 26 20 6c  mp->nsymbol && l
1c360 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
1c370 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 3b  >type!=TERMINAL;
1c380 20 69 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 69   i++);.    if( i
1c390 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29  <lemp->nsymbol )
1c3a0 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f 64 65 73  {.      emit_des
1c3b0 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74  tructor_code(out
1c3c0 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
1c3d0 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b  ],lemp,&lineno);
1c3e0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1c3f0 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b  ut,"      break;
1c400 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1c410 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1c420 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29 7b  lemp->vardest ){
1c430 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62  .    struct symb
1c440 6f 6c 20 2a 64 66 6c 74 5f 73 70 20 3d 20 30 3b  ol *dflt_sp = 0;
1c450 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20  .    int once = 
1c460 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  1;.    for(i=0; 
1c470 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
1c480 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
1c490 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
1c4a0 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
1c4b0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d  ];.      if( sp=
1c4c0 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d  =0 || sp->type==
1c4d0 54 45 52 4d 49 4e 41 4c 20 7c 7c 0a 20 20 20 20  TERMINAL ||.    
1c4e0 20 20 20 20 20 20 73 70 2d 3e 69 6e 64 65 78 3c        sp->index<
1c4f0 3d 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75  =0 || sp->destru
1c500 63 74 6f 72 21 3d 30 20 29 20 63 6f 6e 74 69 6e  ctor!=0 ) contin
1c510 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 6e  ue;.      if( on
1c520 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  ce ){.        fp
1c530 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20  rintf(out, "    
1c540 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 4e 4f 4e    /* Default NON
1c550 2d 54 45 52 4d 49 4e 41 4c 20 44 65 73 74 72 75  -TERMINAL Destru
1c560 63 74 6f 72 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e  ctor */\n"); lin
1c570 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6f  eno++;.        o
1c580 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nce = 0;.      }
1c590 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
1c5a0 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a  ut,"    case %d:
1c5b0 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20   /* %s */\n",.  
1c5c0 20 20 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e              sp->
1c5d0 69 6e 64 65 78 2c 20 73 70 2d 3e 6e 61 6d 65 29  index, sp->name)
1c5e0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1c5f0 20 20 64 66 6c 74 5f 73 70 20 3d 20 73 70 3b 0a    dflt_sp = sp;.
1c600 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 66      }.    if( df
1c610 6c 74 5f 73 70 21 3d 30 20 29 7b 0a 20 20 20 20  lt_sp!=0 ){.    
1c620 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f    emit_destructo
1c630 72 5f 63 6f 64 65 28 6f 75 74 2c 64 66 6c 74 5f  r_code(out,dflt_
1c640 73 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  sp,lemp,&lineno)
1c650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
1c660 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62  ntf(out,"      b
1c670 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  reak;\n"); linen
1c680 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  o++;.  }.  for(i
1c690 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
1c6a0 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  bol; i++){.    s
1c6b0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
1c6c0 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
1c6d0 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 3d  [i];.    if( sp=
1c6e0 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d 3d  =0 || sp->type==
1c6f0 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e  TERMINAL || sp->
1c700 64 65 73 74 72 75 63 74 6f 72 3d 3d 30 20 29 20  destructor==0 ) 
1c710 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 70  continue;.    fp
1c720 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63  rintf(out,"    c
1c730 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f  ase %d: /* %s */
1c740 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1c750 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e   sp->index, sp->
1c760 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
1c770 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65  ..    /* Combine
1c780 20 64 75 70 6c 69 63 61 74 65 20 64 65 73 74 72   duplicate destr
1c790 75 63 74 6f 72 73 20 69 6e 74 6f 20 61 20 73 69  uctors into a si
1c7a0 6e 67 6c 65 20 63 61 73 65 20 2a 2f 0a 20 20 20  ngle case */.   
1c7b0 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6c 65   for(j=i+1; j<le
1c7c0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 2b  mp->nsymbol; j++
1c7d0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1c7e0 73 79 6d 62 6f 6c 20 2a 73 70 32 20 3d 20 6c 65  symbol *sp2 = le
1c7f0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a  mp->symbols[j];.
1c800 20 20 20 20 20 20 69 66 28 20 73 70 32 20 26 26        if( sp2 &&
1c810 20 73 70 32 2d 3e 74 79 70 65 21 3d 54 45 52 4d   sp2->type!=TERM
1c820 49 4e 41 4c 20 26 26 20 73 70 32 2d 3e 64 65 73  INAL && sp2->des
1c830 74 72 75 63 74 6f 72 0a 20 20 20 20 20 20 20 20  tructor.        
1c840 20 20 26 26 20 73 70 32 2d 3e 64 74 6e 75 6d 3d    && sp2->dtnum=
1c850 3d 73 70 2d 3e 64 74 6e 75 6d 0a 20 20 20 20 20  =sp->dtnum.     
1c860 20 20 20 20 20 26 26 20 73 74 72 63 6d 70 28 73       && strcmp(s
1c870 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 2c 73 70  p->destructor,sp
1c880 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 29 3d 3d  2->destructor)==
1c890 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 66 70  0 ){.         fp
1c8a0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63  rintf(out,"    c
1c8b0 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f  ase %d: /* %s */
1c8c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1c8d0 20 20 20 20 20 20 73 70 32 2d 3e 69 6e 64 65 78        sp2->index
1c8e0 2c 20 73 70 32 2d 3e 6e 61 6d 65 29 3b 20 6c 69  , sp2->name); li
1c8f0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
1c900 20 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72   sp2->destructor
1c910 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1c920 20 20 7d 0a 0a 20 20 20 20 65 6d 69 74 5f 64 65    }..    emit_de
1c930 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75  structor_code(ou
1c940 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  t,lemp->symbols[
1c950 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  i],lemp,&lineno)
1c960 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1c970 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c  t,"      break;\
1c980 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1c990 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
1c9a0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1c9b0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1c9c0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
1c9d0 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68  hich executes wh
1c9e0 65 6e 65 76 65 72 20 74 68 65 20 70 61 72 73 65  enever the parse
1c9f0 72 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77  r stack overflow
1ca00 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e  s */.  tplt_prin
1ca10 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d  t(out,lemp,lemp-
1ca20 3e 6f 76 65 72 66 6c 6f 77 2c 26 6c 69 6e 65 6e  >overflow,&linen
1ca30 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  o);.  tplt_xfer(
1ca40 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1ca50 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1ca60 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74  * Generate the t
1ca70 61 62 6c 65 20 6f 66 20 72 75 6c 65 20 69 6e 66  able of rule inf
1ca80 6f 72 6d 61 74 69 6f 6e 20 0a 20 20 2a 2a 0a 20  ormation .  **. 
1ca90 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 63   ** Note: This c
1caa0 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ode depends on t
1cab0 68 65 20 66 61 63 74 20 74 68 61 74 20 72 75 6c  he fact that rul
1cac0 65 73 20 61 72 65 20 6e 75 6d 62 65 72 0a 20 20  es are number.  
1cad0 2a 2a 20 73 65 71 75 65 6e 74 75 61 6c 6c 79 20  ** sequentually 
1cae0 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30  beginning with 0
1caf0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d  ..  */.  for(rp=
1cb00 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
1cb10 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
1cb20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1cb30 20 7b 20 25 64 2c 20 25 64 20 7d 2c 5c 6e 22 2c   { %d, %d },\n",
1cb40 72 70 2d 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c 72  rp->lhs->index,r
1cb50 70 2d 3e 6e 72 68 73 29 3b 20 6c 69 6e 65 6e 6f  p->nrhs); lineno
1cb60 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78  ++;.  }.  tplt_x
1cb70 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1cb80 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1cb90 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1cba0 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
1cbb0 69 6f 6e 20 64 75 72 69 6e 67 20 65 61 63 68 20  ion during each 
1cbc0 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20 2a 2f  REDUCE action */
1cbd0 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
1cbe0 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
1cbf0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 74 72 61 6e  >next){.    tran
1cc00 73 6c 61 74 65 5f 63 6f 64 65 28 6c 65 6d 70 2c  slate_code(lemp,
1cc10 20 72 70 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28   rp);.  }.  for(
1cc20 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
1cc30 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
1cc40 0a 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65  .    struct rule
1cc50 20 2a 72 70 32 3b 0a 20 20 20 20 69 66 28 20 72   *rp2;.    if( r
1cc60 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 20 63 6f 6e  p->code==0 ) con
1cc70 74 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e  tinue;.    fprin
1cc80 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63 61  tf(out,"      ca
1cc90 73 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72 70 2d  se %d: /* ", rp-
1cca0 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 77 72 69  >index);.    wri
1ccb0 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20  teRuleText(out, 
1ccc0 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  rp);.    fprintf
1ccd0 28 6f 75 74 2c 20 22 20 2a 2f 5c 6e 22 29 3b 20  (out, " */\n"); 
1cce0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 6f  lineno++;.    fo
1ccf0 72 28 72 70 32 3d 72 70 2d 3e 6e 65 78 74 3b 20  r(rp2=rp->next; 
1cd00 72 70 32 3b 20 72 70 32 3d 72 70 32 2d 3e 6e 65  rp2; rp2=rp2->ne
1cd10 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  xt){.      if( r
1cd20 70 32 2d 3e 63 6f 64 65 3d 3d 72 70 2d 3e 63 6f  p2->code==rp->co
1cd30 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  de ){.        fp
1cd40 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
1cd50 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 22 2c 20   case %d: /* ", 
1cd60 72 70 32 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  rp2->index);.   
1cd70 20 20 20 20 20 77 72 69 74 65 52 75 6c 65 54 65       writeRuleTe
1cd80 78 74 28 6f 75 74 2c 20 72 70 32 29 3b 0a 20 20  xt(out, rp2);.  
1cd90 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1cda0 74 2c 22 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65  t," */\n"); line
1cdb0 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 70  no++;.        rp
1cdc0 32 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20 20 20  2->code = 0;.   
1cdd0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65     }.    }.    e
1cde0 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c 72 70 2c  mit_code(out,rp,
1cdf0 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lemp,&lineno);. 
1ce00 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1ce10 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e          break;\n
1ce20 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1ce30 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
1ce40 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1ce50 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1ce60 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68  Generate code wh
1ce70 69 63 68 20 65 78 65 63 75 74 65 73 20 69 66 20  ich executes if 
1ce80 61 20 70 61 72 73 65 20 66 61 69 6c 73 20 2a 2f  a parse fails */
1ce90 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75  .  tplt_print(ou
1cea0 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 66 61 69  t,lemp,lemp->fai
1ceb0 6c 75 72 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lure,&lineno);. 
1cec0 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1ced0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1cee0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1cef0 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63 68  erate code which
1cf00 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 20 61   executes when a
1cf10 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20 6f 63   syntax error oc
1cf20 63 75 72 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70  curs */.  tplt_p
1cf30 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65  rint(out,lemp,le
1cf40 6d 70 2d 3e 65 72 72 6f 72 2c 26 6c 69 6e 65 6e  mp->error,&linen
1cf50 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  o);.  tplt_xfer(
1cf60 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1cf70 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1cf80 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1cf90 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
1cfa0 68 65 6e 20 74 68 65 20 70 61 72 73 65 72 20 61  hen the parser a
1cfb0 63 63 65 70 74 73 20 69 74 73 20 69 6e 70 75 74  ccepts its input
1cfc0 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74   */.  tplt_print
1cfd0 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e  (out,lemp,lemp->
1cfe0 61 63 63 65 70 74 2c 26 6c 69 6e 65 6e 6f 29 3b  accept,&lineno);
1cff0 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
1d000 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
1d010 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 41  lineno);..  /* A
1d020 70 70 65 6e 64 20 61 6e 79 20 61 64 64 69 74 69  ppend any additi
1d030 6f 6e 20 63 6f 64 65 20 74 68 65 20 75 73 65 72  on code the user
1d040 20 64 65 73 69 72 65 73 20 2a 2f 0a 20 20 74 70   desires */.  tp
1d050 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d  lt_print(out,lem
1d060 70 2c 6c 65 6d 70 2d 3e 65 78 74 72 61 63 6f 64  p,lemp->extracod
1d070 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 66  e,&lineno);..  f
1d080 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 66 63 6c  close(in);.  fcl
1d090 6f 73 65 28 6f 75 74 29 3b 0a 20 20 72 65 74 75  ose(out);.  retu
1d0a0 72 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61  rn;.}../* Genera
1d0b0 74 65 20 61 20 68 65 61 64 65 72 20 66 69 6c 65  te a header file
1d0c0 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20   for the parser 
1d0d0 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 48 65  */.void ReportHe
1d0e0 61 64 65 72 28 6c 65 6d 70 29 0a 73 74 72 75 63  ader(lemp).struc
1d0f0 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
1d100 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69  .  FILE *out, *i
1d110 6e 3b 0a 20 20 63 68 61 72 20 2a 70 72 65 66 69  n;.  char *prefi
1d120 78 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c  x;.  char line[L
1d130 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 63 68 61 72  INESIZE];.  char
1d140 20 70 61 74 74 65 72 6e 5b 4c 49 4e 45 53 49 5a   pattern[LINESIZ
1d150 45 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  E];.  int i;..  
1d160 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70  if( lemp->tokenp
1d170 72 65 66 69 78 20 29 20 70 72 65 66 69 78 20 3d  refix ) prefix =
1d180 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66   lemp->tokenpref
1d190 69 78 3b 0a 20 20 65 6c 73 65 20 20 20 20 20 20  ix;.  else      
1d1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
1d1b0 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 69 6e 20  efix = "";.  in 
1d1c0 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70  = file_open(lemp
1d1d0 2c 22 2e 68 22 2c 22 72 62 22 29 3b 0a 20 20 69  ,".h","rb");.  i
1d1e0 66 28 20 69 6e 20 29 7b 0a 20 20 20 20 66 6f 72  f( in ){.    for
1d1f0 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74  (i=1; i<lemp->nt
1d200 65 72 6d 69 6e 61 6c 20 26 26 20 66 67 65 74 73  erminal && fgets
1d210 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69  (line,LINESIZE,i
1d220 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  n); i++){.      
1d230 73 70 72 69 6e 74 66 28 70 61 74 74 65 72 6e 2c  sprintf(pattern,
1d240 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73  "#define %s%-30s
1d250 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c   %2d\n",prefix,l
1d260 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
1d270 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20  >name,i);.      
1d280 69 66 28 20 73 74 72 63 6d 70 28 6c 69 6e 65 2c  if( strcmp(line,
1d290 70 61 74 74 65 72 6e 29 20 29 20 62 72 65 61 6b  pattern) ) break
1d2a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f  ;.    }.    fclo
1d2b0 73 65 28 69 6e 29 3b 0a 20 20 20 20 69 66 28 20  se(in);.    if( 
1d2c0 69 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e  i==lemp->ntermin
1d2d0 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  al ){.      /* N
1d2e0 6f 20 63 68 61 6e 67 65 20 69 6e 20 74 68 65 20  o change in the 
1d2f0 66 69 6c 65 2e 20 20 44 6f 6e 27 74 20 72 65 77  file.  Don't rew
1d300 72 69 74 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20  rite it. */.    
1d310 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a    return;.    }.
1d320 20 20 7d 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65    }.  out = file
1d330 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c  _open(lemp,".h",
1d340 22 77 62 22 29 3b 0a 20 20 69 66 28 20 6f 75 74  "wb");.  if( out
1d350 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b   ){.    for(i=1;
1d360 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e   i<lemp->ntermin
1d370 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  al; i++){.      
1d380 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1d390 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25 32 64  fine %s%-30s %2d
1d3a0 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d  \n",prefix,lemp-
1d3b0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d  >symbols[i]->nam
1d3c0 65 2c 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e,i);.    }.    
1d3d0 66 63 6c 6f 73 65 28 6f 75 74 29 3b 20 20 0a 20  fclose(out);  . 
1d3e0 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a   }.  return;.}..
1d3f0 2f 2a 20 52 65 64 75 63 65 20 74 68 65 20 73 69  /* Reduce the si
1d400 7a 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e  ze of the action
1d410 20 74 61 62 6c 65 73 2c 20 69 66 20 70 6f 73 73   tables, if poss
1d420 69 62 6c 65 2c 20 62 79 20 6d 61 6b 69 6e 67 20  ible, by making 
1d430 75 73 65 0a 2a 2a 20 6f 66 20 64 65 66 61 75 6c  use.** of defaul
1d440 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 69  ts..**.** In thi
1d450 73 20 76 65 72 73 69 6f 6e 2c 20 77 65 20 74 61  s version, we ta
1d460 6b 65 20 74 68 65 20 6d 6f 73 74 20 66 72 65 71  ke the most freq
1d470 75 65 6e 74 20 52 45 44 55 43 45 20 61 63 74 69  uent REDUCE acti
1d480 6f 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a 20 69  on and make.** i
1d490 74 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20 20  t the default.  
1d4a0 45 78 63 65 70 74 2c 20 74 68 65 72 65 20 69 73  Except, there is
1d4b0 20 6e 6f 20 64 65 66 61 75 6c 74 20 69 66 20 74   no default if t
1d4c0 68 65 20 77 69 6c 64 63 61 72 64 20 74 6f 6b 65  he wildcard toke
1d4d0 6e 0a 2a 2a 20 69 73 20 61 20 70 6f 73 73 69 62  n.** is a possib
1d4e0 6c 65 20 6c 6f 6f 6b 2d 61 68 65 61 64 2e 0a 2a  le look-ahead..*
1d4f0 2f 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73 73 54  /.void CompressT
1d500 61 62 6c 65 73 28 6c 65 6d 70 29 0a 73 74 72 75  ables(lemp).stru
1d510 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
1d520 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  {.  struct state
1d530 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
1d540 61 63 74 69 6f 6e 20 2a 61 70 2c 20 2a 61 70 32  action *ap, *ap2
1d550 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
1d560 2a 72 70 2c 20 2a 72 70 32 2c 20 2a 72 62 65 73  *rp, *rp2, *rbes
1d570 74 3b 0a 20 20 69 6e 74 20 6e 62 65 73 74 2c 20  t;.  int nbest, 
1d580 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
1d590 74 20 75 73 65 73 57 69 6c 64 63 61 72 64 3b 0a  t usesWildcard;.
1d5a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
1d5b0 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
1d5c0 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  {.    stp = lemp
1d5d0 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
1d5e0 20 6e 62 65 73 74 20 3d 20 30 3b 0a 20 20 20 20   nbest = 0;.    
1d5f0 72 62 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 75  rbest = 0;.    u
1d600 73 65 73 57 69 6c 64 63 61 72 64 20 3d 20 30 3b  sesWildcard = 0;
1d610 0a 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70  ..    for(ap=stp
1d620 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
1d630 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
1d640 28 20 61 70 2d 3e 74 79 70 65 3d 3d 53 48 49 46  ( ap->type==SHIF
1d650 54 20 26 26 20 61 70 2d 3e 73 70 3d 3d 6c 65 6d  T && ap->sp==lem
1d660 70 2d 3e 77 69 6c 64 63 61 72 64 20 29 7b 0a 20  p->wildcard ){. 
1d670 20 20 20 20 20 20 20 75 73 65 73 57 69 6c 64 63         usesWildc
1d680 61 72 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ard = 1;.      }
1d690 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74  .      if( ap->t
1d6a0 79 70 65 21 3d 52 45 44 55 43 45 20 29 20 63 6f  ype!=REDUCE ) co
1d6b0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 72 70  ntinue;.      rp
1d6c0 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20 20   = ap->x.rp;.   
1d6d0 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 53 74     if( rp->lhsSt
1d6e0 61 72 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  art ) continue;.
1d6f0 20 20 20 20 20 20 69 66 28 20 72 70 3d 3d 72 62        if( rp==rb
1d700 65 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  est ) continue;.
1d710 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20        n = 1;.   
1d720 20 20 20 66 6f 72 28 61 70 32 3d 61 70 2d 3e 6e     for(ap2=ap->n
1d730 65 78 74 3b 20 61 70 32 3b 20 61 70 32 3d 61 70  ext; ap2; ap2=ap
1d740 32 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20  2->next){.      
1d750 20 20 69 66 28 20 61 70 32 2d 3e 74 79 70 65 21    if( ap2->type!
1d760 3d 52 45 44 55 43 45 20 29 20 63 6f 6e 74 69 6e  =REDUCE ) contin
1d770 75 65 3b 0a 20 20 20 20 20 20 20 20 72 70 32 20  ue;.        rp2 
1d780 3d 20 61 70 32 2d 3e 78 2e 72 70 3b 0a 20 20 20  = ap2->x.rp;.   
1d790 20 20 20 20 20 69 66 28 20 72 70 32 3d 3d 72 62       if( rp2==rb
1d7a0 65 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  est ) continue;.
1d7b0 20 20 20 20 20 20 20 20 69 66 28 20 72 70 32 3d          if( rp2=
1d7c0 3d 72 70 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20  =rp ) n++;.     
1d7d0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e   }.      if( n>n
1d7e0 62 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  best ){.        
1d7f0 6e 62 65 73 74 20 3d 20 6e 3b 0a 20 20 20 20 20  nbest = n;.     
1d800 20 20 20 72 62 65 73 74 20 3d 20 72 70 3b 0a 20     rbest = rp;. 
1d810 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 0a 20       }.    }. . 
1d820 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b     /* Do not mak
1d830 65 20 61 20 64 65 66 61 75 6c 74 20 69 66 20 74  e a default if t
1d840 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 75 6c  he number of rul
1d850 65 73 20 74 6f 20 64 65 66 61 75 6c 74 0a 20 20  es to default.  
1d860 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 74 20 6c    ** is not at l
1d870 65 61 73 74 20 31 20 6f 72 20 69 66 20 74 68 65  east 1 or if the
1d880 20 77 69 6c 64 63 61 72 64 20 74 6f 6b 65 6e 20   wildcard token 
1d890 69 73 20 61 20 70 6f 73 73 69 62 6c 65 0a 20 20  is a possible.  
1d8a0 20 20 2a 2a 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a    ** lookahead..
1d8b0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1d8c0 62 65 73 74 3c 31 20 7c 7c 20 75 73 65 73 57 69  best<1 || usesWi
1d8d0 6c 64 63 61 72 64 20 29 20 63 6f 6e 74 69 6e 75  ldcard ) continu
1d8e0 65 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62  e;...    /* Comb
1d8f0 69 6e 65 20 6d 61 74 63 68 69 6e 67 20 52 45 44  ine matching RED
1d900 55 43 45 20 61 63 74 69 6f 6e 73 20 69 6e 74 6f  UCE actions into
1d910 20 61 20 73 69 6e 67 6c 65 20 64 65 66 61 75 6c   a single defaul
1d920 74 20 2a 2f 0a 20 20 20 20 66 6f 72 28 61 70 3d  t */.    for(ap=
1d930 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  stp->ap; ap; ap=
1d940 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
1d950 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52   if( ap->type==R
1d960 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72  EDUCE && ap->x.r
1d970 70 3d 3d 72 62 65 73 74 20 29 20 62 72 65 61 6b  p==rbest ) break
1d980 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1d990 72 74 28 20 61 70 20 29 3b 0a 20 20 20 20 61 70  rt( ap );.    ap
1d9a0 2d 3e 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65  ->sp = Symbol_ne
1d9b0 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b 0a  w("{default}");.
1d9c0 20 20 20 20 66 6f 72 28 61 70 3d 61 70 2d 3e 6e      for(ap=ap->n
1d9d0 65 78 74 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  ext; ap; ap=ap->
1d9e0 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
1d9f0 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43   ap->type==REDUC
1da00 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d 72  E && ap->x.rp==r
1da10 62 65 73 74 20 29 20 61 70 2d 3e 74 79 70 65 20  best ) ap->type 
1da20 3d 20 4e 4f 54 5f 55 53 45 44 3b 0a 20 20 20 20  = NOT_USED;.    
1da30 7d 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20  }.    stp->ap = 
1da40 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70 2d  Action_sort(stp-
1da50 3e 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  >ap);.  }.}.../*
1da60 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
1da70 73 74 61 74 65 73 20 66 6f 72 20 73 6f 72 74 69  states for sorti
1da80 6e 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68  ng purposes.  Th
1da90 65 20 73 6d 61 6c 6c 65 72 20 73 74 61 74 65 20  e smaller state 
1daa0 69 73 20 74 68 65 0a 2a 2a 20 6f 6e 65 20 77 69  is the.** one wi
1dab0 74 68 20 74 68 65 20 6d 6f 73 74 20 6e 6f 6e 2d  th the most non-
1dac0 74 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73  terminal actions
1dad0 2e 20 20 49 66 20 74 68 65 79 20 68 61 76 65 20  .  If they have 
1dae0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
1daf0 2a 2a 20 6f 66 20 6e 6f 6e 2d 74 65 72 6d 69 6e  ** of non-termin
1db00 61 6c 20 61 63 74 69 6f 6e 73 2c 20 74 68 65 6e  al actions, then
1db10 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 69 73 20   the smaller is 
1db20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
1db30 20 6d 6f 73 74 0a 2a 2a 20 74 6f 6b 65 6e 20 61   most.** token a
1db40 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  ctions..*/.stati
1db50 63 20 69 6e 74 20 73 74 61 74 65 52 65 73 6f 72  c int stateResor
1db60 74 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76  tCompare(const v
1db70 6f 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f  oid *a, const vo
1db80 69 64 20 2a 62 29 7b 0a 20 20 63 6f 6e 73 74 20  id *b){.  const 
1db90 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 70 41  struct state *pA
1dba0 20 3d 20 2a 28 63 6f 6e 73 74 20 73 74 72 75 63   = *(const struc
1dbb0 74 20 73 74 61 74 65 2a 2a 29 61 3b 0a 20 20 63  t state**)a;.  c
1dbc0 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74  onst struct stat
1dbd0 65 20 2a 70 42 20 3d 20 2a 28 63 6f 6e 73 74 20  e *pB = *(const 
1dbe0 73 74 72 75 63 74 20 73 74 61 74 65 2a 2a 29 62  struct state**)b
1dbf0 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 6e 20  ;.  int n;..  n 
1dc00 3d 20 70 42 2d 3e 6e 4e 74 41 63 74 20 2d 20 70  = pB->nNtAct - p
1dc10 41 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20 69 66 28  A->nNtAct;.  if(
1dc20 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d   n==0 ){.    n =
1dc30 20 70 42 2d 3e 6e 54 6b 6e 41 63 74 20 2d 20 70   pB->nTknAct - p
1dc40 41 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 7d 0a  A->nTknAct;.  }.
1dc50 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a    return n;.}...
1dc60 2f 2a 0a 2a 2a 20 52 65 6e 75 6d 62 65 72 20 61  /*.** Renumber a
1dc70 6e 64 20 72 65 73 6f 72 74 20 73 74 61 74 65 73  nd resort states
1dc80 20 73 6f 20 74 68 61 74 20 73 74 61 74 65 73 20   so that states 
1dc90 77 69 74 68 20 66 65 77 65 72 20 63 68 6f 69 63  with fewer choic
1dca0 65 73 0a 2a 2a 20 6f 63 63 75 72 20 61 74 20 74  es.** occur at t
1dcb0 68 65 20 65 6e 64 2e 20 20 45 78 63 65 70 74 2c  he end.  Except,
1dcc0 20 6b 65 65 70 20 73 74 61 74 65 20 30 20 61 73   keep state 0 as
1dcd0 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65   the first state
1dce0 2e 0a 2a 2f 0a 76 6f 69 64 20 52 65 73 6f 72 74  ..*/.void Resort
1dcf0 53 74 61 74 65 73 28 6c 65 6d 70 29 0a 73 74 72  States(lemp).str
1dd00 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
1dd10 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  .{.  int i;.  st
1dd20 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
1dd30 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
1dd40 20 2a 61 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30   *ap;..  for(i=0
1dd50 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
1dd60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
1dd70 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
1dd80 5d 3b 0a 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e  ];.    stp->nTkn
1dd90 41 63 74 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63  Act = stp->nNtAc
1dda0 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 70 2d 3e  t = 0;.    stp->
1ddb0 69 44 66 6c 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73  iDflt = lemp->ns
1ddc0 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75  tate + lemp->nru
1ddd0 6c 65 3b 0a 20 20 20 20 73 74 70 2d 3e 69 54 6b  le;.    stp->iTk
1dde0 6e 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45  nOfst = NO_OFFSE
1ddf0 54 3b 0a 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f  T;.    stp->iNtO
1de00 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b  fst = NO_OFFSET;
1de10 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d  .    for(ap=stp-
1de20 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
1de30 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
1de40 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28   compute_action(
1de50 6c 65 6d 70 2c 61 70 29 3e 3d 30 20 29 7b 0a 20  lemp,ap)>=0 ){. 
1de60 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73         if( ap->s
1de70 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e  p->index<lemp->n
1de80 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20  terminal ){.    
1de90 20 20 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41        stp->nTknA
1dea0 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  ct++;.        }e
1deb0 6c 73 65 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e  lse if( ap->sp->
1dec0 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  index<lemp->nsym
1ded0 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  bol ){.         
1dee0 20 73 74 70 2d 3e 6e 4e 74 41 63 74 2b 2b 3b 0a   stp->nNtAct++;.
1def0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1df00 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e 69 44           stp->iD
1df10 66 6c 74 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63  flt = compute_ac
1df20 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a  tion(lemp, ap);.
1df30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1df40 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 71 73  }.    }.  }.  qs
1df50 6f 72 74 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65  ort(&lemp->sorte
1df60 64 5b 31 5d 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61  d[1], lemp->nsta
1df70 74 65 2d 31 2c 20 73 69 7a 65 6f 66 28 6c 65 6d  te-1, sizeof(lem
1df80 70 2d 3e 73 6f 72 74 65 64 5b 30 5d 29 2c 0a 20  p->sorted[0]),. 
1df90 20 20 20 20 20 20 20 73 74 61 74 65 52 65 73 6f         stateReso
1dfa0 72 74 43 6f 6d 70 61 72 65 29 3b 0a 20 20 66 6f  rtCompare);.  fo
1dfb0 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
1dfc0 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
1dfd0 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
1dfe0 2d 3e 73 74 61 74 65 6e 75 6d 20 3d 20 69 3b 0a  ->statenum = i;.
1dff0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a    }.}.../*******
1e000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
1e010 74 68 65 20 66 69 6c 65 20 22 73 65 74 2e 63 22  the file "set.c"
1e020 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1e030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e040 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 65 74  *****/./*.** Set
1e050 20 6d 61 6e 69 70 75 6c 61 74 69 6f 6e 20 72 6f   manipulation ro
1e060 75 74 69 6e 65 73 20 66 6f 72 20 74 68 65 20 4c  utines for the L
1e070 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65  EMON parser gene
1e080 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69  rator..*/..stati
1e090 63 20 69 6e 74 20 73 69 7a 65 20 3d 20 30 3b 0a  c int size = 0;.
1e0a0 0a 2f 2a 20 53 65 74 20 74 68 65 20 73 65 74 20  ./* Set the set 
1e0b0 73 69 7a 65 20 2a 2f 0a 76 6f 69 64 20 53 65 74  size */.void Set
1e0c0 53 69 7a 65 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b  Size(n).int n;.{
1e0d0 0a 20 20 73 69 7a 65 20 3d 20 6e 2b 31 3b 0a 7d  .  size = n+1;.}
1e0e0 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
1e0f0 6e 65 77 20 73 65 74 20 2a 2f 0a 63 68 61 72 20  new set */.char 
1e100 2a 53 65 74 4e 65 77 28 29 7b 0a 20 20 63 68 61  *SetNew(){.  cha
1e110 72 20 2a 73 3b 0a 20 20 73 20 3d 20 28 63 68 61  r *s;.  s = (cha
1e120 72 2a 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65 2c  r*)calloc( size,
1e130 20 31 29 3b 0a 20 20 69 66 28 20 73 3d 3d 30 20   1);.  if( s==0 
1e140 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f  ){.    extern vo
1e150 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28  id memory_error(
1e160 29 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65 72  );.    memory_er
1e170 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ror();.  }.  ret
1e180 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20 44 65 61  urn s;.}../* Dea
1e190 6c 6c 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f  llocate a set */
1e1a0 0a 76 6f 69 64 20 53 65 74 46 72 65 65 28 73 29  .void SetFree(s)
1e1b0 0a 63 68 61 72 20 2a 73 3b 0a 7b 0a 20 20 66 72  .char *s;.{.  fr
1e1c0 65 65 28 73 29 3b 0a 7d 0a 0a 2f 2a 20 41 64 64  ee(s);.}../* Add
1e1d0 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
1e1e0 6f 20 74 68 65 20 73 65 74 2e 20 20 52 65 74 75  o the set.  Retu
1e1f0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 65  rn TRUE if the e
1e200 6c 65 6d 65 6e 74 20 77 61 73 20 61 64 64 65 64  lement was added
1e210 0a 2a 2a 20 61 6e 64 20 46 41 4c 53 45 20 69 66  .** and FALSE if
1e220 20 69 74 20 77 61 73 20 61 6c 72 65 61 64 79 20   it was already 
1e230 74 68 65 72 65 2e 20 2a 2f 0a 69 6e 74 20 53 65  there. */.int Se
1e240 74 41 64 64 28 73 2c 65 29 0a 63 68 61 72 20 2a  tAdd(s,e).char *
1e250 73 3b 0a 69 6e 74 20 65 3b 0a 7b 0a 20 20 69 6e  s;.int e;.{.  in
1e260 74 20 72 76 3b 0a 20 20 61 73 73 65 72 74 28 20  t rv;.  assert( 
1e270 65 3e 3d 30 20 26 26 20 65 3c 73 69 7a 65 20 29  e>=0 && e<size )
1e280 3b 0a 20 20 72 76 20 3d 20 73 5b 65 5d 3b 0a 20  ;.  rv = s[e];. 
1e290 20 73 5b 65 5d 20 3d 20 31 3b 0a 20 20 72 65 74   s[e] = 1;.  ret
1e2a0 75 72 6e 20 21 72 76 3b 0a 7d 0a 0a 2f 2a 20 41  urn !rv;.}../* A
1e2b0 64 64 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74  dd every element
1e2c0 20 6f 66 20 73 32 20 74 6f 20 73 31 2e 20 20 52   of s2 to s1.  R
1e2d0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 31  eturn TRUE if s1
1e2e0 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a 69 6e 74   changes. */.int
1e2f0 20 53 65 74 55 6e 69 6f 6e 28 73 31 2c 73 32 29   SetUnion(s1,s2)
1e300 0a 63 68 61 72 20 2a 73 31 3b 0a 63 68 61 72 20  .char *s1;.char 
1e310 2a 73 32 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 20  *s2;.{.  int i, 
1e320 70 72 6f 67 72 65 73 73 3b 0a 20 20 70 72 6f 67  progress;.  prog
1e330 72 65 73 73 20 3d 20 30 3b 0a 20 20 66 6f 72 28  ress = 0;.  for(
1e340 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b  i=0; i<size; i++
1e350 29 7b 0a 20 20 20 20 69 66 28 20 73 32 5b 69 5d  ){.    if( s2[i]
1e360 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
1e370 20 20 20 20 69 66 28 20 73 31 5b 69 5d 3d 3d 30      if( s1[i]==0
1e380 20 29 7b 0a 20 20 20 20 20 20 70 72 6f 67 72 65   ){.      progre
1e390 73 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 31  ss = 1;.      s1
1e3a0 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  [i] = 1;.    }. 
1e3b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 72 6f 67   }.  return prog
1e3c0 72 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  ress;.}./*******
1e3d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1e3e0 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74  From the file "t
1e3f0 61 62 6c 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  able.c" ********
1e400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1e410 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20  ****/./*.** All 
1e420 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c  code in this fil
1e430 65 20 68 61 73 20 62 65 65 6e 20 61 75 74 6f 6d  e has been autom
1e440 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 74  atically generat
1e450 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20 73 70 65  ed.** from a spe
1e460 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 74 68  cification in th
1e470 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20  e file.**       
1e480 20 20 20 20 20 20 20 22 74 61 62 6c 65 2e 71 22         "table.q"
1e490 0a 2a 2a 20 62 79 20 74 68 65 20 61 73 73 6f 63  .** by the assoc
1e4a0 69 61 74 69 76 65 20 61 72 72 61 79 20 63 6f 64  iative array cod
1e4b0 65 20 62 75 69 6c 64 69 6e 67 20 70 72 6f 67 72  e building progr
1e4c0 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a 2a 20 44  am "aagen"..** D
1e4d0 6f 20 6e 6f 74 20 65 64 69 74 20 74 68 69 73 20  o not edit this 
1e4e0 66 69 6c 65 21 20 20 49 6e 73 74 65 61 64 2c 20  file!  Instead, 
1e4f0 65 64 69 74 20 74 68 65 20 73 70 65 63 69 66 69  edit the specifi
1e500 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20  cation.** file, 
1e510 74 68 65 6e 20 72 65 72 75 6e 20 61 61 67 65 6e  then rerun aagen
1e520 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ..*/./*.** Code 
1e530 66 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 74  for processing t
1e540 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45 4d  ables in the LEM
1e550 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
1e560 74 6f 72 2e 0a 2a 2f 0a 0a 50 52 49 56 41 54 45  tor..*/..PRIVATE
1e570 20 69 6e 74 20 73 74 72 68 61 73 68 28 78 29 0a   int strhash(x).
1e580 63 68 61 72 20 2a 78 3b 0a 7b 0a 20 20 69 6e 74  char *x;.{.  int
1e590 20 68 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   h = 0;.  while(
1e5a0 20 2a 78 29 20 68 20 3d 20 68 2a 31 33 20 2b 20   *x) h = h*13 + 
1e5b0 2a 28 78 2b 2b 29 3b 0a 20 20 72 65 74 75 72 6e  *(x++);.  return
1e5c0 20 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72 6b 73 20   h;.}../* Works 
1e5d0 6c 69 6b 65 20 73 74 72 64 75 70 2c 20 73 6f 72  like strdup, sor
1e5e0 74 20 6f 66 2e 20 20 53 61 76 65 20 61 20 73 74  t of.  Save a st
1e5f0 72 69 6e 67 20 69 6e 20 6d 61 6c 6c 6f 63 65 64  ring in malloced
1e600 20 6d 65 6d 6f 72 79 2c 20 62 75 74 0a 2a 2a 20   memory, but.** 
1e610 6b 65 65 70 20 73 74 72 69 6e 67 73 20 69 6e 20  keep strings in 
1e620 61 20 74 61 62 6c 65 20 73 6f 20 74 68 61 74 20  a table so that 
1e630 74 68 65 20 73 61 6d 65 20 73 74 72 69 6e 67 20  the same string 
1e640 69 73 20 6e 6f 74 20 69 6e 20 6d 6f 72 65 0a 2a  is not in more.*
1e650 2a 20 74 68 61 6e 20 6f 6e 65 20 70 6c 61 63 65  * than one place
1e660 2e 0a 2a 2f 0a 63 68 61 72 20 2a 53 74 72 73 61  ..*/.char *Strsa
1e670 66 65 28 79 29 0a 63 68 61 72 20 2a 79 3b 0a 7b  fe(y).char *y;.{
1e680 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69  .  char *z;..  i
1e690 66 28 20 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( y==0 ) return
1e6a0 20 30 3b 0a 20 20 7a 20 3d 20 53 74 72 73 61 66   0;.  z = Strsaf
1e6b0 65 5f 66 69 6e 64 28 79 29 3b 0a 20 20 69 66 28  e_find(y);.  if(
1e6c0 20 7a 3d 3d 30 20 26 26 20 28 7a 3d 6d 61 6c 6c   z==0 && (z=mall
1e6d0 6f 63 28 20 73 74 72 6c 65 6e 28 79 29 2b 31 20  oc( strlen(y)+1 
1e6e0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ))!=0 ){.    str
1e6f0 63 70 79 28 7a 2c 79 29 3b 0a 20 20 20 20 53 74  cpy(z,y);.    St
1e700 72 73 61 66 65 5f 69 6e 73 65 72 74 28 7a 29 3b  rsafe_insert(z);
1e710 0a 20 20 7d 0a 20 20 4d 65 6d 6f 72 79 43 68 65  .  }.  MemoryChe
1e720 63 6b 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ck(z);.  return 
1e730 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69  z;.}../* There i
1e740 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
1e750 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1e760 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61  structure for ea
1e770 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76  ch.** associativ
1e780 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
1e790 22 78 31 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  "x1"..*/.struct 
1e7a0 73 5f 78 31 20 7b 0a 20 20 69 6e 74 20 73 69 7a  s_x1 {.  int siz
1e7b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1e7c0 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
1e7d0 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74  f available slot
1e7e0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
1e7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e800 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70  /*   Must be a p
1e810 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65  ower of 2 greate
1e820 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20  r than or */.   
1e830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e840 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61         /*   equa
1e850 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20  l to 1 */.  int 
1e860 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  count;          
1e870 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1e880 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73   currently slots
1e890 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72   filled */.  str
1e8a0 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 74 62  uct s_x1node *tb
1e8b0 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  l;  /* The data 
1e8c0 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20  stored here */. 
1e8d0 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
1e8e0 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20   **ht;  /* Hash 
1e8f0 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70  table for lookup
1e900 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72  s */.};../* Ther
1e910 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
1e920 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
1e930 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61  ure for every da
1e940 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e  ta element.** in
1e950 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20   an associative 
1e960 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
1e970 31 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  1"..*/.typedef s
1e980 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 7b  truct s_x1node {
1e990 0a 20 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20  .  char *data;  
1e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9b0 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
1e9c0 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
1e9d0 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78   *next;   /* Nex
1e9e0 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  t entry with the
1e9f0 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20   same hash */.  
1ea00 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20  struct s_x1node 
1ea10 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76  **from;  /* Prev
1ea20 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78  ious link */.} x
1ea30 31 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65  1node;../* There
1ea40 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73   is only one ins
1ea50 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72  tance of the arr
1ea60 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  ay, which is the
1ea70 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74   following */.st
1ea80 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 31  atic struct s_x1
1ea90 20 2a 78 31 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63   *x1a;../* Alloc
1eaa0 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69  ate a new associ
1eab0 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76  ative array */.v
1eac0 6f 69 64 20 53 74 72 73 61 66 65 5f 69 6e 69 74  oid Strsafe_init
1ead0 28 29 7b 0a 20 20 69 66 28 20 78 31 61 20 29 20  (){.  if( x1a ) 
1eae0 72 65 74 75 72 6e 3b 0a 20 20 78 31 61 20 3d 20  return;.  x1a = 
1eaf0 28 73 74 72 75 63 74 20 73 5f 78 31 2a 29 6d 61  (struct s_x1*)ma
1eb00 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
1eb10 75 63 74 20 73 5f 78 31 29 20 29 3b 0a 20 20 69  uct s_x1) );.  i
1eb20 66 28 20 78 31 61 20 29 7b 0a 20 20 20 20 78 31  f( x1a ){.    x1
1eb30 61 2d 3e 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  a->size = 1024;.
1eb40 20 20 20 20 78 31 61 2d 3e 63 6f 75 6e 74 20 3d      x1a->count =
1eb50 20 30 3b 0a 20 20 20 20 78 31 61 2d 3e 74 62 6c   0;.    x1a->tbl
1eb60 20 3d 20 28 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x1node*)mall
1eb70 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65  oc( .      (size
1eb80 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x1node) + siz
1eb90 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 2a 31 30  eof(x1node*))*10
1eba0 32 34 20 29 3b 0a 20 20 20 20 69 66 28 20 78 31  24 );.    if( x1
1ebb0 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
1ebc0 20 20 20 66 72 65 65 28 78 31 61 29 3b 0a 20 20     free(x1a);.  
1ebd0 20 20 20 20 78 31 61 20 3d 20 30 3b 0a 20 20 20      x1a = 0;.   
1ebe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1ebf0 74 20 69 3b 0a 20 20 20 20 20 20 78 31 61 2d 3e  t i;.      x1a->
1ec00 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26  ht = (x1node**)&
1ec10 28 78 31 61 2d 3e 74 62 6c 5b 31 30 32 34 5d 29  (x1a->tbl[1024])
1ec20 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1ec30 20 69 3c 31 30 32 34 3b 20 69 2b 2b 29 20 78 31   i<1024; i++) x1
1ec40 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  a->ht[i] = 0;.  
1ec50 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73    }.  }.}./* Ins
1ec60 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
1ec70 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e   into the array.
1ec80 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
1ec90 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20   successful..** 
1eca0 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20  Prior data with 
1ecb0 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
1ecc0 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20  NOT overwritten 
1ecd0 2a 2f 0a 69 6e 74 20 53 74 72 73 61 66 65 5f 69  */.int Strsafe_i
1ece0 6e 73 65 72 74 28 64 61 74 61 29 0a 63 68 61 72  nsert(data).char
1ecf0 20 2a 64 61 74 61 3b 0a 7b 0a 20 20 78 31 6e 6f   *data;.{.  x1no
1ed00 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b  de *np;.  int h;
1ed10 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66  .  int ph;..  if
1ed20 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x1a==0 ) retur
1ed30 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72 68  n 0;.  ph = strh
1ed40 61 73 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d  ash(data);.  h =
1ed50 20 70 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65   ph & (x1a->size
1ed60 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d  -1);.  np = x1a-
1ed70 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
1ed80 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73   np ){.    if( s
1ed90 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64  trcmp(np->data,d
1eda0 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ata)==0 ){.     
1edb0 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
1edc0 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
1edd0 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64  ame key is found
1ede0 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61  . */.      /* Fa
1edf0 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77  il because overw
1ee00 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  rite is not allo
1ee10 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ws. */.      ret
1ee20 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1ee30 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
1ee40 20 20 7d 0a 20 20 69 66 28 20 78 31 61 2d 3e 63    }.  if( x1a->c
1ee50 6f 75 6e 74 3e 3d 78 31 61 2d 3e 73 69 7a 65 20  ount>=x1a->size 
1ee60 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74  ){.    /* Need t
1ee70 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20  o make the hash 
1ee80 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a  table bigger */.
1ee90 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a      int i,size;.
1eea0 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 31 20      struct s_x1 
1eeb0 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79  array;.    array
1eec0 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78  .size = size = x
1eed0 31 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20  1a->size*2;.    
1eee0 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 31  array.count = x1
1eef0 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72  a->count;.    ar
1ef00 72 61 79 2e 74 62 6c 20 3d 20 28 78 31 6e 6f 64  ray.tbl = (x1nod
1ef10 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e*)malloc(.     
1ef20 20 28 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29   (sizeof(x1node)
1ef30 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65   + sizeof(x1node
1ef40 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20  *))*size );.    
1ef50 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30  if( array.tbl==0
1ef60 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
1ef70 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c   Fail due to mal
1ef80 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20  loc failure */. 
1ef90 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78     array.ht = (x
1efa0 31 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e  1node**)&(array.
1efb0 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20  tbl[size]);.    
1efc0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
1efd0 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69   i++) array.ht[i
1efe0 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  ] = 0;.    for(i
1eff0 3d 30 3b 20 69 3c 78 31 61 2d 3e 63 6f 75 6e 74  =0; i<x1a->count
1f000 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 31  ; i++){.      x1
1f010 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65  node *oldnp, *ne
1f020 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70  wnp;.      oldnp
1f030 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 69 5d   = &(x1a->tbl[i]
1f040 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74 72  );.      h = str
1f050 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61  hash(oldnp->data
1f060 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20  ) & (size-1);.  
1f070 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72      newnp = &(ar
1f080 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  ray.tbl[i]);.   
1f090 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b     if( array.ht[
1f0a0 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d  h] ) array.ht[h]
1f0b0 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70  ->from = &(newnp
1f0c0 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ->next);.      n
1f0d0 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72  ewnp->next = arr
1f0e0 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20  ay.ht[h];.      
1f0f0 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c  newnp->data = ol
1f100 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20  dnp->data;.     
1f110 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26   newnp->from = &
1f120 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20  (array.ht[h]);. 
1f130 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d       array.ht[h]
1f140 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a   = newnp;.    }.
1f150 20 20 20 20 66 72 65 65 28 78 31 61 2d 3e 74 62      free(x1a->tb
1f160 6c 29 3b 0a 20 20 20 20 2a 78 31 61 20 3d 20 61  l);.    *x1a = a
1f170 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  rray;.  }.  /* I
1f180 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61  nsert the new da
1f190 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26  ta */.  h = ph &
1f1a0 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x1a->size-1);.
1f1b0 20 20 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74 62    np = &(x1a->tb
1f1c0 6c 5b 78 31 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29  l[x1a->count++])
1f1d0 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64  ;.  np->data = d
1f1e0 61 74 61 3b 0a 20 20 69 66 28 20 78 31 61 2d 3e  ata;.  if( x1a->
1f1f0 68 74 5b 68 5d 20 29 20 78 31 61 2d 3e 68 74 5b  ht[h] ) x1a->ht[
1f200 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d  h]->from = &(np-
1f210 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65  >next);.  np->ne
1f220 78 74 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b  xt = x1a->ht[h];
1f230 0a 20 20 78 31 61 2d 3e 68 74 5b 68 5d 20 3d 20  .  x1a->ht[h] = 
1f240 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d  np;.  np->from =
1f250 20 26 28 78 31 61 2d 3e 68 74 5b 68 5d 29 3b 0a   &(x1a->ht[h]);.
1f260 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
1f270 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1f280 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67  er to data assig
1f290 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ned to the given
1f2a0 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55   key.  Return NU
1f2b0 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68  LL.** if no such
1f2c0 20 6b 65 79 2e 20 2a 2f 0a 63 68 61 72 20 2a 53   key. */.char *S
1f2d0 74 72 73 61 66 65 5f 66 69 6e 64 28 6b 65 79 29  trsafe_find(key)
1f2e0 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20  .char *key;.{.  
1f2f0 69 6e 74 20 68 3b 0a 20 20 78 31 6e 6f 64 65 20  int h;.  x1node 
1f300 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d  *np;..  if( x1a=
1f310 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1f320 20 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79   h = strhash(key
1f330 29 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31  ) & (x1a->size-1
1f340 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68  );.  np = x1a->h
1f350 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
1f360 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  p ){.    if( str
1f370 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79  cmp(np->data,key
1f380 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
1f390 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
1f3a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70  .  }.  return np
1f3b0 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b   ? np->data : 0;
1f3c0 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
1f3d0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 28  pointer to the (
1f3e0 74 65 72 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74  terminal or nont
1f3f0 65 72 6d 69 6e 61 6c 29 20 73 79 6d 62 6f 6c 20  erminal) symbol 
1f400 22 78 22 2e 0a 2a 2a 20 43 72 65 61 74 65 20 61  "x"..** Create a
1f410 20 6e 65 77 20 73 79 6d 62 6f 6c 20 69 66 20 74   new symbol if t
1f420 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
1f430 20 74 69 6d 65 20 22 78 22 20 68 61 73 20 62 65   time "x" has be
1f440 65 6e 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75  en seen..*/.stru
1f450 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f  ct symbol *Symbo
1f460 6c 5f 6e 65 77 28 78 29 0a 63 68 61 72 20 2a 78  l_new(x).char *x
1f470 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  ;.{.  struct sym
1f480 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 73 70 20 3d  bol *sp;..  sp =
1f490 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 3b   Symbol_find(x);
1f4a0 0a 20 20 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a  .  if( sp==0 ){.
1f4b0 20 20 20 20 73 70 20 3d 20 28 73 74 72 75 63 74      sp = (struct
1f4c0 20 73 79 6d 62 6f 6c 20 2a 29 63 61 6c 6c 6f 63   symbol *)calloc
1f4d0 28 31 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63  (1, sizeof(struc
1f4e0 74 20 73 79 6d 62 6f 6c 29 20 29 3b 0a 20 20 20  t symbol) );.   
1f4f0 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73 70 29   MemoryCheck(sp)
1f500 3b 0a 20 20 20 20 73 70 2d 3e 6e 61 6d 65 20 3d  ;.    sp->name =
1f510 20 53 74 72 73 61 66 65 28 78 29 3b 0a 20 20 20   Strsafe(x);.   
1f520 20 73 70 2d 3e 74 79 70 65 20 3d 20 69 73 75 70   sp->type = isup
1f530 70 65 72 28 2a 78 29 20 3f 20 54 45 52 4d 49 4e  per(*x) ? TERMIN
1f540 41 4c 20 3a 20 4e 4f 4e 54 45 52 4d 49 4e 41 4c  AL : NONTERMINAL
1f550 3b 0a 20 20 20 20 73 70 2d 3e 72 75 6c 65 20 3d  ;.    sp->rule =
1f560 20 30 3b 0a 20 20 20 20 73 70 2d 3e 66 61 6c 6c   0;.    sp->fall
1f570 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73 70  back = 0;.    sp
1f580 2d 3e 70 72 65 63 20 3d 20 2d 31 3b 0a 20 20 20  ->prec = -1;.   
1f590 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20 55 4e 4b   sp->assoc = UNK
1f5a0 3b 0a 20 20 20 20 73 70 2d 3e 66 69 72 73 74 73  ;.    sp->firsts
1f5b0 65 74 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e  et = 0;.    sp->
1f5c0 6c 61 6d 62 64 61 20 3d 20 4c 45 4d 4f 4e 5f 46  lambda = LEMON_F
1f5d0 41 4c 53 45 3b 0a 20 20 20 20 73 70 2d 3e 64 65  ALSE;.    sp->de
1f5e0 73 74 72 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20  structor = 0;.  
1f5f0 20 20 73 70 2d 3e 64 65 73 74 4c 69 6e 65 6e 6f    sp->destLineno
1f600 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64 61   = 0;.    sp->da
1f610 74 61 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  tatype = 0;.    
1f620 73 70 2d 3e 75 73 65 43 6e 74 20 3d 20 30 3b 0a  sp->useCnt = 0;.
1f630 20 20 20 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72      Symbol_inser
1f640 74 28 73 70 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a  t(sp,sp->name);.
1f650 20 20 7d 0a 20 20 73 70 2d 3e 75 73 65 43 6e 74    }.  sp->useCnt
1f660 2b 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73 70 3b  ++;.  return sp;
1f670 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74  .}../* Compare t
1f680 77 6f 20 73 79 6d 62 6f 6c 73 20 66 6f 72 20 77  wo symbols for w
1f690 6f 72 6b 69 6e 67 20 70 75 72 70 6f 73 65 73 0a  orking purposes.
1f6a0 2a 2a 0a 2a 2a 20 53 79 6d 62 6f 6c 73 20 74 68  **.** Symbols th
1f6b0 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 75 70  at begin with up
1f6c0 70 65 72 20 63 61 73 65 20 6c 65 74 74 65 72 73  per case letters
1f6d0 20 28 74 65 72 6d 69 6e 61 6c 73 20 6f 72 20 74   (terminals or t
1f6e0 6f 6b 65 6e 73 29 0a 2a 2a 20 6d 75 73 74 20 73  okens).** must s
1f6f0 6f 72 74 20 62 65 66 6f 72 65 20 73 79 6d 62 6f  ort before symbo
1f700 6c 73 20 74 68 61 74 20 62 65 67 69 6e 20 77 69  ls that begin wi
1f710 74 68 20 6c 6f 77 65 72 20 63 61 73 65 20 6c 65  th lower case le
1f720 74 74 65 72 73 0a 2a 2a 20 28 6e 6f 6e 2d 74 65  tters.** (non-te
1f730 72 6d 69 6e 61 6c 73 29 2e 20 20 4f 74 68 65 72  rminals).  Other
1f740 20 74 68 61 6e 20 74 68 61 74 2c 20 74 68 65 20   than that, the 
1f750 6f 72 64 65 72 20 64 6f 65 73 20 6e 6f 74 20 6d  order does not m
1f760 61 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  atter..**.** We 
1f770 66 69 6e 64 20 65 78 70 65 72 69 6d 65 6e 74 61  find experimenta
1f780 6c 6c 79 20 74 68 61 74 20 6c 65 61 76 69 6e 67  lly that leaving
1f790 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 69 6e 20   the symbols in 
1f7a0 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 0a 2a  their original.*
1f7b0 2a 20 6f 72 64 65 72 20 28 74 68 65 20 6f 72 64  * order (the ord
1f7c0 65 72 20 74 68 65 79 20 61 70 70 65 61 72 65 64  er they appeared
1f7d0 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20   in the grammar 
1f7e0 66 69 6c 65 29 20 67 69 76 65 73 20 74 68 65 0a  file) gives the.
1f7f0 2a 2a 20 73 6d 61 6c 6c 65 73 74 20 70 61 72 73  ** smallest pars
1f800 65 72 20 74 61 62 6c 65 73 20 69 6e 20 53 51 4c  er tables in SQL
1f810 69 74 65 2e 0a 2a 2f 0a 69 6e 74 20 53 79 6d 62  ite..*/.int Symb
1f820 6f 6c 63 6d 70 70 28 73 74 72 75 63 74 20 73 79  olcmpp(struct sy
1f830 6d 62 6f 6c 20 2a 2a 61 2c 20 73 74 72 75 63 74  mbol **a, struct
1f840 20 73 79 6d 62 6f 6c 20 2a 2a 62 29 7b 0a 20 20   symbol **b){.  
1f850 69 6e 74 20 69 31 20 3d 20 28 2a 2a 61 29 2e 69  int i1 = (**a).i
1f860 6e 64 65 78 20 2b 20 31 30 30 30 30 30 30 30 2a  ndex + 10000000*
1f870 28 28 2a 2a 61 29 2e 6e 61 6d 65 5b 30 5d 3e 27  ((**a).name[0]>'
1f880 5a 27 29 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20  Z');.  int i2 = 
1f890 28 2a 2a 62 29 2e 69 6e 64 65 78 20 2b 20 31 30  (**b).index + 10
1f8a0 30 30 30 30 30 30 2a 28 28 2a 2a 62 29 2e 6e 61  000000*((**b).na
1f8b0 6d 65 5b 30 5d 3e 27 5a 27 29 3b 0a 20 20 72 65  me[0]>'Z');.  re
1f8c0 74 75 72 6e 20 69 31 2d 69 32 3b 0a 7d 0a 0a 2f  turn i1-i2;.}../
1f8d0 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
1f8e0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
1f8f0 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1f900 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61  re for each.** a
1f910 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
1f920 20 6f 66 20 74 79 70 65 20 22 78 32 22 2e 0a 2a   of type "x2"..*
1f930 2f 0a 73 74 72 75 63 74 20 73 5f 78 32 20 7b 0a  /.struct s_x2 {.
1f940 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
1f950 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1f960 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
1f970 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20  able slots. */. 
1f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f990 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75           /*   Mu
1f9a0 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
1f9b0 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20   2 greater than 
1f9c0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
1f9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9e0 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20  /*   equal to 1 
1f9f0 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20  */.  int count; 
1fa00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fa10 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e  Number of curren
1fa20 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64  tly slots filled
1fa30 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
1fa40 32 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20  2node *tbl;  /* 
1fa50 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20  The data stored 
1fa60 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  here */.  struct
1fa70 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 68 74 3b 20   s_x2node **ht; 
1fa80 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66   /* Hash table f
1fa90 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b  or lookups */.};
1faa0 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
1fab0 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
1fac0 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
1fad0 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d   every data elem
1fae0 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73  ent.** in an ass
1faf0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
1fb00 66 20 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a  f type "x2"..*/.
1fb10 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
1fb20 5f 78 32 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75  _x2node {.  stru
1fb30 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b  ct symbol *data;
1fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb50 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
1fb60 0a 20 20 63 68 61 72 20 2a 6b 65 79 3b 20 20 20  .  char *key;   
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb80 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
1fb90 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20  struct s_x2node 
1fba0 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74  *next;   /* Next
1fbb0 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
1fbc0 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73  same hash */.  s
1fbd0 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a  truct s_x2node *
1fbe0 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69  *from;  /* Previ
1fbf0 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 32  ous link */.} x2
1fc00 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  node;../* There 
1fc10 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74  is only one inst
1fc20 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61  ance of the arra
1fc30 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  y, which is the 
1fc40 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61  following */.sta
1fc50 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 32 20  tic struct s_x2 
1fc60 2a 78 32 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61  *x2a;../* Alloca
1fc70 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61  te a new associa
1fc80 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f  tive array */.vo
1fc90 69 64 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 29  id Symbol_init()
1fca0 7b 0a 20 20 69 66 28 20 78 32 61 20 29 20 72 65  {.  if( x2a ) re
1fcb0 74 75 72 6e 3b 0a 20 20 78 32 61 20 3d 20 28 73  turn;.  x2a = (s
1fcc0 74 72 75 63 74 20 73 5f 78 32 2a 29 6d 61 6c 6c  truct s_x2*)mall
1fcd0 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63  oc( sizeof(struc
1fce0 74 20 73 5f 78 32 29 20 29 3b 0a 20 20 69 66 28  t s_x2) );.  if(
1fcf0 20 78 32 61 20 29 7b 0a 20 20 20 20 78 32 61 2d   x2a ){.    x2a-
1fd00 3e 73 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20  >size = 128;.   
1fd10 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b   x2a->count = 0;
1fd20 0a 20 20 20 20 78 32 61 2d 3e 74 62 6c 20 3d 20  .    x2a->tbl = 
1fd30 28 78 32 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x2node*)malloc(
1fd40 20 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28   .      (sizeof(
1fd50 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x2node) + sizeof
1fd60 28 78 32 6e 6f 64 65 2a 29 29 2a 31 32 38 20 29  (x2node*))*128 )
1fd70 3b 0a 20 20 20 20 69 66 28 20 78 32 61 2d 3e 74  ;.    if( x2a->t
1fd80 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  bl==0 ){.      f
1fd90 72 65 65 28 78 32 61 29 3b 0a 20 20 20 20 20 20  ree(x2a);.      
1fda0 78 32 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  x2a = 0;.    }el
1fdb0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
1fdc0 0a 20 20 20 20 20 20 78 32 61 2d 3e 68 74 20 3d  .      x2a->ht =
1fdd0 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28 78 32 61   (x2node**)&(x2a
1fde0 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20  ->tbl[128]);.   
1fdf0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32     for(i=0; i<12
1fe00 38 3b 20 69 2b 2b 29 20 78 32 61 2d 3e 68 74 5b  8; i++) x2a->ht[
1fe10 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
1fe20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20  }.}./* Insert a 
1fe30 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
1fe40 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75  the array.  Retu
1fe50 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65  rn TRUE if succe
1fe60 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20  ssful..** Prior 
1fe70 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61  data with the sa
1fe80 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76  me key is NOT ov
1fe90 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74  erwritten */.int
1fea0 20 53 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 64   Symbol_insert(d
1feb0 61 74 61 2c 6b 65 79 29 0a 73 74 72 75 63 74 20  ata,key).struct 
1fec0 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a 63 68  symbol *data;.ch
1fed0 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20 78 32 6e  ar *key;.{.  x2n
1fee0 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68  ode *np;.  int h
1fef0 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69  ;.  int ph;..  i
1ff00 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75  f( x2a==0 ) retu
1ff10 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73 74 72  rn 0;.  ph = str
1ff20 68 61 73 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d  hash(key);.  h =
1ff30 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65   ph & (x2a->size
1ff40 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d  -1);.  np = x2a-
1ff50 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28  >ht[h];.  while(
1ff60 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73   np ){.    if( s
1ff70 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65  trcmp(np->key,ke
1ff80 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  y)==0 ){.      /
1ff90 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  * An existing en
1ffa0 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
1ffb0 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20  e key is found. 
1ffc0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  */.      /* Fail
1ffd0 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69   because overwri
1ffe0 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73  te is not allows
1fff0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
20000 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 0;.    }.    n
20010 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
20020 7d 0a 20 20 69 66 28 20 78 32 61 2d 3e 63 6f 75  }.  if( x2a->cou
20030 6e 74 3e 3d 78 32 61 2d 3e 73 69 7a 65 20 29 7b  nt>=x2a->size ){
20040 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  .    /* Need to 
20050 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
20060 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20  ble bigger */.  
20070 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20    int i,size;.  
20080 20 20 73 74 72 75 63 74 20 73 5f 78 32 20 61 72    struct s_x2 ar
20090 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73  ray;.    array.s
200a0 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 32 61  ize = size = x2a
200b0 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72  ->size*2;.    ar
200c0 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 32 61 2d  ray.count = x2a-
200d0 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61  >count;.    arra
200e0 79 2e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a  y.tbl = (x2node*
200f0 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28  )malloc(.      (
20100 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b  sizeof(x2node) +
20110 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29   sizeof(x2node*)
20120 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66  )*size );.    if
20130 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29  ( array.tbl==0 )
20140 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46   return 0;  /* F
20150 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f  ail due to mallo
20160 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20  c failure */.   
20170 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 32 6e   array.ht = (x2n
20180 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62  ode**)&(array.tb
20190 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f  l[size]);.    fo
201a0 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69  r(i=0; i<size; i
201b0 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20  ++) array.ht[i] 
201c0 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
201d0 3b 20 69 3c 78 32 61 2d 3e 63 6f 75 6e 74 3b 20  ; i<x2a->count; 
201e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 32 6e 6f  i++){.      x2no
201f0 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e  de *oldnp, *newn
20200 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d  p;.      oldnp =
20210 20 26 28 78 32 61 2d 3e 74 62 6c 5b 69 5d 29 3b   &(x2a->tbl[i]);
20220 0a 20 20 20 20 20 20 68 20 3d 20 73 74 72 68 61  .      h = strha
20230 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26  sh(oldnp->key) &
20240 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20   (size-1);.     
20250 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79   newnp = &(array
20260 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  .tbl[i]);.      
20270 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20  if( array.ht[h] 
20280 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66  ) array.ht[h]->f
20290 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e  rom = &(newnp->n
202a0 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  ext);.      newn
202b0 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e  p->next = array.
202c0 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77  ht[h];.      new
202d0 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d  np->key = oldnp-
202e0 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e  >key;.      newn
202f0 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d  p->data = oldnp-
20300 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77  >data;.      new
20310 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72  np->from = &(arr
20320 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20  ay.ht[h]);.     
20330 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e   array.ht[h] = n
20340 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ewnp;.    }.    
20350 66 72 65 65 28 78 32 61 2d 3e 74 62 6c 29 3b 0a  free(x2a->tbl);.
20360 20 20 20 20 2a 78 32 61 20 3d 20 61 72 72 61 79      *x2a = array
20370 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  ;.  }.  /* Inser
20380 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a  t the new data *
20390 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 32  /.  h = ph & (x2
203a0 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
203b0 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b 78 32   = &(x2a->tbl[x2
203c0 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20  a->count++]);.  
203d0 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20  np->key = key;. 
203e0 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61   np->data = data
203f0 3b 0a 20 20 69 66 28 20 78 32 61 2d 3e 68 74 5b  ;.  if( x2a->ht[
20400 68 5d 20 29 20 78 32 61 2d 3e 68 74 5b 68 5d 2d  h] ) x2a->ht[h]-
20410 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65  >from = &(np->ne
20420 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20  xt);.  np->next 
20430 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x2a->ht[h];.  
20440 78 32 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b  x2a->ht[h] = np;
20450 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  .  np->from = &(
20460 78 32 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72  x2a->ht[h]);.  r
20470 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52  eturn 1;.}../* R
20480 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
20490 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64  to data assigned
204a0 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65   to the given ke
204b0 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a  y.  Return NULL.
204c0 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65  ** if no such ke
204d0 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d  y. */.struct sym
204e0 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64  bol *Symbol_find
204f0 28 6b 65 79 29 0a 63 68 61 72 20 2a 6b 65 79 3b  (key).char *key;
20500 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 32  .{.  int h;.  x2
20510 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28  node *np;..  if(
20520 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x2a==0 ) return
20530 20 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73   0;.  h = strhas
20540 68 28 6b 65 79 29 20 26 20 28 78 32 61 2d 3e 73  h(key) & (x2a->s
20550 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
20560 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  2a->ht[h];.  whi
20570 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
20580 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79  ( strcmp(np->key
20590 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b  ,key)==0 ) break
205a0 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  ;.    np = np->n
205b0 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ext;.  }.  retur
205c0 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20  n np ? np->data 
205d0 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  : 0;.}../* Retur
205e0 6e 20 74 68 65 20 6e 2d 74 68 20 64 61 74 61 2e  n the n-th data.
205f0 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
20600 20 6e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   n is out of ran
20610 67 65 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79  ge. */.struct sy
20620 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 4e 74 68  mbol *Symbol_Nth
20630 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 73  (n).int n;.{.  s
20640 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61  truct symbol *da
20650 74 61 3b 0a 20 20 69 66 28 20 78 32 61 20 26 26  ta;.  if( x2a &&
20660 20 6e 3e 30 20 26 26 20 6e 3c 3d 78 32 61 2d 3e   n>0 && n<=x2a->
20670 63 6f 75 6e 74 20 29 7b 0a 20 20 20 20 64 61 74  count ){.    dat
20680 61 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 6e 2d 31  a = x2a->tbl[n-1
20690 5d 2e 64 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b  ].data;.  }else{
206a0 0a 20 20 20 20 64 61 74 61 20 3d 20 30 3b 0a 20  .    data = 0;. 
206b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 61 74 61   }.  return data
206c0 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74  ;.}../* Return t
206d0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61  he size of the a
206e0 72 72 61 79 20 2a 2f 0a 69 6e 74 20 53 79 6d 62  rray */.int Symb
206f0 6f 6c 5f 63 6f 75 6e 74 28 29 0a 7b 0a 20 20 72  ol_count().{.  r
20700 65 74 75 72 6e 20 78 32 61 20 3f 20 78 32 61 2d  eturn x2a ? x2a-
20710 3e 63 6f 75 6e 74 20 3a 20 30 3b 0a 7d 0a 0a 2f  >count : 0;.}../
20720 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61  * Return an arra
20730 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  y of pointers to
20740 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65   all data in the
20750 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61   table..** The a
20760 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64  rray is obtained
20770 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52   from malloc.  R
20780 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65  eturn NULL if me
20790 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
207a0 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20  ** problems, or 
207b0 69 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  if the array is 
207c0 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74  empty. */.struct
207d0 20 73 79 6d 62 6f 6c 20 2a 2a 53 79 6d 62 6f 6c   symbol **Symbol
207e0 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73  _arrayof().{.  s
207f0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 61  truct symbol **a
20800 72 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c 73 69  rray;.  int i,si
20810 7a 65 3b 0a 20 20 69 66 28 20 78 32 61 3d 3d 30  ze;.  if( x2a==0
20820 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
20830 69 7a 65 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74  ize = x2a->count
20840 3b 0a 20 20 61 72 72 61 79 20 3d 20 28 73 74 72  ;.  array = (str
20850 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 63 61  uct symbol **)ca
20860 6c 6c 6f 63 28 73 69 7a 65 2c 20 73 69 7a 65 6f  lloc(size, sizeo
20870 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  f(struct symbol 
20880 2a 29 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79  *));.  if( array
20890 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
208a0 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72   i<size; i++) ar
208b0 72 61 79 5b 69 5d 20 3d 20 78 32 61 2d 3e 74 62  ray[i] = x2a->tb
208c0 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20  l[i].data;.  }. 
208d0 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d   return array;.}
208e0 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f  ../* Compare two
208f0 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
20900 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70  */.int Configcmp
20910 28 61 2c 62 29 0a 73 74 72 75 63 74 20 63 6f 6e  (a,b).struct con
20920 66 69 67 20 2a 61 3b 0a 73 74 72 75 63 74 20 63  fig *a;.struct c
20930 6f 6e 66 69 67 20 2a 62 3b 0a 7b 0a 20 20 69 6e  onfig *b;.{.  in
20940 74 20 78 3b 0a 20 20 78 20 3d 20 61 2d 3e 72 70  t x;.  x = a->rp
20950 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d  ->index - b->rp-
20960 3e 69 6e 64 65 78 3b 0a 20 20 69 66 28 20 78 3d  >index;.  if( x=
20970 3d 30 20 29 20 78 20 3d 20 61 2d 3e 64 6f 74 20  =0 ) x = a->dot 
20980 2d 20 62 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75  - b->dot;.  retu
20990 72 6e 20 78 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70  rn x;.}../* Comp
209a0 61 72 65 20 74 77 6f 20 73 74 61 74 65 73 20 2a  are two states *
209b0 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 73 74  /.PRIVATE int st
209c0 61 74 65 63 6d 70 28 61 2c 62 29 0a 73 74 72 75  atecmp(a,b).stru
209d0 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 73 74  ct config *a;.st
209e0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 3b 0a  ruct config *b;.
209f0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 66 6f  {.  int rc;.  fo
20a00 72 28 72 63 3d 30 3b 20 72 63 3d 3d 30 20 26 26  r(rc=0; rc==0 &&
20a10 20 61 20 26 26 20 62 3b 20 20 61 3d 61 2d 3e 62   a && b;  a=a->b
20a20 70 2c 20 62 3d 62 2d 3e 62 70 29 7b 0a 20 20 20  p, b=b->bp){.   
20a30 20 72 63 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64   rc = a->rp->ind
20a40 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65  ex - b->rp->inde
20a50 78 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30  x;.    if( rc==0
20a60 20 29 20 72 63 20 3d 20 61 2d 3e 64 6f 74 20 2d   ) rc = a->dot -
20a70 20 62 2d 3e 64 6f 74 3b 0a 20 20 7d 0a 20 20 69   b->dot;.  }.  i
20a80 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
20a90 69 66 28 20 61 20 29 20 72 63 20 3d 20 31 3b 0a  if( a ) rc = 1;.
20aa0 20 20 20 20 69 66 28 20 62 20 29 20 72 63 20 3d      if( b ) rc =
20ab0 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   -1;.  }.  retur
20ac0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68  n rc;.}../* Hash
20ad0 20 61 20 73 74 61 74 65 20 2a 2f 0a 50 52 49 56   a state */.PRIV
20ae0 41 54 45 20 69 6e 74 20 73 74 61 74 65 68 61 73  ATE int statehas
20af0 68 28 61 29 0a 73 74 72 75 63 74 20 63 6f 6e 66  h(a).struct conf
20b00 69 67 20 2a 61 3b 0a 7b 0a 20 20 69 6e 74 20 68  ig *a;.{.  int h
20b10 3d 30 3b 0a 20 20 77 68 69 6c 65 28 20 61 20 29  =0;.  while( a )
20b20 7b 0a 20 20 20 20 68 20 3d 20 68 2a 35 37 31 20  {.    h = h*571 
20b30 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33  + a->rp->index*3
20b40 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 20 20  7 + a->dot;.    
20b50 61 20 3d 20 61 2d 3e 62 70 3b 0a 20 20 7d 0a 20  a = a->bp;.  }. 
20b60 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a   return h;.}../*
20b70 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
20b80 73 74 61 74 65 20 73 74 72 75 63 74 75 72 65 20  state structure 
20b90 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  */.struct state 
20ba0 2a 53 74 61 74 65 5f 6e 65 77 28 29 0a 7b 0a 20  *State_new().{. 
20bb0 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 6e   struct state *n
20bc0 65 77 3b 0a 20 20 6e 65 77 20 3d 20 28 73 74 72  ew;.  new = (str
20bd0 75 63 74 20 73 74 61 74 65 20 2a 29 63 61 6c 6c  uct state *)call
20be0 6f 63 28 31 2c 20 73 69 7a 65 6f 66 28 73 74 72  oc(1, sizeof(str
20bf0 75 63 74 20 73 74 61 74 65 29 20 29 3b 0a 20 20  uct state) );.  
20c00 4d 65 6d 6f 72 79 43 68 65 63 6b 28 6e 65 77 29  MemoryCheck(new)
20c10 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a  ;.  return new;.
20c20 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  }../* There is o
20c30 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
20c40 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
20c50 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a  ucture for each.
20c60 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ** associative a
20c70 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 33  rray of type "x3
20c80 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78  "..*/.struct s_x
20c90 33 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20  3 {.  int size; 
20ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20cb0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   The number of a
20cc0 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20  vailable slots. 
20cd0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
20ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20cf0 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65    Must be a powe
20d00 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74  r of 2 greater t
20d10 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20  han or */.      
20d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d30 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74      /*   equal t
20d40 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75  o 1 */.  int cou
20d50 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
20d60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
20d70 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69  rrently slots fi
20d80 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  lled */.  struct
20d90 20 73 5f 78 33 6e 6f 64 65 20 2a 74 62 6c 3b 20   s_x3node *tbl; 
20da0 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f   /* The data sto
20db0 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  red here */.  st
20dc0 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a  ruct s_x3node **
20dd0 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62  ht;  /* Hash tab
20de0 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a  le for lookups *
20df0 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  /.};../* There i
20e00 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
20e10 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
20e20 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20   for every data 
20e30 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e  element.** in an
20e40 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
20e50 61 79 20 6f 66 20 74 79 70 65 20 22 78 33 22 2e  ay of type "x3".
20e60 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
20e70 63 74 20 73 5f 78 33 6e 6f 64 65 20 7b 0a 20 20  ct s_x3node {.  
20e80 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 64 61  struct state *da
20e90 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
20ea0 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
20eb0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   */.  struct con
20ec0 66 69 67 20 2a 6b 65 79 3b 20 20 20 20 20 20 20  fig *key;       
20ed0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
20ee0 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75  he key */.  stru
20ef0 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 6e 65 78  ct s_x3node *nex
20f00 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74  t;   /* Next ent
20f10 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
20f20 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63   hash */.  struc
20f30 74 20 73 5f 78 33 6e 6f 64 65 20 2a 2a 66 72 6f  t s_x3node **fro
20f40 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20  m;  /* Previous 
20f50 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 33 6e 6f 64 65  link */.} x3node
20f60 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
20f70 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65  nly one instance
20f80 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77   of the array, w
20f90 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c  hich is the foll
20fa0 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20  owing */.static 
20fb0 73 74 72 75 63 74 20 73 5f 78 33 20 2a 78 33 61  struct s_x3 *x3a
20fc0 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  ;../* Allocate a
20fd0 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65   new associative
20fe0 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53   array */.void S
20ff0 74 61 74 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69  tate_init(){.  i
21000 66 28 20 78 33 61 20 29 20 72 65 74 75 72 6e 3b  f( x3a ) return;
21010 0a 20 20 78 33 61 20 3d 20 28 73 74 72 75 63 74  .  x3a = (struct
21020 20 73 5f 78 33 2a 29 6d 61 6c 6c 6f 63 28 20 73   s_x3*)malloc( s
21030 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78  izeof(struct s_x
21040 33 29 20 29 3b 0a 20 20 69 66 28 20 78 33 61 20  3) );.  if( x3a 
21050 29 7b 0a 20 20 20 20 78 33 61 2d 3e 73 69 7a 65  ){.    x3a->size
21060 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 33 61 2d   = 128;.    x3a-
21070 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  >count = 0;.    
21080 78 33 61 2d 3e 74 62 6c 20 3d 20 28 78 33 6e 6f  x3a->tbl = (x3no
21090 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20  de*)malloc( .   
210a0 20 20 20 28 73 69 7a 65 6f 66 28 78 33 6e 6f 64     (sizeof(x3nod
210b0 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 33 6e 6f  e) + sizeof(x3no
210c0 64 65 2a 29 29 2a 31 32 38 20 29 3b 0a 20 20 20  de*))*128 );.   
210d0 20 69 66 28 20 78 33 61 2d 3e 74 62 6c 3d 3d 30   if( x3a->tbl==0
210e0 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78   ){.      free(x
210f0 33 61 29 3b 0a 20 20 20 20 20 20 78 33 61 20 3d  3a);.      x3a =
21100 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
21110 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
21120 20 20 78 33 61 2d 3e 68 74 20 3d 20 28 78 33 6e    x3a->ht = (x3n
21130 6f 64 65 2a 2a 29 26 28 78 33 61 2d 3e 74 62 6c  ode**)&(x3a->tbl
21140 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f  [128]);.      fo
21150 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b  r(i=0; i<128; i+
21160 2b 29 20 78 33 61 2d 3e 68 74 5b 69 5d 20 3d 20  +) x3a->ht[i] = 
21170 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f  0;.    }.  }.}./
21180 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72  * Insert a new r
21190 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61  ecord into the a
211a0 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52  rray.  Return TR
211b0 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  UE if successful
211c0 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20  ..** Prior data 
211d0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
211e0 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69  y is NOT overwri
211f0 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 61 74  tten */.int Stat
21200 65 5f 69 6e 73 65 72 74 28 64 61 74 61 2c 6b 65  e_insert(data,ke
21210 79 29 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  y).struct state 
21220 2a 64 61 74 61 3b 0a 73 74 72 75 63 74 20 63 6f  *data;.struct co
21230 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20 78  nfig *key;.{.  x
21240 33 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74  3node *np;.  int
21250 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20   h;.  int ph;.. 
21260 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65   if( x3a==0 ) re
21270 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73  turn 0;.  ph = s
21280 74 61 74 65 68 61 73 68 28 6b 65 79 29 3b 0a 20  tatehash(key);. 
21290 20 68 20 3d 20 70 68 20 26 20 28 78 33 61 2d 3e   h = ph & (x3a->
212a0 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
212b0 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x3a->ht[h];.  wh
212c0 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
212d0 66 28 20 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e  f( statecmp(np->
212e0 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20  key,key)==0 ){. 
212f0 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
21300 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74  ing entry with t
21310 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66  he same key is f
21320 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  ound. */.      /
21330 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f  * Fail because o
21340 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20  verwrite is not 
21350 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20  allows. */.     
21360 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
21370 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
21380 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 33  xt;.  }.  if( x3
21390 61 2d 3e 63 6f 75 6e 74 3e 3d 78 33 61 2d 3e 73  a->count>=x3a->s
213a0 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ize ){.    /* Ne
213b0 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68  ed to make the h
213c0 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72  ash table bigger
213d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69   */.    int i,si
213e0 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  ze;.    struct s
213f0 5f 78 33 20 61 72 72 61 79 3b 0a 20 20 20 20 61  _x3 array;.    a
21400 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65  rray.size = size
21410 20 3d 20 78 33 61 2d 3e 73 69 7a 65 2a 32 3b 0a   = x3a->size*2;.
21420 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20      array.count 
21430 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x3a->count;.  
21440 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78    array.tbl = (x
21450 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20  3node*)malloc(. 
21460 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 33 6e       (sizeof(x3n
21470 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 33  ode) + sizeof(x3
21480 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a  node*))*size );.
21490 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62      if( array.tb
214a0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
214b0 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f    /* Fail due to
214c0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
214d0 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20  */.    array.ht 
214e0 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28 61 72  = (x3node**)&(ar
214f0 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a  ray.tbl[size]);.
21500 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
21510 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e  ize; i++) array.
21520 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66  ht[i] = 0;.    f
21530 6f 72 28 69 3d 30 3b 20 69 3c 78 33 61 2d 3e 63  or(i=0; i<x3a->c
21540 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ount; i++){.    
21550 20 20 78 33 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c    x3node *oldnp,
21560 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f   *newnp;.      o
21570 6c 64 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62  ldnp = &(x3a->tb
21580 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d  l[i]);.      h =
21590 20 73 74 61 74 65 68 61 73 68 28 6f 6c 64 6e 70   statehash(oldnp
215a0 2d 3e 6b 65 79 29 20 26 20 28 73 69 7a 65 2d 31  ->key) & (size-1
215b0 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d  );.      newnp =
215c0 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29   &(array.tbl[i])
215d0 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61  ;.      if( arra
215e0 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e  y.ht[h] ) array.
215f0 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
21600 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20  newnp->next);.  
21610 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20      newnp->next 
21620 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20  = array.ht[h];. 
21630 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20       newnp->key 
21640 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20  = oldnp->key;.  
21650 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20      newnp->data 
21660 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20  = oldnp->data;. 
21670 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d       newnp->from
21680 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d   = &(array.ht[h]
21690 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68  );.      array.h
216a0 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20  t[h] = newnp;.  
216b0 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 33 61    }.    free(x3a
216c0 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 33 61  ->tbl);.    *x3a
216d0 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20   = array;.  }.  
216e0 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
216f0 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20  w data */.  h = 
21700 70 68 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d  ph & (x3a->size-
21710 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 33 61  1);.  np = &(x3a
21720 2d 3e 74 62 6c 5b 78 33 61 2d 3e 63 6f 75 6e 74  ->tbl[x3a->count
21730 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20  ++]);.  np->key 
21740 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74  = key;.  np->dat
21750 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20  a = data;.  if( 
21760 78 33 61 2d 3e 68 74 5b 68 5d 20 29 20 78 33 61  x3a->ht[h] ) x3a
21770 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  ->ht[h]->from = 
21780 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e  &(np->next);.  n
21790 70 2d 3e 6e 65 78 74 20 3d 20 78 33 61 2d 3e 68  p->next = x3a->h
217a0 74 5b 68 5d 3b 0a 20 20 78 33 61 2d 3e 68 74 5b  t[h];.  x3a->ht[
217b0 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66  h] = np;.  np->f
217c0 72 6f 6d 20 3d 20 26 28 78 33 61 2d 3e 68 74 5b  rom = &(x3a->ht[
217d0 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  h]);.  return 1;
217e0 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
217f0 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
21800 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20  assigned to the 
21810 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75  given key.  Retu
21820 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f  rn NULL.** if no
21830 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74   such key. */.st
21840 72 75 63 74 20 73 74 61 74 65 20 2a 53 74 61 74  ruct state *Stat
21850 65 5f 66 69 6e 64 28 6b 65 79 29 0a 73 74 72 75  e_find(key).stru
21860 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a  ct config *key;.
21870 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 33 6e  {.  int h;.  x3n
21880 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20  ode *np;..  if( 
21890 78 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x3a==0 ) return 
218a0 30 3b 0a 20 20 68 20 3d 20 73 74 61 74 65 68 61  0;.  h = stateha
218b0 73 68 28 6b 65 79 29 20 26 20 28 78 33 61 2d 3e  sh(key) & (x3a->
218c0 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
218d0 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x3a->ht[h];.  wh
218e0 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
218f0 66 28 20 73 74 61 74 65 63 6d 70 28 6e 70 2d 3e  f( statecmp(np->
21900 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72  key,key)==0 ) br
21910 65 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70  eak;.    np = np
21920 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65  ->next;.  }.  re
21930 74 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61  turn np ? np->da
21940 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65  ta : 0;.}../* Re
21950 74 75 72 6e 20 61 6e 20 61 72 72 61 79 20 6f 66  turn an array of
21960 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c   pointers to all
21970 20 64 61 74 61 20 69 6e 20 74 68 65 20 74 61 62   data in the tab
21980 6c 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72 61 79  le..** The array
21990 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
219a0 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72  m malloc.  Retur
219b0 6e 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79  n NULL if memory
219c0 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70   allocation.** p
219d0 72 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74  roblems, or if t
219e0 68 65 20 61 72 72 61 79 20 69 73 20 65 6d 70 74  he array is empt
219f0 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61  y. */.struct sta
21a00 74 65 20 2a 2a 53 74 61 74 65 5f 61 72 72 61 79  te **State_array
21a10 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  of().{.  struct 
21a20 73 74 61 74 65 20 2a 2a 61 72 72 61 79 3b 0a 20  state **array;. 
21a30 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 69   int i,size;.  i
21a40 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74 75  f( x3a==0 ) retu
21a50 72 6e 20 30 3b 0a 20 20 73 69 7a 65 20 3d 20 78  rn 0;.  size = x
21a60 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72  3a->count;.  arr
21a70 61 79 20 3d 20 28 73 74 72 75 63 74 20 73 74 61  ay = (struct sta
21a80 74 65 20 2a 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  te **)malloc( si
21a90 7a 65 6f 66 28 73 74 72 75 63 74 20 73 74 61 74  zeof(struct stat
21aa0 65 20 2a 29 2a 73 69 7a 65 20 29 3b 0a 20 20 69  e *)*size );.  i
21ab0 66 28 20 61 72 72 61 79 20 29 7b 0a 20 20 20 20  f( array ){.    
21ac0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
21ad0 20 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d   i++) array[i] =
21ae0 20 78 33 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74   x3a->tbl[i].dat
21af0 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  a;.  }.  return 
21b00 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 48 61 73  array;.}../* Has
21b10 68 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  h a configuratio
21b20 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74  n */.PRIVATE int
21b30 20 63 6f 6e 66 69 67 68 61 73 68 28 61 29 0a 73   confighash(a).s
21b40 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b  truct config *a;
21b50 0a 7b 0a 20 20 69 6e 74 20 68 3d 30 3b 0a 20 20  .{.  int h=0;.  
21b60 68 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72  h = h*571 + a->r
21b70 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d  p->index*37 + a-
21b80 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 68  >dot;.  return h
21b90 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  ;.}../* There is
21ba0 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
21bb0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
21bc0 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63  tructure for eac
21bd0 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65  h.** associative
21be0 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
21bf0 78 34 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73  x4"..*/.struct s
21c00 5f 78 34 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65  _x4 {.  int size
21c10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21c20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
21c30 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73   available slots
21c40 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
21c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21c60 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f  *   Must be a po
21c70 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65 72  wer of 2 greater
21c80 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20   than or */.    
21c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ca0 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c        /*   equal
21cb0 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63   to 1 */.  int c
21cc0 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  ount;           
21cd0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21ce0 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20  currently slots 
21cf0 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75  filled */.  stru
21d00 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 74 62 6c  ct s_x4node *tbl
21d10 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73  ;  /* The data s
21d20 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20  tored here */.  
21d30 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20  struct s_x4node 
21d40 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74  **ht;  /* Hash t
21d50 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73  able for lookups
21d60 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65   */.};../* There
21d70 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65   is one instance
21d80 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
21d90 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61 74  re for every dat
21da0 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20  a element.** in 
21db0 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  an associative a
21dc0 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 34  rray of type "x4
21dd0 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  "..*/.typedef st
21de0 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 7b 0a  ruct s_x4node {.
21df0 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
21e00 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  *data;          
21e10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
21e20 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ata */.  struct 
21e30 73 5f 78 34 6e 6f 64 65 20 2a 6e 65 78 74 3b 20  s_x4node *next; 
21e40 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
21e50 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68 61  with the same ha
21e60 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  sh */.  struct s
21e70 5f 78 34 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20  _x4node **from; 
21e80 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e   /* Previous lin
21e90 6b 20 2a 2f 0a 7d 20 78 34 6e 6f 64 65 3b 0a 0a  k */.} x4node;..
21ea0 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79  /* There is only
21eb0 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
21ec0 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69 63   the array, whic
21ed0 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  h is the followi
21ee0 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ng */.static str
21ef0 75 63 74 20 73 5f 78 34 20 2a 78 34 61 3b 0a 0a  uct s_x4 *x4a;..
21f00 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  /* Allocate a ne
21f10 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  w associative ar
21f20 72 61 79 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66  ray */.void Conf
21f30 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 29 7b 0a  igtable_init(){.
21f40 20 20 69 66 28 20 78 34 61 20 29 20 72 65 74 75    if( x4a ) retu
21f50 72 6e 3b 0a 20 20 78 34 61 20 3d 20 28 73 74 72  rn;.  x4a = (str
21f60 75 63 74 20 73 5f 78 34 2a 29 6d 61 6c 6c 6f 63  uct s_x4*)malloc
21f70 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
21f80 73 5f 78 34 29 20 29 3b 0a 20 20 69 66 28 20 78  s_x4) );.  if( x
21f90 34 61 20 29 7b 0a 20 20 20 20 78 34 61 2d 3e 73  4a ){.    x4a->s
21fa0 69 7a 65 20 3d 20 36 34 3b 0a 20 20 20 20 78 34  ize = 64;.    x4
21fb0 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  a->count = 0;.  
21fc0 20 20 78 34 61 2d 3e 74 62 6c 20 3d 20 28 78 34    x4a->tbl = (x4
21fd0 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20  node*)malloc( . 
21fe0 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 34 6e       (sizeof(x4n
21ff0 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34  ode) + sizeof(x4
22000 6e 6f 64 65 2a 29 29 2a 36 34 20 29 3b 0a 20 20  node*))*64 );.  
22010 20 20 69 66 28 20 78 34 61 2d 3e 74 62 6c 3d 3d    if( x4a->tbl==
22020 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28  0 ){.      free(
22030 78 34 61 29 3b 0a 20 20 20 20 20 20 78 34 61 20  x4a);.      x4a 
22040 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
22050 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
22060 20 20 20 78 34 61 2d 3e 68 74 20 3d 20 28 78 34     x4a->ht = (x4
22070 6e 6f 64 65 2a 2a 29 26 28 78 34 61 2d 3e 74 62  node**)&(x4a->tb
22080 6c 5b 36 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f  l[64]);.      fo
22090 72 28 69 3d 30 3b 20 69 3c 36 34 3b 20 69 2b 2b  r(i=0; i<64; i++
220a0 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x4a->ht[i] = 0
220b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
220c0 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
220d0 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72  cord into the ar
220e0 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ray.  Return TRU
220f0 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  E if successful.
22100 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77  .** Prior data w
22110 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
22120 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74   is NOT overwrit
22130 74 65 6e 20 2a 2f 0a 69 6e 74 20 43 6f 6e 66 69  ten */.int Confi
22140 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 64 61  gtable_insert(da
22150 74 61 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  ta).struct confi
22160 67 20 2a 64 61 74 61 3b 0a 7b 0a 20 20 78 34 6e  g *data;.{.  x4n
22170 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74 20 68  ode *np;.  int h
22180 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20 20 69  ;.  int ph;..  i
22190 66 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75  f( x4a==0 ) retu
221a0 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 63 6f 6e  rn 0;.  ph = con
221b0 66 69 67 68 61 73 68 28 64 61 74 61 29 3b 0a 20  fighash(data);. 
221c0 20 68 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e   h = ph & (x4a->
221d0 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
221e0 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x4a->ht[h];.  wh
221f0 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
22200 66 28 20 43 6f 6e 66 69 67 63 6d 70 28 6e 70 2d  f( Configcmp(np-
22210 3e 64 61 74 61 2c 64 61 74 61 29 3d 3d 30 20 29  >data,data)==0 )
22220 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  {.      /* An ex
22230 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74  isting entry wit
22240 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69  h the same key i
22250 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20  s found. */.    
22260 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73    /* Fail becaus
22270 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e  e overwrite is n
22280 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20  ot allows. */.  
22290 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
222a0 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d    }.    np = np-
222b0 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28  >next;.  }.  if(
222c0 20 78 34 61 2d 3e 63 6f 75 6e 74 3e 3d 78 34 61   x4a->count>=x4a
222d0 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a  ->size ){.    /*
222e0 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68   Need to make th
222f0 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69 67  e hash table big
22300 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ger */.    int i
22310 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63  ,size;.    struc
22320 74 20 73 5f 78 34 20 61 72 72 61 79 3b 0a 20 20  t s_x4 array;.  
22330 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73    array.size = s
22340 69 7a 65 20 3d 20 78 34 61 2d 3e 73 69 7a 65 2a  ize = x4a->size*
22350 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75  2;.    array.cou
22360 6e 74 20 3d 20 78 34 61 2d 3e 63 6f 75 6e 74 3b  nt = x4a->count;
22370 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d  .    array.tbl =
22380 20 28 78 34 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63   (x4node*)malloc
22390 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28  (.      (sizeof(
223a0 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x4node) + sizeof
223b0 28 78 34 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20  (x4node*))*size 
223c0 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61 79  );.    if( array
223d0 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  .tbl==0 ) return
223e0 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65   0;  /* Fail due
223f0 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75   to malloc failu
22400 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e  re */.    array.
22410 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26  ht = (x4node**)&
22420 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d  (array.tbl[size]
22430 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
22440 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72  i<size; i++) arr
22450 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  ay.ht[i] = 0;.  
22460 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61    for(i=0; i<x4a
22470 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20  ->count; i++){. 
22480 20 20 20 20 20 78 34 6e 6f 64 65 20 2a 6f 6c 64       x4node *old
22490 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20  np, *newnp;.    
224a0 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 34 61 2d    oldnp = &(x4a-
224b0 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >tbl[i]);.      
224c0 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 6f  h = confighash(o
224d0 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26 20 28 73  ldnp->data) & (s
224e0 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65  ize-1);.      ne
224f0 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62  wnp = &(array.tb
22500 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  l[i]);.      if(
22510 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61   array.ht[h] ) a
22520 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  rray.ht[h]->from
22530 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74   = &(newnp->next
22540 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  );.      newnp->
22550 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b  next = array.ht[
22560 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  h];.      newnp-
22570 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64  >data = oldnp->d
22580 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  ata;.      newnp
22590 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79  ->from = &(array
225a0 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61  .ht[h]);.      a
225b0 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77  rray.ht[h] = new
225c0 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72  np;.    }.    fr
225d0 65 65 28 78 34 61 2d 3e 74 62 6c 29 3b 0a 20 20  ee(x4a->tbl);.  
225e0 20 20 2a 78 34 61 20 3d 20 61 72 72 61 79 3b 0a    *x4a = array;.
225f0 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20    }.  /* Insert 
22600 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a  the new data */.
22610 20 20 68 20 3d 20 70 68 20 26 20 28 78 34 61 2d    h = ph & (x4a-
22620 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
22630 20 26 28 78 34 61 2d 3e 74 62 6c 5b 78 34 61 2d   &(x4a->tbl[x4a-
22640 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70  >count++]);.  np
22650 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20  ->data = data;. 
22660 20 69 66 28 20 78 34 61 2d 3e 68 74 5b 68 5d 20   if( x4a->ht[h] 
22670 29 20 78 34 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72  ) x4a->ht[h]->fr
22680 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29  om = &(np->next)
22690 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78  ;.  np->next = x
226a0 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 34 61  4a->ht[h];.  x4a
226b0 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20  ->ht[h] = np;.  
226c0 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 34 61  np->from = &(x4a
226d0 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75  ->ht[h]);.  retu
226e0 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  rn 1;.}../* Retu
226f0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
22700 64 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f  data assigned to
22710 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20   the given key. 
22720 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20   Return NULL.** 
22730 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20  if no such key. 
22740 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  */.struct config
22750 20 2a 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69   *Configtable_fi
22760 6e 64 28 6b 65 79 29 0a 73 74 72 75 63 74 20 63  nd(key).struct c
22770 6f 6e 66 69 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20  onfig *key;.{.  
22780 69 6e 74 20 68 3b 0a 20 20 78 34 6e 6f 64 65 20  int h;.  x4node 
22790 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d  *np;..  if( x4a=
227a0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
227b0 20 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28   h = confighash(
227c0 6b 65 79 29 20 26 20 28 78 34 61 2d 3e 73 69 7a  key) & (x4a->siz
227d0 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61  e-1);.  np = x4a
227e0 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
227f0 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
22800 43 6f 6e 66 69 67 63 6d 70 28 6e 70 2d 3e 64 61  Configcmp(np->da
22810 74 61 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65  ta,key)==0 ) bre
22820 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d  ak;.    np = np-
22830 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  >next;.  }.  ret
22840 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74  urn np ? np->dat
22850 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 6d  a : 0;.}../* Rem
22860 6f 76 65 20 61 6c 6c 20 64 61 74 61 20 66 72 6f  ove all data fro
22870 6d 20 74 68 65 20 74 61 62 6c 65 2e 20 20 50 61  m the table.  Pa
22880 73 73 20 65 61 63 68 20 64 61 74 61 20 74 6f 20  ss each data to 
22890 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 22 66 22  the function "f"
228a0 0a 2a 2a 20 61 73 20 69 74 20 69 73 20 72 65 6d  .** as it is rem
228b0 6f 76 65 64 2e 20 20 28 22 66 22 20 6d 61 79 20  oved.  ("f" may 
228c0 62 65 20 6e 75 6c 6c 20 74 6f 20 61 76 6f 69 64  be null to avoid
228d0 20 74 68 69 73 20 73 74 65 70 2e 29 20 2a 2f 0a   this step.) */.
228e0 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65  void Configtable
228f0 5f 63 6c 65 61 72 28 66 29 0a 69 6e 74 28 2a 66  _clear(f).int(*f
22900 29 28 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e 66  )(/* struct conf
22910 69 67 20 2a 20 2a 2f 29 3b 0a 7b 0a 20 20 69 6e  ig * */);.{.  in
22920 74 20 69 3b 0a 20 20 69 66 28 20 78 34 61 3d 3d  t i;.  if( x4a==
22930 30 20 7c 7c 20 78 34 61 2d 3e 63 6f 75 6e 74 3d  0 || x4a->count=
22940 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
22950 66 28 20 66 20 29 20 66 6f 72 28 69 3d 30 3b 20  f( f ) for(i=0; 
22960 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b  i<x4a->count; i+
22970 2b 29 20 28 2a 66 29 28 78 34 61 2d 3e 74 62 6c  +) (*f)(x4a->tbl
22980 5b 69 5d 2e 64 61 74 61 29 3b 0a 20 20 66 6f 72  [i].data);.  for
22990 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 73 69 7a  (i=0; i<x4a->siz
229a0 65 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b  e; i++) x4a->ht[
229b0 69 5d 20 3d 20 30 3b 0a 20 20 78 34 61 2d 3e 63  i] = 0;.  x4a->c
229c0 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 72 65 74 75  ount = 0;.  retu
229d0 72 6e 3b 0a 7d 0a                                rn;.}.