/ Hex Artifact Content
Login

Artifact 323e54ac86fb2393f9950219224e304620d2fb12:


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 20 20 20  ined(WIN32).#   
01e0: 20 20 20 20 64 65 66 69 6e 65 20 5f 5f 57 49 4e      define __WIN
01f0: 33 32 5f 5f 0a 23 20 20 20 65 6e 64 69 66 0a 23  32__.#   endif.#
0200: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 5f 5f  endif..#ifdef __
0210: 57 49 4e 33 32 5f 5f 0a 23 69 66 64 65 66 20 5f  WIN32__.#ifdef _
0220: 5f 63 70 6c 75 73 70 6c 75 73 0a 65 78 74 65 72  _cplusplus.exter
0230: 6e 20 22 43 22 20 7b 0a 23 65 6e 64 69 66 0a 65  n "C" {.#endif.e
0240: 78 74 65 72 6e 20 69 6e 74 20 61 63 63 65 73 73  xtern int access
0250: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74  (const char *pat
0260: 68 2c 20 69 6e 74 20 6d 6f 64 65 29 3b 0a 23 69  h, int mode);.#i
0270: 66 64 65 66 20 5f 5f 63 70 6c 75 73 70 6c 75 73  fdef __cplusplus
0280: 0a 7d 0a 23 65 6e 64 69 66 0a 23 65 6c 73 65 0a  .}.#endif.#else.
0290: 23 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73 74 64  #include <unistd
02a0: 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 23  .h>.#endif../* #
02b0: 64 65 66 69 6e 65 20 50 52 49 56 41 54 45 20 73  define PRIVATE s
02c0: 74 61 74 69 63 20 2a 2f 0a 23 64 65 66 69 6e 65  tatic */.#define
02d0: 20 50 52 49 56 41 54 45 0a 0a 23 69 66 64 65 66   PRIVATE..#ifdef
02e0: 20 54 45 53 54 0a 23 64 65 66 69 6e 65 20 4d 41   TEST.#define MA
02f0: 58 52 48 53 20 35 20 20 20 20 20 20 20 2f 2a 20  XRHS 5       /* 
0300: 53 65 74 20 6c 6f 77 20 74 6f 20 65 78 65 72 63  Set low to exerc
0310: 69 73 65 20 65 78 63 65 70 74 69 6f 6e 20 63 6f  ise exception co
0320: 64 65 20 2a 2f 0a 23 65 6c 73 65 0a 23 64 65 66  de */.#else.#def
0330: 69 6e 65 20 4d 41 58 52 48 53 20 31 30 30 30 0a  ine MAXRHS 1000.
0340: 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69  #endif..static i
0350: 6e 74 20 73 68 6f 77 50 72 65 63 65 64 65 6e 63  nt showPrecedenc
0360: 65 43 6f 6e 66 6c 69 63 74 20 3d 20 30 3b 0a 73  eConflict = 0;.s
0370: 74 61 74 69 63 20 63 68 61 72 20 2a 6d 73 6f 72  tatic char *msor
0380: 74 28 63 68 61 72 2a 2c 63 68 61 72 2a 2a 2c 69  t(char*,char**,i
0390: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
03a0: 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 3b  *,const char*));
03b0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 72  ../*.** Compiler
03c0: 73 20 61 72 65 20 67 65 74 74 69 6e 67 20 69 6e  s are getting in
03d0: 63 72 65 61 73 69 6e 67 6c 79 20 70 65 64 61 6e  creasingly pedan
03e0: 74 69 63 20 61 62 6f 75 74 20 74 79 70 65 20 63  tic about type c
03f0: 6f 6e 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 61 73  onversions.** as
0400: 20 43 20 65 76 6f 6c 76 65 73 20 65 76 65 72 20   C evolves ever 
0410: 63 6c 6f 73 65 72 20 74 6f 20 41 64 61 2e 2e 2e  closer to Ada...
0420: 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  .  To work aroun
0430: 64 20 74 68 65 20 6c 61 74 65 73 74 20 70 72 6f  d the latest pro
0440: 62 6c 65 6d 73 0a 2a 2a 20 77 65 20 68 61 76 65  blems.** we have
0450: 20 74 6f 20 64 65 66 69 6e 65 20 74 68 65 20 66   to define the f
0460: 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 6e 74  ollowing variant
0470: 20 6f 66 20 73 74 72 6c 65 6e 28 29 2e 0a 2a 2f   of strlen()..*/
0480: 0a 23 64 65 66 69 6e 65 20 6c 65 6d 6f 6e 53 74  .#define lemonSt
0490: 72 6c 65 6e 28 58 29 20 20 20 28 28 69 6e 74 29  rlen(X)   ((int)
04a0: 73 74 72 6c 65 6e 28 58 29 29 0a 0a 2f 2a 20 61  strlen(X))../* a
04b0: 20 66 65 77 20 66 6f 72 77 61 72 64 20 64 65 63   few forward dec
04c0: 6c 61 72 61 74 69 6f 6e 73 2e 2e 2e 20 2a 2f 0a  larations... */.
04d0: 73 74 72 75 63 74 20 72 75 6c 65 3b 0a 73 74 72  struct rule;.str
04e0: 75 63 74 20 6c 65 6d 6f 6e 3b 0a 73 74 72 75 63  uct lemon;.struc
04f0: 74 20 61 63 74 69 6f 6e 3b 0a 0a 73 74 61 74 69  t action;..stati
0500: 63 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  c struct action 
0510: 2a 41 63 74 69 6f 6e 5f 6e 65 77 28 76 6f 69 64  *Action_new(void
0520: 29 3b 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  );.static struct
0530: 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f   action *Action_
0540: 73 6f 72 74 28 73 74 72 75 63 74 20 61 63 74 69  sort(struct acti
0550: 6f 6e 20 2a 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  on *);../*******
0560: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
0570: 65 20 22 62 75 69 6c 64 2e 68 22 20 2a 2a 2a 2a  e "build.h" ****
0580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
05a0: 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75 6c 65 50  /.void FindRuleP
05b0: 72 65 63 65 64 65 6e 63 65 73 28 29 3b 0a 76 6f  recedences();.vo
05c0: 69 64 20 46 69 6e 64 46 69 72 73 74 53 65 74 73  id FindFirstSets
05d0: 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 53 74 61  ();.void FindSta
05e0: 74 65 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64  tes();.void Find
05f0: 4c 69 6e 6b 73 28 29 3b 0a 76 6f 69 64 20 46 69  Links();.void Fi
0600: 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28 29 3b 0a  ndFollowSets();.
0610: 76 6f 69 64 20 46 69 6e 64 41 63 74 69 6f 6e 73  void FindActions
0620: 28 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  ();../********* 
0630: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 63  From the file "c
0640: 6f 6e 66 69 67 6c 69 73 74 2e 68 22 20 2a 2a 2a  onfiglist.h" ***
0650: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
0670: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
0680: 69 6e 69 74 28 76 6f 69 64 29 3b 0a 73 74 72 75  init(void);.stru
0690: 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
06a0: 67 6c 69 73 74 5f 61 64 64 28 73 74 72 75 63 74  glist_add(struct
06b0: 20 72 75 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a 73   rule *, int);.s
06c0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f  truct config *Co
06d0: 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69  nfiglist_addbasi
06e0: 73 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 2c  s(struct rule *,
06f0: 20 69 6e 74 29 3b 0a 76 6f 69 64 20 43 6f 6e 66   int);.void Conf
0700: 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28 73  iglist_closure(s
0710: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a  truct lemon *);.
0720: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
0730: 73 6f 72 74 28 76 6f 69 64 29 3b 0a 76 6f 69 64  sort(void);.void
0740: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74   Configlist_sort
0750: 62 61 73 69 73 28 76 6f 69 64 29 3b 0a 73 74 72  basis(void);.str
0760: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
0770: 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 76 6f  iglist_return(vo
0780: 69 64 29 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66  id);.struct conf
0790: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 62  ig *Configlist_b
07a0: 61 73 69 73 28 76 6f 69 64 29 3b 0a 76 6f 69 64  asis(void);.void
07b0: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65 61 74 28   Configlist_eat(
07c0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29  struct config *)
07d0: 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  ;.void Configlis
07e0: 74 5f 72 65 73 65 74 28 76 6f 69 64 29 3b 0a 0a  t_reset(void);..
07f0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  /********* From 
0800: 74 68 65 20 66 69 6c 65 20 22 65 72 72 6f 72 2e  the file "error.
0810: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
0820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64  **********/.void
0840: 20 45 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20   ErrorMsg(const 
0850: 63 68 61 72 20 2a 2c 20 69 6e 74 2c 63 6f 6e 73  char *, int,cons
0860: 74 20 63 68 61 72 20 2a 2c 20 2e 2e 2e 29 3b 0a  t char *, ...);.
0870: 0a 2f 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ./****** From th
0880: 65 20 66 69 6c 65 20 22 6f 70 74 69 6f 6e 2e 68  e file "option.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 2a 2f 0a 65 6e  ************/.en
08c0: 75 6d 20 6f 70 74 69 6f 6e 5f 74 79 70 65 20 7b  um option_type {
08d0: 20 4f 50 54 5f 46 4c 41 47 3d 31 2c 20 20 4f 50   OPT_FLAG=1,  OP
08e0: 54 5f 49 4e 54 2c 20 20 4f 50 54 5f 44 42 4c 2c  T_INT,  OPT_DBL,
08f0: 20 20 4f 50 54 5f 53 54 52 2c 0a 20 20 20 20 20    OPT_STR,.     
0900: 20 20 20 20 4f 50 54 5f 46 46 4c 41 47 2c 20 4f      OPT_FFLAG, O
0910: 50 54 5f 46 49 4e 54 2c 20 4f 50 54 5f 46 44 42  PT_FINT, OPT_FDB
0920: 4c 2c 20 4f 50 54 5f 46 53 54 52 7d 3b 0a 73 74  L, OPT_FSTR};.st
0930: 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 7b  ruct s_options {
0940: 0a 20 20 65 6e 75 6d 20 6f 70 74 69 6f 6e 5f 74  .  enum option_t
0950: 79 70 65 20 74 79 70 65 3b 0a 20 20 63 6f 6e 73  ype type;.  cons
0960: 74 20 63 68 61 72 20 2a 6c 61 62 65 6c 3b 0a 20  t char *label;. 
0970: 20 63 68 61 72 20 2a 61 72 67 3b 0a 20 20 63 6f   char *arg;.  co
0980: 6e 73 74 20 63 68 61 72 20 2a 6d 65 73 73 61 67  nst char *messag
0990: 65 3b 0a 7d 3b 0a 69 6e 74 20 20 20 20 4f 70 74  e;.};.int    Opt
09a0: 49 6e 69 74 28 63 68 61 72 2a 2a 2c 73 74 72 75  Init(char**,stru
09b0: 63 74 20 73 5f 6f 70 74 69 6f 6e 73 2a 2c 46 49  ct s_options*,FI
09c0: 4c 45 2a 29 3b 0a 69 6e 74 20 20 20 20 4f 70 74  LE*);.int    Opt
09d0: 4e 41 72 67 73 28 76 6f 69 64 29 3b 0a 63 68 61  NArgs(void);.cha
09e0: 72 20 20 2a 4f 70 74 41 72 67 28 69 6e 74 29 3b  r  *OptArg(int);
09f0: 0a 76 6f 69 64 20 20 20 4f 70 74 45 72 72 28 69  .void   OptErr(i
0a00: 6e 74 29 3b 0a 76 6f 69 64 20 20 20 4f 70 74 50  nt);.void   OptP
0a10: 72 69 6e 74 28 76 6f 69 64 29 3b 0a 0a 2f 2a 2a  rint(void);../**
0a20: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
0a30: 66 69 6c 65 20 22 70 61 72 73 65 2e 68 22 20 2a  file "parse.h" *
0a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a60: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 50  ********/.void P
0a70: 61 72 73 65 28 73 74 72 75 63 74 20 6c 65 6d 6f  arse(struct lemo
0a80: 6e 20 2a 6c 65 6d 70 29 3b 0a 0a 2f 2a 2a 2a 2a  n *lemp);../****
0a90: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
0aa0: 69 6c 65 20 22 70 6c 69 6e 6b 2e 68 22 20 2a 2a  ile "plink.h" **
0ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ad0: 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63 74 20 70 6c  *****/.struct pl
0ae0: 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28 76  ink *Plink_new(v
0af0: 6f 69 64 29 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b  oid);.void Plink
0b00: 5f 61 64 64 28 73 74 72 75 63 74 20 70 6c 69 6e  _add(struct plin
0b10: 6b 20 2a 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e  k **, struct con
0b20: 66 69 67 20 2a 29 3b 0a 76 6f 69 64 20 50 6c 69  fig *);.void Pli
0b30: 6e 6b 5f 63 6f 70 79 28 73 74 72 75 63 74 20 70  nk_copy(struct p
0b40: 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75 63 74 20  link **, struct 
0b50: 70 6c 69 6e 6b 20 2a 29 3b 0a 76 6f 69 64 20 50  plink *);.void P
0b60: 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 73 74 72 75  link_delete(stru
0b70: 63 74 20 70 6c 69 6e 6b 20 2a 29 3b 0a 0a 2f 2a  ct plink *);../*
0b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
0b90: 68 65 20 66 69 6c 65 20 22 72 65 70 6f 72 74 2e  he file "report.
0ba0: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
0bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 52  ********/.void R
0bd0: 65 70 72 69 6e 74 28 73 74 72 75 63 74 20 6c 65  eprint(struct le
0be0: 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20 52 65 70  mon *);.void Rep
0bf0: 6f 72 74 4f 75 74 70 75 74 28 73 74 72 75 63 74  ortOutput(struct
0c00: 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20   lemon *);.void 
0c10: 52 65 70 6f 72 74 54 61 62 6c 65 28 73 74 72 75  ReportTable(stru
0c20: 63 74 20 6c 65 6d 6f 6e 20 2a 2c 20 69 6e 74 29  ct lemon *, int)
0c30: 3b 0a 76 6f 69 64 20 52 65 70 6f 72 74 48 65 61  ;.void ReportHea
0c40: 64 65 72 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e  der(struct lemon
0c50: 20 2a 29 3b 0a 76 6f 69 64 20 43 6f 6d 70 72 65   *);.void Compre
0c60: 73 73 54 61 62 6c 65 73 28 73 74 72 75 63 74 20  ssTables(struct 
0c70: 6c 65 6d 6f 6e 20 2a 29 3b 0a 76 6f 69 64 20 52  lemon *);.void R
0c80: 65 73 6f 72 74 53 74 61 74 65 73 28 73 74 72 75  esortStates(stru
0c90: 63 74 20 6c 65 6d 6f 6e 20 2a 29 3b 0a 0a 2f 2a  ct lemon *);../*
0ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
0cb0: 68 65 20 66 69 6c 65 20 22 73 65 74 2e 68 22 20  he file "set.h" 
0cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 20  ********/.void  
0cf0: 53 65 74 53 69 7a 65 28 69 6e 74 29 3b 20 20 20  SetSize(int);   
0d00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
0d10: 20 73 65 74 73 20 77 69 6c 6c 20 62 65 20 6f 66   sets will be of
0d20: 20 73 69 7a 65 20 4e 20 2a 2f 0a 63 68 61 72 20   size N */.char 
0d30: 2a 53 65 74 4e 65 77 28 76 6f 69 64 29 3b 20 20  *SetNew(void);  
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
0d50: 41 20 6e 65 77 20 73 65 74 20 66 6f 72 20 65 6c  A new set for el
0d60: 65 6d 65 6e 74 20 30 2e 2e 4e 20 2a 2f 0a 76 6f  ement 0..N */.vo
0d70: 69 64 20 20 53 65 74 46 72 65 65 28 63 68 61 72  id  SetFree(char
0d80: 2a 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *);             
0d90: 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  /* Deallocate a 
0da0: 73 65 74 20 2a 2f 0a 69 6e 74 20 53 65 74 41 64  set */.int SetAd
0db0: 64 28 63 68 61 72 2a 2c 69 6e 74 29 3b 20 20 20  d(char*,int);   
0dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
0dd0: 65 6c 65 6d 65 6e 74 20 74 6f 20 61 20 73 65 74  element to a set
0de0: 20 2a 2f 0a 69 6e 74 20 53 65 74 55 6e 69 6f 6e   */.int SetUnion
0df0: 28 63 68 61 72 20 2a 2c 63 68 61 72 20 2a 29 3b  (char *,char *);
0e00: 20 20 20 20 2f 2a 20 41 20 3c 2d 20 41 20 55 20      /* A <- A U 
0e10: 42 2c 20 74 68 72 75 20 65 6c 65 6d 65 6e 74 20  B, thru element 
0e20: 4e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 65 74  N */.#define Set
0e30: 46 69 6e 64 28 58 2c 59 29 20 28 58 5b 59 5d 29  Find(X,Y) (X[Y])
0e40: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
0e50: 66 20 59 20 69 73 20 69 6e 20 73 65 74 20 58 20  f Y is in set X 
0e60: 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  */../********** 
0e70: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 73  From the file "s
0e80: 74 72 75 63 74 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  truct.h" *******
0e90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
0eb0: 2f 2a 0a 2a 2a 20 50 72 69 6e 63 69 70 61 6c 20  /*.** Principal 
0ec0: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73 20  data structures 
0ed0: 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61  for the LEMON pa
0ee0: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
0ef0: 2a 2f 0a 0a 74 79 70 65 64 65 66 20 65 6e 75 6d  */..typedef enum
0f00: 20 7b 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3d 30 2c   {LEMON_FALSE=0,
0f10: 20 4c 45 4d 4f 4e 5f 54 52 55 45 7d 20 42 6f 6f   LEMON_TRUE} Boo
0f20: 6c 65 61 6e 3b 0a 0a 2f 2a 20 53 79 6d 62 6f 6c  lean;../* Symbol
0f30: 73 20 28 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64  s (terminals and
0f40: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 29 20 6f   nonterminals) o
0f50: 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 61 72  f the grammar ar
0f60: 65 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 74  e stored.** in t
0f70: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f  he following: */
0f80: 0a 65 6e 75 6d 20 73 79 6d 62 6f 6c 5f 74 79 70  .enum symbol_typ
0f90: 65 20 7b 0a 20 20 54 45 52 4d 49 4e 41 4c 2c 0a  e {.  TERMINAL,.
0fa0: 20 20 4e 4f 4e 54 45 52 4d 49 4e 41 4c 2c 0a 20    NONTERMINAL,. 
0fb0: 20 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 0a 7d   MULTITERMINAL.}
0fc0: 3b 0a 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 7b  ;.enum e_assoc {
0fd0: 0a 20 20 20 20 4c 45 46 54 2c 0a 20 20 20 20 52  .    LEFT,.    R
0fe0: 49 47 48 54 2c 0a 20 20 20 20 4e 4f 4e 45 2c 0a  IGHT,.    NONE,.
0ff0: 20 20 20 20 55 4e 4b 0a 7d 3b 0a 73 74 72 75 63      UNK.};.struc
1000: 74 20 73 79 6d 62 6f 6c 20 7b 0a 20 20 63 6f 6e  t symbol {.  con
1010: 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20  st char *name;  
1020: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
1030: 20 74 68 65 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20   the symbol */. 
1040: 20 69 6e 74 20 69 6e 64 65 78 3b 20 20 20 20 20   int index;     
1050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1060: 65 78 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ex number for th
1070: 69 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 65  is symbol */.  e
1080: 6e 75 6d 20 73 79 6d 62 6f 6c 5f 74 79 70 65 20  num symbol_type 
1090: 74 79 70 65 3b 20 20 20 2f 2a 20 53 79 6d 62 6f  type;   /* Symbo
10a0: 6c 73 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65  ls are all eithe
10b0: 72 20 54 45 52 4d 49 4e 41 4c 53 20 6f 72 20 4e  r TERMINALS or N
10c0: 54 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72  Ts */.  struct r
10d0: 75 6c 65 20 2a 72 75 6c 65 3b 20 20 20 20 20 20  ule *rule;      
10e0: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
10f0: 6f 66 20 72 75 6c 65 73 20 6f 66 20 74 68 69 73  of rules of this
1100: 20 28 69 66 20 61 6e 20 4e 54 29 20 2a 2f 0a 20   (if an NT) */. 
1110: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
1120: 66 61 6c 6c 62 61 63 6b 3b 20 2f 2a 20 66 61 6c  fallback; /* fal
1130: 6c 62 61 63 6b 20 74 6f 6b 65 6e 20 69 6e 20 63  lback token in c
1140: 61 73 65 20 74 68 69 73 20 74 6f 6b 65 6e 20 64  ase this token d
1150: 6f 65 73 6e 27 74 20 70 61 72 73 65 20 2a 2f 0a  oesn't parse */.
1160: 20 20 69 6e 74 20 70 72 65 63 3b 20 20 20 20 20    int prec;     
1170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
1180: 65 63 65 64 65 6e 63 65 20 69 66 20 64 65 66 69  ecedence if defi
1190: 6e 65 64 20 28 2d 31 20 6f 74 68 65 72 77 69 73  ned (-1 otherwis
11a0: 65 29 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61  e) */.  enum e_a
11b0: 73 73 6f 63 20 61 73 73 6f 63 3b 20 20 20 20 20  ssoc assoc;     
11c0: 20 2f 2a 20 41 73 73 6f 63 69 61 74 69 76 69 74   /* Associativit
11d0: 79 20 69 66 20 70 72 65 63 65 64 65 6e 63 65 20  y if precedence 
11e0: 69 73 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20  is defined */.  
11f0: 63 68 61 72 20 2a 66 69 72 73 74 73 65 74 3b 20  char *firstset; 
1200: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1210: 74 2d 73 65 74 20 66 6f 72 20 61 6c 6c 20 72 75  t-set for all ru
1220: 6c 65 73 20 6f 66 20 74 68 69 73 20 73 79 6d 62  les of this symb
1230: 6f 6c 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20  ol */.  Boolean 
1240: 6c 61 6d 62 64 61 3b 20 20 20 20 20 20 20 20 20  lambda;         
1250: 20 2f 2a 20 54 72 75 65 20 69 66 20 4e 54 20 61   /* True if NT a
1260: 6e 64 20 63 61 6e 20 67 65 6e 65 72 61 74 65 20  nd can generate 
1270: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20  an empty string 
1280: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 43 6e 74 3b  */.  int useCnt;
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12a0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
12b0: 20 75 73 65 64 20 2a 2f 0a 20 20 63 68 61 72 20   used */.  char 
12c0: 2a 64 65 73 74 72 75 63 74 6f 72 3b 20 20 20 20  *destructor;    
12d0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 77 68 69 63      /* Code whic
12e0: 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 65  h executes whene
12f0: 76 65 72 20 74 68 69 73 20 73 79 6d 62 6f 6c 20  ver this symbol 
1300: 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  is.             
1310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
1320: 20 70 6f 70 70 65 64 20 66 72 6f 6d 20 74 68 65   popped from the
1330: 20 73 74 61 63 6b 20 64 75 72 69 6e 67 20 65 72   stack during er
1340: 72 6f 72 20 70 72 6f 63 65 73 73 69 6e 67 20 2a  ror processing *
1350: 2f 0a 20 20 69 6e 74 20 64 65 73 74 4c 69 6e 65  /.  int destLine
1360: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no;          /* 
1370: 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  Line number for 
1380: 73 74 61 72 74 20 6f 66 20 64 65 73 74 72 75 63  start of destruc
1390: 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64  tor */.  char *d
13a0: 61 74 61 74 79 70 65 3b 20 20 20 20 20 20 20 20  atatype;        
13b0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 74 79    /* The data ty
13c0: 70 65 20 6f 66 20 69 6e 66 6f 72 6d 61 74 69 6f  pe of informatio
13d0: 6e 20 68 65 6c 64 20 62 79 20 74 68 69 73 0a 20  n held by this. 
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 62 6a            ** obj
1400: 65 63 74 2e 20 4f 6e 6c 79 20 75 73 65 64 20 69  ect. Only used i
1410: 66 20 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49  f type==NONTERMI
1420: 4e 41 4c 20 2a 2f 0a 20 20 69 6e 74 20 64 74 6e  NAL */.  int dtn
1430: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
1440: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 74 79    /* The data ty
1450: 70 65 20 6e 75 6d 62 65 72 2e 20 20 49 6e 20 74  pe number.  In t
1460: 68 65 20 70 61 72 73 65 72 2c 20 74 68 65 20 76  he parser, the v
1470: 61 6c 75 65 0a 20 20 20 20 20 20 20 20 20 20 20  alue.           
1480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1490: 2a 2a 20 73 74 61 63 6b 20 69 73 20 61 20 75 6e  ** stack is a un
14a0: 69 6f 6e 2e 20 20 54 68 65 20 2e 79 79 25 64 20  ion.  The .yy%d 
14b0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 69 73 0a  element of this.
14c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 6e             ** un
14e0: 69 6f 6e 20 69 73 20 74 68 65 20 63 6f 72 72 65  ion is the corre
14f0: 63 74 20 64 61 74 61 20 74 79 70 65 20 66 6f 72  ct data type for
1500: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a   this object */.
1510: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1520: 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 75 73  ng fields are us
1530: 65 64 20 62 79 20 4d 55 4c 54 49 54 45 52 4d 49  ed by MULTITERMI
1540: 4e 41 4c 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69  NALs only */.  i
1550: 6e 74 20 6e 73 75 62 73 79 6d 3b 20 20 20 20 20  nt nsubsym;     
1560: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1570: 72 20 6f 66 20 63 6f 6e 73 74 69 74 75 65 6e 74  r of constituent
1580: 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 20   symbols in the 
1590: 4d 55 4c 54 49 20 2a 2f 0a 20 20 73 74 72 75 63  MULTI */.  struc
15a0: 74 20 73 79 6d 62 6f 6c 20 2a 2a 73 75 62 73 79  t symbol **subsy
15b0: 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20  m;  /* Array of 
15c0: 63 6f 6e 73 74 69 74 75 65 6e 74 20 73 79 6d 62  constituent symb
15d0: 6f 6c 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61  ols */.};../* Ea
15e0: 63 68 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75  ch production ru
15f0: 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61  le in the gramma
1600: 72 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74  r is stored in t
1610: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
1620: 73 74 72 75 63 74 75 72 65 2e 20 20 2a 2f 0a 73  structure.  */.s
1630: 74 72 75 63 74 20 72 75 6c 65 20 7b 0a 20 20 73  truct rule {.  s
1640: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6c 68  truct symbol *lh
1650: 73 3b 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d  s;      /* Left-
1660: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
1670: 20 72 75 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   rule */.  const
1680: 20 63 68 61 72 20 2a 6c 68 73 61 6c 69 61 73 3b   char *lhsalias;
1690: 20 20 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72      /* Alias for
16a0: 20 74 68 65 20 4c 48 53 20 28 4e 55 4c 4c 20 69   the LHS (NULL i
16b0: 66 20 6e 6f 6e 65 29 20 2a 2f 0a 20 20 69 6e 74  f none) */.  int
16c0: 20 6c 68 73 53 74 61 72 74 3b 20 20 20 20 20 20   lhsStart;      
16d0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
16e0: 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
16f0: 69 73 20 74 68 65 20 73 74 61 72 74 20 73 79 6d  is the start sym
1700: 62 6f 6c 20 2a 2f 0a 20 20 69 6e 74 20 72 75 6c  bol */.  int rul
1710: 65 6c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20  eline;          
1720: 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72    /* Line number
1730: 20 66 6f 72 20 74 68 65 20 72 75 6c 65 20 2a 2f   for the rule */
1740: 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20 20 20 20  .  int nrhs;    
1750: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1760: 75 6d 62 65 72 20 6f 66 20 52 48 53 20 73 79 6d  umber of RHS sym
1770: 62 6f 6c 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  bols */.  struct
1780: 20 73 79 6d 62 6f 6c 20 2a 2a 72 68 73 3b 20 20   symbol **rhs;  
1790: 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20 73 79     /* The RHS sy
17a0: 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  mbols */.  const
17b0: 20 63 68 61 72 20 2a 2a 72 68 73 61 6c 69 61 73   char **rhsalias
17c0: 3b 20 20 20 2f 2a 20 41 6e 20 61 6c 69 61 73 20  ;   /* An alias 
17d0: 66 6f 72 20 65 61 63 68 20 52 48 53 20 73 79 6d  for each RHS sym
17e0: 62 6f 6c 20 28 4e 55 4c 4c 20 69 66 20 6e 6f 6e  bol (NULL if non
17f0: 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6c 69 6e 65  e) */.  int line
1800: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1810: 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20   /* Line number 
1820: 61 74 20 77 68 69 63 68 20 63 6f 64 65 20 62 65  at which code be
1830: 67 69 6e 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  gins */.  const 
1840: 63 68 61 72 20 2a 63 6f 64 65 3b 20 20 20 20 20  char *code;     
1850: 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 65     /* The code e
1860: 78 65 63 75 74 65 64 20 77 68 65 6e 20 74 68 69  xecuted when thi
1870: 73 20 72 75 6c 65 20 69 73 20 72 65 64 75 63 65  s rule is reduce
1880: 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79  d */.  struct sy
1890: 6d 62 6f 6c 20 2a 70 72 65 63 73 79 6d 3b 20 20  mbol *precsym;  
18a0: 2f 2a 20 50 72 65 63 65 64 65 6e 63 65 20 73 79  /* Precedence sy
18b0: 6d 62 6f 6c 20 66 6f 72 20 74 68 69 73 20 72 75  mbol for this ru
18c0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 64 65  le */.  int inde
18d0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
18e0: 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6e 75 6d   /* An index num
18f0: 62 65 72 20 66 6f 72 20 74 68 69 73 20 72 75 6c  ber for this rul
1900: 65 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20 63  e */.  Boolean c
1910: 61 6e 52 65 64 75 63 65 3b 20 20 20 20 20 20 20  anReduce;       
1920: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
1930: 72 75 6c 65 20 69 73 20 65 76 65 72 20 72 65 64  rule is ever red
1940: 75 63 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  uced */.  struct
1950: 20 72 75 6c 65 20 2a 6e 65 78 74 6c 68 73 3b 20   rule *nextlhs; 
1960: 20 20 20 2f 2a 20 4e 65 78 74 20 72 75 6c 65 20     /* Next rule 
1970: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 4c 48  with the same LH
1980: 53 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  S */.  struct ru
1990: 6c 65 20 2a 6e 65 78 74 3b 20 20 20 20 20 20 20  le *next;       
19a0: 2f 2a 20 4e 65 78 74 20 72 75 6c 65 20 69 6e 20  /* Next rule in 
19b0: 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20  the global list 
19c0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 20 63 6f 6e 66  */.};../* A conf
19d0: 69 67 75 72 61 74 69 6f 6e 20 69 73 20 61 20 70  iguration is a p
19e0: 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65 20 6f  roduction rule o
19f0: 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 74 6f  f the grammar to
1a00: 67 65 74 68 65 72 20 77 69 74 68 0a 2a 2a 20 61  gether with.** a
1a10: 20 6d 61 72 6b 20 28 64 6f 74 29 20 73 68 6f 77   mark (dot) show
1a20: 69 6e 67 20 68 6f 77 20 6d 75 63 68 20 6f 66 20  ing how much of 
1a30: 74 68 61 74 20 72 75 6c 65 20 68 61 73 20 62 65  that rule has be
1a40: 65 6e 20 70 72 6f 63 65 73 73 65 64 20 73 6f 20  en processed so 
1a50: 66 61 72 2e 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  far..** Configur
1a60: 61 74 69 6f 6e 73 20 61 6c 73 6f 20 63 6f 6e 74  ations also cont
1a70: 61 69 6e 20 61 20 66 6f 6c 6c 6f 77 2d 73 65 74  ain a follow-set
1a80: 20 77 68 69 63 68 20 69 73 20 61 20 6c 69 73 74   which is a list
1a90: 20 6f 66 20 74 65 72 6d 69 6e 61 6c 0a 2a 2a 20   of terminal.** 
1aa0: 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 61 72  symbols which ar
1ab0: 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 69 6d 6d  e allowed to imm
1ac0: 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 20  ediately follow 
1ad0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 72  the end of the r
1ae0: 75 6c 65 2e 0a 2a 2a 20 45 76 65 72 79 20 63 6f  ule..** Every co
1af0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 73 20 72  nfiguration is r
1b00: 65 63 6f 72 64 65 64 20 61 73 20 61 6e 20 69 6e  ecorded as an in
1b10: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
1b20: 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 65 6e 75 6d  llowing: */.enum
1b30: 20 63 66 67 73 74 61 74 75 73 20 7b 0a 20 20 43   cfgstatus {.  C
1b40: 4f 4d 50 4c 45 54 45 2c 0a 20 20 49 4e 43 4f 4d  OMPLETE,.  INCOM
1b50: 50 4c 45 54 45 0a 7d 3b 0a 73 74 72 75 63 74 20  PLETE.};.struct 
1b60: 63 6f 6e 66 69 67 20 7b 0a 20 20 73 74 72 75 63  config {.  struc
1b70: 74 20 72 75 6c 65 20 2a 72 70 3b 20 20 20 20 20  t rule *rp;     
1b80: 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65 20      /* The rule 
1b90: 75 70 6f 6e 20 77 68 69 63 68 20 74 68 65 20 63  upon which the c
1ba0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 73 20  onfiguration is 
1bb0: 62 61 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64  based */.  int d
1bc0: 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ot;             
1bd0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
1be0: 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 63 68 61 72   point */.  char
1bf0: 20 2a 66 77 73 3b 20 20 20 20 20 20 20 20 20 20   *fws;          
1c00: 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d 73       /* Follow-s
1c10: 65 74 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 66  et for this conf
1c20: 69 67 75 72 61 74 69 6f 6e 20 6f 6e 6c 79 20 2a  iguration only *
1c30: 2f 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b  /.  struct plink
1c40: 20 2a 66 70 6c 70 3b 20 20 20 20 20 20 2f 2a 20   *fplp;      /* 
1c50: 46 6f 6c 6c 6f 77 2d 73 65 74 20 66 6f 72 77 61  Follow-set forwa
1c60: 72 64 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  rd propagation l
1c70: 69 6e 6b 73 20 2a 2f 0a 20 20 73 74 72 75 63 74  inks */.  struct
1c80: 20 70 6c 69 6e 6b 20 2a 62 70 6c 70 3b 20 20 20   plink *bplp;   
1c90: 20 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74     /* Follow-set
1ca0: 20 62 61 63 6b 77 61 72 64 73 20 70 72 6f 70 61   backwards propa
1cb0: 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a  gation links */.
1cc0: 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
1cd0: 73 74 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  stp;       /* Po
1ce0: 69 6e 74 65 72 20 74 6f 20 73 74 61 74 65 20 77  inter to state w
1cf0: 68 69 63 68 20 63 6f 6e 74 61 69 6e 73 20 74 68  hich contains th
1d00: 69 73 20 2a 2f 0a 20 20 65 6e 75 6d 20 63 66 67  is */.  enum cfg
1d10: 73 74 61 74 75 73 20 73 74 61 74 75 73 3b 20 20  status status;  
1d20: 20 2f 2a 20 75 73 65 64 20 64 75 72 69 6e 67 20   /* used during 
1d30: 66 6f 6c 6c 6f 77 73 65 74 20 61 6e 64 20 73 68  followset and sh
1d40: 69 66 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e 73  ift computations
1d50: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   */.  struct con
1d60: 66 69 67 20 2a 6e 65 78 74 3b 20 20 20 20 20 2f  fig *next;     /
1d70: 2a 20 4e 65 78 74 20 63 6f 6e 66 69 67 75 72 61  * Next configura
1d80: 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74 61 74  tion in the stat
1d90: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f  e */.  struct co
1da0: 6e 66 69 67 20 2a 62 70 3b 20 20 20 20 20 20 20  nfig *bp;       
1db0: 2f 2a 20 54 68 65 20 6e 65 78 74 20 62 61 73 69  /* The next basi
1dc0: 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  s configuration 
1dd0: 2a 2f 0a 7d 3b 0a 0a 65 6e 75 6d 20 65 5f 61 63  */.};..enum e_ac
1de0: 74 69 6f 6e 20 7b 0a 20 20 53 48 49 46 54 2c 0a  tion {.  SHIFT,.
1df0: 20 20 41 43 43 45 50 54 2c 0a 20 20 52 45 44 55    ACCEPT,.  REDU
1e00: 43 45 2c 0a 20 20 45 52 52 4f 52 2c 0a 20 20 53  CE,.  ERROR,.  S
1e10: 53 43 4f 4e 46 4c 49 43 54 2c 20 20 20 20 20 20  SCONFLICT,      
1e20: 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 68 69          /* A shi
1e30: 66 74 2f 73 68 69 66 74 20 63 6f 6e 66 6c 69 63  ft/shift conflic
1e40: 74 20 2a 2f 0a 20 20 53 52 43 4f 4e 46 4c 49 43  t */.  SRCONFLIC
1e50: 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T,              
1e60: 2f 2a 20 57 61 73 20 61 20 72 65 64 75 63 65 2c  /* Was a reduce,
1e70: 20 62 75 74 20 70 61 72 74 20 6f 66 20 61 20 63   but part of a c
1e80: 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 52 52 43  onflict */.  RRC
1e90: 4f 4e 46 4c 49 43 54 2c 20 20 20 20 20 20 20 20  ONFLICT,        
1ea0: 20 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20 72        /* Was a r
1eb0: 65 64 75 63 65 2c 20 62 75 74 20 70 61 72 74 20  educe, but part 
1ec0: 6f 66 20 61 20 63 6f 6e 66 6c 69 63 74 20 2a 2f  of a conflict */
1ed0: 0a 20 20 53 48 5f 52 45 53 4f 4c 56 45 44 2c 20  .  SH_RESOLVED, 
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1ef0: 61 73 20 61 20 73 68 69 66 74 2e 20 20 50 72 65  as a shift.  Pre
1f00: 63 65 64 65 6e 63 65 20 72 65 73 6f 6c 76 65 64  cedence resolved
1f10: 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 52   conflict */.  R
1f20: 44 5f 52 45 53 4f 4c 56 45 44 2c 20 20 20 20 20  D_RESOLVED,     
1f30: 20 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20 72          /* Was r
1f40: 65 64 75 63 65 2e 20 20 50 72 65 63 65 64 65 6e  educe.  Preceden
1f50: 63 65 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66  ce resolved conf
1f60: 6c 69 63 74 20 2a 2f 0a 20 20 4e 4f 54 5f 55 53  lict */.  NOT_US
1f70: 45 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ED              
1f80: 20 20 20 2f 2a 20 44 65 6c 65 74 65 64 20 62 79     /* Deleted by
1f90: 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 2a 2f 0a   compression */.
1fa0: 7d 3b 0a 0a 2f 2a 20 45 76 65 72 79 20 73 68 69  };../* Every shi
1fb0: 66 74 20 6f 72 20 72 65 64 75 63 65 20 6f 70 65  ft or reduce ope
1fc0: 72 61 74 69 6f 6e 20 69 73 20 73 74 6f 72 65 64  ration is stored
1fd0: 20 61 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 66   as one of the f
1fe0: 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 72 75  ollowing */.stru
1ff0: 63 74 20 61 63 74 69 6f 6e 20 7b 0a 20 20 73 74  ct action {.  st
2000: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
2010: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
2020: 6f 6b 2d 61 68 65 61 64 20 73 79 6d 62 6f 6c 20  ok-ahead symbol 
2030: 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 63 74 69  */.  enum e_acti
2040: 6f 6e 20 74 79 70 65 3b 0a 20 20 75 6e 69 6f 6e  on type;.  union
2050: 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74   {.    struct st
2060: 61 74 65 20 2a 73 74 70 3b 20 20 20 20 20 2f 2a  ate *stp;     /*
2070: 20 54 68 65 20 6e 65 77 20 73 74 61 74 65 2c 20   The new state, 
2080: 69 66 20 61 20 73 68 69 66 74 20 2a 2f 0a 20 20  if a shift */.  
2090: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
20a0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
20b0: 72 75 6c 65 2c 20 69 66 20 61 20 72 65 64 75 63  rule, if a reduc
20c0: 65 20 2a 2f 0a 20 20 7d 20 78 3b 0a 20 20 73 74  e */.  } x;.  st
20d0: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 78  ruct action *nex
20e0: 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61  t;     /* Next a
20f0: 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 73  ction for this s
2100: 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  tate */.  struct
2110: 20 61 63 74 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65   action *collide
2120: 3b 20 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f  ;  /* Next actio
2130: 6e 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  n with the same 
2140: 68 61 73 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45  hash */.};../* E
2150: 61 63 68 20 73 74 61 74 65 20 6f 66 20 74 68 65  ach state of the
2160: 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65   generated parse
2170: 72 27 73 20 66 69 6e 69 74 65 20 73 74 61 74 65  r's finite state
2180: 20 6d 61 63 68 69 6e 65 0a 2a 2a 20 69 73 20 65   machine.** is e
2190: 6e 63 6f 64 65 64 20 61 73 20 61 6e 20 69 6e 73  ncoded as an ins
21a0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
21b0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
21c0: 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74  . */.struct stat
21d0: 65 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  e {.  struct con
21e0: 66 69 67 20 2a 62 70 3b 20 20 20 20 20 20 20 2f  fig *bp;       /
21f0: 2a 20 54 68 65 20 62 61 73 69 73 20 63 6f 6e 66  * The basis conf
2200: 69 67 75 72 61 74 69 6f 6e 73 20 66 6f 72 20 74  igurations for t
2210: 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73  his state */.  s
2220: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
2230: 70 3b 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63  p;      /* All c
2240: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 69 6e  onfigurations in
2250: 20 74 68 69 73 20 73 65 74 20 2a 2f 0a 20 20 69   this set */.  i
2260: 6e 74 20 73 74 61 74 65 6e 75 6d 3b 20 20 20 20  nt statenum;    
2270: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 71 75 65          /* Seque
2280: 6e 74 69 61 6c 20 6e 75 6d 62 65 72 20 66 6f 72  ntial number for
2290: 20 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20   this state */. 
22a0: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
22b0: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72  ap;       /* Arr
22c0: 61 79 20 6f 66 20 61 63 74 69 6f 6e 73 20 66 6f  ay of actions fo
22d0: 72 20 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a  r this state */.
22e0: 20 20 69 6e 74 20 6e 54 6b 6e 41 63 74 2c 20 6e    int nTknAct, n
22f0: 4e 74 41 63 74 3b 20 20 20 20 20 2f 2a 20 4e 75  NtAct;     /* Nu
2300: 6d 62 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20  mber of actions 
2310: 6f 6e 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64  on terminals and
2320: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 2a 2f   nonterminals */
2330: 0a 20 20 69 6e 74 20 69 54 6b 6e 4f 66 73 74 2c  .  int iTknOfst,
2340: 20 69 4e 74 4f 66 73 74 3b 20 20 20 2f 2a 20 79   iNtOfst;   /* y
2350: 79 5f 61 63 74 69 6f 6e 5b 5d 20 6f 66 66 73 65  y_action[] offse
2360: 74 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c 73 20  t for terminals 
2370: 61 6e 64 20 6e 6f 6e 74 65 72 6d 73 20 2a 2f 0a  and nonterms */.
2380: 20 20 69 6e 74 20 69 44 66 6c 74 3b 20 20 20 20    int iDflt;    
2390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
23a0: 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 2a 2f 0a  fault action */.
23b0: 7d 3b 0a 23 64 65 66 69 6e 65 20 4e 4f 5f 4f 46  };.#define NO_OF
23c0: 46 53 45 54 20 28 2d 32 31 34 37 34 38 33 36 34  FSET (-214748364
23d0: 37 29 0a 0a 2f 2a 20 41 20 66 6f 6c 6c 6f 77 73  7)../* A follows
23e0: 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  et propagation l
23f0: 69 6e 6b 20 69 6e 64 69 63 61 74 65 73 20 74 68  ink indicates th
2400: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
2410: 6f 66 20 6f 6e 65 0a 2a 2a 20 63 6f 6e 66 69 67  of one.** config
2420: 75 72 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77 73 65  uration followse
2430: 74 20 73 68 6f 75 6c 64 20 62 65 20 70 72 6f 70  t should be prop
2440: 61 67 61 74 65 64 20 74 6f 20 61 6e 6f 74 68 65  agated to anothe
2450: 72 20 77 68 65 6e 65 76 65 72 0a 2a 2a 20 74 68  r whenever.** th
2460: 65 20 66 69 72 73 74 20 63 68 61 6e 67 65 73 2e  e first changes.
2470: 20 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b   */.struct plink
2480: 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66   {.  struct conf
2490: 69 67 20 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a  ig *cfp;      /*
24a0: 20 54 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   The configurati
24b0: 6f 6e 20 74 6f 20 77 68 69 63 68 20 6c 69 6e 6b  on to which link
24c0: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70  ed */.  struct p
24d0: 6c 69 6e 6b 20 2a 6e 65 78 74 3b 20 20 20 20 20  link *next;     
24e0: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 72 6f   /* The next pro
24f0: 70 61 67 61 74 65 20 6c 69 6e 6b 20 2a 2f 0a 7d  pagate link */.}
2500: 3b 0a 0a 2f 2a 20 54 68 65 20 73 74 61 74 65 20  ;../* The state 
2510: 76 65 63 74 6f 72 20 66 6f 72 20 74 68 65 20 65  vector for the e
2520: 6e 74 69 72 65 20 70 61 72 73 65 72 20 67 65 6e  ntire parser gen
2530: 65 72 61 74 6f 72 20 69 73 20 72 65 63 6f 72 64  erator is record
2540: 65 64 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73  ed as.** follows
2550: 2e 20 20 28 4c 45 4d 4f 4e 20 75 73 65 73 20 6e  .  (LEMON uses n
2560: 6f 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  o global variabl
2570: 65 73 20 61 6e 64 20 6d 61 6b 65 73 20 6c 69 74  es and makes lit
2580: 74 6c 65 20 75 73 65 20 6f 66 0a 2a 2a 20 73 74  tle use of.** st
2590: 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 2e 20  atic variables. 
25a0: 20 46 69 65 6c 64 73 20 69 6e 20 74 68 65 20 66   Fields in the f
25b0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
25c0: 72 65 20 63 61 6e 20 62 65 20 74 68 6f 75 67 68  re can be though
25d0: 74 0a 2a 2a 20 6f 66 20 61 73 20 62 65 67 69 6e  t.** of as begin
25e0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
25f0: 73 20 69 6e 20 74 68 65 20 70 72 6f 67 72 61 6d  s in the program
2600: 2e 29 20 2a 2f 0a 73 74 72 75 63 74 20 6c 65 6d  .) */.struct lem
2610: 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74  on {.  struct st
2620: 61 74 65 20 2a 2a 73 6f 72 74 65 64 3b 20 20 20  ate **sorted;   
2630: 2f 2a 20 54 61 62 6c 65 20 6f 66 20 73 74 61 74  /* Table of stat
2640: 65 73 20 73 6f 72 74 65 64 20 62 79 20 73 74 61  es sorted by sta
2650: 74 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  te number */.  s
2660: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 75 6c 65  truct rule *rule
2670: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
2680: 6f 66 20 61 6c 6c 20 72 75 6c 65 73 20 2a 2f 0a  of all rules */.
2690: 20 20 69 6e 74 20 6e 73 74 61 74 65 3b 20 20 20    int nstate;   
26a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
26b0: 6d 62 65 72 20 6f 66 20 73 74 61 74 65 73 20 2a  mber of states *
26c0: 2f 0a 20 20 69 6e 74 20 6e 72 75 6c 65 3b 20 20  /.  int nrule;  
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26e0: 4e 75 6d 62 65 72 20 6f 66 20 72 75 6c 65 73 20  Number of rules 
26f0: 2a 2f 0a 20 20 69 6e 74 20 6e 73 79 6d 62 6f 6c  */.  int nsymbol
2700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2710: 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 69   Number of termi
2720: 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69  nal and nontermi
2730: 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  nal symbols */. 
2740: 20 69 6e 74 20 6e 74 65 72 6d 69 6e 61 6c 3b 20   int nterminal; 
2750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2760: 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20  ber of terminal 
2770: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 73 74 72  symbols */.  str
2780: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 73 79 6d  uct symbol **sym
2790: 62 6f 6c 73 3b 20 2f 2a 20 53 6f 72 74 65 64 20  bols; /* Sorted 
27a0: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
27b0: 73 20 74 6f 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  s to symbols */.
27c0: 20 20 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20    int errorcnt; 
27d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
27e0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 2a  mber of errors *
27f0: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
2800: 6c 20 2a 65 72 72 73 79 6d 3b 20 20 20 2f 2a 20  l *errsym;   /* 
2810: 54 68 65 20 65 72 72 6f 72 20 73 79 6d 62 6f 6c  The error symbol
2820: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
2830: 62 6f 6c 20 2a 77 69 6c 64 63 61 72 64 3b 20 2f  bol *wildcard; /
2840: 2a 20 54 6f 6b 65 6e 20 74 68 61 74 20 6d 61 74  * Token that mat
2850: 63 68 65 73 20 61 6e 79 74 68 69 6e 67 20 2a 2f  ches anything */
2860: 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20  .  char *name;  
2870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2880: 61 6d 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ame of the gener
2890: 61 74 65 64 20 70 61 72 73 65 72 20 2a 2f 0a 20  ated parser */. 
28a0: 20 63 68 61 72 20 2a 61 72 67 3b 20 20 20 20 20   char *arg;     
28b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63            /* Dec
28c0: 6c 61 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  laration of the 
28d0: 33 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  3th argument to 
28e0: 70 61 72 73 65 72 20 2a 2f 0a 20 20 63 68 61 72  parser */.  char
28f0: 20 2a 74 6f 6b 65 6e 74 79 70 65 3b 20 20 20 20   *tokentype;    
2900: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
2910: 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
2920: 20 69 6e 20 74 68 65 20 70 61 72 73 65 72 20 73   in the parser s
2930: 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tack */.  char *
2940: 76 61 72 74 79 70 65 3b 20 20 20 20 20 20 20 20  vartype;        
2950: 20 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c     /* The defaul
2960: 74 20 74 79 70 65 20 6f 66 20 6e 6f 6e 2d 74 65  t type of non-te
2970: 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a  rminal symbols *
2980: 2f 0a 20 20 63 68 61 72 20 2a 73 74 61 72 74 3b  /.  char *start;
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29a0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 74 61 72  Name of the star
29b0: 74 20 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68 65  t symbol for the
29c0: 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 63 68   grammar */.  ch
29d0: 61 72 20 2a 73 74 61 63 6b 73 69 7a 65 3b 20 20  ar *stacksize;  
29e0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
29f0: 66 20 74 68 65 20 70 61 72 73 65 72 20 73 74 61  f the parser sta
2a00: 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20 2a 69 6e  ck */.  char *in
2a10: 63 6c 75 64 65 3b 20 20 20 20 20 20 20 20 20 20  clude;          
2a20: 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70 75 74 20   /* Code to put 
2a30: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
2a40: 74 68 65 20 43 20 66 69 6c 65 20 2a 2f 0a 20 20  the C file */.  
2a50: 63 68 61 72 20 2a 65 72 72 6f 72 3b 20 20 20 20  char *error;    
2a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65           /* Code
2a70: 20 74 6f 20 65 78 65 63 75 74 65 20 77 68 65 6e   to execute when
2a80: 20 61 6e 20 65 72 72 6f 72 20 69 73 20 73 65 65   an error is see
2a90: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 76 65  n */.  char *ove
2aa0: 72 66 6c 6f 77 3b 20 20 20 20 20 20 20 20 20 20  rflow;          
2ab0: 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75  /* Code to execu
2ac0: 74 65 20 6f 6e 20 61 20 73 74 61 63 6b 20 6f 76  te on a stack ov
2ad0: 65 72 66 6c 6f 77 20 2a 2f 0a 20 20 63 68 61 72  erflow */.  char
2ae0: 20 2a 66 61 69 6c 75 72 65 3b 20 20 20 20 20 20   *failure;      
2af0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20       /* Code to 
2b00: 65 78 65 63 75 74 65 20 6f 6e 20 70 61 72 73 65  execute on parse
2b10: 72 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 63  r failure */.  c
2b20: 68 61 72 20 2a 61 63 63 65 70 74 3b 20 20 20 20  har *accept;    
2b30: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
2b40: 74 6f 20 65 78 65 63 75 74 65 20 77 68 65 6e 20  to execute when 
2b50: 74 68 65 20 70 61 72 73 65 72 20 65 78 63 65 70  the parser excep
2b60: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 65 78  ts */.  char *ex
2b70: 74 72 61 63 6f 64 65 3b 20 20 20 20 20 20 20 20  tracode;        
2b80: 20 2f 2a 20 43 6f 64 65 20 61 70 70 65 6e 64 65   /* Code appende
2b90: 64 20 74 6f 20 74 68 65 20 67 65 6e 65 72 61 74  d to the generat
2ba0: 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ed file */.  cha
2bb0: 72 20 2a 74 6f 6b 65 6e 64 65 73 74 3b 20 20 20  r *tokendest;   
2bc0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f        /* Code to
2bd0: 20 65 78 65 63 75 74 65 20 74 6f 20 64 65 73 74   execute to dest
2be0: 72 6f 79 20 74 6f 6b 65 6e 20 64 61 74 61 20 2a  roy token data *
2bf0: 2f 0a 20 20 63 68 61 72 20 2a 76 61 72 64 65 73  /.  char *vardes
2c00: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
2c10: 43 6f 64 65 20 66 6f 72 20 74 68 65 20 64 65 66  Code for the def
2c20: 61 75 6c 74 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61  ault non-termina
2c30: 6c 20 64 65 73 74 72 75 63 74 6f 72 20 2a 2f 0a  l destructor */.
2c40: 20 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65    char *filename
2c50: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  ;          /* Na
2c60: 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  me of the input 
2c70: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2c80: 6f 75 74 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  outname;        
2c90: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
2ca0: 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74  e current output
2cb0: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
2cc0: 2a 74 6f 6b 65 6e 70 72 65 66 69 78 3b 20 20 20  *tokenprefix;   
2cd0: 20 20 20 20 2f 2a 20 41 20 70 72 65 66 69 78 20      /* A prefix 
2ce0: 61 64 64 65 64 20 74 6f 20 74 6f 6b 65 6e 20 6e  added to token n
2cf0: 61 6d 65 73 20 69 6e 20 74 68 65 20 2e 68 20 66  ames in the .h f
2d00: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 63 6f  ile */.  int nco
2d10: 6e 66 6c 69 63 74 3b 20 20 20 20 20 20 20 20 20  nflict;         
2d20: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
2d30: 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63 74 73  arsing conflicts
2d40: 20 2a 2f 0a 20 20 69 6e 74 20 74 61 62 6c 65 73   */.  int tables
2d50: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ize;           /
2d60: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61  * Size of the pa
2d70: 72 73 65 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  rse tables */.  
2d80: 69 6e 74 20 62 61 73 69 73 66 6c 61 67 3b 20 20  int basisflag;  
2d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 6e           /* Prin
2da0: 74 20 6f 6e 6c 79 20 62 61 73 69 73 20 63 6f 6e  t only basis con
2db0: 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 20  figurations */. 
2dc0: 20 69 6e 74 20 68 61 73 5f 66 61 6c 6c 62 61 63   int has_fallbac
2dd0: 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  k;        /* Tru
2de0: 65 20 69 66 20 61 6e 79 20 25 66 61 6c 6c 62 61  e if any %fallba
2df0: 63 6b 20 69 73 20 73 65 65 6e 20 69 6e 20 74 68  ck is seen in th
2e00: 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 69  e grammar */.  i
2e10: 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  nt nolinenosflag
2e20: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
2e30: 69 66 20 23 6c 69 6e 65 20 73 74 61 74 65 6d 65  if #line stateme
2e40: 6e 74 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  nts should not b
2e50: 65 20 70 72 69 6e 74 65 64 20 2a 2f 0a 20 20 63  e printed */.  c
2e60: 68 61 72 20 2a 61 72 67 76 30 3b 20 20 20 20 20  har *argv0;     
2e70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2e80: 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 2a  of the program *
2e90: 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 4d 65  /.};..#define Me
2ea0: 6d 6f 72 79 43 68 65 63 6b 28 58 29 20 69 66 28  moryCheck(X) if(
2eb0: 28 58 29 3d 3d 30 29 7b 20 5c 0a 20 20 65 78 74  (X)==0){ \.  ext
2ec0: 65 72 6e 20 76 6f 69 64 20 6d 65 6d 6f 72 79 5f  ern void memory_
2ed0: 65 72 72 6f 72 28 29 3b 20 5c 0a 20 20 6d 65 6d  error(); \.  mem
2ee0: 6f 72 79 5f 65 72 72 6f 72 28 29 3b 20 5c 0a 7d  ory_error(); \.}
2ef0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
2f00: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
2f10: 65 20 22 74 61 62 6c 65 2e 68 22 20 2a 2a 2a 2a  e "table.h" ****
2f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
2f40: 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69 6e  *.** All code in
2f50: 20 74 68 69 73 20 66 69 6c 65 20 68 61 73 20 62   this file has b
2f60: 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  een automaticall
2f70: 79 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20 66  y generated.** f
2f80: 72 6f 6d 20 61 20 73 70 65 63 69 66 69 63 61 74  rom a specificat
2f90: 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  ion in the file.
2fa0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
2fb0: 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79 20  "table.q".** by 
2fc0: 74 68 65 20 61 73 73 6f 63 69 61 74 69 76 65 20  the associative 
2fd0: 61 72 72 61 79 20 63 6f 64 65 20 62 75 69 6c 64  array code build
2fe0: 69 6e 67 20 70 72 6f 67 72 61 6d 20 22 61 61 67  ing program "aag
2ff0: 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65  en"..** Do not e
3000: 64 69 74 20 74 68 69 73 20 66 69 6c 65 21 20 20  dit this file!  
3010: 49 6e 73 74 65 61 64 2c 20 65 64 69 74 20 74 68  Instead, edit th
3020: 65 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 0a  e specification.
3030: 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 72 65  ** file, then re
3040: 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a  run aagen..*/./*
3050: 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 6f  .** Code for pro
3060: 63 65 73 73 69 6e 67 20 74 61 62 6c 65 73 20 69  cessing tables i
3070: 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
3080: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
3090: 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 66 6f 72  ./* Routines for
30a0: 20 68 61 6e 64 6c 69 6e 67 20 61 20 73 74 72 69   handling a stri
30b0: 6e 67 73 20 2a 2f 0a 0a 63 6f 6e 73 74 20 63 68  ngs */..const ch
30c0: 61 72 20 2a 53 74 72 73 61 66 65 28 63 6f 6e 73  ar *Strsafe(cons
30d0: 74 20 63 68 61 72 20 2a 29 3b 0a 0a 76 6f 69 64  t char *);..void
30e0: 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28 76 6f   Strsafe_init(vo
30f0: 69 64 29 3b 0a 69 6e 74 20 53 74 72 73 61 66 65  id);.int Strsafe
3100: 5f 69 6e 73 65 72 74 28 63 6f 6e 73 74 20 63 68  _insert(const ch
3110: 61 72 20 2a 29 3b 0a 63 6f 6e 73 74 20 63 68 61  ar *);.const cha
3120: 72 20 2a 53 74 72 73 61 66 65 5f 66 69 6e 64 28  r *Strsafe_find(
3130: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a  const char *);..
3140: 2f 2a 20 52 6f 75 74 69 6e 65 73 20 66 6f 72 20  /* Routines for 
3150: 68 61 6e 64 6c 69 6e 67 20 73 79 6d 62 6f 6c 73  handling symbols
3160: 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20   of the grammar 
3170: 2a 2f 0a 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  */..struct symbo
3180: 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28 63 6f  l *Symbol_new(co
3190: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 69 6e 74  nst char *);.int
31a0: 20 53 79 6d 62 6f 6c 63 6d 70 70 28 63 6f 6e 73   Symbolcmpp(cons
31b0: 74 20 76 6f 69 64 20 2a 2c 20 63 6f 6e 73 74 20  t void *, const 
31c0: 76 6f 69 64 20 2a 29 3b 0a 76 6f 69 64 20 53 79  void *);.void Sy
31d0: 6d 62 6f 6c 5f 69 6e 69 74 28 76 6f 69 64 29 3b  mbol_init(void);
31e0: 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69 6e 73 65  .int Symbol_inse
31f0: 72 74 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  rt(struct symbol
3200: 20 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   *, const char *
3210: 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  );.struct symbol
3220: 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 63 6f   *Symbol_find(co
3230: 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 73 74 72  nst char *);.str
3240: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62  uct symbol *Symb
3250: 6f 6c 5f 4e 74 68 28 69 6e 74 29 3b 0a 69 6e 74  ol_Nth(int);.int
3260: 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 76 6f   Symbol_count(vo
3270: 69 64 29 3b 0a 73 74 72 75 63 74 20 73 79 6d 62  id);.struct symb
3280: 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72 61  ol **Symbol_arra
3290: 79 6f 66 28 76 6f 69 64 29 3b 0a 0a 2f 2a 20 52  yof(void);../* R
32a0: 6f 75 74 69 6e 65 73 20 74 6f 20 6d 61 6e 61 67  outines to manag
32b0: 65 20 74 68 65 20 73 74 61 74 65 20 74 61 62 6c  e the state tabl
32c0: 65 20 2a 2f 0a 0a 69 6e 74 20 43 6f 6e 66 69 67  e */..int Config
32d0: 63 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  cmp(const char *
32e0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b  , const char *);
32f0: 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 53  .struct state *S
3300: 74 61 74 65 5f 6e 65 77 28 76 6f 69 64 29 3b 0a  tate_new(void);.
3310: 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28  void State_init(
3320: 76 6f 69 64 29 3b 0a 69 6e 74 20 53 74 61 74 65  void);.int State
3330: 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20 73  _insert(struct s
3340: 74 61 74 65 20 2a 2c 20 73 74 72 75 63 74 20 63  tate *, struct c
3350: 6f 6e 66 69 67 20 2a 29 3b 0a 73 74 72 75 63 74  onfig *);.struct
3360: 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 66 69   state *State_fi
3370: 6e 64 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  nd(struct config
3380: 20 2a 29 3b 0a 73 74 72 75 63 74 20 73 74 61 74   *);.struct stat
3390: 65 20 2a 2a 53 74 61 74 65 5f 61 72 72 61 79 6f  e **State_arrayo
33a0: 66 28 2f 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a 20 52  f(/*  */);../* R
33b0: 6f 75 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72  outines used for
33c0: 20 65 66 66 69 63 69 65 6e 63 79 20 69 6e 20 43   efficiency in C
33d0: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 20 2a 2f  onfiglist_add */
33e0: 0a 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62  ..void Configtab
33f0: 6c 65 5f 69 6e 69 74 28 76 6f 69 64 29 3b 0a 69  le_init(void);.i
3400: 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69  nt Configtable_i
3410: 6e 73 65 72 74 28 73 74 72 75 63 74 20 63 6f 6e  nsert(struct con
3420: 66 69 67 20 2a 29 3b 0a 73 74 72 75 63 74 20 63  fig *);.struct c
3430: 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 74 61 62  onfig *Configtab
3440: 6c 65 5f 66 69 6e 64 28 73 74 72 75 63 74 20 63  le_find(struct c
3450: 6f 6e 66 69 67 20 2a 29 3b 0a 76 6f 69 64 20 43  onfig *);.void C
3460: 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72  onfigtable_clear
3470: 28 69 6e 74 28 2a 29 28 73 74 72 75 63 74 20 63  (int(*)(struct c
3480: 6f 6e 66 69 67 20 2a 29 29 3b 0a 0a 2f 2a 2a 2a  onfig *));../***
3490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
34a0: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 61  From the file "a
34b0: 63 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  ction.c" *******
34c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34d0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
34e0: 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73  Routines process
34f0: 69 6e 67 20 70 61 72 73 65 72 20 61 63 74 69 6f  ing parser actio
3500: 6e 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20  ns in the LEMON 
3510: 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
3520: 2e 0a 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  ..*/../* Allocat
3530: 65 20 61 20 6e 65 77 20 70 61 72 73 65 72 20 61  e a new parser a
3540: 63 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ction */.static 
3550: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 41  struct action *A
3560: 63 74 69 6f 6e 5f 6e 65 77 28 76 6f 69 64 29 7b  ction_new(void){
3570: 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
3580: 20 61 63 74 69 6f 6e 20 2a 66 72 65 65 6c 69 73   action *freelis
3590: 74 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20  t = 0;.  struct 
35a0: 61 63 74 69 6f 6e 20 2a 6e 65 77 61 63 74 69 6f  action *newactio
35b0: 6e 3b 0a 0a 20 20 69 66 28 20 66 72 65 65 6c 69  n;..  if( freeli
35c0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  st==0 ){.    int
35d0: 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20   i;.    int amt 
35e0: 3d 20 31 30 30 3b 0a 20 20 20 20 66 72 65 65 6c  = 100;.    freel
35f0: 69 73 74 20 3d 20 28 73 74 72 75 63 74 20 61 63  ist = (struct ac
3600: 74 69 6f 6e 20 2a 29 63 61 6c 6c 6f 63 28 61 6d  tion *)calloc(am
3610: 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  t, sizeof(struct
3620: 20 61 63 74 69 6f 6e 29 29 3b 0a 20 20 20 20 69   action));.    i
3630: 66 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29  f( freelist==0 )
3640: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
3650: 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74  stderr,"Unable t
3660: 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72  o allocate memor
3670: 79 20 66 6f 72 20 61 20 6e 65 77 20 70 61 72 73  y for a new pars
3680: 65 72 20 61 63 74 69 6f 6e 2e 22 29 3b 0a 20 20  er action.");.  
3690: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
36a0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
36b0: 69 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72  i<amt-1; i++) fr
36c0: 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d  eelist[i].next =
36d0: 20 26 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b   &freelist[i+1];
36e0: 0a 20 20 20 20 66 72 65 65 6c 69 73 74 5b 61 6d  .    freelist[am
36f0: 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20  t-1].next = 0;. 
3700: 20 7d 0a 20 20 6e 65 77 61 63 74 69 6f 6e 20 3d   }.  newaction =
3710: 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66 72 65   freelist;.  fre
3720: 65 6c 69 73 74 20 3d 20 66 72 65 65 6c 69 73 74  elist = freelist
3730: 2d 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e  ->next;.  return
3740: 20 6e 65 77 61 63 74 69 6f 6e 3b 0a 7d 0a 0a 2f   newaction;.}../
3750: 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 61 63  * Compare two ac
3760: 74 69 6f 6e 73 20 66 6f 72 20 73 6f 72 74 69 6e  tions for sortin
3770: 67 20 70 75 72 70 6f 73 65 73 2e 20 20 52 65 74  g purposes.  Ret
3780: 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  urn negative, ze
3790: 72 6f 2c 20 6f 72 0a 2a 2a 20 70 6f 73 69 74 69  ro, or.** positi
37a0: 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74 20  ve if the first 
37b0: 61 63 74 69 6f 6e 20 69 73 20 6c 65 73 73 20 74  action is less t
37c0: 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f  han, equal to, o
37d0: 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 0a 2a  r greater than.*
37e0: 2a 20 74 68 65 20 66 69 72 73 74 0a 2a 2f 0a 73  * the first.*/.s
37f0: 74 61 74 69 63 20 69 6e 74 20 61 63 74 69 6f 6e  tatic int action
3800: 63 6d 70 28 0a 20 20 73 74 72 75 63 74 20 61 63  cmp(.  struct ac
3810: 74 69 6f 6e 20 2a 61 70 31 2c 0a 20 20 73 74 72  tion *ap1,.  str
3820: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 32 0a  uct action *ap2.
3830: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  ){.  int rc;.  r
3840: 63 20 3d 20 61 70 31 2d 3e 73 70 2d 3e 69 6e 64  c = ap1->sp->ind
3850: 65 78 20 2d 20 61 70 32 2d 3e 73 70 2d 3e 69 6e  ex - ap2->sp->in
3860: 64 65 78 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  dex;.  if( rc==0
3870: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 28 69 6e   ){.    rc = (in
3880: 74 29 61 70 31 2d 3e 74 79 70 65 20 2d 20 28 69  t)ap1->type - (i
3890: 6e 74 29 61 70 32 2d 3e 74 79 70 65 3b 0a 20 20  nt)ap2->type;.  
38a0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 26 26  }.  if( rc==0 &&
38b0: 20 61 70 31 2d 3e 74 79 70 65 3d 3d 52 45 44 55   ap1->type==REDU
38c0: 43 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 61  CE ){.    rc = a
38d0: 70 31 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20  p1->x.rp->index 
38e0: 2d 20 61 70 32 2d 3e 78 2e 72 70 2d 3e 69 6e 64  - ap2->x.rp->ind
38f0: 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ex;.  }.  if( rc
3900: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
3910: 28 69 6e 74 29 20 28 61 70 32 20 2d 20 61 70 31  (int) (ap2 - ap1
3920: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
3930: 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20 70  rc;.}../* Sort p
3940: 61 72 73 65 72 20 61 63 74 69 6f 6e 73 20 2a 2f  arser actions */
3950: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 61  .static struct a
3960: 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f  ction *Action_so
3970: 72 74 28 0a 20 20 73 74 72 75 63 74 20 61 63 74  rt(.  struct act
3980: 69 6f 6e 20 2a 61 70 0a 29 7b 0a 20 20 61 70 20  ion *ap.){.  ap 
3990: 3d 20 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e  = (struct action
39a0: 20 2a 29 6d 73 6f 72 74 28 28 63 68 61 72 20 2a   *)msort((char *
39b0: 29 61 70 2c 28 63 68 61 72 20 2a 2a 29 26 61 70  )ap,(char **)&ap
39c0: 2d 3e 6e 65 78 74 2c 0a 20 20 20 20 20 20 20 20  ->next,.        
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39e0: 20 20 20 20 20 20 28 69 6e 74 28 2a 29 28 63 6f        (int(*)(co
39f0: 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20  nst char*,const 
3a00: 63 68 61 72 2a 29 29 61 63 74 69 6f 6e 63 6d 70  char*))actioncmp
3a10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 70 3b 0a  );.  return ap;.
3a20: 7d 0a 0a 76 6f 69 64 20 41 63 74 69 6f 6e 5f 61  }..void Action_a
3a30: 64 64 28 0a 20 20 73 74 72 75 63 74 20 61 63 74  dd(.  struct act
3a40: 69 6f 6e 20 2a 2a 61 70 70 2c 0a 20 20 65 6e 75  ion **app,.  enu
3a50: 6d 20 65 5f 61 63 74 69 6f 6e 20 74 79 70 65 2c  m e_action type,
3a60: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
3a70: 20 2a 73 70 2c 0a 20 20 63 68 61 72 20 2a 61 72   *sp,.  char *ar
3a80: 67 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 61 63  g.){.  struct ac
3a90: 74 69 6f 6e 20 2a 6e 65 77 61 63 74 69 6f 6e 3b  tion *newaction;
3aa0: 0a 20 20 6e 65 77 61 63 74 69 6f 6e 20 3d 20 41  .  newaction = A
3ab0: 63 74 69 6f 6e 5f 6e 65 77 28 29 3b 0a 20 20 6e  ction_new();.  n
3ac0: 65 77 61 63 74 69 6f 6e 2d 3e 6e 65 78 74 20 3d  ewaction->next =
3ad0: 20 2a 61 70 70 3b 0a 20 20 2a 61 70 70 20 3d 20   *app;.  *app = 
3ae0: 6e 65 77 61 63 74 69 6f 6e 3b 0a 20 20 6e 65 77  newaction;.  new
3af0: 61 63 74 69 6f 6e 2d 3e 74 79 70 65 20 3d 20 74  action->type = t
3b00: 79 70 65 3b 0a 20 20 6e 65 77 61 63 74 69 6f 6e  ype;.  newaction
3b10: 2d 3e 73 70 20 3d 20 73 70 3b 0a 20 20 69 66 28  ->sp = sp;.  if(
3b20: 20 74 79 70 65 3d 3d 53 48 49 46 54 20 29 7b 0a   type==SHIFT ){.
3b30: 20 20 20 20 6e 65 77 61 63 74 69 6f 6e 2d 3e 78      newaction->x
3b40: 2e 73 74 70 20 3d 20 28 73 74 72 75 63 74 20 73  .stp = (struct s
3b50: 74 61 74 65 20 2a 29 61 72 67 3b 0a 20 20 7d 65  tate *)arg;.  }e
3b60: 6c 73 65 7b 0a 20 20 20 20 6e 65 77 61 63 74 69  lse{.    newacti
3b70: 6f 6e 2d 3e 78 2e 72 70 20 3d 20 28 73 74 72 75  on->x.rp = (stru
3b80: 63 74 20 72 75 6c 65 20 2a 29 61 72 67 3b 0a 20  ct rule *)arg;. 
3b90: 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   }.}./**********
3ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 65 77  ************ New
3bb0: 20 63 6f 64 65 20 74 6f 20 69 6d 70 6c 65 6d 65   code to impleme
3bc0: 6e 74 20 74 68 65 20 22 61 63 74 74 61 62 22 20  nt the "acttab" 
3bd0: 6d 6f 64 75 6c 65 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  module *********
3be0: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d  **/./*.** This m
3bf0: 6f 64 75 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 73  odule implements
3c00: 20 72 6f 75 74 69 6e 65 73 20 75 73 65 20 74 6f   routines use to
3c10: 20 63 6f 6e 73 74 72 75 63 74 20 74 68 65 20 79   construct the y
3c20: 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65  y_action[] table
3c30: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ..*/../*.** The 
3c40: 73 74 61 74 65 20 6f 66 20 74 68 65 20 79 79 5f  state of the yy_
3c50: 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 75 6e 64  action table und
3c60: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
3c70: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
3c80: 66 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69  f.** the followi
3c90: 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a  ng structure..**
3ca0: 0a 2a 2a 20 54 68 65 20 79 79 5f 61 63 74 69 6f  .** The yy_actio
3cb0: 6e 20 74 61 62 6c 65 20 6d 61 70 73 20 74 68 65  n table maps the
3cc0: 20 70 61 69 72 20 28 73 74 61 74 65 5f 6e 75 6d   pair (state_num
3cd0: 62 65 72 2c 20 6c 6f 6f 6b 61 68 65 61 64 29 20  ber, lookahead) 
3ce0: 69 6e 74 6f 20 61 6e 0a 2a 2a 20 61 63 74 69 6f  into an.** actio
3cf0: 6e 5f 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 74  n_number.  The t
3d00: 61 62 6c 65 20 69 73 20 61 6e 20 61 72 72 61 79  able is an array
3d10: 20 6f 66 20 69 6e 74 65 67 65 72 73 20 70 61 69   of integers pai
3d20: 72 73 2e 20 20 54 68 65 20 73 74 61 74 65 5f 6e  rs.  The state_n
3d30: 75 6d 62 65 72 0a 2a 2a 20 64 65 74 65 72 6d 69  umber.** determi
3d40: 6e 65 73 20 61 6e 20 69 6e 69 74 69 61 6c 20 6f  nes an initial o
3d50: 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20 79  ffset into the y
3d60: 79 5f 61 63 74 69 6f 6e 20 61 72 72 61 79 2e 20  y_action array. 
3d70: 20 54 68 65 20 6c 6f 6f 6b 61 68 65 61 64 0a 2a   The lookahead.*
3d80: 2a 20 76 61 6c 75 65 20 69 73 20 74 68 65 6e 20  * value is then 
3d90: 61 64 64 65 64 20 74 6f 20 74 68 69 73 20 69 6e  added to this in
3da0: 69 74 69 61 6c 20 6f 66 66 73 65 74 20 74 6f 20  itial offset to 
3db0: 67 65 74 20 61 6e 20 69 6e 64 65 78 20 58 20 69  get an index X i
3dc0: 6e 74 6f 20 74 68 65 0a 2a 2a 20 79 79 5f 61 63  nto the.** yy_ac
3dd0: 74 69 6f 6e 20 61 72 72 61 79 2e 20 49 66 20 74  tion array. If t
3de0: 68 65 20 61 41 63 74 69 6f 6e 5b 58 5d 2e 6c 6f  he aAction[X].lo
3df0: 6f 6b 61 68 65 61 64 20 65 71 75 61 6c 73 20 74  okahead equals t
3e00: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 0a  he value of the.
3e10: 2a 2a 20 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68  ** of the lookah
3e20: 65 61 64 20 69 6e 70 75 74 2c 20 74 68 65 6e 20  ead input, then 
3e30: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
3e40: 20 61 63 74 69 6f 6e 5f 6e 75 6d 62 65 72 20 6f   action_number o
3e50: 75 74 70 75 74 20 69 73 0a 2a 2a 20 61 41 63 74  utput is.** aAct
3e60: 69 6f 6e 5b 58 5d 2e 61 63 74 69 6f 6e 2e 20 20  ion[X].action.  
3e70: 49 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64  If the lookahead
3e80: 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 20 74  s do not match t
3e90: 68 65 6e 20 74 68 65 0a 2a 2a 20 64 65 66 61 75  hen the.** defau
3ea0: 6c 74 20 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  lt action for th
3eb0: 65 20 73 74 61 74 65 5f 6e 75 6d 62 65 72 20 69  e state_number i
3ec0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
3ed0: 2a 20 41 6c 6c 20 61 63 74 69 6f 6e 73 20 61 73  * All actions as
3ee0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
3ef0: 73 69 6e 67 6c 65 20 73 74 61 74 65 5f 6e 75 6d  single state_num
3f00: 62 65 72 20 61 72 65 20 66 69 72 73 74 20 65 6e  ber are first en
3f10: 74 65 72 65 64 0a 2a 2a 20 69 6e 74 6f 20 61 4c  tered.** into aL
3f20: 6f 6f 6b 61 68 65 61 64 5b 5d 20 75 73 69 6e 67  ookahead[] using
3f30: 20 6d 75 6c 74 69 70 6c 65 20 63 61 6c 6c 73 20   multiple calls 
3f40: 74 6f 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e  to acttab_action
3f50: 28 29 2e 20 20 54 68 65 6e 20 74 68 65 20 0a 2a  ().  Then the .*
3f60: 2a 20 61 63 74 69 6f 6e 73 20 66 6f 72 20 74 68  * actions for th
3f70: 61 74 20 73 69 6e 67 6c 65 20 73 74 61 74 65 5f  at single state_
3f80: 6e 75 6d 62 65 72 20 61 72 65 20 70 6c 61 63 65  number are place
3f90: 64 20 69 6e 74 6f 20 74 68 65 20 61 41 63 74 69  d into the aActi
3fa0: 6f 6e 5b 5d 20 0a 2a 2a 20 61 72 72 61 79 20 77  on[] .** array w
3fb0: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 63 61 6c  ith a single cal
3fc0: 6c 20 74 6f 20 61 63 74 74 61 62 5f 69 6e 73 65  l to acttab_inse
3fd0: 72 74 28 29 2e 20 20 54 68 65 20 61 63 74 74 61  rt().  The actta
3fe0: 62 5f 69 6e 73 65 72 74 28 29 20 63 61 6c 6c 0a  b_insert() call.
3ff0: 2a 2a 20 61 6c 73 6f 20 72 65 73 65 74 73 20 74  ** also resets t
4000: 68 65 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20  he aLookahead[] 
4010: 61 72 72 61 79 20 69 6e 20 70 72 65 70 61 72 61  array in prepara
4020: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 78  tion for the nex
4030: 74 0a 2a 2a 20 73 74 61 74 65 20 6e 75 6d 62 65  t.** state numbe
4040: 72 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 6f  r..*/.struct loo
4050: 6b 61 68 65 61 64 5f 61 63 74 69 6f 6e 20 7b 0a  kahead_action {.
4060: 20 20 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64 3b    int lookahead;
4070: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4080: 56 61 6c 75 65 20 6f 66 20 74 68 65 20 6c 6f 6f  Value of the loo
4090: 6b 61 68 65 61 64 20 74 6f 6b 65 6e 20 2a 2f 0a  kahead token */.
40a0: 20 20 69 6e 74 20 61 63 74 69 6f 6e 3b 20 20 20    int action;   
40b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
40c0: 41 63 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 6f  Action to take o
40d0: 6e 20 74 68 65 20 67 69 76 65 6e 20 6c 6f 6f 6b  n the given look
40e0: 61 68 65 61 64 20 2a 2f 0a 7d 3b 0a 74 79 70 65  ahead */.};.type
40f0: 64 65 66 20 73 74 72 75 63 74 20 61 63 74 74 61  def struct actta
4100: 62 20 61 63 74 74 61 62 3b 0a 73 74 72 75 63 74  b acttab;.struct
4110: 20 61 63 74 74 61 62 20 7b 0a 20 20 69 6e 74 20   acttab {.  int 
4120: 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  nAction;        
4130: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4140: 65 72 20 6f 66 20 75 73 65 64 20 73 6c 6f 74 73  er of used slots
4150: 20 69 6e 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f   in aAction[] */
4160: 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 41 6c  .  int nActionAl
4170: 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  loc;            
4180: 2f 2a 20 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74  /* Slots allocat
4190: 65 64 20 66 6f 72 20 61 41 63 74 69 6f 6e 5b 5d  ed for aAction[]
41a0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 6f   */.  struct loo
41b0: 6b 61 68 65 61 64 5f 61 63 74 69 6f 6e 0a 20 20  kahead_action.  
41c0: 20 20 2a 61 41 63 74 69 6f 6e 2c 20 20 20 20 20    *aAction,     
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
41e0: 54 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20  The yy_action[] 
41f0: 74 61 62 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73  table under cons
4200: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  truction */.    
4210: 2a 61 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20  *aLookahead;    
4220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
4230: 73 69 6e 67 6c 65 20 6e 65 77 20 74 72 61 6e 73  single new trans
4240: 61 63 74 69 6f 6e 20 73 65 74 20 2a 2f 0a 20 20  action set */.  
4250: 69 6e 74 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b  int mnLookahead;
4260: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4270: 4d 69 6e 69 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65  Minimum aLookahe
4280: 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a  ad[].lookahead *
4290: 2f 0a 20 20 69 6e 74 20 6d 6e 41 63 74 69 6f 6e  /.  int mnAction
42a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
42b0: 20 2f 2a 20 41 63 74 69 6f 6e 20 61 73 73 6f 63   /* Action assoc
42c0: 69 61 74 65 64 20 77 69 74 68 20 6d 6e 4c 6f 6f  iated with mnLoo
42d0: 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  kahead */.  int 
42e0: 6d 78 4c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20  mxLookahead;    
42f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69           /* Maxi
4300: 6d 75 6d 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d  mum aLookahead[]
4310: 2e 6c 6f 6f 6b 61 68 65 61 64 20 2a 2f 0a 20 20  .lookahead */.  
4320: 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20  int nLookahead; 
4330: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4340: 55 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 4c  Used slots in aL
4350: 6f 6f 6b 61 68 65 61 64 5b 5d 20 2a 2f 0a 20 20  ookahead[] */.  
4360: 69 6e 74 20 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c  int nLookaheadAl
4370: 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  loc;         /* 
4380: 53 6c 6f 74 73 20 61 6c 6c 6f 63 61 74 65 64 20  Slots allocated 
4390: 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20  in aLookahead[] 
43a0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 52 65 74 75 72 6e  */.};../* Return
43b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
43c0: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 79 79  ntries in the yy
43d0: 5f 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f  _action table */
43e0: 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f  .#define acttab_
43f0: 73 69 7a 65 28 58 29 20 28 28 58 29 2d 3e 6e 41  size(X) ((X)->nA
4400: 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76  ction)../* The v
4410: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 4e 2d 74  alue for the N-t
4420: 68 20 65 6e 74 72 79 20 69 6e 20 79 79 5f 61 63  h entry in yy_ac
4430: 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  tion */.#define 
4440: 61 63 74 74 61 62 5f 79 79 61 63 74 69 6f 6e 28  acttab_yyaction(
4450: 58 2c 4e 29 20 20 28 28 58 29 2d 3e 61 41 63 74  X,N)  ((X)->aAct
4460: 69 6f 6e 5b 4e 5d 2e 61 63 74 69 6f 6e 29 0a 0a  ion[N].action)..
4470: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 66 6f 72  /* The value for
4480: 20 74 68 65 20 4e 2d 74 68 20 65 6e 74 72 79 20   the N-th entry 
4490: 69 6e 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 20  in yy_lookahead 
44a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 61 63 74 74 61  */.#define actta
44b0: 62 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28 58 2c  b_yylookahead(X,
44c0: 4e 29 20 20 28 28 58 29 2d 3e 61 41 63 74 69 6f  N)  ((X)->aActio
44d0: 6e 5b 4e 5d 2e 6c 6f 6f 6b 61 68 65 61 64 29 0a  n[N].lookahead).
44e0: 0a 2f 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  ./* Free all mem
44f0: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
4500: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 63  ith the given ac
4510: 74 74 61 62 20 2a 2f 0a 76 6f 69 64 20 61 63 74  ttab */.void act
4520: 74 61 62 5f 66 72 65 65 28 61 63 74 74 61 62 20  tab_free(acttab 
4530: 2a 70 29 7b 0a 20 20 66 72 65 65 28 20 70 2d 3e  *p){.  free( p->
4540: 61 41 63 74 69 6f 6e 20 29 3b 0a 20 20 66 72 65  aAction );.  fre
4550: 65 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  e( p->aLookahead
4560: 20 29 3b 0a 20 20 66 72 65 65 28 20 70 20 29 3b   );.  free( p );
4570: 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  .}../* Allocate 
4580: 61 20 6e 65 77 20 61 63 74 74 61 62 20 73 74 72  a new acttab str
4590: 75 63 74 75 72 65 20 2a 2f 0a 61 63 74 74 61 62  ucture */.acttab
45a0: 20 2a 61 63 74 74 61 62 5f 61 6c 6c 6f 63 28 76   *acttab_alloc(v
45b0: 6f 69 64 29 7b 0a 20 20 61 63 74 74 61 62 20 2a  oid){.  acttab *
45c0: 70 20 3d 20 28 61 63 74 74 61 62 20 2a 29 20 63  p = (acttab *) c
45d0: 61 6c 6c 6f 63 28 20 31 2c 20 73 69 7a 65 6f 66  alloc( 1, sizeof
45e0: 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  (*p) );.  if( p=
45f0: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
4600: 66 28 73 74 64 65 72 72 2c 22 55 6e 61 62 6c 65  f(stderr,"Unable
4610: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d   to allocate mem
4620: 6f 72 79 20 66 6f 72 20 61 20 6e 65 77 20 61 63  ory for a new ac
4630: 74 74 61 62 2e 22 29 3b 0a 20 20 20 20 65 78 69  ttab.");.    exi
4640: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  t(1);.  }.  mems
4650: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
4660: 2a 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  *p));.  return p
4670: 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65  ;.}../* Add a ne
4680: 77 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  w action to the 
4690: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
46a0: 69 6f 6e 20 73 65 74 2e 20 20 0a 2a 2a 0a 2a 2a  ion set.  .**.**
46b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
46c0: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72   called once for
46d0: 20 65 61 63 68 20 6c 6f 6f 6b 61 68 65 61 64 20   each lookahead 
46e0: 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
46f0: 0a 2a 2a 20 73 74 61 74 65 2e 0a 2a 2f 0a 76 6f  .** state..*/.vo
4700: 69 64 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e  id acttab_action
4710: 28 61 63 74 74 61 62 20 2a 70 2c 20 69 6e 74 20  (acttab *p, int 
4720: 6c 6f 6f 6b 61 68 65 61 64 2c 20 69 6e 74 20 61  lookahead, int a
4730: 63 74 69 6f 6e 29 7b 0a 20 20 69 66 28 20 70 2d  ction){.  if( p-
4740: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3e 3d 70 2d 3e  >nLookahead>=p->
4750: 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20  nLookaheadAlloc 
4760: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 6f 6f 6b 61  ){.    p->nLooka
4770: 68 65 61 64 41 6c 6c 6f 63 20 2b 3d 20 32 35 3b  headAlloc += 25;
4780: 0a 20 20 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65  .    p->aLookahe
4790: 61 64 20 3d 20 28 73 74 72 75 63 74 20 6c 6f 6f  ad = (struct loo
47a0: 6b 61 68 65 61 64 5f 61 63 74 69 6f 6e 20 2a 29  kahead_action *)
47b0: 20 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 4c 6f   realloc( p->aLo
47c0: 6f 6b 61 68 65 61 64 2c 0a 20 20 20 20 20 20 20  okahead,.       
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 2d 3e        sizeof(p->
47f0: 61 4c 6f 6f 6b 61 68 65 61 64 5b 30 5d 29 2a 70  aLookahead[0])*p
4800: 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f  ->nLookaheadAllo
4810: 63 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  c );.    if( p->
4820: 61 4c 6f 6f 6b 61 68 65 61 64 3d 3d 30 20 29 7b  aLookahead==0 ){
4830: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
4840: 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61  tderr,"malloc fa
4850: 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20  iled\n");.      
4860: 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20  exit(1);.    }. 
4870: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f   }.  if( p->nLoo
4880: 6b 61 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20  kahead==0 ){.   
4890: 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20   p->mxLookahead 
48a0: 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20  = lookahead;.   
48b0: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20   p->mnLookahead 
48c0: 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20  = lookahead;.   
48d0: 20 70 2d 3e 6d 6e 41 63 74 69 6f 6e 20 3d 20 61   p->mnAction = a
48e0: 63 74 69 6f 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ction;.  }else{.
48f0: 20 20 20 20 69 66 28 20 70 2d 3e 6d 78 4c 6f 6f      if( p->mxLoo
4900: 6b 61 68 65 61 64 3c 6c 6f 6f 6b 61 68 65 61 64  kahead<lookahead
4910: 20 29 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61   ) p->mxLookahea
4920: 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20  d = lookahead;. 
4930: 20 20 20 69 66 28 20 70 2d 3e 6d 6e 4c 6f 6f 6b     if( p->mnLook
4940: 61 68 65 61 64 3e 6c 6f 6f 6b 61 68 65 61 64 20  ahead>lookahead 
4950: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6e 4c 6f  ){.      p->mnLo
4960: 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f 6b 61 68  okahead = lookah
4970: 65 61 64 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6e  ead;.      p->mn
4980: 41 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b  Action = action;
4990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
49a0: 61 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e 4c  aLookahead[p->nL
49b0: 6f 6f 6b 61 68 65 61 64 5d 2e 6c 6f 6f 6b 61 68  ookahead].lookah
49c0: 65 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b  ead = lookahead;
49d0: 0a 20 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64  .  p->aLookahead
49e0: 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 5d 2e  [p->nLookahead].
49f0: 61 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e 3b  action = action;
4a00: 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  .  p->nLookahead
4a10: 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  ++;.}../*.** Add
4a20: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
4a30: 20 73 65 74 20 62 75 69 6c 74 20 75 70 20 77 69   set built up wi
4a40: 74 68 20 70 72 69 6f 72 20 63 61 6c 6c 73 20 74  th prior calls t
4a50: 6f 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28  o acttab_action(
4a60: 29 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 63 75  ).** into the cu
4a70: 72 72 65 6e 74 20 61 63 74 69 6f 6e 20 74 61 62  rrent action tab
4a80: 6c 65 2e 20 20 54 68 65 6e 20 72 65 73 65 74 20  le.  Then reset 
4a90: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
4aa0: 73 65 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 61  set back.** to a
4ab0: 6e 20 65 6d 70 74 79 20 73 65 74 20 69 6e 20 70  n empty set in p
4ac0: 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 20 61  reparation for a
4ad0: 20 6e 65 77 20 72 6f 75 6e 64 20 6f 66 20 61 63   new round of ac
4ae0: 74 74 61 62 5f 61 63 74 69 6f 6e 28 29 20 63 61  ttab_action() ca
4af0: 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lls..**.** Retur
4b00: 6e 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74  n the offset int
4b10: 6f 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  o the action tab
4b20: 6c 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 72  le of the new tr
4b30: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  ansaction..*/.in
4b40: 74 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74 28  t acttab_insert(
4b50: 61 63 74 74 61 62 20 2a 70 29 7b 0a 20 20 69 6e  acttab *p){.  in
4b60: 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a 20 20  t i, j, k, n;.  
4b70: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4c 6f 6f 6b  assert( p->nLook
4b80: 61 68 65 61 64 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ahead>0 );..  /*
4b90: 20 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61   Make sure we ha
4ba0: 76 65 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20  ve enough space 
4bb0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 78 70 61  to hold the expa
4bc0: 6e 64 65 64 20 61 63 74 69 6f 6e 20 74 61 62 6c  nded action tabl
4bd0: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 77 6f  e.  ** in the wo
4be0: 72 73 74 20 63 61 73 65 2e 20 20 54 68 65 20 77  rst case.  The w
4bf0: 6f 72 73 74 20 63 61 73 65 20 6f 63 63 75 72 73  orst case occurs
4c00: 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
4c10: 69 6f 6e 20 73 65 74 0a 20 20 2a 2a 20 6d 75 73  ion set.  ** mus
4c20: 74 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  t be appended to
4c30: 20 74 68 65 20 63 75 72 72 65 6e 74 20 61 63 74   the current act
4c40: 69 6f 6e 20 74 61 62 6c 65 0a 20 20 2a 2f 0a 20  ion table.  */. 
4c50: 20 6e 20 3d 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68   n = p->mxLookah
4c60: 65 61 64 20 2b 20 31 3b 0a 20 20 69 66 28 20 70  ead + 1;.  if( p
4c70: 2d 3e 6e 41 63 74 69 6f 6e 20 2b 20 6e 20 3e 3d  ->nAction + n >=
4c80: 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63   p->nActionAlloc
4c90: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 6c 64 41   ){.    int oldA
4ca0: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63 74 69 6f  lloc = p->nActio
4cb0: 6e 41 6c 6c 6f 63 3b 0a 20 20 20 20 70 2d 3e 6e  nAlloc;.    p->n
4cc0: 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 3d 20 70 2d  ActionAlloc = p-
4cd0: 3e 6e 41 63 74 69 6f 6e 20 2b 20 6e 20 2b 20 70  >nAction + n + p
4ce0: 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 2b  ->nActionAlloc +
4cf0: 20 32 30 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74   20;.    p->aAct
4d00: 69 6f 6e 20 3d 20 28 73 74 72 75 63 74 20 6c 6f  ion = (struct lo
4d10: 6f 6b 61 68 65 61 64 5f 61 63 74 69 6f 6e 20 2a  okahead_action *
4d20: 29 20 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 41  ) realloc( p->aA
4d30: 63 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  ction,.         
4d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d50: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 41 63 74 69   sizeof(p->aActi
4d60: 6f 6e 5b 30 5d 29 2a 70 2d 3e 6e 41 63 74 69 6f  on[0])*p->nActio
4d70: 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28  nAlloc);.    if(
4d80: 20 70 2d 3e 61 41 63 74 69 6f 6e 3d 3d 30 20 29   p->aAction==0 )
4d90: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
4da0: 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66  stderr,"malloc f
4db0: 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20  ailed\n");.     
4dc0: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
4dd0: 20 20 20 20 66 6f 72 28 69 3d 6f 6c 64 41 6c 6c      for(i=oldAll
4de0: 6f 63 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e  oc; i<p->nAction
4df0: 41 6c 6c 6f 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  Alloc; i++){.   
4e00: 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d     p->aAction[i]
4e10: 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 2d 31 3b  .lookahead = -1;
4e20: 0a 20 20 20 20 20 20 70 2d 3e 61 41 63 74 69 6f  .      p->aActio
4e30: 6e 5b 69 5d 2e 61 63 74 69 6f 6e 20 3d 20 2d 31  n[i].action = -1
4e40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
4e50: 2a 20 53 63 61 6e 20 74 68 65 20 65 78 69 73 74  * Scan the exist
4e60: 69 6e 67 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  ing action table
4e70: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 6e 20   looking for an 
4e80: 6f 66 66 73 65 74 20 74 68 61 74 20 69 73 20 61  offset that is a
4e90: 20 0a 20 20 2a 2a 20 64 75 70 6c 69 63 61 74 65   .  ** duplicate
4ea0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
4eb0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e  transaction set.
4ec0: 20 20 46 61 6c 6c 20 6f 75 74 20 6f 66 20 74 68    Fall out of th
4ed0: 65 20 6c 6f 6f 70 0a 20 20 2a 2a 20 69 66 20 61  e loop.  ** if a
4ee0: 6e 64 20 77 68 65 6e 20 74 68 65 20 64 75 70 6c  nd when the dupl
4ef0: 69 63 61 74 65 20 69 73 20 66 6f 75 6e 64 2e 0a  icate is found..
4f00: 20 20 2a 2a 0a 20 20 2a 2a 20 69 20 69 73 20 74    **.  ** i is t
4f10: 68 65 20 69 6e 64 65 78 20 69 6e 20 70 2d 3e 61  he index in p->a
4f20: 41 63 74 69 6f 6e 5b 5d 20 77 68 65 72 65 20 70  Action[] where p
4f30: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 69 73  ->mnLookahead is
4f40: 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a   inserted..  */.
4f50: 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 41 63 74 69    for(i=p->nActi
4f60: 6f 6e 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  on-1; i>=0; i--)
4f70: 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63  {.    if( p->aAc
4f80: 74 69 6f 6e 5b 69 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[i].lookahea
4f90: 64 3d 3d 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61  d==p->mnLookahea
4fa0: 64 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c  d ){.      /* Al
4fb0: 6c 20 6c 6f 6f 6b 61 68 65 61 64 73 20 61 6e 64  l lookaheads and
4fc0: 20 61 63 74 69 6f 6e 73 20 69 6e 20 74 68 65 20   actions in the 
4fd0: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72 61  aLookahead[] tra
4fe0: 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  nsaction.      *
4ff0: 2a 20 6d 75 73 74 20 6d 61 74 63 68 20 61 67 61  * must match aga
5000: 69 6e 73 74 20 74 68 65 20 63 61 6e 64 69 64 61  inst the candida
5010: 74 65 20 61 41 63 74 69 6f 6e 5b 69 5d 20 65 6e  te aAction[i] en
5020: 74 72 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  try. */.      if
5030: 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e  ( p->aAction[i].
5040: 61 63 74 69 6f 6e 21 3d 70 2d 3e 6d 6e 41 63 74  action!=p->mnAct
5050: 69 6f 6e 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ion ) continue;.
5060: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
5070: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20  <p->nLookahead; 
5080: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20  j++){.        k 
5090: 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  = p->aLookahead[
50a0: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70  j].lookahead - p
50b0: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20  ->mnLookahead + 
50c0: 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b  i;.        if( k
50d0: 3c 30 20 7c 7c 20 6b 3e 3d 70 2d 3e 6e 41 63 74  <0 || k>=p->nAct
50e0: 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ion ) break;.   
50f0: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f       if( p->aLoo
5100: 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68  kahead[j].lookah
5110: 65 61 64 21 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b  ead!=p->aAction[
5120: 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 29 20 62  k].lookahead ) b
5130: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 69 66  reak;.        if
5140: 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  ( p->aLookahead[
5150: 6a 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 61 41  j].action!=p->aA
5160: 63 74 69 6f 6e 5b 6b 5d 2e 61 63 74 69 6f 6e 20  ction[k].action 
5170: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
5180: 0a 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e  .      if( j<p->
5190: 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e  nLookahead ) con
51a0: 74 69 6e 75 65 3b 0a 0a 20 20 20 20 20 20 2f 2a  tinue;..      /*
51b0: 20 4e 6f 20 70 6f 73 73 69 62 6c 65 20 6c 6f 6f   No possible loo
51c0: 6b 61 68 65 61 64 20 76 61 6c 75 65 20 74 68 61  kahead value tha
51d0: 74 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  t is not in the 
51e0: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 0a 20 20 20  aLookahead[].   
51f0: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
5200: 6e 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20  n is allowed to 
5210: 6d 61 74 63 68 20 61 41 63 74 69 6f 6e 5b 69 5d  match aAction[i]
5220: 20 2a 2f 0a 20 20 20 20 20 20 6e 20 3d 20 30 3b   */.      n = 0;
5230: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
5240: 6a 3c 70 2d 3e 6e 41 63 74 69 6f 6e 3b 20 6a 2b  j<p->nAction; j+
5250: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
5260: 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f  p->aAction[j].lo
5270: 6f 6b 61 68 65 61 64 3c 30 20 29 20 63 6f 6e 74  okahead<0 ) cont
5280: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
5290: 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6a 5d 2e  ( p->aAction[j].
52a0: 6c 6f 6f 6b 61 68 65 61 64 3d 3d 6a 2b 70 2d 3e  lookahead==j+p->
52b0: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 2d 69 20 29 20  mnLookahead-i ) 
52c0: 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n++;.      }.   
52d0: 20 20 20 69 66 28 20 6e 3d 3d 70 2d 3e 6e 4c 6f     if( n==p->nLo
52e0: 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20 20  okahead ){.     
52f0: 20 20 20 62 72 65 61 6b 3b 20 20 2f 2a 20 41 6e     break;  /* An
5300: 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20   exact match is 
5310: 66 6f 75 6e 64 20 61 74 20 6f 66 66 73 65 74 20  found at offset 
5320: 69 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  i */.      }.   
5330: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
5340: 6e 6f 20 65 78 69 73 74 69 6e 67 20 6f 66 66 73  no existing offs
5350: 65 74 73 20 65 78 61 63 74 6c 79 20 6d 61 74 63  ets exactly matc
5360: 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  h the current tr
5370: 61 6e 73 61 63 74 69 6f 6e 2c 20 66 69 6e 64 20  ansaction, find 
5380: 61 6e 0a 20 20 2a 2a 20 61 6e 20 65 6d 70 74 79  an.  ** an empty
5390: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 61   offset in the a
53a0: 41 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 69  Action[] table i
53b0: 6e 20 77 68 69 63 68 20 77 65 20 63 61 6e 20 61  n which we can a
53c0: 64 64 20 74 68 65 0a 20 20 2a 2a 20 61 4c 6f 6f  dd the.  ** aLoo
53d0: 6b 61 68 65 61 64 5b 5d 20 74 72 61 6e 73 61 63  kahead[] transac
53e0: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tion..  */.  if(
53f0: 20 69 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4c   i<0 ){.    /* L
5400: 6f 6f 6b 20 66 6f 72 20 68 6f 6c 65 73 20 69 6e  ook for holes in
5410: 20 74 68 65 20 61 41 63 74 69 6f 6e 5b 5d 20 74   the aAction[] t
5420: 61 62 6c 65 20 74 68 61 74 20 66 69 74 20 74 68  able that fit th
5430: 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a  e current.    **
5440: 20 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 20 74 72   aLookahead[] tr
5450: 61 6e 73 61 63 74 69 6f 6e 2e 20 20 4c 65 61 76  ansaction.  Leav
5460: 65 20 69 20 73 65 74 20 74 6f 20 74 68 65 20 6f  e i set to the o
5470: 66 66 73 65 74 20 6f 66 20 74 68 65 20 68 6f 6c  ffset of the hol
5480: 65 2e 0a 20 20 20 20 2a 2a 20 49 66 20 6e 6f 20  e..    ** If no 
5490: 68 6f 6c 65 73 20 61 72 65 20 66 6f 75 6e 64 2c  holes are found,
54a0: 20 69 20 69 73 20 6c 65 66 74 20 61 74 20 70 2d   i is left at p-
54b0: 3e 6e 41 63 74 69 6f 6e 2c 20 77 68 69 63 68 20  >nAction, which 
54c0: 6d 65 61 6e 73 20 74 68 65 0a 20 20 20 20 2a 2a  means the.    **
54d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
54e0: 6c 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 2a  l be appended. *
54f0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
5500: 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63  <p->nActionAlloc
5510: 20 2d 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61   - p->mxLookahea
5520: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  d; i++){.      i
5530: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d  f( p->aAction[i]
5540: 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29 7b 0a  .lookahead<0 ){.
5550: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b          for(j=0;
5560: 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64   j<p->nLookahead
5570: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
5580: 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68    k = p->aLookah
5590: 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ead[j].lookahead
55a0: 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61   - p->mnLookahea
55b0: 64 20 2b 20 69 3b 0a 20 20 20 20 20 20 20 20 20  d + i;.         
55c0: 20 69 66 28 20 6b 3c 30 20 29 20 62 72 65 61 6b   if( k<0 ) break
55d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
55e0: 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f  p->aAction[k].lo
55f0: 6f 6b 61 68 65 61 64 3e 3d 30 20 29 20 62 72 65  okahead>=0 ) bre
5600: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
5610: 20 20 20 20 20 20 69 66 28 20 6a 3c 70 2d 3e 6e        if( j<p->n
5620: 4c 6f 6f 6b 61 68 65 61 64 20 29 20 63 6f 6e 74  Lookahead ) cont
5630: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f  inue;.        fo
5640: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74  r(j=0; j<p->nAct
5650: 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ion; j++){.     
5660: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74       if( p->aAct
5670: 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[j].lookahead
5680: 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  ==j+p->mnLookahe
5690: 61 64 2d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20  ad-i ) break;.  
56a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
56b0: 69 66 28 20 6a 3d 3d 70 2d 3e 6e 41 63 74 69 6f  if( j==p->nActio
56c0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  n ){.          b
56d0: 72 65 61 6b 3b 20 20 2f 2a 20 46 69 74 73 20 69  reak;  /* Fits i
56e0: 6e 20 65 6d 70 74 79 20 73 6c 6f 74 73 20 2a 2f  n empty slots */
56f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5700: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
5710: 2a 20 49 6e 73 65 72 74 20 74 72 61 6e 73 61 63  * Insert transac
5720: 74 69 6f 6e 20 73 65 74 20 61 74 20 69 6e 64 65  tion set at inde
5730: 78 20 69 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d  x i. */.  for(j=
5740: 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  0; j<p->nLookahe
5750: 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6b 20  ad; j++){.    k 
5760: 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  = p->aLookahead[
5770: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70  j].lookahead - p
5780: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20  ->mnLookahead + 
5790: 69 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f  i;.    p->aActio
57a0: 6e 5b 6b 5d 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61  n[k] = p->aLooka
57b0: 68 65 61 64 5b 6a 5d 3b 0a 20 20 20 20 69 66 28  head[j];.    if(
57c0: 20 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29   k>=p->nAction )
57d0: 20 70 2d 3e 6e 41 63 74 69 6f 6e 20 3d 20 6b 2b   p->nAction = k+
57e0: 31 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c 6f 6f  1;.  }.  p->nLoo
57f0: 6b 61 68 65 61 64 20 3d 20 30 3b 0a 0a 20 20 2f  kahead = 0;..  /
5800: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66  * Return the off
5810: 73 65 74 20 74 68 61 74 20 69 73 20 61 64 64 65  set that is adde
5820: 64 20 74 6f 20 74 68 65 20 6c 6f 6f 6b 61 68 65  d to the lookahe
5830: 61 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67  ad in order to g
5840: 65 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65  et the.  ** inde
5850: 78 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e  x into yy_action
5860: 20 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20 2a   of the action *
5870: 2f 0a 20 20 72 65 74 75 72 6e 20 69 20 2d 20 70  /.  return i - p
5880: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b 0a 7d  ->mnLookahead;.}
5890: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
58a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
58b0: 68 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 63  he file "build.c
58c0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
58d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
58e0: 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20  ./*.** Routines 
58f0: 74 6f 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  to construction 
5900: 74 68 65 20 66 69 6e 69 74 65 20 73 74 61 74 65  the finite state
5910: 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 74 68 65   machine for the
5920: 20 4c 45 4d 4f 4e 0a 2a 2a 20 70 61 72 73 65 72   LEMON.** parser
5930: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
5940: 2f 2a 20 46 69 6e 64 20 61 20 70 72 65 63 65 64  /* Find a preced
5950: 65 6e 63 65 20 73 79 6d 62 6f 6c 20 6f 66 20 65  ence symbol of e
5960: 76 65 72 79 20 72 75 6c 65 20 69 6e 20 74 68 65  very rule in the
5970: 20 67 72 61 6d 6d 61 72 2e 0a 2a 2a 20 0a 2a 2a   grammar..** .**
5980: 20 54 68 6f 73 65 20 72 75 6c 65 73 20 77 68 69   Those rules whi
5990: 63 68 20 68 61 76 65 20 61 20 70 72 65 63 65 64  ch have a preced
59a0: 65 6e 63 65 20 73 79 6d 62 6f 6c 20 63 6f 64 65  ence symbol code
59b0: 64 20 69 6e 20 74 68 65 20 69 6e 70 75 74 0a 2a  d in the input.*
59c0: 2a 20 67 72 61 6d 6d 61 72 20 75 73 69 6e 67 20  * grammar using 
59d0: 74 68 65 20 22 5b 73 79 6d 62 6f 6c 5d 22 20 63  the "[symbol]" c
59e0: 6f 6e 73 74 72 75 63 74 20 77 69 6c 6c 20 61 6c  onstruct will al
59f0: 72 65 61 64 79 20 68 61 76 65 20 74 68 65 0a 2a  ready have the.*
5a00: 2a 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 66 69  * rp->precsym fi
5a10: 65 6c 64 20 66 69 6c 6c 65 64 2e 20 20 4f 74 68  eld filled.  Oth
5a20: 65 72 20 72 75 6c 65 73 20 74 61 6b 65 20 61 73  er rules take as
5a30: 20 74 68 65 69 72 20 70 72 65 63 65 64 65 6e 63   their precedenc
5a40: 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 74 68 65 20  e.** symbol the 
5a50: 66 69 72 73 74 20 52 48 53 20 73 79 6d 62 6f 6c  first RHS symbol
5a60: 20 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20   with a defined 
5a70: 70 72 65 63 65 64 65 6e 63 65 2e 20 20 49 66 20  precedence.  If 
5a80: 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 74  there.** are not
5a90: 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 77 69 74   RHS symbols wit
5aa0: 68 20 61 20 64 65 66 69 6e 65 64 20 70 72 65 63  h a defined prec
5ab0: 65 64 65 6e 63 65 2c 20 74 68 65 20 70 72 65 63  edence, the prec
5ac0: 65 64 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c  edence.** symbol
5ad0: 20 66 69 65 6c 64 20 69 73 20 6c 65 66 74 20 62   field is left b
5ae0: 6c 61 6e 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69  lank..*/.void Fi
5af0: 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65  ndRulePrecedence
5b00: 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  s(struct lemon *
5b10: 78 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 72  xp).{.  struct r
5b20: 75 6c 65 20 2a 72 70 3b 0a 20 20 66 6f 72 28 72  ule *rp;.  for(r
5b30: 70 3d 78 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  p=xp->rule; rp; 
5b40: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
5b50: 20 20 69 66 28 20 72 70 2d 3e 70 72 65 63 73 79    if( rp->precsy
5b60: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  m==0 ){.      in
5b70: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 66 6f  t i, j;.      fo
5b80: 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
5b90: 73 20 26 26 20 72 70 2d 3e 70 72 65 63 73 79 6d  s && rp->precsym
5ba0: 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ==0; i++){.     
5bb0: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
5bc0: 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69   *sp = rp->rhs[i
5bd0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ];.        if( s
5be0: 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  p->type==MULTITE
5bf0: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
5c00: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
5c10: 70 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29  p->nsubsym; j++)
5c20: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
5c30: 28 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d  ( sp->subsym[j]-
5c40: 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20  >prec>=0 ){.    
5c50: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70 72            rp->pr
5c60: 65 63 73 79 6d 20 3d 20 73 70 2d 3e 73 75 62 73  ecsym = sp->subs
5c70: 79 6d 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 20  ym[j];.         
5c80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5c90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5ca0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
5cb0: 6c 73 65 20 69 66 28 20 73 70 2d 3e 70 72 65 63  lse if( sp->prec
5cc0: 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  >=0 ){.         
5cd0: 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20 72   rp->precsym = r
5ce0: 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20  p->rhs[i];.     
5cf0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
5d00: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b   }.  }.  return;
5d10: 0a 7d 0a 0a 2f 2a 20 46 69 6e 64 20 61 6c 6c 20  .}../* Find all 
5d20: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68 69  nonterminals whi
5d30: 63 68 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65  ch will generate
5d40: 20 74 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e   the empty strin
5d50: 67 2e 0a 2a 2a 20 54 68 65 6e 20 67 6f 20 62 61  g..** Then go ba
5d60: 63 6b 20 61 6e 64 20 63 6f 6d 70 75 74 65 20 74  ck and compute t
5d70: 68 65 20 66 69 72 73 74 20 73 65 74 73 20 6f 66  he first sets of
5d80: 20 65 76 65 72 79 20 6e 6f 6e 74 65 72 6d 69 6e   every nontermin
5d90: 61 6c 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  al..** The first
5da0: 20 73 65 74 20 69 73 20 74 68 65 20 73 65 74 20   set is the set 
5db0: 6f 66 20 61 6c 6c 20 74 65 72 6d 69 6e 61 6c 20  of all terminal 
5dc0: 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 63 61  symbols which ca
5dd0: 6e 20 62 65 67 69 6e 0a 2a 2a 20 61 20 73 74 72  n begin.** a str
5de0: 69 6e 67 20 67 65 6e 65 72 61 74 65 64 20 62 79  ing generated by
5df0: 20 74 68 61 74 20 6e 6f 6e 74 65 72 6d 69 6e 61   that nontermina
5e00: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46  l..*/.void FindF
5e10: 69 72 73 74 53 65 74 73 28 73 74 72 75 63 74 20  irstSets(struct 
5e20: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
5e30: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72   int i, j;.  str
5e40: 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20  uct rule *rp;.  
5e50: 69 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 0a 20  int progress;.. 
5e60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
5e70: 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
5e80: 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  .    lemp->symbo
5e90: 6c 73 5b 69 5d 2d 3e 6c 61 6d 62 64 61 20 3d 20  ls[i]->lambda = 
5ea0: 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 7d  LEMON_FALSE;.  }
5eb0: 0a 20 20 66 6f 72 28 69 3d 6c 65 6d 70 2d 3e 6e  .  for(i=lemp->n
5ec0: 74 65 72 6d 69 6e 61 6c 3b 20 69 3c 6c 65 6d 70  terminal; i<lemp
5ed0: 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
5ee0: 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  .    lemp->symbo
5ef0: 6c 73 5b 69 5d 2d 3e 66 69 72 73 74 73 65 74 20  ls[i]->firstset 
5f00: 3d 20 53 65 74 4e 65 77 28 29 3b 0a 20 20 7d 0a  = SetNew();.  }.
5f10: 0a 20 20 2f 2a 20 46 69 72 73 74 20 63 6f 6d 70  .  /* First comp
5f20: 75 74 65 20 61 6c 6c 20 6c 61 6d 62 64 61 73 20  ute all lambdas 
5f30: 2a 2f 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f  */.  do{.    pro
5f40: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66  gress = 0;.    f
5f50: 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65  or(rp=lemp->rule
5f60: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
5f70: 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70  t){.      if( rp
5f80: 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 29 20  ->lhs->lambda ) 
5f90: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
5fa0: 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
5fb0: 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
5fc0: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
5fd0: 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69   *sp = rp->rhs[i
5fe0: 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ];.        asser
5ff0: 74 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e  t( sp->type==NON
6000: 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e  TERMINAL || sp->
6010: 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41  lambda==LEMON_FA
6020: 4c 53 45 20 29 3b 0a 20 20 20 20 20 20 20 20 69  LSE );.        i
6030: 66 28 20 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 4c  f( sp->lambda==L
6040: 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62 72 65  EMON_FALSE ) bre
6050: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
6060: 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68    if( i==rp->nrh
6070: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72 70 2d  s ){.        rp-
6080: 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61 20 3d 20 4c  >lhs->lambda = L
6090: 45 4d 4f 4e 5f 54 52 55 45 3b 0a 20 20 20 20 20  EMON_TRUE;.     
60a0: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
60b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
60c0: 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73   }while( progres
60d0: 73 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63  s );..  /* Now c
60e0: 6f 6d 70 75 74 65 20 61 6c 6c 20 66 69 72 73 74  ompute all first
60f0: 20 73 65 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20   sets */.  do{. 
6100: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
6110: 20 2a 73 31 2c 20 2a 73 32 3b 0a 20 20 20 20 70   *s1, *s2;.    p
6120: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
6130: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
6140: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
6150: 65 78 74 29 7b 0a 20 20 20 20 20 20 73 31 20 3d  ext){.      s1 =
6160: 20 72 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20   rp->lhs;.      
6170: 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
6180: 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
6190: 20 20 20 73 32 20 3d 20 72 70 2d 3e 72 68 73 5b     s2 = rp->rhs[
61a0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
61b0: 73 32 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  s2->type==TERMIN
61c0: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
61d0: 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41  progress += SetA
61e0: 64 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c  dd(s1->firstset,
61f0: 73 32 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  s2->index);.    
6200: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6210: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
6220: 32 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49 54 45  2->type==MULTITE
6230: 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20  RMINAL ){.      
6240: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 73      for(j=0; j<s
6250: 32 2d 3e 6e 73 75 62 73 79 6d 3b 20 6a 2b 2b 29  2->nsubsym; j++)
6260: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  {.            pr
6270: 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41 64 64  ogress += SetAdd
6280: 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c 73 32  (s1->firstset,s2
6290: 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 69 6e 64  ->subsym[j]->ind
62a0: 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ex);.          }
62b0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
62c0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
62d0: 69 66 28 20 73 31 3d 3d 73 32 20 29 7b 0a 20 20  if( s1==s2 ){.  
62e0: 20 20 20 20 20 20 20 20 69 66 28 20 73 31 2d 3e          if( s1->
62f0: 6c 61 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41  lambda==LEMON_FA
6300: 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  LSE ) break;.   
6310: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6320: 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 2b        progress +
6330: 3d 20 53 65 74 55 6e 69 6f 6e 28 73 31 2d 3e 66  = SetUnion(s1->f
6340: 69 72 73 74 73 65 74 2c 73 32 2d 3e 66 69 72 73  irstset,s2->firs
6350: 74 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 20  tset);.         
6360: 20 69 66 28 20 73 32 2d 3e 6c 61 6d 62 64 61 3d   if( s2->lambda=
6370: 3d 4c 45 4d 4f 4e 5f 46 41 4c 53 45 20 29 20 62  =LEMON_FALSE ) b
6380: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
6390: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
63a0: 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73  }while( progress
63b0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   );.  return;.}.
63c0: 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20  ./* Compute all 
63d0: 4c 52 28 30 29 20 73 74 61 74 65 73 20 66 6f 72  LR(0) states for
63e0: 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 4c   the grammar.  L
63f0: 69 6e 6b 73 0a 2a 2a 20 61 72 65 20 61 64 64 65  inks.** are adde
6400: 64 20 74 6f 20 62 65 74 77 65 65 6e 20 73 6f 6d  d to between som
6410: 65 20 73 74 61 74 65 73 20 73 6f 20 74 68 61 74  e states so that
6420: 20 74 68 65 20 4c 52 28 31 29 20 66 6f 6c 6c 6f   the LR(1) follo
6430: 77 20 73 65 74 73 0a 2a 2a 20 63 61 6e 20 62 65  w sets.** can be
6440: 20 63 6f 6d 70 75 74 65 64 20 6c 61 74 65 72 2e   computed later.
6450: 0a 2a 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75  .*/.PRIVATE stru
6460: 63 74 20 73 74 61 74 65 20 2a 67 65 74 73 74 61  ct state *getsta
6470: 74 65 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  te(struct lemon 
6480: 2a 29 3b 20 20 2f 2a 20 66 6f 72 77 61 72 64 20  *);  /* forward 
6490: 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 76 6f 69  reference */.voi
64a0: 64 20 46 69 6e 64 53 74 61 74 65 73 28 73 74 72  d FindStates(str
64b0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
64c0: 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  .{.  struct symb
64d0: 6f 6c 20 2a 73 70 3b 0a 20 20 73 74 72 75 63 74  ol *sp;.  struct
64e0: 20 72 75 6c 65 20 2a 72 70 3b 0a 0a 20 20 43 6f   rule *rp;..  Co
64f0: 6e 66 69 67 6c 69 73 74 5f 69 6e 69 74 28 29 3b  nfiglist_init();
6500: 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
6510: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a  start symbol */.
6520: 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 72    if( lemp->star
6530: 74 20 29 7b 0a 20 20 20 20 73 70 20 3d 20 53 79  t ){.    sp = Sy
6540: 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e  mbol_find(lemp->
6550: 73 74 61 72 74 29 3b 0a 20 20 20 20 69 66 28 20  start);.    if( 
6560: 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  sp==0 ){.      E
6570: 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
6580: 6c 65 6e 61 6d 65 2c 30 2c 0a 22 54 68 65 20 73  lename,0,."The s
6590: 70 65 63 69 66 69 65 64 20 73 74 61 72 74 20 73  pecified start s
65a0: 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 69 73 20  ymbol \"%s\" is 
65b0: 6e 6f 74 20 5c 0a 69 6e 20 61 20 6e 6f 6e 74 65  not \.in a nonte
65c0: 72 6d 69 6e 61 6c 20 6f 66 20 74 68 65 20 67 72  rminal of the gr
65d0: 61 6d 6d 61 72 2e 20 20 5c 22 25 73 5c 22 20 77  ammar.  \"%s\" w
65e0: 69 6c 6c 20 62 65 20 75 73 65 64 20 61 73 20 74  ill be used as t
65f0: 68 65 20 73 74 61 72 74 20 5c 0a 73 79 6d 62 6f  he start \.symbo
6600: 6c 20 69 6e 73 74 65 61 64 2e 22 2c 6c 65 6d 70  l instead.",lemp
6610: 2d 3e 73 74 61 72 74 2c 6c 65 6d 70 2d 3e 72 75  ->start,lemp->ru
6620: 6c 65 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a  le->lhs->name);.
6630: 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
6640: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 70  rcnt++;.      sp
6650: 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c   = lemp->rule->l
6660: 68 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  hs;.    }.  }els
6670: 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70  e{.    sp = lemp
6680: 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d  ->rule->lhs;.  }
6690: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
66a0: 20 74 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f   the start symbo
66b0: 6c 20 64 6f 65 73 6e 27 74 20 6f 63 63 75 72 20  l doesn't occur 
66c0: 6f 6e 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  on the right-han
66d0: 64 20 73 69 64 65 20 6f 66 0a 20 20 2a 2a 20 61  d side of.  ** a
66e0: 6e 79 20 72 75 6c 65 2e 20 20 52 65 70 6f 72 74  ny rule.  Report
66f0: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 69 74 20   an error if it 
6700: 64 6f 65 73 2e 20 20 28 59 41 43 43 20 77 6f 75  does.  (YACC wou
6710: 6c 64 20 67 65 6e 65 72 61 74 65 20 61 20 6e 65  ld generate a ne
6720: 77 0a 20 20 2a 2a 20 73 74 61 72 74 20 73 79 6d  w.  ** start sym
6730: 62 6f 6c 20 69 6e 20 74 68 69 73 20 63 61 73 65  bol in this case
6740: 2e 29 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c  .) */.  for(rp=l
6750: 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
6760: 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
6770: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
6780: 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  i=0; i<rp->nrhs;
6790: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
67a0: 20 72 70 2d 3e 72 68 73 5b 69 5d 3d 3d 73 70 20   rp->rhs[i]==sp 
67b0: 29 7b 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20  ){   /* FIX ME: 
67c0: 20 44 65 61 6c 20 77 69 74 68 20 6d 75 6c 74 69   Deal with multi
67d0: 74 65 72 6d 69 6e 61 6c 73 20 2a 2f 0a 20 20 20  terminals */.   
67e0: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
67f0: 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a  mp->filename,0,.
6800: 22 54 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f  "The start symbo
6810: 6c 20 5c 22 25 73 5c 22 20 6f 63 63 75 72 73 20  l \"%s\" occurs 
6820: 6f 6e 20 74 68 65 20 5c 0a 72 69 67 68 74 2d 68  on the \.right-h
6830: 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 72 75  and side of a ru
6840: 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 72 65  le. This will re
6850: 73 75 6c 74 20 69 6e 20 61 20 70 61 72 73 65 72  sult in a parser
6860: 20 77 68 69 63 68 20 5c 0a 64 6f 65 73 20 6e 6f   which \.does no
6870: 74 20 77 6f 72 6b 20 70 72 6f 70 65 72 6c 79 2e  t work properly.
6880: 22 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  ",sp->name);.   
6890: 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72       lemp->error
68a0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  cnt++;.      }. 
68b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
68c0: 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75  he basis configu
68d0: 72 61 74 69 6f 6e 20 73 65 74 20 66 6f 72 20 74  ration set for t
68e0: 68 65 20 66 69 72 73 74 20 73 74 61 74 65 0a 20  he first state. 
68f0: 20 2a 2a 20 69 73 20 61 6c 6c 20 72 75 6c 65 73   ** is all rules
6900: 20 77 68 69 63 68 20 68 61 76 65 20 74 68 65 20   which have the 
6910: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 61 73 20  start symbol as 
6920: 74 68 65 69 72 0a 20 20 2a 2a 20 6c 65 66 74 2d  their.  ** left-
6930: 68 61 6e 64 20 73 69 64 65 20 2a 2f 0a 20 20 66  hand side */.  f
6940: 6f 72 28 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20  or(rp=sp->rule; 
6950: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 6c  rp; rp=rp->nextl
6960: 68 73 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  hs){.    struct 
6970: 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 70 3b 0a  config *newcfp;.
6980: 20 20 20 20 72 70 2d 3e 6c 68 73 53 74 61 72 74      rp->lhsStart
6990: 20 3d 20 31 3b 0a 20 20 20 20 6e 65 77 63 66 70   = 1;.    newcfp
69a0: 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64   = Configlist_ad
69b0: 64 62 61 73 69 73 28 72 70 2c 30 29 3b 0a 20 20  dbasis(rp,0);.  
69c0: 20 20 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d    SetAdd(newcfp-
69d0: 3e 66 77 73 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20  >fws,0);.  }..  
69e0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66  /* Compute the f
69f0: 69 72 73 74 20 73 74 61 74 65 2e 20 20 41 6c 6c  irst state.  All
6a00: 20 6f 74 68 65 72 20 73 74 61 74 65 73 20 77 69   other states wi
6a10: 6c 6c 20 62 65 0a 20 20 2a 2a 20 63 6f 6d 70 75  ll be.  ** compu
6a20: 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ted automaticall
6a30: 79 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  y during the com
6a40: 70 75 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  putation of the 
6a50: 66 69 72 73 74 20 6f 6e 65 2e 0a 20 20 2a 2a 20  first one..  ** 
6a60: 54 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 69  The returned poi
6a70: 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73  nter to the firs
6a80: 74 20 73 74 61 74 65 20 69 73 20 6e 6f 74 20 75  t state is not u
6a90: 73 65 64 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29  sed. */.  (void)
6aa0: 67 65 74 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a  getstate(lemp);.
6ab0: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
6ac0: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
6ad0: 20 74 6f 20 61 20 73 74 61 74 65 20 77 68 69 63   to a state whic
6ae0: 68 20 69 73 20 64 65 73 63 72 69 62 65 64 20 62  h is described b
6af0: 79 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  y the configurat
6b00: 69 6f 6e 0a 2a 2a 20 6c 69 73 74 20 77 68 69 63  ion.** list whic
6b10: 68 20 68 61 73 20 62 65 65 6e 20 62 75 69 6c 74  h has been built
6b20: 20 66 72 6f 6d 20 63 61 6c 6c 73 20 74 6f 20 43   from calls to C
6b30: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 2e 0a 2a  onfiglist_add..*
6b40: 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 62  /.PRIVATE void b
6b50: 75 69 6c 64 73 68 69 66 74 73 28 73 74 72 75 63  uildshifts(struc
6b60: 74 20 6c 65 6d 6f 6e 20 2a 2c 20 73 74 72 75 63  t lemon *, struc
6b70: 74 20 73 74 61 74 65 20 2a 29 3b 20 2f 2a 20 46  t state *); /* F
6b80: 6f 72 77 64 20 72 65 66 20 2a 2f 0a 50 52 49 56  orwd ref */.PRIV
6b90: 41 54 45 20 73 74 72 75 63 74 20 73 74 61 74 65  ATE struct state
6ba0: 20 2a 67 65 74 73 74 61 74 65 28 73 74 72 75 63   *getstate(struc
6bb0: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
6bc0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
6bd0: 20 2a 63 66 70 2c 20 2a 62 70 3b 0a 20 20 73 74   *cfp, *bp;.  st
6be0: 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
6bf0: 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74  ..  /* Extract t
6c00: 68 65 20 73 6f 72 74 65 64 20 62 61 73 69 73 20  he sorted basis 
6c10: 6f 66 20 74 68 65 20 6e 65 77 20 73 74 61 74 65  of the new state
6c20: 2e 20 20 54 68 65 20 62 61 73 69 73 20 77 61 73  .  The basis was
6c30: 20 63 6f 6e 73 74 72 75 63 74 65 64 0a 20 20 2a   constructed.  *
6c40: 2a 20 62 79 20 70 72 69 6f 72 20 63 61 6c 6c 73  * by prior calls
6c50: 20 74 6f 20 22 43 6f 6e 66 69 67 6c 69 73 74 5f   to "Configlist_
6c60: 61 64 64 62 61 73 69 73 28 29 22 2e 20 2a 2f 0a  addbasis()". */.
6c70: 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72    Configlist_sor
6c80: 74 62 61 73 69 73 28 29 3b 0a 20 20 62 70 20 3d  tbasis();.  bp =
6c90: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61 73 69   Configlist_basi
6ca0: 73 28 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 61  s();..  /* Get a
6cb0: 20 73 74 61 74 65 20 77 69 74 68 20 74 68 65 20   state with the 
6cc0: 73 61 6d 65 20 62 61 73 69 73 20 2a 2f 0a 20 20  same basis */.  
6cd0: 73 74 70 20 3d 20 53 74 61 74 65 5f 66 69 6e 64  stp = State_find
6ce0: 28 62 70 29 3b 0a 20 20 69 66 28 20 73 74 70 20  (bp);.  if( stp 
6cf0: 29 7b 0a 20 20 20 20 2f 2a 20 41 20 73 74 61 74  ){.    /* A stat
6d00: 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
6d10: 62 61 73 69 73 20 61 6c 72 65 61 64 79 20 65 78  basis already ex
6d20: 69 73 74 73 21 20 20 43 6f 70 79 20 61 6c 6c 20  ists!  Copy all 
6d30: 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 0a 20  the follow-set. 
6d40: 20 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 69 6f     ** propagatio
6d50: 6e 20 6c 69 6e 6b 73 20 66 72 6f 6d 20 74 68 65  n links from the
6d60: 20 73 74 61 74 65 20 75 6e 64 65 72 20 63 6f 6e   state under con
6d70: 73 74 72 75 63 74 69 6f 6e 20 69 6e 74 6f 20 74  struction into t
6d80: 68 65 0a 20 20 20 20 2a 2a 20 70 72 65 65 78 69  he.    ** preexi
6d90: 73 74 69 6e 67 20 73 74 61 74 65 2c 20 74 68 65  sting state, the
6da0: 6e 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  n return a point
6db0: 65 72 20 74 6f 20 74 68 65 20 70 72 65 65 78 69  er to the preexi
6dc0: 73 74 69 6e 67 20 73 74 61 74 65 20 2a 2f 0a 20  sting state */. 
6dd0: 20 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67     struct config
6de0: 20 2a 78 2c 20 2a 79 3b 0a 20 20 20 20 66 6f 72   *x, *y;.    for
6df0: 28 78 3d 62 70 2c 20 79 3d 73 74 70 2d 3e 62 70  (x=bp, y=stp->bp
6e00: 3b 20 78 20 26 26 20 79 3b 20 78 3d 78 2d 3e 62  ; x && y; x=x->b
6e10: 70 2c 20 79 3d 79 2d 3e 62 70 29 7b 0a 20 20 20  p, y=y->bp){.   
6e20: 20 20 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 26 79     Plink_copy(&y
6e30: 2d 3e 62 70 6c 70 2c 78 2d 3e 62 70 6c 70 29 3b  ->bplp,x->bplp);
6e40: 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 64 65 6c  .      Plink_del
6e50: 65 74 65 28 78 2d 3e 66 70 6c 70 29 3b 0a 20 20  ete(x->fplp);.  
6e60: 20 20 20 20 78 2d 3e 66 70 6c 70 20 3d 20 78 2d      x->fplp = x-
6e70: 3e 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 7d  >bplp = 0;.    }
6e80: 0a 20 20 20 20 63 66 70 20 3d 20 43 6f 6e 66 69  .    cfp = Confi
6e90: 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29 3b 0a  glist_return();.
6ea0: 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74 5f 65      Configlist_e
6eb0: 61 74 28 63 66 70 29 3b 0a 20 20 7d 65 6c 73 65  at(cfp);.  }else
6ec0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 72 65  {.    /* This re
6ed0: 61 6c 6c 79 20 69 73 20 61 20 6e 65 77 20 73 74  ally is a new st
6ee0: 61 74 65 2e 20 20 43 6f 6e 73 74 72 75 63 74 20  ate.  Construct 
6ef0: 61 6c 6c 20 74 68 65 20 64 65 74 61 69 6c 73 20  all the details 
6f00: 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73  */.    Configlis
6f10: 74 5f 63 6c 6f 73 75 72 65 28 6c 65 6d 70 29 3b  t_closure(lemp);
6f20: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74      /* Compute t
6f30: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
6f40: 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20   closure */.    
6f50: 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28  Configlist_sort(
6f60: 29 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );           /* 
6f70: 53 6f 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75  Sort the configu
6f80: 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a  ration closure *
6f90: 2f 0a 20 20 20 20 63 66 70 20 3d 20 43 6f 6e 66  /.    cfp = Conf
6fa0: 69 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 29 3b  iglist_return();
6fb0: 20 20 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e     /* Get a poin
6fc0: 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6e 66 69  ter to the confi
6fd0: 67 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 73 74  g list */.    st
6fe0: 70 20 3d 20 53 74 61 74 65 5f 6e 65 77 28 29 3b  p = State_new();
6ff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
7000: 6e 65 77 20 73 74 61 74 65 20 73 74 72 75 63 74  new state struct
7010: 75 72 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 6f 72  ure */.    Memor
7020: 79 43 68 65 63 6b 28 73 74 70 29 3b 0a 20 20 20  yCheck(stp);.   
7030: 20 73 74 70 2d 3e 62 70 20 3d 20 62 70 3b 20 20   stp->bp = bp;  
7040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7050: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63 6f   Remember the co
7060: 6e 66 69 67 75 72 61 74 69 6f 6e 20 62 61 73 69  nfiguration basi
7070: 73 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 63 66  s */.    stp->cf
7080: 70 20 3d 20 63 66 70 3b 20 20 20 20 20 20 20 20  p = cfp;        
7090: 20 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65        /* Remembe
70a0: 72 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  r the configurat
70b0: 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a 2f 0a 20  ion closure */. 
70c0: 20 20 20 73 74 70 2d 3e 73 74 61 74 65 6e 75 6d     stp->statenum
70d0: 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2b   = lemp->nstate+
70e0: 2b 3b 20 2f 2a 20 45 76 65 72 79 20 73 74 61 74  +; /* Every stat
70f0: 65 20 67 65 74 73 20 61 20 73 65 71 75 65 6e 63  e gets a sequenc
7100: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
7110: 73 74 70 2d 3e 61 70 20 3d 20 30 3b 20 20 20 20  stp->ap = 0;    
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7130: 4e 6f 20 61 63 74 69 6f 6e 73 2c 20 79 65 74 2e  No actions, yet.
7140: 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 5f 69 6e   */.    State_in
7150: 73 65 72 74 28 73 74 70 2c 73 74 70 2d 3e 62 70  sert(stp,stp->bp
7160: 29 3b 20 20 20 2f 2a 20 41 64 64 20 74 6f 20 74  );   /* Add to t
7170: 68 65 20 73 74 61 74 65 20 74 61 62 6c 65 20 2a  he state table *
7180: 2f 0a 20 20 20 20 62 75 69 6c 64 73 68 69 66 74  /.    buildshift
7190: 73 28 6c 65 6d 70 2c 73 74 70 29 3b 20 20 20 20  s(lemp,stp);    
71a0: 20 20 20 2f 2a 20 52 65 63 75 72 73 69 76 65 6c     /* Recursivel
71b0: 79 20 63 6f 6d 70 75 74 65 20 73 75 63 63 65 73  y compute succes
71c0: 73 6f 72 20 73 74 61 74 65 73 20 2a 2f 0a 20 20  sor states */.  
71d0: 7d 0a 20 20 72 65 74 75 72 6e 20 73 74 70 3b 0a  }.  return stp;.
71e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
71f0: 74 72 75 65 20 69 66 20 74 77 6f 20 73 79 6d 62  true if two symb
7200: 6f 6c 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  ols are the same
7210: 2e 0a 2a 2f 0a 69 6e 74 20 73 61 6d 65 5f 73 79  ..*/.int same_sy
7220: 6d 62 6f 6c 28 73 74 72 75 63 74 20 73 79 6d 62  mbol(struct symb
7230: 6f 6c 20 2a 61 2c 20 73 74 72 75 63 74 20 73 79  ol *a, struct sy
7240: 6d 62 6f 6c 20 2a 62 29 0a 7b 0a 20 20 69 6e 74  mbol *b).{.  int
7250: 20 69 3b 0a 20 20 69 66 28 20 61 3d 3d 62 20 29   i;.  if( a==b )
7260: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
7270: 20 61 2d 3e 74 79 70 65 21 3d 4d 55 4c 54 49 54   a->type!=MULTIT
7280: 45 52 4d 49 4e 41 4c 20 29 20 72 65 74 75 72 6e  ERMINAL ) return
7290: 20 30 3b 0a 20 20 69 66 28 20 62 2d 3e 74 79 70   0;.  if( b->typ
72a0: 65 21 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c  e!=MULTITERMINAL
72b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
72c0: 66 28 20 61 2d 3e 6e 73 75 62 73 79 6d 21 3d 62  f( a->nsubsym!=b
72d0: 2d 3e 6e 73 75 62 73 79 6d 20 29 20 72 65 74 75  ->nsubsym ) retu
72e0: 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rn 0;.  for(i=0;
72f0: 20 69 3c 61 2d 3e 6e 73 75 62 73 79 6d 3b 20 69   i<a->nsubsym; i
7300: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 2d 3e  ++){.    if( a->
7310: 73 75 62 73 79 6d 5b 69 5d 21 3d 62 2d 3e 73 75  subsym[i]!=b->su
7320: 62 73 79 6d 5b 69 5d 20 29 20 72 65 74 75 72 6e  bsym[i] ) return
7330: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
7340: 20 31 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73 74 72   1;.}../* Constr
7350: 75 63 74 20 61 6c 6c 20 73 75 63 63 65 73 73 6f  uct all successo
7360: 72 20 73 74 61 74 65 73 20 74 6f 20 74 68 65 20  r states to the 
7370: 67 69 76 65 6e 20 73 74 61 74 65 2e 20 20 41 20  given state.  A 
7380: 22 73 75 63 63 65 73 73 6f 72 22 0a 2a 2a 20 73  "successor".** s
7390: 74 61 74 65 20 69 73 20 61 6e 79 20 73 74 61 74  tate is any stat
73a0: 65 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 72  e which can be r
73b0: 65 61 63 68 65 64 20 62 79 20 61 20 73 68 69 66  eached by a shif
73c0: 74 20 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49  t action..*/.PRI
73d0: 56 41 54 45 20 76 6f 69 64 20 62 75 69 6c 64 73  VATE void builds
73e0: 68 69 66 74 73 28 73 74 72 75 63 74 20 6c 65 6d  hifts(struct lem
73f0: 6f 6e 20 2a 6c 65 6d 70 2c 20 73 74 72 75 63 74  on *lemp, struct
7400: 20 73 74 61 74 65 20 2a 73 74 70 29 0a 7b 0a 20   state *stp).{. 
7410: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
7420: 63 66 70 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  cfp;  /* For loo
7430: 70 69 6e 67 20 74 68 72 75 20 74 68 65 20 63 6f  ping thru the co
7440: 6e 66 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20  nfig closure of 
7450: 22 73 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63  "stp" */.  struc
7460: 74 20 63 6f 6e 66 69 67 20 2a 62 63 66 70 3b 20  t config *bcfp; 
7470: 2f 2a 20 46 6f 72 20 74 68 65 20 69 6e 6e 65 72  /* For the inner
7480: 20 6c 6f 6f 70 20 6f 6e 20 63 6f 6e 66 69 67 20   loop on config 
7490: 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22  closure of "stp"
74a0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   */.  struct con
74b0: 66 69 67 20 2a 6e 65 77 63 66 67 3b 20 20 2f 2a  fig *newcfg;  /*
74c0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
74d0: 62 6f 6c 20 2a 73 70 3b 20 20 20 2f 2a 20 53 79  bol *sp;   /* Sy
74e0: 6d 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  mbol following t
74f0: 68 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67  he dot in config
7500: 75 72 61 74 69 6f 6e 20 22 63 66 70 22 20 2a 2f  uration "cfp" */
7510: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
7520: 20 2a 62 73 70 3b 20 20 2f 2a 20 53 79 6d 62 6f   *bsp;  /* Symbo
7530: 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  l following the 
7540: 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61  dot in configura
7550: 74 69 6f 6e 20 22 62 63 66 70 22 20 2a 2f 0a 20  tion "bcfp" */. 
7560: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 6e   struct state *n
7570: 65 77 73 74 70 3b 20 2f 2a 20 41 20 70 6f 69 6e  ewstp; /* A poin
7580: 74 65 72 20 74 6f 20 61 20 73 75 63 63 65 73 73  ter to a success
7590: 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f  or state */..  /
75a0: 2a 20 45 61 63 68 20 63 6f 6e 66 69 67 75 72 61  * Each configura
75b0: 74 69 6f 6e 20 62 65 63 6f 6d 65 73 20 63 6f 6d  tion becomes com
75c0: 70 6c 65 74 65 20 61 66 74 65 72 20 69 74 20 63  plete after it c
75d0: 6f 6e 74 69 62 75 74 65 73 20 74 6f 20 61 20 73  ontibutes to a s
75e0: 75 63 63 65 73 73 6f 72 0a 20 20 2a 2a 20 73 74  uccessor.  ** st
75f0: 61 74 65 2e 20 20 49 6e 69 74 69 61 6c 6c 79 2c  ate.  Initially,
7600: 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69   all configurati
7610: 6f 6e 73 20 61 72 65 20 69 6e 63 6f 6d 70 6c 65  ons are incomple
7620: 74 65 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d  te */.  for(cfp=
7630: 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63  stp->cfp; cfp; c
7640: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 20 63 66  fp=cfp->next) cf
7650: 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f  p->status = INCO
7660: 4d 50 4c 45 54 45 3b 0a 0a 20 20 2f 2a 20 4c 6f  MPLETE;..  /* Lo
7670: 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63  op through all c
7680: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 6f 66  onfigurations of
7690: 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22   the state "stp"
76a0: 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74   */.  for(cfp=st
76b0: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
76c0: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  =cfp->next){.   
76d0: 20 69 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73   if( cfp->status
76e0: 3d 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e  ==COMPLETE ) con
76f0: 74 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72  tinue;    /* Alr
7700: 65 61 64 79 20 75 73 65 64 20 62 79 20 69 6e 6e  eady used by inn
7710: 65 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69  er loop */.    i
7720: 66 28 20 63 66 70 2d 3e 64 6f 74 3e 3d 63 66 70  f( cfp->dot>=cfp
7730: 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e  ->rp->nrhs ) con
7740: 74 69 6e 75 65 3b 20 20 2f 2a 20 43 61 6e 27 74  tinue;  /* Can't
7750: 20 73 68 69 66 74 20 74 68 69 73 20 63 6f 6e 66   shift this conf
7760: 69 67 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67  ig */.    Config
7770: 6c 69 73 74 5f 72 65 73 65 74 28 29 3b 20 20 20  list_reset();   
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 20 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20     /* Reset the 
77a0: 6e 65 77 20 63 6f 6e 66 69 67 20 73 65 74 20 2a  new config set *
77b0: 2f 0a 20 20 20 20 73 70 20 3d 20 63 66 70 2d 3e  /.    sp = cfp->
77c0: 72 70 2d 3e 72 68 73 5b 63 66 70 2d 3e 64 6f 74  rp->rhs[cfp->dot
77d0: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
77e0: 2a 20 53 79 6d 62 6f 6c 20 61 66 74 65 72 20 74  * Symbol after t
77f0: 68 65 20 64 6f 74 20 2a 2f 0a 0a 20 20 20 20 2f  he dot */..    /
7800: 2a 20 46 6f 72 20 65 76 65 72 79 20 63 6f 6e 66  * For every conf
7810: 69 67 75 72 61 74 69 6f 6e 20 69 6e 20 74 68 65  iguration in the
7820: 20 73 74 61 74 65 20 22 73 74 70 22 20 77 68 69   state "stp" whi
7830: 63 68 20 68 61 73 20 74 68 65 20 73 79 6d 62 6f  ch has the symbo
7840: 6c 20 22 73 70 22 0a 20 20 20 20 2a 2a 20 66 6f  l "sp".    ** fo
7850: 6c 6c 6f 77 69 6e 67 20 69 74 73 20 64 6f 74 2c  llowing its dot,
7860: 20 61 64 64 20 74 68 65 20 73 61 6d 65 20 63 6f   add the same co
7870: 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 74  nfiguration to t
7880: 68 65 20 62 61 73 69 73 20 73 65 74 20 75 6e 64  he basis set und
7890: 65 72 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72  er.    ** constr
78a0: 75 63 74 69 6f 6e 20 62 75 74 20 77 69 74 68 20  uction but with 
78b0: 74 68 65 20 64 6f 74 20 73 68 69 66 74 65 64 20  the dot shifted 
78c0: 6f 6e 65 20 73 79 6d 62 6f 6c 20 74 6f 20 74 68  one symbol to th
78d0: 65 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20  e right. */.    
78e0: 66 6f 72 28 62 63 66 70 3d 63 66 70 3b 20 62 63  for(bcfp=cfp; bc
78f0: 66 70 3b 20 62 63 66 70 3d 62 63 66 70 2d 3e 6e  fp; bcfp=bcfp->n
7900: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
7910: 62 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f  bcfp->status==CO
7920: 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75  MPLETE ) continu
7930: 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79  e;    /* Already
7940: 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 69   used */.      i
7950: 66 28 20 62 63 66 70 2d 3e 64 6f 74 3e 3d 62 63  f( bcfp->dot>=bc
7960: 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63  fp->rp->nrhs ) c
7970: 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 43 61 6e 27  ontinue; /* Can'
7980: 74 20 73 68 69 66 74 20 74 68 69 73 20 6f 6e 65  t shift this one
7990: 20 2a 2f 0a 20 20 20 20 20 20 62 73 70 20 3d 20   */.      bsp = 
79a0: 62 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 62 63  bcfp->rp->rhs[bc
79b0: 66 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20  fp->dot];       
79c0: 20 20 20 20 2f 2a 20 47 65 74 20 73 79 6d 62 6f      /* Get symbo
79d0: 6c 20 61 66 74 65 72 20 64 6f 74 20 2a 2f 0a 20  l after dot */. 
79e0: 20 20 20 20 20 69 66 28 20 21 73 61 6d 65 5f 73       if( !same_s
79f0: 79 6d 62 6f 6c 28 62 73 70 2c 73 70 29 20 29 20  ymbol(bsp,sp) ) 
7a00: 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20 20 2f  continue;      /
7a10: 2a 20 4d 75 73 74 20 62 65 20 73 61 6d 65 20 61  * Must be same a
7a20: 73 20 66 6f 72 20 22 63 66 70 22 20 2a 2f 0a 20  s for "cfp" */. 
7a30: 20 20 20 20 20 62 63 66 70 2d 3e 73 74 61 74 75       bcfp->statu
7a40: 73 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 20 20 20  s = COMPLETE;   
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7a60: 2a 20 4d 61 72 6b 20 74 68 69 73 20 63 6f 6e 66  * Mark this conf
7a70: 69 67 20 61 73 20 75 73 65 64 20 2a 2f 0a 20 20  ig as used */.  
7a80: 20 20 20 20 6e 65 77 63 66 67 20 3d 20 43 6f 6e      newcfg = Con
7a90: 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73  figlist_addbasis
7aa0: 28 62 63 66 70 2d 3e 72 70 2c 62 63 66 70 2d 3e  (bcfp->rp,bcfp->
7ab0: 64 6f 74 2b 31 29 3b 0a 20 20 20 20 20 20 50 6c  dot+1);.      Pl
7ac0: 69 6e 6b 5f 61 64 64 28 26 6e 65 77 63 66 67 2d  ink_add(&newcfg-
7ad0: 3e 62 70 6c 70 2c 62 63 66 70 29 3b 0a 20 20 20  >bplp,bcfp);.   
7ae0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 61   }..    /* Get a
7af0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
7b00: 73 74 61 74 65 20 64 65 73 63 72 69 62 65 64 20  state described 
7b10: 62 79 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e  by the basis con
7b20: 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 0a 20  figuration set. 
7b30: 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74 65     ** constructe
7b40: 64 20 69 6e 20 74 68 65 20 70 72 65 63 65 64 69  d in the precedi
7b50: 6e 67 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 6e  ng loop */.    n
7b60: 65 77 73 74 70 20 3d 20 67 65 74 73 74 61 74 65  ewstp = getstate
7b70: 28 6c 65 6d 70 29 3b 0a 0a 20 20 20 20 2f 2a 20  (lemp);..    /* 
7b80: 54 68 65 20 73 74 61 74 65 20 22 6e 65 77 73 74  The state "newst
7b90: 70 22 20 69 73 20 72 65 61 63 68 65 64 20 66 72  p" is reached fr
7ba0: 6f 6d 20 74 68 65 20 73 74 61 74 65 20 22 73 74  om the state "st
7bb0: 70 22 20 62 79 20 61 20 73 68 69 66 74 20 61 63  p" by a shift ac
7bc0: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6f 6e 20 74  tion.    ** on t
7bd0: 68 65 20 73 79 6d 62 6f 6c 20 22 73 70 22 20 2a  he symbol "sp" *
7be0: 2f 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79  /.    if( sp->ty
7bf0: 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
7c00: 4c 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  L ){.      int i
7c10: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
7c20: 20 69 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b 20   i<sp->nsubsym; 
7c30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 41 63  i++){.        Ac
7c40: 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61  tion_add(&stp->a
7c50: 70 2c 53 48 49 46 54 2c 73 70 2d 3e 73 75 62 73  p,SHIFT,sp->subs
7c60: 79 6d 5b 69 5d 2c 28 63 68 61 72 2a 29 6e 65 77  ym[i],(char*)new
7c70: 73 74 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  stp);.      }.  
7c80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 41    }else{.      A
7c90: 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e  ction_add(&stp->
7ca0: 61 70 2c 53 48 49 46 54 2c 73 70 2c 28 63 68 61  ap,SHIFT,sp,(cha
7cb0: 72 20 2a 29 6e 65 77 73 74 70 29 3b 0a 20 20 20  r *)newstp);.   
7cc0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
7cd0: 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 70 72  Construct the pr
7ce0: 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a  opagation links.
7cf0: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b  */.void FindLink
7d00: 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  s(struct lemon *
7d10: 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69 3b  lemp).{.  int i;
7d20: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
7d30: 20 2a 63 66 70 2c 20 2a 6f 74 68 65 72 3b 0a 20   *cfp, *other;. 
7d40: 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
7d50: 74 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  tp;.  struct pli
7d60: 6e 6b 20 2a 70 6c 70 3b 0a 0a 20 20 2f 2a 20 48  nk *plp;..  /* H
7d70: 6f 75 73 65 6b 65 65 70 69 6e 67 20 64 65 74 61  ousekeeping deta
7d80: 69 6c 3a 0a 20 20 2a 2a 20 41 64 64 20 74 6f 20  il:.  ** Add to 
7d90: 65 76 65 72 79 20 70 72 6f 70 61 67 61 74 65 20  every propagate 
7da0: 6c 69 6e 6b 20 61 20 70 6f 69 6e 74 65 72 20 62  link a pointer b
7db0: 61 63 6b 20 74 6f 20 74 68 65 20 73 74 61 74 65  ack to the state
7dc0: 20 74 6f 0a 20 20 2a 2a 20 77 68 69 63 68 20 74   to.  ** which t
7dd0: 68 65 20 6c 69 6e 6b 20 69 73 20 61 74 74 61 63  he link is attac
7de0: 68 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  hed. */.  for(i=
7df0: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
7e00: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  e; i++){.    stp
7e10: 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
7e20: 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d  i];.    for(cfp=
7e30: 73 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63  stp->cfp; cfp; c
7e40: 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20  fp=cfp->next){. 
7e50: 20 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20       cfp->stp = 
7e60: 73 74 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  stp;.    }.  }..
7e70: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 61 6c 6c    /* Convert all
7e80: 20 62 61 63 6b 6c 69 6e 6b 73 20 69 6e 74 6f 20   backlinks into 
7e90: 66 6f 72 77 61 72 64 20 6c 69 6e 6b 73 2e 20 20  forward links.  
7ea0: 4f 6e 6c 79 20 74 68 65 20 66 6f 72 77 61 72 64  Only the forward
7eb0: 0a 20 20 2a 2a 20 6c 69 6e 6b 73 20 61 72 65 20  .  ** links are 
7ec0: 75 73 65 64 20 69 6e 20 74 68 65 20 66 6f 6c 6c  used in the foll
7ed0: 6f 77 2d 73 65 74 20 63 6f 6d 70 75 74 61 74 69  ow-set computati
7ee0: 6f 6e 2e 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  on. */.  for(i=0
7ef0: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
7f00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20  ; i++){.    stp 
7f10: 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69  = lemp->sorted[i
7f20: 5d 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73  ];.    for(cfp=s
7f30: 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66  tp->cfp; cfp; cf
7f40: 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  p=cfp->next){.  
7f50: 20 20 20 20 66 6f 72 28 70 6c 70 3d 63 66 70 2d      for(plp=cfp-
7f60: 3e 62 70 6c 70 3b 20 70 6c 70 3b 20 70 6c 70 3d  >bplp; plp; plp=
7f70: 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  plp->next){.    
7f80: 20 20 20 20 6f 74 68 65 72 20 3d 20 70 6c 70 2d      other = plp-
7f90: 3e 63 66 70 3b 0a 20 20 20 20 20 20 20 20 50 6c  >cfp;.        Pl
7fa0: 69 6e 6b 5f 61 64 64 28 26 6f 74 68 65 72 2d 3e  ink_add(&other->
7fb0: 66 70 6c 70 2c 63 66 70 29 3b 0a 20 20 20 20 20  fplp,cfp);.     
7fc0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
7fd0: 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 66  /* Compute all f
7fe0: 6f 6c 6c 6f 77 73 65 74 73 2e 0a 2a 2a 0a 2a 2a  ollowsets..**.**
7ff0: 20 41 20 66 6f 6c 6c 6f 77 73 65 74 20 69 73 20   A followset is 
8000: 74 68 65 20 73 65 74 20 6f 66 20 61 6c 6c 20 73  the set of all s
8010: 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 63 61 6e  ymbols which can
8020: 20 63 6f 6d 65 20 69 6d 6d 65 64 69 61 74 65 6c   come immediatel
8030: 79 0a 2a 2a 20 61 66 74 65 72 20 61 20 63 6f 6e  y.** after a con
8040: 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76  figuration..*/.v
8050: 6f 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65  oid FindFollowSe
8060: 74 73 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  ts(struct lemon 
8070: 2a 6c 65 6d 70 29 0a 7b 0a 20 20 69 6e 74 20 69  *lemp).{.  int i
8080: 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  ;.  struct confi
8090: 67 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74  g *cfp;.  struct
80a0: 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 20 20 69   plink *plp;.  i
80b0: 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 20 20 69  nt progress;.  i
80c0: 6e 74 20 63 68 61 6e 67 65 3b 0a 0a 20 20 66 6f  nt change;..  fo
80d0: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
80e0: 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
80f0: 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73   for(cfp=lemp->s
8100: 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63  orted[i]->cfp; c
8110: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
8120: 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e 73  t){.      cfp->s
8130: 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45  tatus = INCOMPLE
8140: 54 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  TE;.    }.  }.  
8150: 0a 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72  .  do{.    progr
8160: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72  ess = 0;.    for
8170: 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
8180: 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  tate; i++){.    
8190: 20 20 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e    for(cfp=lemp->
81a0: 73 6f 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20  sorted[i]->cfp; 
81b0: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
81c0: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  xt){.        if(
81d0: 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f   cfp->status==CO
81e0: 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75  MPLETE ) continu
81f0: 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  e;.        for(p
8200: 6c 70 3d 63 66 70 2d 3e 66 70 6c 70 3b 20 70 6c  lp=cfp->fplp; pl
8210: 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74  p; plp=plp->next
8220: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  ){.          cha
8230: 6e 67 65 20 3d 20 53 65 74 55 6e 69 6f 6e 28 70  nge = SetUnion(p
8240: 6c 70 2d 3e 63 66 70 2d 3e 66 77 73 2c 63 66 70  lp->cfp->fws,cfp
8250: 2d 3e 66 77 73 29 3b 0a 20 20 20 20 20 20 20 20  ->fws);.        
8260: 20 20 69 66 28 20 63 68 61 6e 67 65 20 29 7b 0a    if( change ){.
8270: 20 20 20 20 20 20 20 20 20 20 20 20 70 6c 70 2d              plp-
8280: 3e 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49  >cfp->status = I
8290: 4e 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20  NCOMPLETE;.     
82a0: 20 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20         progress 
82b0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
82c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
82d0: 20 20 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d     cfp->status =
82e0: 20 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20   COMPLETE;.     
82f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c   }.    }.  }whil
8300: 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 7d  e( progress );.}
8310: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  ..static int res
8320: 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 73 74  olve_conflict(st
8330: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 2c 73 74  ruct action *,st
8340: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 29 3b 0a  ruct action *);.
8350: 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20  ./* Compute the 
8360: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 2c 20  reduce actions, 
8370: 61 6e 64 20 72 65 73 6f 6c 76 65 20 63 6f 6e 66  and resolve conf
8380: 6c 69 63 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 46  licts..*/.void F
8390: 69 6e 64 41 63 74 69 6f 6e 73 28 73 74 72 75 63  indActions(struc
83a0: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
83b0: 0a 20 20 69 6e 74 20 69 2c 6a 3b 0a 20 20 73 74  .  int i,j;.  st
83c0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
83d0: 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
83e0: 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
83f0: 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 73 74  symbol *sp;.  st
8400: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 0a  ruct rule *rp;..
8410: 20 20 2f 2a 20 41 64 64 20 61 6c 6c 20 6f 66 20    /* Add all of 
8420: 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69 6f  the reduce actio
8430: 6e 73 20 0a 20 20 2a 2a 20 41 20 72 65 64 75 63  ns .  ** A reduc
8440: 65 20 61 63 74 69 6f 6e 20 69 73 20 61 64 64 65  e action is adde
8450: 64 20 66 6f 72 20 65 61 63 68 20 65 6c 65 6d 65  d for each eleme
8460: 6e 74 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  nt of the follow
8470: 73 65 74 20 6f 66 0a 20 20 2a 2a 20 61 20 63 6f  set of.  ** a co
8480: 6e 66 69 67 75 72 61 74 69 6f 6e 20 77 68 69 63  nfiguration whic
8490: 68 20 68 61 73 20 69 74 73 20 64 6f 74 20 61 74  h has its dot at
84a0: 20 74 68 65 20 65 78 74 72 65 6d 65 20 72 69 67   the extreme rig
84b0: 68 74 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ht..  */.  for(i
84c0: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
84d0: 74 65 3b 20 69 2b 2b 29 7b 20 20 20 2f 2a 20 4c  te; i++){   /* L
84e0: 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 73 74 61  oop over all sta
84f0: 74 65 73 20 2a 2f 0a 20 20 20 20 73 74 70 20 3d  tes */.    stp =
8500: 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
8510: 3b 0a 20 20 20 20 66 6f 72 28 63 66 70 3d 73 74  ;.    for(cfp=st
8520: 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70  p->cfp; cfp; cfp
8530: 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 20 20 2f 2a  =cfp->next){  /*
8540: 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c 6c 20 63   Loop over all c
8550: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f  onfigurations */
8560: 0a 20 20 20 20 20 20 69 66 28 20 63 66 70 2d 3e  .      if( cfp->
8570: 72 70 2d 3e 6e 72 68 73 3d 3d 63 66 70 2d 3e 64  rp->nrhs==cfp->d
8580: 6f 74 20 29 7b 20 20 20 20 20 20 20 20 2f 2a 20  ot ){        /* 
8590: 49 73 20 64 6f 74 20 61 74 20 65 78 74 72 65 6d  Is dot at extrem
85a0: 65 20 72 69 67 68 74 3f 20 2a 2f 0a 20 20 20 20  e right? */.    
85b0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c      for(j=0; j<l
85c0: 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
85d0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
85e0: 69 66 28 20 53 65 74 46 69 6e 64 28 63 66 70 2d  if( SetFind(cfp-
85f0: 3e 66 77 73 2c 6a 29 20 29 7b 0a 20 20 20 20 20  >fws,j) ){.     
8600: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20         /* Add a 
8610: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 74 6f  reduce action to
8620: 20 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22   the state "stp"
8630: 20 77 68 69 63 68 20 77 69 6c 6c 20 72 65 64 75   which will redu
8640: 63 65 20 62 79 20 74 68 65 0a 20 20 20 20 20 20  ce by the.      
8650: 20 20 20 20 20 20 2a 2a 20 72 75 6c 65 20 22 63        ** rule "c
8660: 66 70 2d 3e 72 70 22 20 69 66 20 74 68 65 20 6c  fp->rp" if the l
8670: 6f 6f 6b 61 68 65 61 64 20 73 79 6d 62 6f 6c 20  ookahead symbol 
8680: 69 73 20 22 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  is "lemp->symbol
8690: 73 5b 6a 5d 22 20 2a 2f 0a 20 20 20 20 20 20 20  s[j]" */.       
86a0: 20 20 20 20 20 41 63 74 69 6f 6e 5f 61 64 64 28       Action_add(
86b0: 26 73 74 70 2d 3e 61 70 2c 52 45 44 55 43 45 2c  &stp->ap,REDUCE,
86c0: 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d  lemp->symbols[j]
86d0: 2c 28 63 68 61 72 20 2a 29 63 66 70 2d 3e 72 70  ,(char *)cfp->rp
86e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
86f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8700: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
8710: 20 41 64 64 20 74 68 65 20 61 63 63 65 70 74 69   Add the accepti
8720: 6e 67 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 69 66  ng token */.  if
8730: 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b  ( lemp->start ){
8740: 0a 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c  .    sp = Symbol
8750: 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72  _find(lemp->star
8760: 74 29 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d  t);.    if( sp==
8770: 30 20 29 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72  0 ) sp = lemp->r
8780: 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 65 6c 73  ule->lhs;.  }els
8790: 65 7b 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70  e{.    sp = lemp
87a0: 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d  ->rule->lhs;.  }
87b0: 0a 20 20 2f 2a 20 41 64 64 20 74 6f 20 74 68 65  .  /* Add to the
87c0: 20 66 69 72 73 74 20 73 74 61 74 65 20 28 77 68   first state (wh
87d0: 69 63 68 20 69 73 20 61 6c 77 61 79 73 20 74 68  ich is always th
87e0: 65 20 73 74 61 72 74 69 6e 67 20 73 74 61 74 65  e starting state
87f0: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e   of the.  ** fin
8800: 69 74 65 20 73 74 61 74 65 20 6d 61 63 68 69 6e  ite state machin
8810: 65 29 20 61 6e 20 61 63 74 69 6f 6e 20 74 6f 20  e) an action to 
8820: 41 43 43 45 50 54 20 69 66 20 74 68 65 20 6c 6f  ACCEPT if the lo
8830: 6f 6b 61 68 65 61 64 20 69 73 20 74 68 65 0a 20  okahead is the. 
8840: 20 2a 2a 20 73 74 61 72 74 20 6e 6f 6e 74 65 72   ** start nonter
8850: 6d 69 6e 61 6c 2e 20 20 2a 2f 0a 20 20 41 63 74  minal.  */.  Act
8860: 69 6f 6e 5f 61 64 64 28 26 6c 65 6d 70 2d 3e 73  ion_add(&lemp->s
8870: 6f 72 74 65 64 5b 30 5d 2d 3e 61 70 2c 41 43 43  orted[0]->ap,ACC
8880: 45 50 54 2c 73 70 2c 30 29 3b 0a 0a 20 20 2f 2a  EPT,sp,0);..  /*
8890: 20 52 65 73 6f 6c 76 65 20 63 6f 6e 66 6c 69 63   Resolve conflic
88a0: 74 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ts */.  for(i=0;
88b0: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
88c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
88d0: 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20 2a 6e  t action *ap, *n
88e0: 61 70 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  ap;.    struct s
88f0: 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 20 20 73  tate *stp;.    s
8900: 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
8910: 64 5b 69 5d 3b 0a 20 20 20 20 2f 2a 20 61 73 73  d[i];.    /* ass
8920: 65 72 74 28 20 73 74 70 2d 3e 61 70 20 29 3b 20  ert( stp->ap ); 
8930: 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d  */.    stp->ap =
8940: 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70   Action_sort(stp
8950: 2d 3e 61 70 29 3b 0a 20 20 20 20 66 6f 72 28 61  ->ap);.    for(a
8960: 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 20 26 26  p=stp->ap; ap &&
8970: 20 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3d 61 70   ap->next; ap=ap
8980: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66  ->next){.      f
8990: 6f 72 28 6e 61 70 3d 61 70 2d 3e 6e 65 78 74 3b  or(nap=ap->next;
89a0: 20 6e 61 70 20 26 26 20 6e 61 70 2d 3e 73 70 3d   nap && nap->sp=
89b0: 3d 61 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e 61 70  =ap->sp; nap=nap
89c0: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
89d0: 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 61 63 74    /* The two act
89e0: 69 6f 6e 73 20 22 61 70 22 20 61 6e 64 20 22 6e  ions "ap" and "n
89f0: 61 70 22 20 68 61 76 65 20 74 68 65 20 73 61 6d  ap" have the sam
8a00: 65 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20  e lookahead..   
8a10: 20 20 20 20 20 20 2a 2a 20 46 69 67 75 72 65 20        ** Figure 
8a20: 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 73 68  out which one sh
8a30: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 2a 2f 0a  ould be used */.
8a40: 20 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 6e           lemp->n
8a50: 63 6f 6e 66 6c 69 63 74 20 2b 3d 20 72 65 73 6f  conflict += reso
8a60: 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70 2c  lve_conflict(ap,
8a70: 6e 61 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  nap);.      }.  
8a80: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65    }.  }..  /* Re
8a90: 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 66 6f  port an error fo
8aa0: 72 20 65 61 63 68 20 72 75 6c 65 20 74 68 61 74  r each rule that
8ab0: 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 72 65   can never be re
8ac0: 64 75 63 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28  duced. */.  for(
8ad0: 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
8ae0: 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 20  p; rp=rp->next) 
8af0: 72 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d 20  rp->canReduce = 
8b00: 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20 20 66  LEMON_FALSE;.  f
8b10: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
8b20: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
8b30: 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20    struct action 
8b40: 2a 61 70 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  *ap;.    for(ap=
8b50: 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d  lemp->sorted[i]-
8b60: 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
8b70: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  next){.      if(
8b80: 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43   ap->type==REDUC
8b90: 45 20 29 20 61 70 2d 3e 78 2e 72 70 2d 3e 63 61  E ) ap->x.rp->ca
8ba0: 6e 52 65 64 75 63 65 20 3d 20 4c 45 4d 4f 4e 5f  nReduce = LEMON_
8bb0: 54 52 55 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  TRUE;.    }.  }.
8bc0: 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
8bd0: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
8be0: 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 72  next){.    if( r
8bf0: 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 29 20 63  p->canReduce ) c
8c00: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 45 72 72  ontinue;.    Err
8c10: 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
8c20: 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e  name,rp->rulelin
8c30: 65 2c 22 54 68 69 73 20 72 75 6c 65 20 63 61 6e  e,"This rule can
8c40: 20 6e 6f 74 20 62 65 20 72 65 64 75 63 65 64 2e   not be reduced.
8c50: 5c 6e 22 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e  \n");.    lemp->
8c60: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a  errorcnt++;.  }.
8c70: 7d 0a 0a 2f 2a 20 52 65 73 6f 6c 76 65 20 61 20  }../* Resolve a 
8c80: 63 6f 6e 66 6c 69 63 74 20 62 65 74 77 65 65 6e  conflict between
8c90: 20 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20 61   the two given a
8ca0: 63 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 0a  ctions.  If the.
8cb0: 2a 2a 20 63 6f 6e 66 6c 69 63 74 20 63 61 6e 27  ** conflict can'
8cc0: 74 20 62 65 20 72 65 73 6f 6c 76 65 64 2c 20 72  t be resolved, r
8cd0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a  eturn non-zero..
8ce0: 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e 47 45 52 20  **.** NO LONGER 
8cf0: 54 52 55 45 3a 0a 2a 2a 20 20 20 54 6f 20 72 65  TRUE:.**   To re
8d00: 73 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69 63 74  solve a conflict
8d10: 2c 20 66 69 72 73 74 20 6c 6f 6f 6b 20 74 6f 20  , first look to 
8d20: 73 65 65 20 69 66 20 65 69 74 68 65 72 20 61 63  see if either ac
8d30: 74 69 6f 6e 0a 2a 2a 20 20 20 69 73 20 6f 6e 20  tion.**   is on 
8d40: 61 6e 20 65 72 72 6f 72 20 72 75 6c 65 2e 20 20  an error rule.  
8d50: 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74 61  In that case, ta
8d60: 6b 65 20 74 68 65 20 61 63 74 69 6f 6e 20 77 68  ke the action wh
8d70: 69 63 68 0a 2a 2a 20 20 20 69 73 20 6e 6f 74 20  ich.**   is not 
8d80: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
8d90: 74 68 65 20 65 72 72 6f 72 20 72 75 6c 65 2e 20  the error rule. 
8da0: 20 49 66 20 6e 65 69 74 68 65 72 20 6f 72 20 62   If neither or b
8db0: 6f 74 68 0a 2a 2a 20 20 20 61 63 74 69 6f 6e 73  oth.**   actions
8dc0: 20 61 72 65 20 61 73 73 6f 63 69 61 74 65 64 20   are associated 
8dd0: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 72 75  with an error ru
8de0: 6c 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 0a  le, then try to.
8df0: 2a 2a 20 20 20 75 73 65 20 70 72 65 63 65 64 65  **   use precede
8e00: 6e 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 74  nce to resolve t
8e10: 68 65 20 63 6f 6e 66 6c 69 63 74 2e 0a 2a 2a 0a  he conflict..**.
8e20: 2a 2a 20 49 66 20 65 69 74 68 65 72 20 61 63 74  ** If either act
8e30: 69 6f 6e 20 69 73 20 61 20 53 48 49 46 54 2c 20  ion is a SHIFT, 
8e40: 74 68 65 6e 20 69 74 20 6d 75 73 74 20 62 65 20  then it must be 
8e50: 61 70 78 2e 20 20 54 68 69 73 0a 2a 2a 20 66 75  apx.  This.** fu
8e60: 6e 63 74 69 6f 6e 20 77 6f 6e 27 74 20 77 6f 72  nction won't wor
8e70: 6b 20 69 66 20 61 70 78 2d 3e 74 79 70 65 3d 3d  k if apx->type==
8e80: 52 45 44 55 43 45 20 61 6e 64 20 61 70 79 2d 3e  REDUCE and apy->
8e90: 74 79 70 65 3d 3d 53 48 49 46 54 2e 0a 2a 2f 0a  type==SHIFT..*/.
8ea0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
8eb0: 76 65 5f 63 6f 6e 66 6c 69 63 74 28 0a 20 20 73  ve_conflict(.  s
8ec0: 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70  truct action *ap
8ed0: 78 2c 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  x,.  struct acti
8ee0: 6f 6e 20 2a 61 70 79 0a 29 7b 0a 20 20 73 74 72  on *apy.){.  str
8ef0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 78 2c  uct symbol *spx,
8f00: 20 2a 73 70 79 3b 0a 20 20 69 6e 74 20 65 72 72   *spy;.  int err
8f10: 63 6e 74 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  cnt = 0;.  asser
8f20: 74 28 20 61 70 78 2d 3e 73 70 3d 3d 61 70 79 2d  t( apx->sp==apy-
8f30: 3e 73 70 20 29 3b 20 20 2f 2a 20 4f 74 68 65 72  >sp );  /* Other
8f40: 77 69 73 65 20 74 68 65 72 65 20 77 6f 75 6c 64  wise there would
8f50: 20 62 65 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 20   be no conflict 
8f60: 2a 2f 0a 20 20 69 66 28 20 61 70 78 2d 3e 74 79  */.  if( apx->ty
8f70: 70 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70 79  pe==SHIFT && apy
8f80: 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 20 29 7b  ->type==SHIFT ){
8f90: 0a 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d  .    apy->type =
8fa0: 20 53 53 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20   SSCONFLICT;.   
8fb0: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20   errcnt++;.  }. 
8fc0: 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d   if( apx->type==
8fd0: 53 48 49 46 54 20 26 26 20 61 70 79 2d 3e 74 79  SHIFT && apy->ty
8fe0: 70 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20  pe==REDUCE ){.  
8ff0: 20 20 73 70 78 20 3d 20 61 70 78 2d 3e 73 70 3b    spx = apx->sp;
9000: 0a 20 20 20 20 73 70 79 20 3d 20 61 70 79 2d 3e  .    spy = apy->
9010: 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a 20  x.rp->precsym;. 
9020: 20 20 20 69 66 28 20 73 70 79 3d 3d 30 20 7c 7c     if( spy==0 ||
9030: 20 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 20   spx->prec<0 || 
9040: 73 70 79 2d 3e 70 72 65 63 3c 30 20 29 7b 0a 20  spy->prec<0 ){. 
9050: 20 20 20 20 20 2f 2a 20 4e 6f 74 20 65 6e 6f 75       /* Not enou
9060: 67 68 20 70 72 65 63 65 64 65 6e 63 65 20 69 6e  gh precedence in
9070: 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20  formation. */.  
9080: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20      apy->type = 
9090: 53 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20  SRCONFLICT;.    
90a0: 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20    errcnt++;.    
90b0: 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70  }else if( spx->p
90c0: 72 65 63 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b  rec>spy->prec ){
90d0: 20 20 20 20 2f 2a 20 68 69 67 68 65 72 20 70 72      /* higher pr
90e0: 65 63 65 64 65 6e 63 65 20 77 69 6e 73 20 2a 2f  ecedence wins */
90f0: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
9100: 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a   = RD_RESOLVED;.
9110: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
9120: 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72 65  x->prec<spy->pre
9130: 63 20 29 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e  c ){.      apx->
9140: 74 79 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56  type = SH_RESOLV
9150: 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ED;.    }else if
9160: 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79  ( spx->prec==spy
9170: 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61  ->prec && spx->a
9180: 73 73 6f 63 3d 3d 52 49 47 48 54 20 29 7b 20 2f  ssoc==RIGHT ){ /
9190: 2a 20 55 73 65 20 6f 70 65 72 61 74 6f 72 20 2a  * Use operator *
91a0: 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  /.      apy->typ
91b0: 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b  e = RD_RESOLVED;
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
91e0: 61 73 73 6f 63 69 61 74 69 76 69 74 79 20 2a 2f  associativity */
91f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
9200: 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70  px->prec==spy->p
9210: 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f  rec && spx->asso
9220: 63 3d 3d 4c 45 46 54 20 29 7b 20 20 2f 2a 20 74  c==LEFT ){  /* t
9230: 6f 20 62 72 65 61 6b 20 74 69 65 20 2a 2f 0a 20  o break tie */. 
9240: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d       apx->type =
9250: 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   SH_RESOLVED;.  
9260: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
9270: 73 73 65 72 74 28 20 73 70 78 2d 3e 70 72 65 63  ssert( spx->prec
9280: 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73  ==spy->prec && s
9290: 70 78 2d 3e 61 73 73 6f 63 3d 3d 4e 4f 4e 45 20  px->assoc==NONE 
92a0: 29 3b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  );.      apy->ty
92b0: 70 65 20 3d 20 53 52 43 4f 4e 46 4c 49 43 54 3b  pe = SRCONFLICT;
92c0: 0a 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b  .      errcnt++;
92d0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
92e0: 66 28 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45  f( apx->type==RE
92f0: 44 55 43 45 20 26 26 20 61 70 79 2d 3e 74 79 70  DUCE && apy->typ
9300: 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20  e==REDUCE ){.   
9310: 20 73 70 78 20 3d 20 61 70 78 2d 3e 78 2e 72 70   spx = apx->x.rp
9320: 2d 3e 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 73  ->precsym;.    s
9330: 70 79 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e  py = apy->x.rp->
9340: 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 69 66 28  precsym;.    if(
9350: 20 73 70 78 3d 3d 30 20 7c 7c 20 73 70 79 3d 3d   spx==0 || spy==
9360: 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30  0 || spx->prec<0
9370: 20 7c 7c 0a 20 20 20 20 73 70 79 2d 3e 70 72 65   ||.    spy->pre
9380: 63 3c 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63  c<0 || spx->prec
9390: 3d 3d 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20  ==spy->prec ){. 
93a0: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d       apy->type =
93b0: 20 52 52 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20   RRCONFLICT;.   
93c0: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
93d0: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e   }else if( spx->
93e0: 70 72 65 63 3e 73 70 79 2d 3e 70 72 65 63 20 29  prec>spy->prec )
93f0: 7b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  {.      apy->typ
9400: 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b  e = RD_RESOLVED;
9410: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
9420: 70 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72  px->prec<spy->pr
9430: 65 63 20 29 7b 0a 20 20 20 20 20 20 61 70 78 2d  ec ){.      apx-
9440: 3e 74 79 70 65 20 3d 20 52 44 5f 52 45 53 4f 4c  >type = RD_RESOL
9450: 56 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  VED;.    }.  }el
9460: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
9470: 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65  .      apx->type
9480: 3d 3d 53 48 5f 52 45 53 4f 4c 56 45 44 20 7c 7c  ==SH_RESOLVED ||
9490: 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65  .      apx->type
94a0: 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c  ==RD_RESOLVED ||
94b0: 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65  .      apx->type
94c0: 3d 3d 53 53 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a  ==SSCONFLICT ||.
94d0: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d        apx->type=
94e0: 3d 53 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20  =SRCONFLICT ||. 
94f0: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d       apx->type==
9500: 52 52 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20  RRCONFLICT ||.  
9510: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53      apy->type==S
9520: 48 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20  H_RESOLVED ||.  
9530: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52      apy->type==R
9540: 44 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20  D_RESOLVED ||.  
9550: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53      apy->type==S
9560: 53 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20  SCONFLICT ||.   
9570: 20 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 52     apy->type==SR
9580: 43 4f 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20  CONFLICT ||.    
9590: 20 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52 52 43    apy->type==RRC
95a0: 4f 4e 46 4c 49 43 54 0a 20 20 20 20 29 3b 0a 20  ONFLICT.    );. 
95b0: 20 20 20 2f 2a 20 54 68 65 20 52 45 44 55 43 45     /* The REDUCE
95c0: 2f 53 48 49 46 54 20 63 61 73 65 20 63 61 6e 6e  /SHIFT case cann
95d0: 6f 74 20 68 61 70 70 65 6e 20 62 65 63 61 75 73  ot happen becaus
95e0: 65 20 53 48 49 46 54 73 20 63 6f 6d 65 20 62 65  e SHIFTs come be
95f0: 66 6f 72 65 0a 20 20 20 20 2a 2a 20 52 45 44 55  fore.    ** REDU
9600: 43 45 73 20 6f 6e 20 74 68 65 20 6c 69 73 74 2e  CEs on the list.
9610: 20 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68    If we reach th
9620: 69 73 20 70 6f 69 6e 74 20 69 74 20 6d 75 73 74  is point it must
9630: 20 62 65 20 62 65 63 61 75 73 65 0a 20 20 20 20   be because.    
9640: 2a 2a 20 74 68 65 20 70 61 72 73 65 72 20 63 6f  ** the parser co
9650: 6e 66 6c 69 63 74 20 68 61 64 20 61 6c 72 65 61  nflict had alrea
9660: 64 79 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  dy been resolved
9670: 2e 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  . */.  }.  retur
9680: 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a  n errcnt;.}./***
9690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
96a0: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
96b0: 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e 63 22 20   "configlist.c" 
96c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
96d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
96e0: 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 70 72 6f   Routines to pro
96f0: 63 65 73 73 69 6e 67 20 61 20 63 6f 6e 66 69 67  cessing a config
9700: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64  uration list and
9710: 20 62 75 69 6c 64 69 6e 67 20 61 20 73 74 61 74   building a stat
9720: 65 0a 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f  e.** in the LEMO
9730: 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
9740: 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 73  or..*/..static s
9750: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 66 72  truct config *fr
9760: 65 65 6c 69 73 74 20 3d 20 30 3b 20 20 20 20 20  eelist = 0;     
9770: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65   /* List of free
9780: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20   configurations 
9790: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
97a0: 20 63 6f 6e 66 69 67 20 2a 63 75 72 72 65 6e 74   config *current
97b0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54   = 0;       /* T
97c0: 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 63 6f  op of list of co
97d0: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a  nfigurations */.
97e0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f  static struct co
97f0: 6e 66 69 67 20 2a 2a 63 75 72 72 65 6e 74 65 6e  nfig **currenten
9800: 64 20 3d 20 30 3b 20 20 20 2f 2a 20 4c 61 73 74  d = 0;   /* Last
9810: 20 6f 6e 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66   on list of conf
9820: 69 67 73 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  igs */.static st
9830: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 61 73  ruct config *bas
9840: 69 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  is = 0;         
9850: 2f 2a 20 54 6f 70 20 6f 66 20 6c 69 73 74 20 6f  /* Top of list o
9860: 66 20 62 61 73 69 73 20 63 6f 6e 66 69 67 73 20  f basis configs 
9870: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
9880: 20 63 6f 6e 66 69 67 20 2a 2a 62 61 73 69 73 65   config **basise
9890: 6e 64 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 45  nd = 0;     /* E
98a0: 6e 64 20 6f 66 20 6c 69 73 74 20 6f 66 20 62 61  nd of list of ba
98b0: 73 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 0a  sis configs */..
98c0: 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
98d0: 74 65 72 20 74 6f 20 61 20 6e 65 77 20 63 6f 6e  ter to a new con
98e0: 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52  figuration */.PR
98f0: 49 56 41 54 45 20 73 74 72 75 63 74 20 63 6f 6e  IVATE struct con
9900: 66 69 67 20 2a 6e 65 77 63 6f 6e 66 69 67 28 29  fig *newconfig()
9910: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
9920: 67 20 2a 6e 65 77 63 66 67 3b 0a 20 20 69 66 28  g *newcfg;.  if(
9930: 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a   freelist==0 ){.
9940: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
9950: 6e 74 20 61 6d 74 20 3d 20 33 3b 0a 20 20 20 20  nt amt = 3;.    
9960: 66 72 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75  freelist = (stru
9970: 63 74 20 63 6f 6e 66 69 67 20 2a 29 63 61 6c 6c  ct config *)call
9980: 6f 63 28 20 61 6d 74 2c 20 73 69 7a 65 6f 66 28  oc( amt, sizeof(
9990: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 29 20 29  struct config) )
99a0: 3b 0a 20 20 20 20 69 66 28 20 66 72 65 65 6c 69  ;.    if( freeli
99b0: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  st==0 ){.      f
99c0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 55  printf(stderr,"U
99d0: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
99e0: 65 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e  e memory for a n
99f0: 65 77 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ew configuration
9a00: 2e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  .");.      exit(
9a10: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  1);.    }.    fo
9a20: 72 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20  r(i=0; i<amt-1; 
9a30: 69 2b 2b 29 20 66 72 65 65 6c 69 73 74 5b 69 5d  i++) freelist[i]
9a40: 2e 6e 65 78 74 20 3d 20 26 66 72 65 65 6c 69 73  .next = &freelis
9a50: 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 66 72 65 65  t[i+1];.    free
9a60: 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78 74  list[amt-1].next
9a70: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77 63   = 0;.  }.  newc
9a80: 66 67 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20  fg = freelist;. 
9a90: 20 66 72 65 65 6c 69 73 74 20 3d 20 66 72 65 65   freelist = free
9aa0: 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65  list->next;.  re
9ab0: 74 75 72 6e 20 6e 65 77 63 66 67 3b 0a 7d 0a 0a  turn newcfg;.}..
9ac0: 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67 75 72 61  /* The configura
9ad0: 74 69 6f 6e 20 22 6f 6c 64 22 20 69 73 20 6e 6f  tion "old" is no
9ae0: 20 6c 6f 6e 67 65 72 20 75 73 65 64 20 2a 2f 0a   longer used */.
9af0: 50 52 49 56 41 54 45 20 76 6f 69 64 20 64 65 6c  PRIVATE void del
9b00: 65 74 65 63 6f 6e 66 69 67 28 73 74 72 75 63 74  eteconfig(struct
9b10: 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 29 0a 7b 0a   config *old).{.
9b20: 20 20 6f 6c 64 2d 3e 6e 65 78 74 20 3d 20 66 72    old->next = fr
9b30: 65 65 6c 69 73 74 3b 0a 20 20 66 72 65 65 6c 69  eelist;.  freeli
9b40: 73 74 20 3d 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20  st = old;.}../* 
9b50: 49 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20  Initialized the 
9b60: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
9b70: 73 74 20 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f  st builder */.vo
9b80: 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 69 6e  id Configlist_in
9b90: 69 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20  it(){.  current 
9ba0: 3d 20 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e  = 0;.  currenten
9bb0: 64 20 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20 20  d = &current;.  
9bc0: 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73  basis = 0;.  bas
9bd0: 69 73 65 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a  isend = &basis;.
9be0: 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e    Configtable_in
9bf0: 69 74 28 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  it();.  return;.
9c00: 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  }../* Initialize
9c10: 64 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  d the configurat
9c20: 69 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65 72  ion list builder
9c30: 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c   */.void Configl
9c40: 69 73 74 5f 72 65 73 65 74 28 29 7b 0a 20 20 63  ist_reset(){.  c
9c50: 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75  urrent = 0;.  cu
9c60: 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72  rrentend = &curr
9c70: 65 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30  ent;.  basis = 0
9c80: 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26  ;.  basisend = &
9c90: 62 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74  basis;.  Configt
9ca0: 61 62 6c 65 5f 63 6c 65 61 72 28 30 29 3b 0a 20  able_clear(0);. 
9cb0: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 41   return;.}../* A
9cc0: 64 64 20 61 6e 6f 74 68 65 72 20 63 6f 6e 66 69  dd another confi
9cd0: 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  guration to the 
9ce0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
9cf0: 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e  st */.struct con
9d00: 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f  fig *Configlist_
9d10: 61 64 64 28 0a 20 20 73 74 72 75 63 74 20 72 75  add(.  struct ru
9d20: 6c 65 20 2a 72 70 2c 20 20 20 20 2f 2a 20 54 68  le *rp,    /* Th
9d30: 65 20 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e rule */.  int 
9d40: 64 6f 74 20 20 20 20 20 20 20 20 20 20 20 20 20  dot             
9d50: 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f 20 74 68  /* Index into th
9d60: 65 20 52 48 53 20 6f 66 20 74 68 65 20 72 75 6c  e RHS of the rul
9d70: 65 20 77 68 65 72 65 20 74 68 65 20 64 6f 74 20  e where the dot 
9d80: 67 6f 65 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  goes */.){.  str
9d90: 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c  uct config *cfp,
9da0: 20 6d 6f 64 65 6c 3b 0a 0a 20 20 61 73 73 65 72   model;..  asser
9db0: 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30  t( currentend!=0
9dc0: 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20 3d   );.  model.rp =
9dd0: 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f 74   rp;.  model.dot
9de0: 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d 20   = dot;.  cfp = 
9df0: 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64  Configtable_find
9e00: 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28 20  (&model);.  if( 
9e10: 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 66  cfp==0 ){.    cf
9e20: 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29 3b  p = newconfig();
9e30: 0a 20 20 20 20 63 66 70 2d 3e 72 70 20 3d 20 72  .    cfp->rp = r
9e40: 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74 20  p;.    cfp->dot 
9e50: 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d 3e  = dot;.    cfp->
9e60: 66 77 73 20 3d 20 53 65 74 4e 65 77 28 29 3b 0a  fws = SetNew();.
9e70: 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20 30      cfp->stp = 0
9e80: 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c 70 20  ;.    cfp->fplp 
9e90: 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30 3b  = cfp->bplp = 0;
9ea0: 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78 74 20 3d  .    cfp->next =
9eb0: 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70 20   0;.    cfp->bp 
9ec0: 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72 72 65 6e  = 0;.    *curren
9ed0: 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20 20  tend = cfp;.    
9ee0: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 66  currentend = &cf
9ef0: 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 43 6f 6e  p->next;.    Con
9f00: 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28  figtable_insert(
9f10: 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  cfp);.  }.  retu
9f20: 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 41 64  rn cfp;.}../* Ad
9f30: 64 20 61 20 62 61 73 69 73 20 63 6f 6e 66 69 67  d a basis config
9f40: 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63  uration to the c
9f50: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
9f60: 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  t */.struct conf
9f70: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 61  ig *Configlist_a
9f80: 64 64 62 61 73 69 73 28 73 74 72 75 63 74 20 72  ddbasis(struct r
9f90: 75 6c 65 20 2a 72 70 2c 20 69 6e 74 20 64 6f 74  ule *rp, int dot
9fa0: 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  ).{.  struct con
9fb0: 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b  fig *cfp, model;
9fc0: 0a 0a 20 20 61 73 73 65 72 74 28 20 62 61 73 69  ..  assert( basi
9fd0: 73 65 6e 64 21 3d 30 20 29 3b 0a 20 20 61 73 73  send!=0 );.  ass
9fe0: 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21  ert( currentend!
9ff0: 3d 30 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70  =0 );.  model.rp
a000: 20 3d 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64   = rp;.  model.d
a010: 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20  ot = dot;.  cfp 
a020: 3d 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69  = Configtable_fi
a030: 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66  nd(&model);.  if
a040: 28 20 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ( cfp==0 ){.    
a050: 63 66 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28  cfp = newconfig(
a060: 29 3b 0a 20 20 20 20 63 66 70 2d 3e 72 70 20 3d  );.    cfp->rp =
a070: 20 72 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f   rp;.    cfp->do
a080: 74 20 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66 70  t = dot;.    cfp
a090: 2d 3e 66 77 73 20 3d 20 53 65 74 4e 65 77 28 29  ->fws = SetNew()
a0a0: 3b 0a 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d  ;.    cfp->stp =
a0b0: 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c   0;.    cfp->fpl
a0c0: 70 20 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20  p = cfp->bplp = 
a0d0: 30 3b 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78 74  0;.    cfp->next
a0e0: 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62   = 0;.    cfp->b
a0f0: 70 20 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72 72  p = 0;.    *curr
a100: 65 6e 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20  entend = cfp;.  
a110: 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26    currentend = &
a120: 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 2a  cfp->next;.    *
a130: 62 61 73 69 73 65 6e 64 20 3d 20 63 66 70 3b 0a  basisend = cfp;.
a140: 20 20 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26      basisend = &
a150: 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20 43 6f 6e  cfp->bp;.    Con
a160: 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28  figtable_insert(
a170: 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  cfp);.  }.  retu
a180: 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f  rn cfp;.}../* Co
a190: 6d 70 75 74 65 20 74 68 65 20 63 6c 6f 73 75 72  mpute the closur
a1a0: 65 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75  e of the configu
a1b0: 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76  ration list */.v
a1c0: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63  oid Configlist_c
a1d0: 6c 6f 73 75 72 65 28 73 74 72 75 63 74 20 6c 65  losure(struct le
a1e0: 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20 20 73  mon *lemp).{.  s
a1f0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
a200: 70 2c 20 2a 6e 65 77 63 66 70 3b 0a 20 20 73 74  p, *newcfp;.  st
a210: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20 2a  ruct rule *rp, *
a220: 6e 65 77 72 70 3b 0a 20 20 73 74 72 75 63 74 20  newrp;.  struct 
a230: 73 79 6d 62 6f 6c 20 2a 73 70 2c 20 2a 78 73 70  symbol *sp, *xsp
a240: 3b 0a 20 20 69 6e 74 20 69 2c 20 64 6f 74 3b 0a  ;.  int i, dot;.
a250: 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 72 65  .  assert( curre
a260: 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 66 6f  ntend!=0 );.  fo
a270: 72 28 63 66 70 3d 63 75 72 72 65 6e 74 3b 20 63  r(cfp=current; c
a280: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
a290: 74 29 7b 0a 20 20 20 20 72 70 20 3d 20 63 66 70  t){.    rp = cfp
a2a0: 2d 3e 72 70 3b 0a 20 20 20 20 64 6f 74 20 3d 20  ->rp;.    dot = 
a2b0: 63 66 70 2d 3e 64 6f 74 3b 0a 20 20 20 20 69 66  cfp->dot;.    if
a2c0: 28 20 64 6f 74 3e 3d 72 70 2d 3e 6e 72 68 73 20  ( dot>=rp->nrhs 
a2d0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
a2e0: 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 64 6f 74  sp = rp->rhs[dot
a2f0: 5d 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 74  ];.    if( sp->t
a300: 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c  ype==NONTERMINAL
a310: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 70   ){.      if( sp
a320: 2d 3e 72 75 6c 65 3d 3d 30 20 26 26 20 73 70 21  ->rule==0 && sp!
a330: 3d 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29 7b  =lemp->errsym ){
a340: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
a350: 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  g(lemp->filename
a360: 2c 72 70 2d 3e 6c 69 6e 65 2c 22 4e 6f 6e 74 65  ,rp->line,"Nonte
a370: 72 6d 69 6e 61 6c 20 5c 22 25 73 5c 22 20 68 61  rminal \"%s\" ha
a380: 73 20 6e 6f 20 72 75 6c 65 73 2e 22 2c 0a 20 20  s no rules.",.  
a390: 20 20 20 20 20 20 20 20 73 70 2d 3e 6e 61 6d 65          sp->name
a3a0: 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6d 70 2d  );.        lemp-
a3b0: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
a3c0: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e     }.      for(n
a3d0: 65 77 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20 6e  ewrp=sp->rule; n
a3e0: 65 77 72 70 3b 20 6e 65 77 72 70 3d 6e 65 77 72  ewrp; newrp=newr
a3f0: 70 2d 3e 6e 65 78 74 6c 68 73 29 7b 0a 20 20 20  p->nextlhs){.   
a400: 20 20 20 20 20 6e 65 77 63 66 70 20 3d 20 43 6f       newcfp = Co
a410: 6e 66 69 67 6c 69 73 74 5f 61 64 64 28 6e 65 77  nfiglist_add(new
a420: 72 70 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 66  rp,0);.        f
a430: 6f 72 28 69 3d 64 6f 74 2b 31 3b 20 69 3c 72 70  or(i=dot+1; i<rp
a440: 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20  ->nrhs; i++){.  
a450: 20 20 20 20 20 20 20 20 78 73 70 20 3d 20 72 70          xsp = rp
a460: 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20  ->rhs[i];.      
a470: 20 20 20 20 69 66 28 20 78 73 70 2d 3e 74 79 70      if( xsp->typ
a480: 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  e==TERMINAL ){. 
a490: 20 20 20 20 20 20 20 20 20 20 20 53 65 74 41 64             SetAd
a4a0: 64 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78 73  d(newcfp->fws,xs
a4b0: 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  p->index);.     
a4c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a4d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
a4e0: 28 20 78 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c  ( xsp->type==MUL
a4f0: 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20  TITERMINAL ){.  
a500: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b            int k;
a510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
a520: 28 6b 3d 30 3b 20 6b 3c 78 73 70 2d 3e 6e 73 75  (k=0; k<xsp->nsu
a530: 62 73 79 6d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  bsym; k++){.    
a540: 20 20 20 20 20 20 20 20 20 20 53 65 74 41 64 64            SetAdd
a550: 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 20 78 73  (newcfp->fws, xs
a560: 70 2d 3e 73 75 62 73 79 6d 5b 6b 5d 2d 3e 69 6e  p->subsym[k]->in
a570: 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  dex);.          
a580: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
a590: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
a5a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a5b0: 20 20 20 20 53 65 74 55 6e 69 6f 6e 28 6e 65 77      SetUnion(new
a5c0: 63 66 70 2d 3e 66 77 73 2c 78 73 70 2d 3e 66 69  cfp->fws,xsp->fi
a5d0: 72 73 74 73 65 74 29 3b 0a 20 20 20 20 20 20 20  rstset);.       
a5e0: 20 20 20 20 20 69 66 28 20 78 73 70 2d 3e 6c 61       if( xsp->la
a5f0: 6d 62 64 61 3d 3d 4c 45 4d 4f 4e 5f 46 41 4c 53  mbda==LEMON_FALS
a600: 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  E ) break;.     
a610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
a620: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d  .        if( i==
a630: 72 70 2d 3e 6e 72 68 73 20 29 20 50 6c 69 6e 6b  rp->nrhs ) Plink
a640: 5f 61 64 64 28 26 63 66 70 2d 3e 66 70 6c 70 2c  _add(&cfp->fplp,
a650: 6e 65 77 63 66 70 29 3b 0a 20 20 20 20 20 20 7d  newcfp);.      }
a660: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
a670: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72 74 20  urn;.}../* Sort 
a680: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
a690: 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 43  n list */.void C
a6a0: 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72 74 28 29  onfiglist_sort()
a6b0: 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 28 73  {.  current = (s
a6c0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 6d  truct config *)m
a6d0: 73 6f 72 74 28 28 63 68 61 72 20 2a 29 63 75 72  sort((char *)cur
a6e0: 72 65 6e 74 2c 28 63 68 61 72 20 2a 2a 29 26 28  rent,(char **)&(
a6f0: 63 75 72 72 65 6e 74 2d 3e 6e 65 78 74 29 2c 43  current->next),C
a700: 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20 63 75 72  onfigcmp);.  cur
a710: 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20 20 72  rentend = 0;.  r
a720: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f 72  eturn;.}../* Sor
a730: 74 20 74 68 65 20 62 61 73 69 73 20 63 6f 6e 66  t the basis conf
a740: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a  iguration list *
a750: 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  /.void Configlis
a760: 74 5f 73 6f 72 74 62 61 73 69 73 28 29 7b 0a 20  t_sortbasis(){. 
a770: 20 62 61 73 69 73 20 3d 20 28 73 74 72 75 63 74   basis = (struct
a780: 20 63 6f 6e 66 69 67 20 2a 29 6d 73 6f 72 74 28   config *)msort(
a790: 28 63 68 61 72 20 2a 29 63 75 72 72 65 6e 74 2c  (char *)current,
a7a0: 28 63 68 61 72 20 2a 2a 29 26 28 63 75 72 72 65  (char **)&(curre
a7b0: 6e 74 2d 3e 62 70 29 2c 43 6f 6e 66 69 67 63 6d  nt->bp),Configcm
a7c0: 70 29 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d  p);.  basisend =
a7d0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.
a7e0: 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
a7f0: 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64  nter to the head
a800: 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72   of the configur
a810: 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a 2a  ation list and.*
a820: 2a 20 72 65 73 65 74 20 74 68 65 20 6c 69 73 74  * reset the list
a830: 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69   */.struct confi
a840: 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65  g *Configlist_re
a850: 74 75 72 6e 28 29 7b 0a 20 20 73 74 72 75 63 74  turn(){.  struct
a860: 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20   config *old;.  
a870: 6f 6c 64 20 3d 20 63 75 72 72 65 6e 74 3b 0a 20  old = current;. 
a880: 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20   current = 0;.  
a890: 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a  currentend = 0;.
a8a0: 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a    return old;.}.
a8b0: 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
a8c0: 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64  nter to the head
a8d0: 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72   of the configur
a8e0: 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a 2a  ation list and.*
a8f0: 2a 20 72 65 73 65 74 20 74 68 65 20 6c 69 73 74  * reset the list
a900: 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66 69   */.struct confi
a910: 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 62 61  g *Configlist_ba
a920: 73 69 73 28 29 7b 0a 20 20 73 74 72 75 63 74 20  sis(){.  struct 
a930: 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20 6f  config *old;.  o
a940: 6c 64 20 3d 20 62 61 73 69 73 3b 0a 20 20 62 61  ld = basis;.  ba
a950: 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73  sis = 0;.  basis
a960: 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  end = 0;.  retur
a970: 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 46 72 65  n old;.}../* Fre
a980: 65 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 6f  e all elements o
a990: 66 20 74 68 65 20 67 69 76 65 6e 20 63 6f 6e 66  f the given conf
a9a0: 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a  iguration list *
a9b0: 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73  /.void Configlis
a9c0: 74 5f 65 61 74 28 73 74 72 75 63 74 20 63 6f 6e  t_eat(struct con
a9d0: 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20 73 74  fig *cfp).{.  st
a9e0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 78  ruct config *nex
a9f0: 74 63 66 70 3b 0a 20 20 66 6f 72 28 3b 20 63 66  tcfp;.  for(; cf
aa00: 70 3b 20 63 66 70 3d 6e 65 78 74 63 66 70 29 7b  p; cfp=nextcfp){
aa10: 0a 20 20 20 20 6e 65 78 74 63 66 70 20 3d 20 63  .    nextcfp = c
aa20: 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 61 73  fp->next;.    as
aa30: 73 65 72 74 28 20 63 66 70 2d 3e 66 70 6c 70 3d  sert( cfp->fplp=
aa40: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
aa50: 28 20 63 66 70 2d 3e 62 70 6c 70 3d 3d 30 20 29  ( cfp->bplp==0 )
aa60: 3b 0a 20 20 20 20 69 66 28 20 63 66 70 2d 3e 66  ;.    if( cfp->f
aa70: 77 73 20 29 20 53 65 74 46 72 65 65 28 63 66 70  ws ) SetFree(cfp
aa80: 2d 3e 66 77 73 29 3b 0a 20 20 20 20 64 65 6c 65  ->fws);.    dele
aa90: 74 65 63 6f 6e 66 69 67 28 63 66 70 29 3b 0a 20  teconfig(cfp);. 
aaa0: 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 2f   }.  return;.}./
aab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aac0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
aad0: 22 65 72 72 6f 72 2e 63 22 20 2a 2a 2a 2a 2a 2a  "error.c" ******
aae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
aaf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
ab00: 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70 72 69 6e  ** Code for prin
ab10: 74 69 6e 67 20 65 72 72 6f 72 20 6d 65 73 73 61  ting error messa
ab20: 67 65 2e 0a 2a 2f 0a 0a 76 6f 69 64 20 45 72 72  ge..*/..void Err
ab30: 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63 68 61 72  orMsg(const char
ab40: 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20   *filename, int 
ab50: 6c 69 6e 65 6e 6f 2c 20 63 6f 6e 73 74 20 63 68  lineno, const ch
ab60: 61 72 20 2a 66 6f 72 6d 61 74 2c 20 2e 2e 2e 29  ar *format, ...)
ab70: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
ab80: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
ab90: 2c 20 22 25 73 3a 25 64 3a 20 22 2c 20 66 69 6c  , "%s:%d: ", fil
aba0: 65 6e 61 6d 65 2c 20 6c 69 6e 65 6e 6f 29 3b 0a  ename, lineno);.
abb0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 66    va_start(ap, f
abc0: 6f 72 6d 61 74 29 3b 0a 20 20 76 66 70 72 69 6e  ormat);.  vfprin
abd0: 74 66 28 73 74 64 65 72 72 2c 66 6f 72 6d 61 74  tf(stderr,format
abe0: 2c 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61  ,ap);.  va_end(a
abf0: 70 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  p);.  fprintf(st
ac00: 64 65 72 72 2c 20 22 5c 6e 22 29 3b 0a 7d 0a 2f  derr, "\n");.}./
ac10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac20: 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
ac30: 6d 61 69 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  main.c" ********
ac40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
ac50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
ac60: 0a 2a 2a 20 4d 61 69 6e 20 70 72 6f 67 72 61 6d  .** Main program
ac70: 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 4c 45   file for the LE
ac80: 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
ac90: 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 52 65 70  ator..*/../* Rep
aca0: 6f 72 74 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65  ort an out-of-me
acb0: 6d 6f 72 79 20 63 6f 6e 64 69 74 69 6f 6e 20 61  mory condition a
acc0: 6e 64 20 61 62 6f 72 74 2e 20 20 54 68 69 73 20  nd abort.  This 
acd0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 75  function.** is u
ace0: 73 65 64 20 6d 6f 73 74 6c 79 20 62 79 20 74 68  sed mostly by th
acf0: 65 20 22 4d 65 6d 6f 72 79 43 68 65 63 6b 22 20  e "MemoryCheck" 
ad00: 6d 61 63 72 6f 20 69 6e 20 73 74 72 75 63 74 2e  macro in struct.
ad10: 68 0a 2a 2f 0a 76 6f 69 64 20 6d 65 6d 6f 72 79  h.*/.void memory
ad20: 5f 65 72 72 6f 72 28 29 7b 0a 20 20 66 70 72 69  _error(){.  fpri
ad30: 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20  ntf(stderr,"Out 
ad40: 6f 66 20 6d 65 6d 6f 72 79 2e 20 20 41 62 6f 72  of memory.  Abor
ad50: 74 69 6e 67 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 65  ting...\n");.  e
ad60: 78 69 74 28 31 29 3b 0a 7d 0a 0a 73 74 61 74 69  xit(1);.}..stati
ad70: 63 20 69 6e 74 20 6e 44 65 66 69 6e 65 20 3d 20  c int nDefine = 
ad80: 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  0;      /* Numbe
ad90: 72 20 6f 66 20 2d 44 20 6f 70 74 69 6f 6e 73 20  r of -D options 
ada0: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
adb0: 69 6e 65 20 2a 2f 0a 73 74 61 74 69 63 20 63 68  ine */.static ch
adc0: 61 72 20 2a 2a 61 7a 44 65 66 69 6e 65 20 3d 20  ar **azDefine = 
add0: 30 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  0;  /* Name of t
ade0: 68 65 20 2d 44 20 6d 61 63 72 6f 73 20 2a 2f 0a  he -D macros */.
adf0: 0a 2f 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  ./* This routine
ae00: 20 69 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20   is called with 
ae10: 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  the argument to 
ae20: 65 61 63 68 20 2d 44 20 63 6f 6d 6d 61 6e 64 2d  each -D command-
ae30: 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a 2a 2a 20  line option..** 
ae40: 41 64 64 20 74 68 65 20 6d 61 63 72 6f 20 64 65  Add the macro de
ae50: 66 69 6e 65 64 20 74 6f 20 74 68 65 20 61 7a 44  fined to the azD
ae60: 65 66 69 6e 65 20 61 72 72 61 79 2e 0a 2a 2f 0a  efine array..*/.
ae70: 73 74 61 74 69 63 20 76 6f 69 64 20 68 61 6e 64  static void hand
ae80: 6c 65 5f 44 5f 6f 70 74 69 6f 6e 28 63 68 61 72  le_D_option(char
ae90: 20 2a 7a 29 7b 0a 20 20 63 68 61 72 20 2a 2a 70   *z){.  char **p
aea0: 61 7a 3b 0a 20 20 6e 44 65 66 69 6e 65 2b 2b 3b  az;.  nDefine++;
aeb0: 0a 20 20 61 7a 44 65 66 69 6e 65 20 3d 20 28 63  .  azDefine = (c
aec0: 68 61 72 20 2a 2a 29 20 72 65 61 6c 6c 6f 63 28  har **) realloc(
aed0: 61 7a 44 65 66 69 6e 65 2c 20 73 69 7a 65 6f 66  azDefine, sizeof
aee0: 28 61 7a 44 65 66 69 6e 65 5b 30 5d 29 2a 6e 44  (azDefine[0])*nD
aef0: 65 66 69 6e 65 29 3b 0a 20 20 69 66 28 20 61 7a  efine);.  if( az
af00: 44 65 66 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20  Define==0 ){.   
af10: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
af20: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e  "out of memory\n
af30: 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
af40: 0a 20 20 7d 0a 20 20 70 61 7a 20 3d 20 26 61 7a  .  }.  paz = &az
af50: 44 65 66 69 6e 65 5b 6e 44 65 66 69 6e 65 2d 31  Define[nDefine-1
af60: 5d 3b 0a 20 20 2a 70 61 7a 20 3d 20 28 63 68 61  ];.  *paz = (cha
af70: 72 20 2a 29 20 6d 61 6c 6c 6f 63 28 20 6c 65 6d  r *) malloc( lem
af80: 6f 6e 53 74 72 6c 65 6e 28 7a 29 2b 31 20 29 3b  onStrlen(z)+1 );
af90: 0a 20 20 69 66 28 20 2a 70 61 7a 3d 3d 30 20 29  .  if( *paz==0 )
afa0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
afb0: 64 65 72 72 2c 22 6f 75 74 20 6f 66 20 6d 65 6d  derr,"out of mem
afc0: 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  ory\n");.    exi
afd0: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63  t(1);.  }.  strc
afe0: 70 79 28 2a 70 61 7a 2c 20 7a 29 3b 0a 20 20 66  py(*paz, z);.  f
aff0: 6f 72 28 7a 3d 2a 70 61 7a 3b 20 2a 7a 20 26 26  or(z=*paz; *z &&
b000: 20 2a 7a 21 3d 27 3d 27 3b 20 7a 2b 2b 29 7b 7d   *z!='='; z++){}
b010: 0a 20 20 2a 7a 20 3d 20 30 3b 0a 7d 0a 0a 73 74  .  *z = 0;.}..st
b020: 61 74 69 63 20 63 68 61 72 20 2a 75 73 65 72 5f  atic char *user_
b030: 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20 3d 20 4e  templatename = N
b040: 55 4c 4c 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  ULL;.static void
b050: 20 68 61 6e 64 6c 65 5f 54 5f 6f 70 74 69 6f 6e   handle_T_option
b060: 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75 73 65  (char *z){.  use
b070: 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 20 3d  r_templatename =
b080: 20 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c 6f 63   (char *) malloc
b090: 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 29  ( lemonStrlen(z)
b0a0: 2b 31 20 29 3b 0a 20 20 69 66 28 20 75 73 65 72  +1 );.  if( user
b0b0: 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 3d 3d 30  _templatename==0
b0c0: 20 29 7b 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65   ){.    memory_e
b0d0: 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20 20 73 74  rror();.  }.  st
b0e0: 72 63 70 79 28 75 73 65 72 5f 74 65 6d 70 6c 61  rcpy(user_templa
b0f0: 74 65 6e 61 6d 65 2c 20 7a 29 3b 0a 7d 0a 0a 2f  tename, z);.}../
b100: 2a 20 54 68 65 20 6d 61 69 6e 20 70 72 6f 67 72  * The main progr
b110: 61 6d 2e 20 20 50 61 72 73 65 20 74 68 65 20 63  am.  Parse the c
b120: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 6e 64 20  ommand line and 
b130: 64 6f 20 69 74 2e 2e 2e 20 2a 2f 0a 69 6e 74 20  do it... */.int 
b140: 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63  main(int argc, c
b150: 68 61 72 20 2a 2a 61 72 67 76 29 0a 7b 0a 20 20  har **argv).{.  
b160: 73 74 61 74 69 63 20 69 6e 74 20 76 65 72 73 69  static int versi
b170: 6f 6e 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  on = 0;.  static
b180: 20 69 6e 74 20 72 70 66 6c 61 67 20 3d 20 30 3b   int rpflag = 0;
b190: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 62 61  .  static int ba
b1a0: 73 69 73 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73  sisflag = 0;.  s
b1b0: 74 61 74 69 63 20 69 6e 74 20 63 6f 6d 70 72 65  tatic int compre
b1c0: 73 73 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  ss = 0;.  static
b1d0: 20 69 6e 74 20 71 75 69 65 74 20 3d 20 30 3b 0a   int quiet = 0;.
b1e0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 73 74 61    static int sta
b1f0: 74 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 73  tistics = 0;.  s
b200: 74 61 74 69 63 20 69 6e 74 20 6d 68 66 6c 61 67  tatic int mhflag
b210: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
b220: 6e 74 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67  nt nolinenosflag
b230: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69   = 0;.  static i
b240: 6e 74 20 6e 6f 52 65 73 6f 72 74 20 3d 20 30 3b  nt noResort = 0;
b250: 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74  .  static struct
b260: 20 73 5f 6f 70 74 69 6f 6e 73 20 6f 70 74 69 6f   s_options optio
b270: 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 4f 50  ns[] = {.    {OP
b280: 54 5f 46 4c 41 47 2c 20 22 62 22 2c 20 28 63 68  T_FLAG, "b", (ch
b290: 61 72 2a 29 26 62 61 73 69 73 66 6c 61 67 2c 20  ar*)&basisflag, 
b2a0: 22 50 72 69 6e 74 20 6f 6e 6c 79 20 74 68 65 20  "Print only the 
b2b0: 62 61 73 69 73 20 69 6e 20 72 65 70 6f 72 74 2e  basis in report.
b2c0: 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41  "},.    {OPT_FLA
b2d0: 47 2c 20 22 63 22 2c 20 28 63 68 61 72 2a 29 26  G, "c", (char*)&
b2e0: 63 6f 6d 70 72 65 73 73 2c 20 22 44 6f 6e 27 74  compress, "Don't
b2f0: 20 63 6f 6d 70 72 65 73 73 20 74 68 65 20 61 63   compress the ac
b300: 74 69 6f 6e 20 74 61 62 6c 65 2e 22 7d 2c 0a 20  tion table."},. 
b310: 20 20 20 7b 4f 50 54 5f 46 53 54 52 2c 20 22 44     {OPT_FSTR, "D
b320: 22 2c 20 28 63 68 61 72 2a 29 68 61 6e 64 6c 65  ", (char*)handle
b330: 5f 44 5f 6f 70 74 69 6f 6e 2c 20 22 44 65 66 69  _D_option, "Defi
b340: 6e 65 20 61 6e 20 25 69 66 64 65 66 20 6d 61 63  ne an %ifdef mac
b350: 72 6f 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  ro."},.    {OPT_
b360: 46 53 54 52 2c 20 22 54 22 2c 20 28 63 68 61 72  FSTR, "T", (char
b370: 2a 29 68 61 6e 64 6c 65 5f 54 5f 6f 70 74 69 6f  *)handle_T_optio
b380: 6e 2c 20 22 53 70 65 63 69 66 79 20 61 20 74 65  n, "Specify a te
b390: 6d 70 6c 61 74 65 20 66 69 6c 65 2e 22 7d 2c 0a  mplate file."},.
b3a0: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
b3b0: 67 22 2c 20 28 63 68 61 72 2a 29 26 72 70 66 6c  g", (char*)&rpfl
b3c0: 61 67 2c 20 22 50 72 69 6e 74 20 67 72 61 6d 6d  ag, "Print gramm
b3d0: 61 72 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f  ar without actio
b3e0: 6e 73 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  ns."},.    {OPT_
b3f0: 46 4c 41 47 2c 20 22 6d 22 2c 20 28 63 68 61 72  FLAG, "m", (char
b400: 2a 29 26 6d 68 66 6c 61 67 2c 20 22 4f 75 74 70  *)&mhflag, "Outp
b410: 75 74 20 61 20 6d 61 6b 65 68 65 61 64 65 72 73  ut a makeheaders
b420: 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 69 6c 65   compatible file
b430: 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c  ."},.    {OPT_FL
b440: 41 47 2c 20 22 6c 22 2c 20 28 63 68 61 72 2a 29  AG, "l", (char*)
b450: 26 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 2c 20  &nolinenosflag, 
b460: 22 44 6f 20 6e 6f 74 20 70 72 69 6e 74 20 23 6c  "Do not print #l
b470: 69 6e 65 20 73 74 61 74 65 6d 65 6e 74 73 2e 22  ine statements."
b480: 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47  },.    {OPT_FLAG
b490: 2c 20 22 70 22 2c 20 28 63 68 61 72 2a 29 26 73  , "p", (char*)&s
b4a0: 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43 6f 6e  howPrecedenceCon
b4b0: 66 6c 69 63 74 2c 0a 20 20 20 20 20 20 20 20 20  flict,.         
b4c0: 20 20 20 20 20 20 20 20 20 20 20 22 53 68 6f 77             "Show
b4d0: 20 63 6f 6e 66 6c 69 63 74 73 20 72 65 73 6f 6c   conflicts resol
b4e0: 76 65 64 20 62 79 20 70 72 65 63 65 64 65 6e 63  ved by precedenc
b4f0: 65 20 72 75 6c 65 73 22 7d 2c 0a 20 20 20 20 7b  e rules"},.    {
b500: 4f 50 54 5f 46 4c 41 47 2c 20 22 71 22 2c 20 28  OPT_FLAG, "q", (
b510: 63 68 61 72 2a 29 26 71 75 69 65 74 2c 20 22 28  char*)&quiet, "(
b520: 51 75 69 65 74 29 20 44 6f 6e 27 74 20 70 72 69  Quiet) Don't pri
b530: 6e 74 20 74 68 65 20 72 65 70 6f 72 74 20 66 69  nt the report fi
b540: 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f  le."},.    {OPT_
b550: 46 4c 41 47 2c 20 22 72 22 2c 20 28 63 68 61 72  FLAG, "r", (char
b560: 2a 29 26 6e 6f 52 65 73 6f 72 74 2c 20 22 44 6f  *)&noResort, "Do
b570: 20 6e 6f 74 20 73 6f 72 74 20 6f 72 20 72 65 6e   not sort or ren
b580: 75 6d 62 65 72 20 73 74 61 74 65 73 22 7d 2c 0a  umber states"},.
b590: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
b5a0: 73 22 2c 20 28 63 68 61 72 2a 29 26 73 74 61 74  s", (char*)&stat
b5b0: 69 73 74 69 63 73 2c 0a 20 20 20 20 20 20 20 20  istics,.        
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5d0: 20 20 20 20 20 20 20 20 20 20 20 22 50 72 69 6e             "Prin
b5e0: 74 20 70 61 72 73 65 72 20 73 74 61 74 73 20 74  t parser stats t
b5f0: 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75  o standard outpu
b600: 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  t."},.    {OPT_F
b610: 4c 41 47 2c 20 22 78 22 2c 20 28 63 68 61 72 2a  LAG, "x", (char*
b620: 29 26 76 65 72 73 69 6f 6e 2c 20 22 50 72 69 6e  )&version, "Prin
b630: 74 20 74 68 65 20 76 65 72 73 69 6f 6e 20 6e 75  t the version nu
b640: 6d 62 65 72 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  mber."},.    {OP
b650: 54 5f 46 4c 41 47 2c 30 2c 30 2c 30 7d 0a 20 20  T_FLAG,0,0,0}.  
b660: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  };.  int i;.  in
b670: 74 20 65 78 69 74 63 6f 64 65 3b 0a 20 20 73 74  t exitcode;.  st
b680: 72 75 63 74 20 6c 65 6d 6f 6e 20 6c 65 6d 3b 0a  ruct lemon lem;.
b690: 0a 20 20 4f 70 74 49 6e 69 74 28 61 72 67 76 2c  .  OptInit(argv,
b6a0: 6f 70 74 69 6f 6e 73 2c 73 74 64 65 72 72 29 3b  options,stderr);
b6b0: 0a 20 20 69 66 28 20 76 65 72 73 69 6f 6e 20 29  .  if( version )
b6c0: 7b 0a 20 20 20 20 20 70 72 69 6e 74 66 28 22 4c  {.     printf("L
b6d0: 65 6d 6f 6e 20 76 65 72 73 69 6f 6e 20 31 2e 30  emon version 1.0
b6e0: 5c 6e 22 29 3b 0a 20 20 20 20 20 65 78 69 74 28  \n");.     exit(
b6f0: 30 29 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20 4f  0); .  }.  if( O
b700: 70 74 4e 41 72 67 73 28 29 21 3d 31 20 29 7b 0a  ptNArgs()!=1 ){.
b710: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
b720: 72 72 2c 22 45 78 61 63 74 6c 79 20 6f 6e 65 20  rr,"Exactly one 
b730: 66 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  filename argumen
b740: 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 5c 6e  t is required.\n
b750: 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b  ");.    exit(1);
b760: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 6c  .  }.  memset(&l
b770: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6c 65  em, 0, sizeof(le
b780: 6d 29 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 6f 72  m));.  lem.error
b790: 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  cnt = 0;..  /* I
b7a0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 61  nitialize the ma
b7b0: 63 68 69 6e 65 20 2a 2f 0a 20 20 53 74 72 73 61  chine */.  Strsa
b7c0: 66 65 5f 69 6e 69 74 28 29 3b 0a 20 20 53 79 6d  fe_init();.  Sym
b7d0: 62 6f 6c 5f 69 6e 69 74 28 29 3b 0a 20 20 53 74  bol_init();.  St
b7e0: 61 74 65 5f 69 6e 69 74 28 29 3b 0a 20 20 6c 65  ate_init();.  le
b7f0: 6d 2e 61 72 67 76 30 20 3d 20 61 72 67 76 5b 30  m.argv0 = argv[0
b800: 5d 3b 0a 20 20 6c 65 6d 2e 66 69 6c 65 6e 61 6d  ];.  lem.filenam
b810: 65 20 3d 20 4f 70 74 41 72 67 28 30 29 3b 0a 20  e = OptArg(0);. 
b820: 20 6c 65 6d 2e 62 61 73 69 73 66 6c 61 67 20 3d   lem.basisflag =
b830: 20 62 61 73 69 73 66 6c 61 67 3b 0a 20 20 6c 65   basisflag;.  le
b840: 6d 2e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 20  m.nolinenosflag 
b850: 3d 20 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 3b  = nolinenosflag;
b860: 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 24  .  Symbol_new("$
b870: 22 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d  ");.  lem.errsym
b880: 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 65   = Symbol_new("e
b890: 72 72 6f 72 22 29 3b 0a 20 20 6c 65 6d 2e 65 72  rror");.  lem.er
b8a0: 72 73 79 6d 2d 3e 75 73 65 43 6e 74 20 3d 20 30  rsym->useCnt = 0
b8b0: 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68  ;..  /* Parse th
b8c0: 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a  e input file */.
b8d0: 20 20 50 61 72 73 65 28 26 6c 65 6d 29 3b 0a 20    Parse(&lem);. 
b8e0: 20 69 66 28 20 6c 65 6d 2e 65 72 72 6f 72 63 6e   if( lem.errorcn
b8f0: 74 20 29 20 65 78 69 74 28 6c 65 6d 2e 65 72 72  t ) exit(lem.err
b900: 6f 72 63 6e 74 29 3b 0a 20 20 69 66 28 20 6c 65  orcnt);.  if( le
b910: 6d 2e 6e 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20  m.nrule==0 ){.  
b920: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
b930: 2c 22 45 6d 70 74 79 20 67 72 61 6d 6d 61 72 2e  ,"Empty grammar.
b940: 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
b950: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 75  );.  }..  /* Cou
b960: 6e 74 20 61 6e 64 20 69 6e 64 65 78 20 74 68 65  nt and index the
b970: 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74 68 65 20   symbols of the 
b980: 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 6c 65 6d  grammar */.  lem
b990: 2e 6e 73 79 6d 62 6f 6c 20 3d 20 53 79 6d 62 6f  .nsymbol = Symbo
b9a0: 6c 5f 63 6f 75 6e 74 28 29 3b 0a 20 20 53 79 6d  l_count();.  Sym
b9b0: 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c  bol_new("{defaul
b9c0: 74 7d 22 29 3b 0a 20 20 6c 65 6d 2e 73 79 6d 62  t}");.  lem.symb
b9d0: 6f 6c 73 20 3d 20 53 79 6d 62 6f 6c 5f 61 72 72  ols = Symbol_arr
b9e0: 61 79 6f 66 28 29 3b 0a 20 20 66 6f 72 28 69 3d  ayof();.  for(i=
b9f0: 30 3b 20 69 3c 3d 6c 65 6d 2e 6e 73 79 6d 62 6f  0; i<=lem.nsymbo
ba00: 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e 73 79 6d 62  l; i++) lem.symb
ba10: 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65 78 20 3d 20  ols[i]->index = 
ba20: 69 3b 0a 20 20 71 73 6f 72 74 28 6c 65 6d 2e 73  i;.  qsort(lem.s
ba30: 79 6d 62 6f 6c 73 2c 6c 65 6d 2e 6e 73 79 6d 62  ymbols,lem.nsymb
ba40: 6f 6c 2b 31 2c 73 69 7a 65 6f 66 28 73 74 72 75  ol+1,sizeof(stru
ba50: 63 74 20 73 79 6d 62 6f 6c 2a 29 2c 20 53 79 6d  ct symbol*), Sym
ba60: 62 6f 6c 63 6d 70 70 29 3b 0a 20 20 66 6f 72 28  bolcmpp);.  for(
ba70: 69 3d 30 3b 20 69 3c 3d 6c 65 6d 2e 6e 73 79 6d  i=0; i<=lem.nsym
ba80: 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e 73 79  bol; i++) lem.sy
ba90: 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65 78 20  mbols[i]->index 
baa0: 3d 20 69 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  = i;.  for(i=1; 
bab0: 69 73 75 70 70 65 72 28 6c 65 6d 2e 73 79 6d 62  isupper(lem.symb
bac0: 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 5b 30 5d 29  ols[i]->name[0])
bad0: 3b 20 69 2b 2b 29 3b 0a 20 20 6c 65 6d 2e 6e 74  ; i++);.  lem.nt
bae0: 65 72 6d 69 6e 61 6c 20 3d 20 69 3b 0a 0a 20 20  erminal = i;..  
baf0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 72 65  /* Generate a re
bb00: 70 72 69 6e 74 20 6f 66 20 74 68 65 20 67 72 61  print of the gra
bb10: 6d 6d 61 72 2c 20 69 66 20 72 65 71 75 65 73 74  mmar, if request
bb20: 65 64 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  ed on the comman
bb30: 64 20 6c 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20  d line */.  if( 
bb40: 72 70 66 6c 61 67 20 29 7b 0a 20 20 20 20 52 65  rpflag ){.    Re
bb50: 70 72 69 6e 74 28 26 6c 65 6d 29 3b 0a 20 20 7d  print(&lem);.  }
bb60: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69  else{.    /* Ini
bb70: 74 69 61 6c 69 7a 65 20 74 68 65 20 73 69 7a 65  tialize the size
bb80: 20 66 6f 72 20 61 6c 6c 20 66 6f 6c 6c 6f 77 20   for all follow 
bb90: 61 6e 64 20 66 69 72 73 74 20 73 65 74 73 20 2a  and first sets *
bba0: 2f 0a 20 20 20 20 53 65 74 53 69 7a 65 28 6c 65  /.    SetSize(le
bbb0: 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2b 31 29 3b 0a  m.nterminal+1);.
bbc0: 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 74 68 65  .    /* Find the
bbd0: 20 70 72 65 63 65 64 65 6e 63 65 20 66 6f 72 20   precedence for 
bbe0: 65 76 65 72 79 20 70 72 6f 64 75 63 74 69 6f 6e  every production
bbf0: 20 72 75 6c 65 20 28 74 68 61 74 20 68 61 73 20   rule (that has 
bc00: 6f 6e 65 29 20 2a 2f 0a 20 20 20 20 46 69 6e 64  one) */.    Find
bc10: 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73 28  RulePrecedences(
bc20: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  &lem);..    /* C
bc30: 6f 6d 70 75 74 65 20 74 68 65 20 6c 61 6d 62 64  ompute the lambd
bc40: 61 2d 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 61  a-nonterminals a
bc50: 6e 64 20 74 68 65 20 66 69 72 73 74 2d 73 65 74  nd the first-set
bc60: 73 20 66 6f 72 20 65 76 65 72 79 0a 20 20 20 20  s for every.    
bc70: 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 2a  ** nonterminal *
bc80: 2f 0a 20 20 20 20 46 69 6e 64 46 69 72 73 74 53  /.    FindFirstS
bc90: 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  ets(&lem);..    
bca0: 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c  /* Compute all L
bcb0: 52 28 30 29 20 73 74 61 74 65 73 2e 20 20 41 6c  R(0) states.  Al
bcc0: 73 6f 20 72 65 63 6f 72 64 20 66 6f 6c 6c 6f 77  so record follow
bcd0: 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e  -set propagation
bce0: 0a 20 20 20 20 2a 2a 20 6c 69 6e 6b 73 20 73 6f  .    ** links so
bcf0: 20 74 68 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77   that the follow
bd00: 2d 73 65 74 20 63 61 6e 20 62 65 20 63 6f 6d 70  -set can be comp
bd10: 75 74 65 64 20 6c 61 74 65 72 20 2a 2f 0a 20 20  uted later */.  
bd20: 20 20 6c 65 6d 2e 6e 73 74 61 74 65 20 3d 20 30    lem.nstate = 0
bd30: 3b 0a 20 20 20 20 46 69 6e 64 53 74 61 74 65 73  ;.    FindStates
bd40: 28 26 6c 65 6d 29 3b 0a 20 20 20 20 6c 65 6d 2e  (&lem);.    lem.
bd50: 73 6f 72 74 65 64 20 3d 20 53 74 61 74 65 5f 61  sorted = State_a
bd60: 72 72 61 79 6f 66 28 29 3b 0a 0a 20 20 20 20 2f  rrayof();..    /
bd70: 2a 20 54 69 65 20 75 70 20 6c 6f 6f 73 65 20 65  * Tie up loose e
bd80: 6e 64 73 20 6f 6e 20 74 68 65 20 70 72 6f 70 61  nds on the propa
bd90: 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a  gation links */.
bda0: 20 20 20 20 46 69 6e 64 4c 69 6e 6b 73 28 26 6c      FindLinks(&l
bdb0: 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  em);..    /* Com
bdc0: 70 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77 20  pute the follow 
bdd0: 73 65 74 20 6f 66 20 65 76 65 72 79 20 72 65 64  set of every red
bde0: 75 63 69 62 6c 65 20 63 6f 6e 66 69 67 75 72 61  ucible configura
bdf0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 46 69 6e 64  tion */.    Find
be00: 46 6f 6c 6c 6f 77 53 65 74 73 28 26 6c 65 6d 29  FollowSets(&lem)
be10: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  ;..    /* Comput
be20: 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  e the action tab
be30: 6c 65 73 20 2a 2f 0a 20 20 20 20 46 69 6e 64 41  les */.    FindA
be40: 63 74 69 6f 6e 73 28 26 6c 65 6d 29 3b 0a 0a 20  ctions(&lem);.. 
be50: 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 20 74     /* Compress t
be60: 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73  he action tables
be70: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6f 6d 70   */.    if( comp
be80: 72 65 73 73 3d 3d 30 20 29 20 43 6f 6d 70 72 65  ress==0 ) Compre
be90: 73 73 54 61 62 6c 65 73 28 26 6c 65 6d 29 3b 0a  ssTables(&lem);.
bea0: 0a 20 20 20 20 2f 2a 20 52 65 6f 72 64 65 72 20  .    /* Reorder 
beb0: 61 6e 64 20 72 65 6e 75 6d 62 65 72 20 74 68 65  and renumber the
bec0: 20 73 74 61 74 65 73 20 73 6f 20 74 68 61 74 20   states so that 
bed0: 73 74 61 74 65 73 20 77 69 74 68 20 66 65 77 65  states with fewe
bee0: 72 20 63 68 6f 69 63 65 73 0a 20 20 20 20 2a 2a  r choices.    **
bef0: 20 6f 63 63 75 72 20 61 74 20 74 68 65 20 65 6e   occur at the en
bf00: 64 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f  d.  This is an o
bf10: 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 68 61 74  ptimization that
bf20: 20 68 65 6c 70 73 20 6d 61 6b 65 20 74 68 65 0a   helps make the.
bf30: 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 64      ** generated
bf40: 20 70 61 72 73 65 72 20 74 61 62 6c 65 73 20 73   parser tables s
bf50: 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 20 20 20 20 69  maller. */.    i
bf60: 66 28 20 6e 6f 52 65 73 6f 72 74 3d 3d 30 20 29  f( noResort==0 )
bf70: 20 52 65 73 6f 72 74 53 74 61 74 65 73 28 26 6c   ResortStates(&l
bf80: 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e  em);..    /* Gen
bf90: 65 72 61 74 65 20 61 20 72 65 70 6f 72 74 20 6f  erate a report o
bfa0: 66 20 74 68 65 20 70 61 72 73 65 72 20 67 65 6e  f the parser gen
bfb0: 65 72 61 74 65 64 2e 20 20 28 74 68 65 20 22 79  erated.  (the "y
bfc0: 2e 6f 75 74 70 75 74 22 20 66 69 6c 65 29 20 2a  .output" file) *
bfd0: 2f 0a 20 20 20 20 69 66 28 20 21 71 75 69 65 74  /.    if( !quiet
bfe0: 20 29 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28   ) ReportOutput(
bff0: 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  &lem);..    /* G
c000: 65 6e 65 72 61 74 65 20 74 68 65 20 73 6f 75 72  enerate the sour
c010: 63 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20  ce code for the 
c020: 70 61 72 73 65 72 20 2a 2f 0a 20 20 20 20 52 65  parser */.    Re
c030: 70 6f 72 74 54 61 62 6c 65 28 26 6c 65 6d 2c 20  portTable(&lem, 
c040: 6d 68 66 6c 61 67 29 3b 0a 0a 20 20 20 20 2f 2a  mhflag);..    /*
c050: 20 50 72 6f 64 75 63 65 20 61 20 68 65 61 64 65   Produce a heade
c060: 72 20 66 69 6c 65 20 66 6f 72 20 75 73 65 20 62  r file for use b
c070: 79 20 74 68 65 20 73 63 61 6e 6e 65 72 2e 20 20  y the scanner.  
c080: 28 54 68 69 73 20 73 74 65 70 20 69 73 0a 20 20  (This step is.  
c090: 20 20 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66 20    ** omitted if 
c0a0: 74 68 65 20 22 2d 6d 22 20 6f 70 74 69 6f 6e 20  the "-m" option 
c0b0: 69 73 20 75 73 65 64 20 62 65 63 61 75 73 65 20  is used because 
c0c0: 6d 61 6b 65 68 65 61 64 65 72 73 20 77 69 6c 6c  makeheaders will
c0d0: 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65  .    ** generate
c0e0: 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 75 73   the file for us
c0f0: 2e 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 6d  .) */.    if( !m
c100: 68 66 6c 61 67 20 29 20 52 65 70 6f 72 74 48 65  hflag ) ReportHe
c110: 61 64 65 72 28 26 6c 65 6d 29 3b 0a 20 20 7d 0a  ader(&lem);.  }.
c120: 20 20 69 66 28 20 73 74 61 74 69 73 74 69 63 73    if( statistics
c130: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22   ){.    printf("
c140: 50 61 72 73 65 72 20 73 74 61 74 69 73 74 69 63  Parser statistic
c150: 73 3a 20 25 64 20 74 65 72 6d 69 6e 61 6c 73 2c  s: %d terminals,
c160: 20 25 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73   %d nonterminals
c170: 2c 20 25 64 20 72 75 6c 65 73 5c 6e 22 2c 0a 20  , %d rules\n",. 
c180: 20 20 20 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e       lem.ntermin
c190: 61 6c 2c 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20  al, lem.nsymbol 
c1a0: 2d 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2c  - lem.nterminal,
c1b0: 20 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20 20 20   lem.nrule);.   
c1c0: 20 70 72 69 6e 74 66 28 22 20 20 20 20 20 20 20   printf("       
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20 73              %d s
c1e0: 74 61 74 65 73 2c 20 25 64 20 70 61 72 73 65 72  tates, %d parser
c1f0: 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2c 20   table entries, 
c200: 25 64 20 63 6f 6e 66 6c 69 63 74 73 5c 6e 22 2c  %d conflicts\n",
c210: 0a 20 20 20 20 20 20 6c 65 6d 2e 6e 73 74 61 74  .      lem.nstat
c220: 65 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69 7a 65  e, lem.tablesize
c230: 2c 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29  , lem.nconflict)
c240: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 2e  ;.  }.  if( lem.
c250: 6e 63 6f 6e 66 6c 69 63 74 20 3e 20 30 20 29 7b  nconflict > 0 ){
c260: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
c270: 65 72 72 2c 22 25 64 20 70 61 72 73 69 6e 67 20  err,"%d parsing 
c280: 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22 2c 6c 65  conflicts.\n",le
c290: 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a 20 20  m.nconflict);.  
c2a0: 7d 0a 0a 20 20 2f 2a 20 72 65 74 75 72 6e 20 30  }..  /* return 0
c2b0: 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 31 20 6f   on success, 1 o
c2c0: 6e 20 66 61 69 6c 75 72 65 2e 20 2a 2f 0a 20 20  n failure. */.  
c2d0: 65 78 69 74 63 6f 64 65 20 3d 20 28 28 6c 65 6d  exitcode = ((lem
c2e0: 2e 65 72 72 6f 72 63 6e 74 20 3e 20 30 29 20 7c  .errorcnt > 0) |
c2f0: 7c 20 28 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74  | (lem.nconflict
c300: 20 3e 20 30 29 29 20 3f 20 31 20 3a 20 30 3b 0a   > 0)) ? 1 : 0;.
c310: 20 20 65 78 69 74 28 65 78 69 74 63 6f 64 65 29    exit(exitcode)
c320: 3b 0a 20 20 72 65 74 75 72 6e 20 28 65 78 69 74  ;.  return (exit
c330: 63 6f 64 65 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  code);.}./******
c340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
c350: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6d 73  rom the file "ms
c360: 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ort.c" *********
c370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c380: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 20  ******/./*.** A 
c390: 67 65 6e 65 72 69 63 20 6d 65 72 67 65 2d 73 6f  generic merge-so
c3a0: 72 74 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a  rt program..**.*
c3b0: 2a 20 55 53 41 47 45 3a 0a 2a 2a 20 4c 65 74 20  * USAGE:.** Let 
c3c0: 22 70 74 72 22 20 62 65 20 61 20 70 6f 69 6e 74  "ptr" be a point
c3d0: 65 72 20 74 6f 20 73 6f 6d 65 20 73 74 72 75 63  er to some struc
c3e0: 74 75 72 65 20 77 68 69 63 68 20 69 73 20 61 74  ture which is at
c3f0: 20 74 68 65 20 68 65 61 64 20 6f 66 0a 2a 2a 20   the head of.** 
c400: 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65  a null-terminate
c410: 64 20 6c 69 73 74 2e 20 20 54 68 65 6e 20 74 6f  d list.  Then to
c420: 20 73 6f 72 74 20 74 68 65 20 6c 69 73 74 20 63   sort the list c
c430: 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70  all:.**.**     p
c440: 74 72 20 3d 20 6d 73 6f 72 74 28 70 74 72 2c 26  tr = msort(ptr,&
c450: 28 70 74 72 2d 3e 6e 65 78 74 29 2c 63 6d 70 66  (ptr->next),cmpf
c460: 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  nc);.**.** In th
c470: 65 20 61 62 6f 76 65 2c 20 22 63 6d 70 66 6e 63  e above, "cmpfnc
c480: 22 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  " is a pointer t
c490: 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 68 69  o a function whi
c4a0: 63 68 20 63 6f 6d 70 61 72 65 73 0a 2a 2a 20 74  ch compares.** t
c4b0: 77 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  wo instances of 
c4c0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 61 6e  the structure an
c4d0: 64 20 72 65 74 75 72 6e 73 20 61 6e 20 69 6e 74  d returns an int
c4e0: 65 67 65 72 2c 20 61 73 20 69 6e 0a 2a 2a 20 73  eger, as in.** s
c4f0: 74 72 63 6d 70 2e 20 20 54 68 65 20 73 65 63 6f  trcmp.  The seco
c500: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  nd argument is a
c510: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
c520: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
c530: 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74  * second element
c540: 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   of the linked l
c550: 69 73 74 2e 20 20 54 68 69 73 20 61 64 64 72 65  ist.  This addre
c560: 73 73 20 69 73 20 75 73 65 64 20 74 6f 20 63 6f  ss is used to co
c570: 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20 6f 66 66  mpute.** the off
c580: 73 65 74 20 74 6f 20 74 68 65 20 22 6e 65 78 74  set to the "next
c590: 22 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74  " field within t
c5a0: 68 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  he structure.  T
c5b0: 68 65 20 6f 66 66 73 65 74 20 74 6f 0a 2a 2a 20  he offset to.** 
c5c0: 74 68 65 20 22 6e 65 78 74 22 20 66 69 65 6c 64  the "next" field
c5d0: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e   must be constan
c5e0: 74 20 66 6f 72 20 61 6c 6c 20 73 74 72 75 63 74  t for all struct
c5f0: 75 72 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ures in the list
c600: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 75 6e 63  ..**.** The func
c610: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 6e  tion returns a n
c620: 65 77 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68  ew pointer which
c630: 20 69 73 20 74 68 65 20 68 65 61 64 20 6f 66 20   is the head of 
c640: 74 68 65 20 6c 69 73 74 0a 2a 2a 20 61 66 74 65  the list.** afte
c650: 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  r sorting..**.**
c660: 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a 2a 20 4d   ALGORITHM:.** M
c670: 65 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f 0a 0a 2f  erge-sort..*/../
c680: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
c690: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78  inter to the nex
c6a0: 74 20 73 74 72 75 63 74 75 72 65 20 69 6e 20 74  t structure in t
c6b0: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a  he linked list..
c6c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 45 58 54 28  */.#define NEXT(
c6d0: 41 29 20 28 2a 28 63 68 61 72 2a 2a 29 28 28 28  A) (*(char**)(((
c6e0: 63 68 61 72 2a 29 41 29 2b 6f 66 66 73 65 74 29  char*)A)+offset)
c6f0: 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a  )../*.** Inputs:
c700: 0a 2a 2a 20 20 20 61 3a 20 20 20 20 20 20 20 41  .**   a:       A
c710: 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65   sorted, null-te
c720: 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20  rminated linked 
c730: 6c 69 73 74 2e 20 20 28 4d 61 79 20 62 65 20 6e  list.  (May be n
c740: 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62 3a 20 20 20  ull)..**   b:   
c750: 20 20 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75      A sorted, nu
c760: 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69  ll-terminated li
c770: 6e 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79  nked list.  (May
c780: 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20   be null)..**   
c790: 63 6d 70 3a 20 20 20 20 20 41 20 70 6f 69 6e 74  cmp:     A point
c7a0: 65 72 20 74 6f 20 74 68 65 20 63 6f 6d 70 61 72  er to the compar
c7b0: 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ison function..*
c7c0: 2a 20 20 20 6f 66 66 73 65 74 3a 20 20 4f 66 66  *   offset:  Off
c7d0: 73 65 74 20 69 6e 20 74 68 65 20 73 74 72 75 63  set in the struc
c7e0: 74 75 72 65 20 74 6f 20 74 68 65 20 22 6e 65 78  ture to the "nex
c7f0: 74 22 20 66 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20  t" field..**.** 
c800: 52 65 74 75 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a  Return Value:.**
c810: 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20     A pointer to 
c820: 74 68 65 20 68 65 61 64 20 6f 66 20 61 20 73 6f  the head of a so
c830: 72 74 65 64 20 6c 69 73 74 20 63 6f 6e 74 61 69  rted list contai
c840: 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d 65 6e 74  ning the element
c850: 73 0a 2a 2a 20 20 20 6f 66 20 62 6f 74 68 20 61  s.**   of both a
c860: 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a 2a 20 53 69   and b..**.** Si
c870: 64 65 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20  de effects:.**  
c880: 20 54 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e   The "next" poin
c890: 74 65 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74  ters for element
c8a0: 73 20 69 6e 20 74 68 65 20 6c 69 73 74 73 20 61  s in the lists a
c8b0: 20 61 6e 64 20 62 20 61 72 65 0a 2a 2a 20 20 20   and b are.**   
c8c0: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 73 74 61 74  changed..*/.stat
c8d0: 69 63 20 63 68 61 72 20 2a 6d 65 72 67 65 28 0a  ic char *merge(.
c8e0: 20 20 63 68 61 72 20 2a 61 2c 0a 20 20 63 68 61    char *a,.  cha
c8f0: 72 20 2a 62 2c 0a 20 20 69 6e 74 20 28 2a 63 6d  r *b,.  int (*cm
c900: 70 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  p)(const char*,c
c910: 6f 6e 73 74 20 63 68 61 72 2a 29 2c 0a 20 20 69  onst char*),.  i
c920: 6e 74 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 63  nt offset.){.  c
c930: 68 61 72 20 2a 70 74 72 2c 20 2a 68 65 61 64 3b  har *ptr, *head;
c940: 0a 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a  ..  if( a==0 ){.
c950: 20 20 20 20 68 65 61 64 20 3d 20 62 3b 0a 20 20      head = b;.  
c960: 7d 65 6c 73 65 20 69 66 28 20 62 3d 3d 30 20 29  }else if( b==0 )
c970: 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 61 3b 0a  {.    head = a;.
c980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
c990: 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c 3d 30 20   (*cmp)(a,b)<=0 
c9a0: 29 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 61  ){.      ptr = a
c9b0: 3b 0a 20 20 20 20 20 20 61 20 3d 20 4e 45 58 54  ;.      a = NEXT
c9c0: 28 61 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (a);.    }else{.
c9d0: 20 20 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20        ptr = b;. 
c9e0: 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29       b = NEXT(b)
c9f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 65 61 64  ;.    }.    head
ca00: 20 3d 20 70 74 72 3b 0a 20 20 20 20 77 68 69 6c   = ptr;.    whil
ca10: 65 28 20 61 20 26 26 20 62 20 29 7b 0a 20 20 20  e( a && b ){.   
ca20: 20 20 20 69 66 28 20 28 2a 63 6d 70 29 28 61 2c     if( (*cmp)(a,
ca30: 62 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  b)<=0 ){.       
ca40: 20 4e 45 58 54 28 70 74 72 29 20 3d 20 61 3b 0a   NEXT(ptr) = a;.
ca50: 20 20 20 20 20 20 20 20 70 74 72 20 3d 20 61 3b          ptr = a;
ca60: 0a 20 20 20 20 20 20 20 20 61 20 3d 20 4e 45 58  .        a = NEX
ca70: 54 28 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  T(a);.      }els
ca80: 65 7b 0a 20 20 20 20 20 20 20 20 4e 45 58 54 28  e{.        NEXT(
ca90: 70 74 72 29 20 3d 20 62 3b 0a 20 20 20 20 20 20  ptr) = b;.      
caa0: 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20 20 20    ptr = b;.     
cab0: 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29 3b 0a     b = NEXT(b);.
cac0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
cad0: 20 20 69 66 28 20 61 20 29 20 4e 45 58 54 28 70    if( a ) NEXT(p
cae0: 74 72 29 20 3d 20 61 3b 0a 20 20 20 20 65 6c 73  tr) = a;.    els
caf0: 65 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d  e    NEXT(ptr) =
cb00: 20 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   b;.  }.  return
cb10: 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   head;.}../*.** 
cb20: 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 6c 69 73  Inputs:.**   lis
cb30: 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20  t:      Pointer 
cb40: 74 6f 20 61 20 73 69 6e 67 6c 79 2d 6c 69 6e 6b  to a singly-link
cb50: 65 64 20 6c 69 73 74 20 6f 66 20 73 74 72 75 63  ed list of struc
cb60: 74 75 72 65 73 2e 0a 2a 2a 20 20 20 6e 65 78 74  tures..**   next
cb70: 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74  :      Pointer t
cb80: 6f 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  o pointer to the
cb90: 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20   second element 
cba0: 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a 20  of the list..** 
cbb0: 20 20 63 6d 70 3a 20 20 20 20 20 20 20 41 20 63    cmp:       A c
cbc0: 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69  omparison functi
cbd0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  on..**.** Return
cbe0: 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41 20 70   Value:.**   A p
cbf0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65  ointer to the he
cc00: 61 64 20 6f 66 20 61 20 73 6f 72 74 65 64 20 6c  ad of a sorted l
cc10: 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ist containing t
cc20: 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 20  he elements.**  
cc30: 20 6f 72 67 69 6e 61 6c 6c 79 20 69 6e 20 6c 69   orginally in li
cc40: 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65  st..**.** Side e
cc50: 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65  ffects:.**   The
cc60: 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72 73   "next" pointers
cc70: 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e   for elements in
cc80: 20 6c 69 73 74 20 61 72 65 20 63 68 61 6e 67 65   list are change
cc90: 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4c 49  d..*/.#define LI
cca0: 53 54 53 49 5a 45 20 33 30 0a 73 74 61 74 69 63  STSIZE 30.static
ccb0: 20 63 68 61 72 20 2a 6d 73 6f 72 74 28 0a 20 20   char *msort(.  
ccc0: 63 68 61 72 20 2a 6c 69 73 74 2c 0a 20 20 63 68  char *list,.  ch
ccd0: 61 72 20 2a 2a 6e 65 78 74 2c 0a 20 20 69 6e 74  ar **next,.  int
cce0: 20 28 2a 63 6d 70 29 28 63 6f 6e 73 74 20 63 68   (*cmp)(const ch
ccf0: 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  ar*,const char*)
cd00: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  .){.  unsigned l
cd10: 6f 6e 67 20 6f 66 66 73 65 74 3b 0a 20 20 63 68  ong offset;.  ch
cd20: 61 72 20 2a 65 70 3b 0a 20 20 63 68 61 72 20 2a  ar *ep;.  char *
cd30: 73 65 74 5b 4c 49 53 54 53 49 5a 45 5d 3b 0a 20  set[LISTSIZE];. 
cd40: 20 69 6e 74 20 69 3b 0a 20 20 6f 66 66 73 65 74   int i;.  offset
cd50: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e   = (unsigned lon
cd60: 67 29 6e 65 78 74 20 2d 20 28 75 6e 73 69 67 6e  g)next - (unsign
cd70: 65 64 20 6c 6f 6e 67 29 6c 69 73 74 3b 0a 20 20  ed long)list;.  
cd80: 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53  for(i=0; i<LISTS
cd90: 49 5a 45 3b 20 69 2b 2b 29 20 73 65 74 5b 69 5d  IZE; i++) set[i]
cda0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 6c   = 0;.  while( l
cdb0: 69 73 74 20 29 7b 0a 20 20 20 20 65 70 20 3d 20  ist ){.    ep = 
cdc0: 6c 69 73 74 3b 0a 20 20 20 20 6c 69 73 74 20 3d  list;.    list =
cdd0: 20 4e 45 58 54 28 6c 69 73 74 29 3b 0a 20 20 20   NEXT(list);.   
cde0: 20 4e 45 58 54 28 65 70 29 20 3d 20 30 3b 0a 20   NEXT(ep) = 0;. 
cdf0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49     for(i=0; i<LI
ce00: 53 54 53 49 5a 45 2d 31 20 26 26 20 73 65 74 5b  STSIZE-1 && set[
ce10: 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  i]!=0; i++){.   
ce20: 20 20 20 65 70 20 3d 20 6d 65 72 67 65 28 65 70     ep = merge(ep
ce30: 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73  ,set[i],cmp,offs
ce40: 65 74 29 3b 0a 20 20 20 20 20 20 73 65 74 5b 69  et);.      set[i
ce50: 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = 0;.    }.   
ce60: 20 73 65 74 5b 69 5d 20 3d 20 65 70 3b 0a 20 20   set[i] = ep;.  
ce70: 7d 0a 20 20 65 70 20 3d 20 30 3b 0a 20 20 66 6f  }.  ep = 0;.  fo
ce80: 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a  r(i=0; i<LISTSIZ
ce90: 45 3b 20 69 2b 2b 29 20 69 66 28 20 73 65 74 5b  E; i++) if( set[
cea0: 69 5d 20 29 20 65 70 20 3d 20 6d 65 72 67 65 28  i] ) ep = merge(
ceb0: 73 65 74 5b 69 5d 2c 65 70 2c 63 6d 70 2c 6f 66  set[i],ep,cmp,of
cec0: 66 73 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  fset);.  return 
ced0: 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ep;.}./*********
cee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
cef0: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6f  From the file "o
cf00: 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a  ption.c" *******
cf10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
cf20: 2a 2a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ***/.static char
cf30: 20 2a 2a 61 72 67 76 3b 0a 73 74 61 74 69 63 20   **argv;.static 
cf40: 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e 73  struct s_options
cf50: 20 2a 6f 70 3b 0a 73 74 61 74 69 63 20 46 49 4c   *op;.static FIL
cf60: 45 20 2a 65 72 72 73 74 72 65 61 6d 3b 0a 0a 23  E *errstream;..#
cf70: 64 65 66 69 6e 65 20 49 53 4f 50 54 28 58 29 20  define ISOPT(X) 
cf80: 28 28 58 29 5b 30 5d 3d 3d 27 2d 27 7c 7c 28 58  ((X)[0]=='-'||(X
cf90: 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73 74 72 63 68  )[0]=='+'||strch
cfa0: 72 28 28 58 29 2c 27 3d 27 29 21 3d 30 29 0a 0a  r((X),'=')!=0)..
cfb0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
cfc0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 69 74  command line wit
cfd0: 68 20 61 20 63 61 72 72 6f 74 20 70 6f 69 6e 74  h a carrot point
cfe0: 69 6e 67 20 74 6f 20 74 68 65 20 6b 2d 74 68 20  ing to the k-th 
cff0: 63 68 61 72 61 63 74 65 72 0a 2a 2a 20 6f 66 20  character.** of 
d000: 74 68 65 20 6e 2d 74 68 20 66 69 65 6c 64 2e 0a  the n-th field..
d010: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
d020: 72 72 6c 69 6e 65 28 69 6e 74 20 6e 2c 20 69 6e  rrline(int n, in
d030: 74 20 6b 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a  t k, FILE *err).
d040: 7b 0a 20 20 69 6e 74 20 73 70 63 6e 74 2c 20 69  {.  int spcnt, i
d050: 3b 0a 20 20 69 66 28 20 61 72 67 76 5b 30 5d 20  ;.  if( argv[0] 
d060: 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25  ) fprintf(err,"%
d070: 73 22 2c 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73  s",argv[0]);.  s
d080: 70 63 6e 74 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c  pcnt = lemonStrl
d090: 65 6e 28 61 72 67 76 5b 30 5d 29 20 2b 20 31 3b  en(argv[0]) + 1;
d0a0: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20  .  for(i=1; i<n 
d0b0: 26 26 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29  && argv[i]; i++)
d0c0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72  {.    fprintf(er
d0d0: 72 2c 22 20 25 73 22 2c 61 72 67 76 5b 69 5d 29  r," %s",argv[i])
d0e0: 3b 0a 20 20 20 20 73 70 63 6e 74 20 2b 3d 20 6c  ;.    spcnt += l
d0f0: 65 6d 6f 6e 53 74 72 6c 65 6e 28 61 72 67 76 5b  emonStrlen(argv[
d100: 69 5d 29 2b 31 3b 0a 20 20 7d 0a 20 20 73 70 63  i])+1;.  }.  spc
d110: 6e 74 20 2b 3d 20 6b 3b 0a 20 20 66 6f 72 28 3b  nt += k;.  for(;
d120: 20 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 20 66   argv[i]; i++) f
d130: 70 72 69 6e 74 66 28 65 72 72 2c 22 20 25 73 22  printf(err," %s"
d140: 2c 61 72 67 76 5b 69 5d 29 3b 0a 20 20 69 66 28  ,argv[i]);.  if(
d150: 20 73 70 63 6e 74 3c 32 30 20 29 7b 0a 20 20 20   spcnt<20 ){.   
d160: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e   fprintf(err,"\n
d170: 25 2a 73 5e 2d 2d 20 68 65 72 65 5c 6e 22 2c 73  %*s^-- here\n",s
d180: 70 63 6e 74 2c 22 22 29 3b 0a 20 20 7d 65 6c 73  pcnt,"");.  }els
d190: 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65  e{.    fprintf(e
d1a0: 72 72 2c 22 5c 6e 25 2a 73 68 65 72 65 20 2d 2d  rr,"\n%*shere --
d1b0: 5e 5c 6e 22 2c 73 70 63 6e 74 2d 37 2c 22 22 29  ^\n",spcnt-7,"")
d1c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
d1d0: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
d1e0: 6f 66 20 74 68 65 20 4e 2d 74 68 20 6e 6f 6e 2d  of the N-th non-
d1f0: 73 77 69 74 63 68 20 61 72 67 75 6d 65 6e 74 2e  switch argument.
d200: 20 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69    Return -1.** i
d210: 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61  f N is out of ra
d220: 6e 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nge..*/.static i
d230: 6e 74 20 61 72 67 69 6e 64 65 78 28 69 6e 74 20  nt argindex(int 
d240: 6e 29 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  n).{.  int i;.  
d250: 69 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20 30  int dashdash = 0
d260: 3b 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30 20  ;.  if( argv!=0 
d270: 26 26 20 2a 61 72 67 76 21 3d 30 20 29 7b 0a 20  && *argv!=0 ){. 
d280: 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76     for(i=1; argv
d290: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
d2a0: 20 69 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c   if( dashdash ||
d2b0: 20 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29   !ISOPT(argv[i])
d2c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
d2d0: 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 69 3b  n==0 ) return i;
d2e0: 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20  .        n--;.  
d2f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
d300: 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22  strcmp(argv[i],"
d310: 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61  --")==0 ) dashda
d320: 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  sh = 1;.    }.  
d330: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d  }.  return -1;.}
d340: 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20 65 6d  ..static char em
d350: 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61 6e 64 20  sg[] = "Command 
d360: 6c 69 6e 65 20 73 79 6e 74 61 78 20 65 72 72 6f  line syntax erro
d370: 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  r: ";../*.** Pro
d380: 63 65 73 73 20 61 20 66 6c 61 67 20 63 6f 6d 6d  cess a flag comm
d390: 61 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d 65 6e  and line argumen
d3a0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
d3b0: 20 68 61 6e 64 6c 65 66 6c 61 67 73 28 69 6e 74   handleflags(int
d3c0: 20 69 2c 20 46 49 4c 45 20 2a 65 72 72 29 0a 7b   i, FILE *err).{
d3d0: 0a 20 20 69 6e 74 20 76 3b 0a 20 20 69 6e 74 20  .  int v;.  int 
d3e0: 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e  errcnt = 0;.  in
d3f0: 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  t j;.  for(j=0; 
d400: 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b  op[j].label; j++
d410: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63  ){.    if( strnc
d420: 6d 70 28 26 61 72 67 76 5b 69 5d 5b 31 5d 2c 6f  mp(&argv[i][1],o
d430: 70 5b 6a 5d 2e 6c 61 62 65 6c 2c 6c 65 6d 6f 6e  p[j].label,lemon
d440: 53 74 72 6c 65 6e 28 6f 70 5b 6a 5d 2e 6c 61 62  Strlen(op[j].lab
d450: 65 6c 29 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  el))==0 ) break;
d460: 0a 20 20 7d 0a 20 20 76 20 3d 20 61 72 67 76 5b  .  }.  v = argv[
d470: 69 5d 5b 30 5d 3d 3d 27 2d 27 20 3f 20 31 20 3a  i][0]=='-' ? 1 :
d480: 20 30 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e   0;.  if( op[j].
d490: 6c 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  label==0 ){.    
d4a0: 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20  if( err ){.     
d4b0: 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73   fprintf(err,"%s
d4c0: 75 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e  undefined option
d4d0: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
d4e0: 20 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72    errline(i,1,er
d4f0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72  r);.    }.    er
d500: 72 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20  rcnt++;.  }else 
d510: 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d  if( op[j].type==
d520: 4f 50 54 5f 46 4c 41 47 20 29 7b 0a 20 20 20 20  OPT_FLAG ){.    
d530: 2a 28 28 69 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72  *((int*)op[j].ar
d540: 67 29 20 3d 20 76 3b 0a 20 20 7d 65 6c 73 65 20  g) = v;.  }else 
d550: 69 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d  if( op[j].type==
d560: 4f 50 54 5f 46 46 4c 41 47 20 29 7b 0a 20 20 20  OPT_FFLAG ){.   
d570: 20 28 2a 28 76 6f 69 64 28 2a 29 28 69 6e 74 29   (*(void(*)(int)
d580: 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 76 29  )(op[j].arg))(v)
d590: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70  ;.  }else if( op
d5a0: 5b 6a 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 53  [j].type==OPT_FS
d5b0: 54 52 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69  TR ){.    (*(voi
d5c0: 64 28 2a 29 28 63 68 61 72 20 2a 29 29 28 6f 70  d(*)(char *))(op
d5d0: 5b 6a 5d 2e 61 72 67 29 29 28 26 61 72 67 76 5b  [j].arg))(&argv[
d5e0: 69 5d 5b 32 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b  i][2]);.  }else{
d5f0: 0a 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a  .    if( err ){.
d600: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72        fprintf(er
d610: 72 2c 22 25 73 6d 69 73 73 69 6e 67 20 61 72 67  r,"%smissing arg
d620: 75 6d 65 6e 74 20 6f 6e 20 73 77 69 74 63 68 2e  ument on switch.
d630: 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20  \n",emsg);.     
d640: 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72   errline(i,1,err
d650: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72  );.    }.    err
d660: 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  cnt++;.  }.  ret
d670: 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 2f  urn errcnt;.}../
d680: 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 63  *.** Process a c
d690: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 73 77 69 74  ommand line swit
d6a0: 63 68 20 77 68 69 63 68 20 68 61 73 20 61 6e 20  ch which has an 
d6b0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
d6c0: 74 69 63 20 69 6e 74 20 68 61 6e 64 6c 65 73 77  tic int handlesw
d6d0: 69 74 63 68 28 69 6e 74 20 69 2c 20 46 49 4c 45  itch(int i, FILE
d6e0: 20 2a 65 72 72 29 0a 7b 0a 20 20 69 6e 74 20 6c   *err).{.  int l
d6f0: 76 20 3d 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20  v = 0;.  double 
d700: 64 76 20 3d 20 30 2e 30 3b 0a 20 20 63 68 61 72  dv = 0.0;.  char
d710: 20 2a 73 76 20 3d 20 30 2c 20 2a 65 6e 64 3b 0a   *sv = 0, *end;.
d720: 20 20 63 68 61 72 20 2a 63 70 3b 0a 20 20 69 6e    char *cp;.  in
d730: 74 20 6a 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e  t j;.  int errcn
d740: 74 20 3d 20 30 3b 0a 20 20 63 70 20 3d 20 73 74  t = 0;.  cp = st
d750: 72 63 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27  rchr(argv[i],'='
d760: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 70 21  );.  assert( cp!
d770: 3d 30 20 29 3b 0a 20 20 2a 63 70 20 3d 20 30 3b  =0 );.  *cp = 0;
d780: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a  .  for(j=0; op[j
d790: 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20  ].label; j++){. 
d7a0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72     if( strcmp(ar
d7b0: 67 76 5b 69 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62 65  gv[i],op[j].labe
d7c0: 6c 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  l)==0 ) break;. 
d7d0: 20 7d 0a 20 20 2a 63 70 20 3d 20 27 3d 27 3b 0a   }.  *cp = '=';.
d7e0: 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65    if( op[j].labe
d7f0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  l==0 ){.    if( 
d800: 65 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70 72  err ){.      fpr
d810: 69 6e 74 66 28 65 72 72 2c 22 25 73 75 6e 64 65  intf(err,"%sunde
d820: 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22  fined option.\n"
d830: 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 65 72  ,emsg);.      er
d840: 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a  rline(i,0,err);.
d850: 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63 6e 74      }.    errcnt
d860: 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
d870: 20 63 70 2b 2b 3b 0a 20 20 20 20 73 77 69 74 63   cp++;.    switc
d880: 68 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 20 29 7b  h( op[j].type ){
d890: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
d8a0: 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65  FLAG:.      case
d8b0: 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20   OPT_FFLAG:.    
d8c0: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
d8d0: 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
d8e0: 28 65 72 72 2c 22 25 73 6f 70 74 69 6f 6e 20 72  (err,"%soption r
d8f0: 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d  equires an argum
d900: 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20  ent.\n",emsg);. 
d910: 20 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65           errline
d920: 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20 20 20  (i,0,err);.     
d930: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 72 72     }.        err
d940: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62  cnt++;.        b
d950: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
d960: 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20   OPT_DBL:.      
d970: 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a 0a 20  case OPT_FDBL:. 
d980: 20 20 20 20 20 20 20 64 76 20 3d 20 73 74 72 74         dv = strt
d990: 6f 64 28 63 70 2c 26 65 6e 64 29 3b 0a 20 20 20  od(cp,&end);.   
d9a0: 20 20 20 20 20 69 66 28 20 2a 65 6e 64 20 29 7b       if( *end ){
d9b0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
d9c0: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rr ){.          
d9d0: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25    fprintf(err,"%
d9e0: 73 69 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74  sillegal charact
d9f0: 65 72 20 69 6e 20 66 6c 6f 61 74 69 6e 67 2d 70  er in floating-p
da00: 6f 69 6e 74 20 61 72 67 75 6d 65 6e 74 2e 5c 6e  oint argument.\n
da10: 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  ",emsg);.       
da20: 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 28       errline(i,(
da30: 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 65  (unsigned long)e
da40: 6e 64 29 2d 28 75 6e 73 69 67 6e 65 64 20 6c 6f  nd)-(unsigned lo
da50: 6e 67 29 61 72 67 76 5b 69 5d 2c 65 72 72 29 3b  ng)argv[i],err);
da60: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
da70: 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b         errcnt++;
da80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
da90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
daa0: 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20  case OPT_INT:.  
dab0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e      case OPT_FIN
dac0: 54 3a 0a 20 20 20 20 20 20 20 20 6c 76 20 3d 20  T:.        lv = 
dad0: 73 74 72 74 6f 6c 28 63 70 2c 26 65 6e 64 2c 30  strtol(cp,&end,0
dae0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  );.        if( *
daf0: 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  end ){.         
db00: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
db10: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
db20: 65 72 72 2c 22 25 73 69 6c 6c 65 67 61 6c 20 63  err,"%sillegal c
db30: 68 61 72 61 63 74 65 72 20 69 6e 20 69 6e 74 65  haracter in inte
db40: 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 5c 6e 22  ger argument.\n"
db50: 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  ,emsg);.        
db60: 20 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 28 28      errline(i,((
db70: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 65 6e  unsigned long)en
db80: 64 29 2d 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  d)-(unsigned lon
db90: 67 29 61 72 67 76 5b 69 5d 2c 65 72 72 29 3b 0a  g)argv[i],err);.
dba0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
dbb0: 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a        errcnt++;.
dbc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
dbd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
dbe0: 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20  ase OPT_STR:.   
dbf0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52     case OPT_FSTR
dc00: 3a 0a 20 20 20 20 20 20 20 20 73 76 20 3d 20 63  :.        sv = c
dc10: 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  p;.        break
dc20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74  ;.    }.    swit
dc30: 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 20 29  ch( op[j].type )
dc40: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  {.      case OPT
dc50: 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63 61 73  _FLAG:.      cas
dc60: 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20  e OPT_FFLAG:.   
dc70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dc80: 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a    case OPT_DBL:.
dc90: 20 20 20 20 20 20 20 20 2a 28 64 6f 75 62 6c 65          *(double
dca0: 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20  *)(op[j].arg) = 
dcb0: 64 76 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  dv;.        brea
dcc0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
dcd0: 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20  T_FDBL:.        
dce0: 28 2a 28 76 6f 69 64 28 2a 29 28 64 6f 75 62 6c  (*(void(*)(doubl
dcf0: 65 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28  e))(op[j].arg))(
dd00: 64 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  dv);.        bre
dd10: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
dd20: 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 20 20  PT_INT:.        
dd30: 2a 28 69 6e 74 2a 29 28 6f 70 5b 6a 5d 2e 61 72  *(int*)(op[j].ar
dd40: 67 29 20 3d 20 6c 76 3b 0a 20 20 20 20 20 20 20  g) = lv;.       
dd50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
dd60: 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20  se OPT_FINT:.   
dd70: 20 20 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28       (*(void(*)(
dd80: 69 6e 74 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  int))(op[j].arg)
dd90: 29 28 28 69 6e 74 29 6c 76 29 3b 0a 20 20 20 20  )((int)lv);.    
dda0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ddb0: 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20   case OPT_STR:. 
ddc0: 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29         *(char**)
ddd0: 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 73 76  (op[j].arg) = sv
dde0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
ddf0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
de00: 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 28 2a  FSTR:.        (*
de10: 28 76 6f 69 64 28 2a 29 28 63 68 61 72 20 2a 29  (void(*)(char *)
de20: 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 73 76  )(op[j].arg))(sv
de30: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
de40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
de50: 74 75 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a  turn errcnt;.}..
de60: 69 6e 74 20 4f 70 74 49 6e 69 74 28 63 68 61 72  int OptInit(char
de70: 20 2a 2a 61 2c 20 73 74 72 75 63 74 20 73 5f 6f   **a, struct s_o
de80: 70 74 69 6f 6e 73 20 2a 6f 2c 20 46 49 4c 45 20  ptions *o, FILE 
de90: 2a 65 72 72 29 0a 7b 0a 20 20 69 6e 74 20 65 72  *err).{.  int er
dea0: 72 63 6e 74 20 3d 20 30 3b 0a 20 20 61 72 67 76  rcnt = 0;.  argv
deb0: 20 3d 20 61 3b 0a 20 20 6f 70 20 3d 20 6f 3b 0a   = a;.  op = o;.
dec0: 20 20 65 72 72 73 74 72 65 61 6d 20 3d 20 65 72    errstream = er
ded0: 72 3b 0a 20 20 69 66 28 20 61 72 67 76 20 26 26  r;.  if( argv &&
dee0: 20 2a 61 72 67 76 20 26 26 20 6f 70 20 29 7b 0a   *argv && op ){.
def0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
df00: 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b  or(i=1; argv[i];
df10: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
df20: 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2b 27   argv[i][0]=='+'
df30: 20 7c 7c 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d   || argv[i][0]==
df40: 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 65  '-' ){.        e
df50: 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 66  rrcnt += handlef
df60: 6c 61 67 73 28 69 2c 65 72 72 29 3b 0a 20 20 20  lags(i,err);.   
df70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
df80: 63 68 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29  chr(argv[i],'=')
df90: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 63   ){.        errc
dfa0: 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 73 77 69 74  nt += handleswit
dfb0: 63 68 28 69 2c 65 72 72 29 3b 0a 20 20 20 20 20  ch(i,err);.     
dfc0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
dfd0: 66 28 20 65 72 72 63 6e 74 3e 30 20 29 7b 0a 20  f( errcnt>0 ){. 
dfe0: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
dff0: 56 61 6c 69 64 20 63 6f 6d 6d 61 6e 64 20 6c 69  Valid command li
e000: 6e 65 20 6f 70 74 69 6f 6e 73 20 66 6f 72 20 5c  ne options for \
e010: 22 25 73 5c 22 20 61 72 65 3a 5c 6e 22 2c 2a 61  "%s\" are:\n",*a
e020: 29 3b 0a 20 20 20 20 4f 70 74 50 72 69 6e 74 28  );.    OptPrint(
e030: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
e040: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
e050: 7d 0a 0a 69 6e 74 20 4f 70 74 4e 41 72 67 73 28  }..int OptNArgs(
e060: 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  ){.  int cnt = 0
e070: 3b 0a 20 20 69 6e 74 20 64 61 73 68 64 61 73 68  ;.  int dashdash
e080: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
e090: 20 69 66 28 20 61 72 67 76 21 3d 30 20 26 26 20   if( argv!=0 && 
e0a0: 61 72 67 76 5b 30 5d 21 3d 30 20 29 7b 0a 20 20  argv[0]!=0 ){.  
e0b0: 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b    for(i=1; argv[
e0c0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
e0d0: 69 66 28 20 64 61 73 68 64 61 73 68 20 7c 7c 20  if( dashdash || 
e0e0: 21 49 53 4f 50 54 28 61 72 67 76 5b 69 5d 29 20  !ISOPT(argv[i]) 
e0f0: 29 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69  ) cnt++;.      i
e100: 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69  f( strcmp(argv[i
e110: 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73  ],"--")==0 ) das
e120: 68 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d  hdash = 1;.    }
e130: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6e  .  }.  return cn
e140: 74 3b 0a 7d 0a 0a 63 68 61 72 20 2a 4f 70 74 41  t;.}..char *OptA
e150: 72 67 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 69 6e  rg(int n).{.  in
e160: 74 20 69 3b 0a 20 20 69 20 3d 20 61 72 67 69 6e  t i;.  i = argin
e170: 64 65 78 28 6e 29 3b 0a 20 20 72 65 74 75 72 6e  dex(n);.  return
e180: 20 69 3e 3d 30 20 3f 20 61 72 67 76 5b 69 5d 20   i>=0 ? argv[i] 
e190: 3a 20 30 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74  : 0;.}..void Opt
e1a0: 45 72 72 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 69  Err(int n).{.  i
e1b0: 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61 72 67 69  nt i;.  i = argi
e1c0: 6e 64 65 78 28 6e 29 3b 0a 20 20 69 66 28 20 69  ndex(n);.  if( i
e1d0: 3e 3d 30 20 29 20 65 72 72 6c 69 6e 65 28 69 2c  >=0 ) errline(i,
e1e0: 30 2c 65 72 72 73 74 72 65 61 6d 29 3b 0a 7d 0a  0,errstream);.}.
e1f0: 0a 76 6f 69 64 20 4f 70 74 50 72 69 6e 74 28 29  .void OptPrint()
e200: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
e210: 20 6d 61 78 2c 20 6c 65 6e 3b 0a 20 20 6d 61 78   max, len;.  max
e220: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
e230: 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b   op[i].label; i+
e240: 2b 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 6c 65  +){.    len = le
e250: 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e  monStrlen(op[i].
e260: 6c 61 62 65 6c 29 20 2b 20 31 3b 0a 20 20 20 20  label) + 1;.    
e270: 73 77 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79  switch( op[i].ty
e280: 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  pe ){.      case
e290: 20 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20   OPT_FLAG:.     
e2a0: 20 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a   case OPT_FFLAG:
e2b0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e2c0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49        case OPT_I
e2d0: 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  NT:.      case O
e2e0: 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20  PT_FINT:.       
e2f0: 20 6c 65 6e 20 2b 3d 20 39 3b 20 20 20 20 20 20   len += 9;      
e300: 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c   /* length of "<
e310: 69 6e 74 65 67 65 72 3e 22 20 2a 2f 0a 20 20 20  integer>" */.   
e320: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e330: 20 20 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a    case OPT_DBL:.
e340: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
e350: 44 42 4c 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e  DBL:.        len
e360: 20 2b 3d 20 36 3b 20 20 20 20 20 20 20 2f 2a 20   += 6;       /* 
e370: 6c 65 6e 67 74 68 20 6f 66 20 22 3c 72 65 61 6c  length of "<real
e380: 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  >" */.        br
e390: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
e3a0: 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63  OPT_STR:.      c
e3b0: 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20  ase OPT_FSTR:.  
e3c0: 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 38 3b 20        len += 8; 
e3d0: 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20        /* length 
e3e0: 6f 66 20 22 3c 73 74 72 69 6e 67 3e 22 20 2a 2f  of "<string>" */
e3f0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e400: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 65      }.    if( le
e410: 6e 3e 6d 61 78 20 29 20 6d 61 78 20 3d 20 6c 65  n>max ) max = le
e420: 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  n;.  }.  for(i=0
e430: 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69  ; op[i].label; i
e440: 2b 2b 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28  ++){.    switch(
e450: 20 6f 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20   op[i].type ){. 
e460: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c       case OPT_FL
e470: 41 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  AG:.      case O
e480: 50 54 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20  PT_FFLAG:.      
e490: 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72    fprintf(errstr
e4a0: 65 61 6d 2c 22 20 20 2d 25 2d 2a 73 20 20 25 73  eam,"  -%-*s  %s
e4b0: 5c 6e 22 2c 6d 61 78 2c 6f 70 5b 69 5d 2e 6c 61  \n",max,op[i].la
e4c0: 62 65 6c 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67  bel,op[i].messag
e4d0: 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
e4e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
e4f0: 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73  T_INT:.      cas
e500: 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20  e OPT_FINT:.    
e510: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73      fprintf(errs
e520: 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 69 6e 74  tream,"  %s=<int
e530: 65 67 65 72 3e 25 2a 73 20 20 25 73 5c 6e 22 2c  eger>%*s  %s\n",
e540: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20  op[i].label,.   
e550: 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78         (int)(max
e560: 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6f 70 5b  -lemonStrlen(op[
e570: 69 5d 2e 6c 61 62 65 6c 29 2d 39 29 2c 22 22 2c  i].label)-9),"",
e580: 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a  op[i].message);.
e590: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e5a0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42       case OPT_DB
e5b0: 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  L:.      case OP
e5c0: 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20  T_FDBL:.        
e5d0: 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61  fprintf(errstrea
e5e0: 6d 2c 22 20 20 25 73 3d 3c 72 65 61 6c 3e 25 2a  m,"  %s=<real>%*
e5f0: 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c  s  %s\n",op[i].l
e600: 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  abel,.          
e610: 28 69 6e 74 29 28 6d 61 78 2d 6c 65 6d 6f 6e 53  (int)(max-lemonS
e620: 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65  trlen(op[i].labe
e630: 6c 29 2d 36 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d  l)-6),"",op[i].m
e640: 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20  essage);.       
e650: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
e660: 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20  se OPT_STR:.    
e670: 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a    case OPT_FSTR:
e680: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
e690: 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 25 73  (errstream,"  %s
e6a0: 3d 3c 73 74 72 69 6e 67 3e 25 2a 73 20 20 25 73  =<string>%*s  %s
e6b0: 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c  \n",op[i].label,
e6c0: 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29  .          (int)
e6d0: 28 6d 61 78 2d 6c 65 6d 6f 6e 53 74 72 6c 65 6e  (max-lemonStrlen
e6e0: 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 38 29  (op[i].label)-8)
e6f0: 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67  ,"",op[i].messag
e700: 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
e710: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f  k;.    }.  }.}./
e720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e730: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
e740: 20 66 69 6c 65 20 22 70 61 72 73 65 2e 63 22 20   file "parse.c" 
e750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
e760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
e770: 0a 2a 2a 20 49 6e 70 75 74 20 66 69 6c 65 20 70  .** Input file p
e780: 61 72 73 65 72 20 66 6f 72 20 74 68 65 20 4c 45  arser for the LE
e790: 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
e7a0: 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 54 68 65  ator..*/../* The
e7b0: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
e7c0: 72 73 65 72 20 2a 2f 0a 65 6e 75 6d 20 65 5f 73  rser */.enum e_s
e7d0: 74 61 74 65 20 7b 0a 20 20 49 4e 49 54 49 41 4c  tate {.  INITIAL
e7e0: 49 5a 45 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  IZE,.  WAITING_F
e7f0: 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 2c  OR_DECL_OR_RULE,
e800: 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44  .  WAITING_FOR_D
e810: 45 43 4c 5f 4b 45 59 57 4f 52 44 2c 0a 20 20 57  ECL_KEYWORD,.  W
e820: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
e830: 41 52 47 2c 0a 20 20 57 41 49 54 49 4e 47 5f 46  ARG,.  WAITING_F
e840: 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59  OR_PRECEDENCE_SY
e850: 4d 42 4f 4c 2c 0a 20 20 57 41 49 54 49 4e 47 5f  MBOL,.  WAITING_
e860: 46 4f 52 5f 41 52 52 4f 57 2c 0a 20 20 49 4e 5f  FOR_ARROW,.  IN_
e870: 52 48 53 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53  RHS,.  LHS_ALIAS
e880: 5f 31 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f  _1,.  LHS_ALIAS_
e890: 32 2c 0a 20 20 4c 48 53 5f 41 4c 49 41 53 5f 33  2,.  LHS_ALIAS_3
e8a0: 2c 0a 20 20 52 48 53 5f 41 4c 49 41 53 5f 31 2c  ,.  RHS_ALIAS_1,
e8b0: 0a 20 20 52 48 53 5f 41 4c 49 41 53 5f 32 2c 0a  .  RHS_ALIAS_2,.
e8c0: 20 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52    PRECEDENCE_MAR
e8d0: 4b 5f 31 2c 0a 20 20 50 52 45 43 45 44 45 4e 43  K_1,.  PRECEDENC
e8e0: 45 5f 4d 41 52 4b 5f 32 2c 0a 20 20 52 45 53 59  E_MARK_2,.  RESY
e8f0: 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
e900: 52 4f 52 2c 0a 20 20 52 45 53 59 4e 43 5f 41 46  ROR,.  RESYNC_AF
e910: 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 2c 0a  TER_DECL_ERROR,.
e920: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45    WAITING_FOR_DE
e930: 53 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 2c  STRUCTOR_SYMBOL,
e940: 0a 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44  .  WAITING_FOR_D
e950: 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 2c 0a  ATATYPE_SYMBOL,.
e960: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41    WAITING_FOR_FA
e970: 4c 4c 42 41 43 4b 5f 49 44 2c 0a 20 20 57 41 49  LLBACK_ID,.  WAI
e980: 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44 43 41 52  TING_FOR_WILDCAR
e990: 44 5f 49 44 0a 7d 3b 0a 73 74 72 75 63 74 20 70  D_ID.};.struct p
e9a0: 73 74 61 74 65 20 7b 0a 20 20 63 68 61 72 20 2a  state {.  char *
e9b0: 66 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  filename;       
e9c0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
e9d0: 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 69  nput file */.  i
e9e0: 6e 74 20 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 20  nt tokenlineno; 
e9f0: 20 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62       /* Linenumb
ea00: 65 72 20 61 74 20 77 68 69 63 68 20 63 75 72 72  er at which curr
ea10: 65 6e 74 20 74 6f 6b 65 6e 20 73 74 61 72 74 73  ent token starts
ea20: 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f 72 63   */.  int errorc
ea30: 6e 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  nt;         /* N
ea40: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
ea50: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68 61 72  so far */.  char
ea60: 20 2a 74 6f 6b 65 6e 73 74 61 72 74 3b 20 20 20   *tokenstart;   
ea70: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 63 75 72    /* Text of cur
ea80: 72 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20  rent token */.  
ea90: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 67 70  struct lemon *gp
eaa0: 3b 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20  ;     /* Global 
eab0: 73 74 61 74 65 20 76 65 63 74 6f 72 20 2a 2f 0a  state vector */.
eac0: 20 20 65 6e 75 6d 20 65 5f 73 74 61 74 65 20 73    enum e_state s
ead0: 74 61 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20  tate;        /* 
eae0: 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  The state of the
eaf0: 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 73 74 72   parser */.  str
eb00: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c  uct symbol *fall
eb10: 62 61 63 6b 3b 20 20 20 2f 2a 20 54 68 65 20 66  back;   /* The f
eb20: 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20 2a 2f  allback token */
eb30: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
eb40: 20 2a 6c 68 73 3b 20 20 20 20 20 20 20 20 2f 2a   *lhs;        /*
eb50: 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   Left-hand side 
eb60: 6f 66 20 63 75 72 72 65 6e 74 20 72 75 6c 65 20  of current rule 
eb70: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
eb80: 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20 20 20 20  *lhsalias;      
eb90: 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65  /* Alias for the
eba0: 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 6e 72   LHS */.  int nr
ebb0: 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hs;             
ebc0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ebd0: 66 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  f right-hand sid
ebe0: 65 20 73 79 6d 62 6f 6c 73 20 73 65 65 6e 20 2a  e symbols seen *
ebf0: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
ec00: 6c 20 2a 72 68 73 5b 4d 41 58 52 48 53 5d 3b 20  l *rhs[MAXRHS]; 
ec10: 20 2f 2a 20 52 48 53 20 73 79 6d 62 6f 6c 73 20   /* RHS symbols 
ec20: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
ec30: 2a 61 6c 69 61 73 5b 4d 41 58 52 48 53 5d 3b 20  *alias[MAXRHS]; 
ec40: 2f 2a 20 41 6c 69 61 73 65 73 20 66 6f 72 20 65  /* Aliases for e
ec50: 61 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28  ach RHS symbol (
ec60: 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73 74  or NULL) */.  st
ec70: 72 75 63 74 20 72 75 6c 65 20 2a 70 72 65 76 72  ruct rule *prevr
ec80: 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 72 65 76  ule;     /* Prev
ec90: 69 6f 75 73 20 72 75 6c 65 20 70 61 72 73 65 64  ious rule parsed
eca0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
ecb0: 20 2a 64 65 63 6c 6b 65 79 77 6f 72 64 3b 20 20   *declkeyword;  
ecc0: 20 2f 2a 20 4b 65 79 77 6f 72 64 20 6f 66 20 61   /* Keyword of a
ecd0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a   declaration */.
ece0: 20 20 63 68 61 72 20 2a 2a 64 65 63 6c 61 72 67    char **declarg
ecf0: 73 6c 6f 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  slot;        /* 
ed00: 57 68 65 72 65 20 74 68 65 20 64 65 63 6c 61 72  Where the declar
ed10: 61 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20 73  ation argument s
ed20: 68 6f 75 6c 64 20 62 65 20 70 75 74 20 2a 2f 0a  hould be put */.
ed30: 20 20 69 6e 74 20 69 6e 73 65 72 74 4c 69 6e 65    int insertLine
ed40: 4d 61 63 72 6f 3b 20 20 20 20 20 20 20 2f 2a 20  Macro;       /* 
ed50: 41 64 64 20 23 6c 69 6e 65 20 62 65 66 6f 72 65  Add #line before
ed60: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 69 6e 73   declaration ins
ed70: 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 64 65  ert */.  int *de
ed80: 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3b 20 20 20  cllinenoslot;   
ed90: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
eda0: 77 72 69 74 65 20 64 65 63 6c 61 72 61 74 69 6f  write declaratio
edb0: 6e 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f  n line number */
edc0: 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20  .  enum e_assoc 
edd0: 64 65 63 6c 61 73 73 6f 63 3b 20 20 20 20 2f 2a  declassoc;    /*
ede0: 20 41 73 73 69 67 6e 20 74 68 69 73 20 61 73 73   Assign this ass
edf0: 6f 63 69 61 74 69 6f 6e 20 74 6f 20 64 65 63 6c  ociation to decl
ee00: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
ee10: 69 6e 74 20 70 72 65 63 63 6f 75 6e 74 65 72 3b  int preccounter;
ee20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73             /* As
ee30: 73 69 67 6e 20 74 68 69 73 20 70 72 65 63 65 64  sign this preced
ee40: 65 6e 63 65 20 74 6f 20 64 65 63 6c 20 61 72 67  ence to decl arg
ee50: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73 74 72 75  uments */.  stru
ee60: 63 74 20 72 75 6c 65 20 2a 66 69 72 73 74 72 75  ct rule *firstru
ee70: 6c 65 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  le;    /* Pointe
ee80: 72 20 74 6f 20 66 69 72 73 74 20 72 75 6c 65 20  r to first rule 
ee90: 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a  in the grammar *
eea0: 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  /.  struct rule 
eeb0: 2a 6c 61 73 74 72 75 6c 65 3b 20 20 20 20 20 2f  *lastrule;     /
eec0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
eed0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 70   most recently p
eee0: 61 72 73 65 64 20 72 75 6c 65 20 2a 2f 0a 7d 3b  arsed rule */.};
eef0: 0a 0a 2f 2a 20 50 61 72 73 65 20 61 20 73 69 6e  ../* Parse a sin
ef00: 67 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a 73 74 61  gle token */.sta
ef10: 74 69 63 20 76 6f 69 64 20 70 61 72 73 65 6f 6e  tic void parseon
ef20: 65 74 6f 6b 65 6e 28 73 74 72 75 63 74 20 70 73  etoken(struct ps
ef30: 74 61 74 65 20 2a 70 73 70 29 0a 7b 0a 20 20 63  tate *psp).{.  c
ef40: 6f 6e 73 74 20 63 68 61 72 20 2a 78 3b 0a 20 20  onst char *x;.  
ef50: 78 20 3d 20 53 74 72 73 61 66 65 28 70 73 70 2d  x = Strsafe(psp-
ef60: 3e 74 6f 6b 65 6e 73 74 61 72 74 29 3b 20 20 20  >tokenstart);   
ef70: 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 74 6f    /* Save the to
ef80: 6b 65 6e 20 70 65 72 6d 61 6e 65 6e 74 6c 79 20  ken permanently 
ef90: 2a 2f 0a 23 69 66 20 30 0a 20 20 70 72 69 6e 74  */.#if 0.  print
efa0: 66 28 22 25 73 3a 25 64 3a 20 54 6f 6b 65 6e 3d  f("%s:%d: Token=
efb0: 5b 25 73 5d 20 73 74 61 74 65 3d 25 64 5c 6e 22  [%s] state=%d\n"
efc0: 2c 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  ,psp->filename,p
efd0: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
efe0: 0a 20 20 20 20 78 2c 70 73 70 2d 3e 73 74 61 74  .    x,psp->stat
eff0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 77 69  e);.#endif.  swi
f000: 74 63 68 28 20 70 73 70 2d 3e 73 74 61 74 65 20  tch( psp->state 
f010: 29 7b 0a 20 20 20 20 63 61 73 65 20 49 4e 49 54  ){.    case INIT
f020: 49 41 4c 49 5a 45 3a 0a 20 20 20 20 20 20 70 73  IALIZE:.      ps
f030: 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20 30 3b  p->prevrule = 0;
f040: 0a 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63  .      psp->prec
f050: 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 20  counter = 0;.   
f060: 20 20 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c     psp->firstrul
f070: 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c  e = psp->lastrul
f080: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70  e = 0;.      psp
f090: 2d 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d 20 30 3b  ->gp->nrule = 0;
f0a0: 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74  .      /* Fall t
f0b0: 68 72 75 20 74 6f 20 6e 65 78 74 20 63 61 73 65  hru to next case
f0c0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 57 41 49   */.    case WAI
f0d0: 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52  TING_FOR_DECL_OR
f0e0: 5f 52 55 4c 45 3a 0a 20 20 20 20 20 20 69 66 28  _RULE:.      if(
f0f0: 20 78 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a 20 20   x[0]=='%' ){.  
f100: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
f110: 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
f120: 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20  ECL_KEYWORD;.   
f130: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 6c     }else if( isl
f140: 6f 77 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20  ower(x[0]) ){.  
f150: 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 20 3d        psp->lhs =
f160: 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
f170: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6e 72 68          psp->nrh
f180: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  s = 0;.        p
f190: 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20 30  sp->lhsalias = 0
f1a0: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
f1b0: 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
f1c0: 4f 52 5f 41 52 52 4f 57 3b 0a 20 20 20 20 20 20  OR_ARROW;.      
f1d0: 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d  }else if( x[0]==
f1e0: 27 7b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '{' ){.        i
f1f0: 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65  f( psp->prevrule
f200: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
f210: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
f220: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
f230: 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65 72 65  enlineno,."There
f240: 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c   is no prior rul
f250: 65 20 75 70 6f 6e 20 77 68 69 63 68 20 74 6f 20  e upon which to 
f260: 61 74 74 61 63 68 20 74 68 65 20 63 6f 64 65 20  attach the code 
f270: 5c 0a 66 72 61 67 6d 65 6e 74 20 77 68 69 63 68  \.fragment which
f280: 20 62 65 67 69 6e 73 20 6f 6e 20 74 68 69 73 20   begins on this 
f290: 6c 69 6e 65 2e 22 29 3b 0a 20 20 20 20 20 20 20  line.");.       
f2a0: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
f2b0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
f2c0: 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72  e if( psp->prevr
f2d0: 75 6c 65 2d 3e 63 6f 64 65 21 3d 30 20 29 7b 0a  ule->code!=0 ){.
f2e0: 20 20 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 22 43 6f 64 65 20 66 72 61 67 6d 65 6e  o,."Code fragmen
f320: 74 20 62 65 67 69 6e 6e 69 6e 67 20 6f 6e 20 74  t beginning on t
f330: 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20  his line is not 
f340: 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66  the first \.to f
f350: 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f  ollow the previo
f360: 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20  us rule.");.    
f370: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
f380: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
f390: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
f3a0: 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 6c  psp->prevrule->l
f3b0: 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e  ine = psp->token
f3c0: 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20  lineno;.        
f3d0: 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d    psp->prevrule-
f3e0: 3e 63 6f 64 65 20 3d 20 26 78 5b 31 5d 3b 0a 20  >code = &x[1];. 
f3f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f400: 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27  else if( x[0]=='
f410: 5b 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  [' ){.        ps
f420: 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43 45  p->state = PRECE
f430: 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 3b 0a 20 20  DENCE_MARK_1;.  
f440: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f450: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
f460: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
f470: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
f480: 20 20 20 20 20 20 22 54 6f 6b 65 6e 20 5c 22 25        "Token \"%
f490: 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 65 69  s\" should be ei
f4a0: 74 68 65 72 20 5c 22 25 25 5c 22 20 6f 72 20 61  ther \"%%\" or a
f4b0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 6e 61 6d   nonterminal nam
f4c0: 65 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78  e.",.          x
f4d0: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
f4e0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
f4f0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
f500: 0a 20 20 20 20 63 61 73 65 20 50 52 45 43 45 44  .    case PRECED
f510: 45 4e 43 45 5f 4d 41 52 4b 5f 31 3a 0a 20 20 20  ENCE_MARK_1:.   
f520: 20 20 20 69 66 28 20 21 69 73 75 70 70 65 72 28     if( !isupper(
f530: 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
f540: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
f550: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
f560: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
f570: 20 20 20 20 22 54 68 65 20 70 72 65 63 65 64 65      "The precede
f580: 6e 63 65 20 73 79 6d 62 6f 6c 20 6d 75 73 74 20  nce symbol must 
f590: 62 65 20 61 20 74 65 72 6d 69 6e 61 6c 2e 22 29  be a terminal.")
f5a0: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
f5b0: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
f5c0: 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e   }else if( psp->
f5d0: 70 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a 20  prevrule==0 ){. 
f5e0: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
f5f0: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
f600: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
f610: 20 20 20 20 20 20 20 20 20 20 22 54 68 65 72 65            "There
f620: 20 69 73 20 6e 6f 20 70 72 69 6f 72 20 72 75 6c   is no prior rul
f630: 65 20 74 6f 20 61 73 73 69 67 6e 20 70 72 65 63  e to assign prec
f640: 65 64 65 6e 63 65 20 5c 22 5b 25 73 5d 5c 22 2e  edence \"[%s]\".
f650: 22 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ",x);.        ps
f660: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
f670: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
f680: 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72  sp->prevrule->pr
f690: 65 63 73 79 6d 21 3d 30 20 29 7b 0a 20 20 20 20  ecsym!=0 ){.    
f6a0: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
f6b0: 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
f6c0: 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 50 72  tokenlineno,."Pr
f6d0: 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 20 6f 6e  ecedence mark on
f6e0: 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f   this line is no
f6f0: 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74 6f  t the first \.to
f700: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65 76   follow the prev
f710: 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20  ious rule.");.  
f720: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
f730: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  cnt++;.      }el
f740: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  se{.        psp-
f750: 3e 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63 73  >prevrule->precs
f760: 79 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  ym = Symbol_new(
f770: 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
f780: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 50    psp->state = P
f790: 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32  RECEDENCE_MARK_2
f7a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f7b0: 20 20 20 63 61 73 65 20 50 52 45 43 45 44 45 4e     case PRECEDEN
f7c0: 43 45 5f 4d 41 52 4b 5f 32 3a 0a 20 20 20 20 20  CE_MARK_2:.     
f7d0: 20 69 66 28 20 78 5b 30 5d 21 3d 27 5d 27 20 29   if( x[0]!=']' )
f7e0: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
f7f0: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
f800: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
f810: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69  o,.          "Mi
f820: 73 73 69 6e 67 20 5c 22 5d 5c 22 20 6f 6e 20 70  ssing \"]\" on p
f830: 72 65 63 65 64 65 6e 63 65 20 6d 61 72 6b 2e 22  recedence mark."
f840: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
f850: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
f860: 20 20 7d 0a 20 20 20 20 20 20 70 73 70 2d 3e 73    }.      psp->s
f870: 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
f880: 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
f890: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f8a0: 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
f8b0: 4f 52 5f 41 52 52 4f 57 3a 0a 20 20 20 20 20 20  OR_ARROW:.      
f8c0: 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26 26  if( x[0]==':' &&
f8d0: 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78 5b   x[1]==':' && x[
f8e0: 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20 20  2]=='=' ){.     
f8f0: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f900: 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65  IN_RHS;.      }e
f910: 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28  lse if( x[0]=='(
f920: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
f930: 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c  ->state = LHS_AL
f940: 49 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c  IAS_1;.      }el
f950: 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
f960: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
f970: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
f980: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
f990: 45 78 70 65 63 74 65 64 20 74 6f 20 73 65 65 20  Expected to see 
f9a0: 61 20 5c 22 3a 5c 22 20 66 6f 6c 6c 6f 77 69 6e  a \":\" followin
f9b0: 67 20 74 68 65 20 4c 48 53 20 73 79 6d 62 6f 6c  g the LHS symbol
f9c0: 20 5c 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20   \"%s\".",.     
f9d0: 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e       psp->lhs->n
f9e0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73  ame);.        ps
f9f0: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
fa00: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
fa10: 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
fa20: 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20  _RULE_ERROR;.   
fa30: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
fa40: 3b 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41  ;.    case LHS_A
fa50: 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20 20 69 66  LIAS_1:.      if
fa60: 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20  ( isalpha(x[0]) 
fa70: 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
fa80: 6c 68 73 61 6c 69 61 73 20 3d 20 78 3b 0a 20 20  lhsalias = x;.  
fa90: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
faa0: 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3b 0a   = LHS_ALIAS_2;.
fab0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fac0: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
fad0: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
fae0: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
faf0: 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22 20          "\"%s\" 
fb00: 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 61  is not a valid a
fb10: 6c 69 61 73 20 66 6f 72 20 74 68 65 20 4c 48 53  lias for the LHS
fb20: 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20   \"%s\"\n",.    
fb30: 20 20 20 20 20 20 78 2c 70 73 70 2d 3e 6c 68 73        x,psp->lhs
fb40: 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
fb50: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
fb60: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
fb70: 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
fb80: 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
fb90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
fba0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48  eak;.    case LH
fbb0: 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20 20  S_ALIAS_2:.     
fbc0: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20 29   if( x[0]==')' )
fbd0: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
fbe0: 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53  tate = LHS_ALIAS
fbf0: 5f 33 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _3;.      }else{
fc00: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
fc10: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
fc20: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
fc30: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73  ,.          "Mis
fc40: 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f  sing \")\" follo
fc50: 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e  wing LHS alias n
fc60: 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70  ame \"%s\".",psp
fc70: 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->lhsalias);.   
fc80: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
fc90: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
fca0: 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
fcb0: 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
fcc0: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
fcd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
fce0: 65 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3a 0a 20  e LHS_ALIAS_3:. 
fcf0: 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
fd00: 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20  :' && x[1]==':' 
fd10: 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a  && x[2]=='=' ){.
fd20: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
fd30: 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20  te = IN_RHS;.   
fd40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fd50: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
fd60: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
fd70: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
fd80: 20 20 20 20 20 22 4d 69 73 73 69 6e 67 20 5c 22       "Missing \"
fd90: 2d 3e 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20  ->\" following: 
fda0: 5c 22 25 73 28 25 73 29 5c 22 2e 22 2c 0a 20 20  \"%s(%s)\".",.  
fdb0: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68           psp->lh
fdc0: 73 2d 3e 6e 61 6d 65 2c 70 73 70 2d 3e 6c 68 73  s->name,psp->lhs
fdd0: 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20  alias);.        
fde0: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
fdf0: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
fe00: 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
fe10: 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20  ER_RULE_ERROR;. 
fe20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
fe30: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 49 4e 5f  ak;.    case IN_
fe40: 52 48 53 3a 0a 20 20 20 20 20 20 69 66 28 20 78  RHS:.      if( x
fe50: 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]=='.' ){.    
fe60: 20 20 20 20 73 74 72 75 63 74 20 72 75 6c 65 20      struct rule 
fe70: 2a 72 70 3b 0a 20 20 20 20 20 20 20 20 72 70 20  *rp;.        rp 
fe80: 3d 20 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a  = (struct rule *
fe90: 29 63 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )calloc( sizeof(
fea0: 73 74 72 75 63 74 20 72 75 6c 65 29 20 2b 20 0a  struct rule) + .
feb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 7a               siz
fec0: 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
fed0: 6c 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 20 2b 20  l*)*psp->nrhs + 
fee0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2a 70 73  sizeof(char*)*ps
fef0: 70 2d 3e 6e 72 68 73 2c 20 31 29 3b 0a 20 20 20  p->nrhs, 1);.   
ff00: 20 20 20 20 20 69 66 28 20 72 70 3d 3d 30 20 29       if( rp==0 )
ff10: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
ff20: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
ff30: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
ff40: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
ff50: 20 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65   "Can't allocate
ff60: 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72 79 20 66   enough memory f
ff70: 6f 72 20 74 68 69 73 20 72 75 6c 65 2e 22 29 3b  or this rule.");
ff80: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
ff90: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
ffa0: 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72        psp->prevr
ffb0: 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ule = 0;.       
ffc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ffd0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
ffe0: 20 20 20 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 20     rp->ruleline 
fff0: 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  = psp->tokenline
10000 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  no;.          rp
10010 2d 3e 72 68 73 20 3d 20 28 73 74 72 75 63 74 20  ->rhs = (struct 
10020 73 79 6d 62 6f 6c 2a 2a 29 26 72 70 5b 31 5d 3b  symbol**)&rp[1];
10030 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72  .          rp->r
10040 68 73 61 6c 69 61 73 20 3d 20 28 63 6f 6e 73 74  hsalias = (const
10050 20 63 68 61 72 2a 2a 29 26 28 72 70 2d 3e 72 68   char**)&(rp->rh
10060 73 5b 70 73 70 2d 3e 6e 72 68 73 5d 29 3b 0a 20  s[psp->nrhs]);. 
10070 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
10080 3b 20 69 3c 70 73 70 2d 3e 6e 72 68 73 3b 20 69  ; i<psp->nrhs; i
10090 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
100a0 20 72 70 2d 3e 72 68 73 5b 69 5d 20 3d 20 70 73   rp->rhs[i] = ps
100b0 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20  p->rhs[i];.     
100c0 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c         rp->rhsal
100d0 69 61 73 5b 69 5d 20 3d 20 70 73 70 2d 3e 61 6c  ias[i] = psp->al
100e0 69 61 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  ias[i];.        
100f0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 70    }.          rp
10100 2d 3e 6c 68 73 20 3d 20 70 73 70 2d 3e 6c 68 73  ->lhs = psp->lhs
10110 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
10120 6c 68 73 61 6c 69 61 73 20 3d 20 70 73 70 2d 3e  lhsalias = psp->
10130 6c 68 73 61 6c 69 61 73 3b 0a 20 20 20 20 20 20  lhsalias;.      
10140 20 20 20 20 72 70 2d 3e 6e 72 68 73 20 3d 20 70      rp->nrhs = p
10150 73 70 2d 3e 6e 72 68 73 3b 0a 20 20 20 20 20 20  sp->nrhs;.      
10160 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 30      rp->code = 0
10170 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
10180 70 72 65 63 73 79 6d 20 3d 20 30 3b 0a 20 20 20  precsym = 0;.   
10190 20 20 20 20 20 20 20 72 70 2d 3e 69 6e 64 65 78         rp->index
101a0 20 3d 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c   = psp->gp->nrul
101b0 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72  e++;.          r
101c0 70 2d 3e 6e 65 78 74 6c 68 73 20 3d 20 72 70 2d  p->nextlhs = rp-
101d0 3e 6c 68 73 2d 3e 72 75 6c 65 3b 0a 20 20 20 20  >lhs->rule;.    
101e0 20 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 72        rp->lhs->r
101f0 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20  ule = rp;.      
10200 20 20 20 20 72 70 2d 3e 6e 65 78 74 20 3d 20 30      rp->next = 0
10210 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
10220 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 3d 3d  psp->firstrule==
10230 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
10240 20 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20   psp->firstrule 
10250 3d 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20  = psp->lastrule 
10260 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20  = rp;.          
10270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
10280 20 20 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65     psp->lastrule
10290 2d 3e 6e 65 78 74 20 3d 20 72 70 3b 0a 20 20 20  ->next = rp;.   
102a0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61           psp->la
102b0 73 74 72 75 6c 65 20 3d 20 72 70 3b 0a 20 20 20  strule = rp;.   
102c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
102d0 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
102e0 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20 20 7d   = rp;.        }
102f0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
10300 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
10310 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a  R_DECL_OR_RULE;.
10320 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10330 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b  isalpha(x[0]) ){
10340 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70  .        if( psp
10350 2d 3e 6e 72 68 73 3e 3d 4d 41 58 52 48 53 20 29  ->nrhs>=MAXRHS )
10360 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
10370 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
10380 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
10390 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eno,.           
103a0 20 22 54 6f 6f 20 6d 61 6e 79 20 73 79 6d 62 6f   "Too many symbo
103b0 6c 73 20 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c  ls on RHS of rul
103c0 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 5c  e beginning at \
103d0 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20  "%s\".",.       
103e0 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20       x);.       
103f0 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
10400 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
10410 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
10420 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
10430 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  OR;.        }els
10440 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  e{.          psp
10450 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 5d  ->rhs[psp->nrhs]
10460 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
10470 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
10480 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72 68 73  >alias[psp->nrhs
10490 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
104a0 20 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a 20 20   psp->nrhs++;.  
104b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
104c0 6c 73 65 20 69 66 28 20 28 78 5b 30 5d 3d 3d 27  lse if( (x[0]=='
104d0 7c 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 2f 27 29  |' || x[0]=='/')
104e0 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20   && psp->nrhs>0 
104f0 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  ){.        struc
10500 74 20 73 79 6d 62 6f 6c 20 2a 6d 73 70 20 3d 20  t symbol *msp = 
10510 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72  psp->rhs[psp->nr
10520 68 73 2d 31 5d 3b 0a 20 20 20 20 20 20 20 20 69  hs-1];.        i
10530 66 28 20 6d 73 70 2d 3e 74 79 70 65 21 3d 4d 55  f( msp->type!=MU
10540 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20  LTITERMINAL ){. 
10550 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
10560 73 79 6d 62 6f 6c 20 2a 6f 72 69 67 73 70 20 3d  symbol *origsp =
10570 20 6d 73 70 3b 0a 20 20 20 20 20 20 20 20 20 20   msp;.          
10580 6d 73 70 20 3d 20 28 73 74 72 75 63 74 20 73 79  msp = (struct sy
10590 6d 62 6f 6c 20 2a 29 20 63 61 6c 6c 6f 63 28 31  mbol *) calloc(1
105a0 2c 73 69 7a 65 6f 66 28 2a 6d 73 70 29 29 3b 0a  ,sizeof(*msp));.
105b0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
105c0 28 6d 73 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (msp, 0, sizeof(
105d0 2a 6d 73 70 29 29 3b 0a 20 20 20 20 20 20 20 20  *msp));.        
105e0 20 20 6d 73 70 2d 3e 74 79 70 65 20 3d 20 4d 55    msp->type = MU
105f0 4c 54 49 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20  LTITERMINAL;.   
10600 20 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62         msp->nsub
10610 73 79 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sym = 1;.       
10620 20 20 20 6d 73 70 2d 3e 73 75 62 73 79 6d 20 3d     msp->subsym =
10630 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20   (struct symbol 
10640 2a 2a 29 20 63 61 6c 6c 6f 63 28 31 2c 73 69 7a  **) calloc(1,siz
10650 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
10660 6c 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l*));.          
10670 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d 20 3d  msp->subsym[0] =
10680 20 6f 72 69 67 73 70 3b 0a 20 20 20 20 20 20 20   origsp;.       
10690 20 20 20 6d 73 70 2d 3e 6e 61 6d 65 20 3d 20 6f     msp->name = o
106a0 72 69 67 73 70 2d 3e 6e 61 6d 65 3b 0a 20 20 20  rigsp->name;.   
106b0 20 20 20 20 20 20 20 70 73 70 2d 3e 72 68 73 5b         psp->rhs[
106c0 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 6d  psp->nrhs-1] = m
106d0 73 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sp;.        }.  
106e0 20 20 20 20 20 20 6d 73 70 2d 3e 6e 73 75 62 73        msp->nsubs
106f0 79 6d 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6d 73  ym++;.        ms
10700 70 2d 3e 73 75 62 73 79 6d 20 3d 20 28 73 74 72  p->subsym = (str
10710 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20 72  uct symbol **) r
10720 65 61 6c 6c 6f 63 28 6d 73 70 2d 3e 73 75 62 73  ealloc(msp->subs
10730 79 6d 2c 0a 20 20 20 20 20 20 20 20 20 20 73 69  ym,.          si
10740 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62  zeof(struct symb
10750 6f 6c 2a 29 2a 6d 73 70 2d 3e 6e 73 75 62 73 79  ol*)*msp->nsubsy
10760 6d 29 3b 0a 20 20 20 20 20 20 20 20 6d 73 70 2d  m);.        msp-
10770 3e 73 75 62 73 79 6d 5b 6d 73 70 2d 3e 6e 73 75  >subsym[msp->nsu
10780 62 73 79 6d 2d 31 5d 20 3d 20 53 79 6d 62 6f 6c  bsym-1] = Symbol
10790 5f 6e 65 77 28 26 78 5b 31 5d 29 3b 0a 20 20 20  _new(&x[1]);.   
107a0 20 20 20 20 20 69 66 28 20 69 73 6c 6f 77 65 72       if( islower
107b0 28 78 5b 31 5d 29 20 7c 7c 20 69 73 6c 6f 77 65  (x[1]) || islowe
107c0 72 28 6d 73 70 2d 3e 73 75 62 73 79 6d 5b 30 5d  r(msp->subsym[0]
107d0 2d 3e 6e 61 6d 65 5b 30 5d 29 20 29 7b 0a 20 20  ->name[0]) ){.  
107e0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
107f0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
10800 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
10810 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43 61  .            "Ca
10820 6e 6e 6f 74 20 66 6f 72 6d 20 61 20 63 6f 6d 70  nnot form a comp
10830 6f 75 6e 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ound containing 
10840 61 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 22 29  a non-terminal")
10850 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
10860 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
10870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
10880 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27  se if( x[0]=='('
10890 20 26 26 20 70 73 70 2d 3e 6e 72 68 73 3e 30 20   && psp->nrhs>0 
108a0 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
108b0 73 74 61 74 65 20 3d 20 52 48 53 5f 41 4c 49 41  state = RHS_ALIA
108c0 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  S_1;.      }else
108d0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
108e0 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
108f0 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
10900 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49 6c  o,.          "Il
10910 6c 65 67 61 6c 20 63 68 61 72 61 63 74 65 72 20  legal character 
10920 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c 65 3a 20  on RHS of rule: 
10930 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20  \"%s\".",x);.   
10940 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
10950 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
10960 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
10970 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
10980 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
10990 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
109a0 65 20 52 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20  e RHS_ALIAS_1:. 
109b0 20 20 20 20 20 69 66 28 20 69 73 61 6c 70 68 61       if( isalpha
109c0 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
109d0 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b 70 73 70    psp->alias[psp
109e0 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 78 3b 0a 20  ->nrhs-1] = x;. 
109f0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
10a00 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 32 3b  e = RHS_ALIAS_2;
10a10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10a20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
10a30 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
10a40 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
10a50 20 20 20 20 20 20 20 20 20 22 5c 22 25 73 5c 22           "\"%s\"
10a60 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
10a70 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20 52 48  alias for the RH
10a80 53 20 73 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c  S symbol \"%s\"\
10a90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 78 2c  n",.          x,
10aa0 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72  psp->rhs[psp->nr
10ab0 68 73 2d 31 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  hs-1]->name);.  
10ac0 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
10ad0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
10ae0 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
10af0 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
10b00 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
10b10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
10b20 73 65 20 52 48 53 5f 41 4c 49 41 53 5f 32 3a 0a  se RHS_ALIAS_2:.
10b30 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
10b40 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ')' ){.        p
10b50 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52  sp->state = IN_R
10b60 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  HS;.      }else{
10b70 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
10b80 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
10b90 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
10ba0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 4d 69 73  ,.          "Mis
10bb0 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f  sing \")\" follo
10bc0 77 69 6e 67 20 4c 48 53 20 61 6c 69 61 73 20 6e  wing LHS alias n
10bd0 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c 70 73 70  ame \"%s\".",psp
10be0 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->lhsalias);.   
10bf0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
10c00 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
10c10 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
10c20 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
10c30 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
10c40 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
10c50 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  e WAITING_FOR_DE
10c60 43 4c 5f 4b 45 59 57 4f 52 44 3a 0a 20 20 20 20  CL_KEYWORD:.    
10c70 20 20 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b    if( isalpha(x[
10c80 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  0]) ){.        p
10c90 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 20  sp->declkeyword 
10ca0 3d 20 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = x;.        psp
10cb0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
10cc0 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
10cd0 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 20 3d  decllinenoslot =
10ce0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   0;.        psp-
10cf0 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f  >insertLineMacro
10d00 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 73   = 1;.        ps
10d10 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
10d20 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b  NG_FOR_DECL_ARG;
10d30 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
10d40 63 6d 70 28 78 2c 22 6e 61 6d 65 22 29 3d 3d 30  cmp(x,"name")==0
10d50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
10d60 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
10d70 20 26 28 70 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65   &(psp->gp->name
10d80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
10d90 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72  ->insertLineMacr
10da0 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  o = 0;.        }
10db0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10dc0 78 2c 22 69 6e 63 6c 75 64 65 22 29 3d 3d 30 20  x,"include")==0 
10dd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
10de0 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
10df0 26 28 70 73 70 2d 3e 67 70 2d 3e 69 6e 63 6c 75  &(psp->gp->inclu
10e00 64 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  de);.        }el
10e10 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
10e20 22 63 6f 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20  "code")==0 ){.  
10e30 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
10e40 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
10e50 2d 3e 67 70 2d 3e 65 78 74 72 61 63 6f 64 65 29  ->gp->extracode)
10e60 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
10e70 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f  if( strcmp(x,"to
10e80 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f 72 22 29  ken_destructor")
10e90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
10ea0 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f   psp->declargslo
10eb0 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74 6f  t = &psp->gp->to
10ec0 6b 65 6e 64 65 73 74 3b 0a 20 20 20 20 20 20 20  kendest;.       
10ed0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
10ee0 70 28 78 2c 22 64 65 66 61 75 6c 74 5f 64 65 73  p(x,"default_des
10ef0 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a  tructor")==0 ){.
10f00 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
10f10 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73  eclargslot = &ps
10f20 70 2d 3e 67 70 2d 3e 76 61 72 64 65 73 74 3b 0a  p->gp->vardest;.
10f30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
10f40 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65  ( strcmp(x,"toke
10f50 6e 5f 70 72 65 66 69 78 22 29 3d 3d 30 20 29 7b  n_prefix")==0 ){
10f60 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10f70 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70  declargslot = &p
10f80 73 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 70 72 65  sp->gp->tokenpre
10f90 66 69 78 3b 0a 20 20 20 20 20 20 20 20 20 20 70  fix;.          p
10fa0 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
10fb0 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cro = 0;.       
10fc0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
10fd0 70 28 78 2c 22 73 79 6e 74 61 78 5f 65 72 72 6f  p(x,"syntax_erro
10fe0 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
10ff0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
11000 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
11010 2d 3e 65 72 72 6f 72 29 3b 0a 20 20 20 20 20 20  ->error);.      
11020 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
11030 6d 70 28 78 2c 22 70 61 72 73 65 5f 61 63 63 65  mp(x,"parse_acce
11040 70 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pt")==0 ){.     
11050 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
11060 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
11070 70 2d 3e 61 63 63 65 70 74 29 3b 0a 20 20 20 20  p->accept);.    
11080 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
11090 72 63 6d 70 28 78 2c 22 70 61 72 73 65 5f 66 61  rcmp(x,"parse_fa
110a0 69 6c 75 72 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ilure")==0 ){.  
110b0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
110c0 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
110d0 2d 3e 67 70 2d 3e 66 61 69 6c 75 72 65 29 3b 0a  ->gp->failure);.
110e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
110f0 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 63  ( strcmp(x,"stac
11100 6b 5f 6f 76 65 72 66 6c 6f 77 22 29 3d 3d 30 20  k_overflow")==0 
11110 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
11120 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
11130 26 28 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72 66  &(psp->gp->overf
11140 6c 6f 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  low);.        }e
11150 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
11160 2c 22 65 78 74 72 61 5f 61 72 67 75 6d 65 6e 74  ,"extra_argument
11170 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
11180 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
11190 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
111a0 3e 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20  >arg);.         
111b0 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65   psp->insertLine
111c0 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20  Macro = 0;.     
111d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
111e0 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 74 79 70  cmp(x,"token_typ
111f0 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
11200 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
11210 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
11220 2d 3e 74 6f 6b 65 6e 74 79 70 65 29 3b 0a 20 20  ->tokentype);.  
11230 20 20 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73          psp->ins
11240 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30  ertLineMacro = 0
11250 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
11260 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64 65  if( strcmp(x,"de
11270 66 61 75 6c 74 5f 74 79 70 65 22 29 3d 3d 30 20  fault_type")==0 
11280 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
11290 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
112a0 26 28 70 73 70 2d 3e 67 70 2d 3e 76 61 72 74 79  &(psp->gp->varty
112b0 70 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pe);.          p
112c0 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65 4d 61  sp->insertLineMa
112d0 63 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  cro = 0;.       
112e0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
112f0 70 28 78 2c 22 73 74 61 63 6b 5f 73 69 7a 65 22  p(x,"stack_size"
11300 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
11310 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
11320 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e  ot = &(psp->gp->
11330 73 74 61 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20  stacksize);.    
11340 20 20 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72        psp->inser
11350 74 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a  tLineMacro = 0;.
11360 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
11370 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 72  ( strcmp(x,"star
11380 74 5f 73 79 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b  t_symbol")==0 ){
11390 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
113a0 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
113b0 70 73 70 2d 3e 67 70 2d 3e 73 74 61 72 74 29 3b  psp->gp->start);
113c0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
113d0 69 6e 73 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20  insertLineMacro 
113e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
113f0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
11400 22 6c 65 66 74 22 29 3d 3d 30 20 29 7b 0a 20 20  "left")==0 ){.  
11410 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
11420 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  ccounter++;.    
11430 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
11440 73 73 6f 63 20 3d 20 4c 45 46 54 3b 0a 20 20 20  ssoc = LEFT;.   
11450 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11460 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
11470 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
11480 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
11490 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 72   if( strcmp(x,"r
114a0 69 67 68 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ight")==0 ){.   
114b0 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63         psp->prec
114c0 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20  counter++;.     
114d0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73       psp->declas
114e0 73 6f 63 20 3d 20 52 49 47 48 54 3b 0a 20 20 20  soc = RIGHT;.   
114f0 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
11500 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  e = WAITING_FOR_
11510 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f  PRECEDENCE_SYMBO
11520 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  L;.        }else
11530 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e   if( strcmp(x,"n
11540 6f 6e 61 73 73 6f 63 22 29 3d 3d 30 20 29 7b 0a  onassoc")==0 ){.
11550 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70            psp->p
11560 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  reccounter++;.  
11570 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
11580 6c 61 73 73 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20  lassoc = NONE;. 
11590 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
115a0 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
115b0 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59 4d  R_PRECEDENCE_SYM
115c0 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  BOL;.        }el
115d0 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
115e0 22 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30  "destructor")==0
115f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
11600 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
11610 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f  NG_FOR_DESTRUCTO
11620 52 5f 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20  R_SYMBOL;.      
11630 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
11640 6d 70 28 78 2c 22 74 79 70 65 22 29 3d 3d 30 20  mp(x,"type")==0 
11650 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
11660 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
11670 47 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53  G_FOR_DATATYPE_S
11680 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d  YMBOL;.        }
11690 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
116a0 78 2c 22 66 61 6c 6c 62 61 63 6b 22 29 3d 3d 30  x,"fallback")==0
116b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
116c0 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b  p->fallback = 0;
116d0 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
116e0 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
116f0 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3b  FOR_FALLBACK_ID;
11700 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
11710 66 28 20 73 74 72 63 6d 70 28 78 2c 22 77 69 6c  f( strcmp(x,"wil
11720 64 63 61 72 64 22 29 3d 3d 30 20 29 7b 0a 20 20  dcard")==0 ){.  
11730 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11740 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
11750 5f 57 49 4c 44 43 41 52 44 5f 49 44 3b 0a 20 20  _WILDCARD_ID;.  
11760 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11770 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
11780 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
11790 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
117a0 20 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 6b              "Unk
117b0 6e 6f 77 6e 20 64 65 63 6c 61 72 61 74 69 6f 6e  nown declaration
117c0 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25 25 25 73   keyword: \"%%%s
117d0 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20  \".",x);.       
117e0 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
117f0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
11800 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
11810 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52  C_AFTER_DECL_ERR
11820 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
11830 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11840 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
11850 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
11860 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
11870 20 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20 64        "Illegal d
11880 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f  eclaration keywo
11890 72 64 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b  rd: \"%s\".",x);
118a0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
118b0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
118c0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
118d0 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
118e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
118f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11900 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
11910 52 5f 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d  R_DESTRUCTOR_SYM
11920 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20 21  BOL:.      if( !
11930 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b  isalpha(x[0]) ){
11940 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
11950 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
11960 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
11970 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 79 6d  ,.          "Sym
11980 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e 67  bol name missing
11990 20 61 66 74 65 72 20 25 25 64 65 73 74 72 75 63   after %%destruc
119a0 74 6f 72 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20  tor keyword");. 
119b0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
119c0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
119d0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
119e0 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
119f0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
11a00 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
11a10 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53  t symbol *sp = S
11a20 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
11a30 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
11a40 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65  rgslot = &sp->de
11a50 73 74 72 75 63 74 6f 72 3b 0a 20 20 20 20 20 20  structor;.      
11a60 20 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e    psp->decllinen
11a70 6f 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73  oslot = &sp->des
11a80 74 4c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20  tLineno;.       
11a90 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c 69 6e 65   psp->insertLine
11aa0 4d 61 63 72 6f 20 3d 20 31 3b 0a 20 20 20 20 20  Macro = 1;.     
11ab0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
11ac0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
11ad0 5f 41 52 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _ARG;.      }.  
11ae0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
11af0 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f  ase WAITING_FOR_
11b00 44 41 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3a  DATATYPE_SYMBOL:
11b10 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 61 6c  .      if( !isal
11b20 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  pha(x[0]) ){.   
11b30 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
11b40 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
11b50 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
11b60 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20          "Symbol 
11b70 6e 61 6d 65 20 6d 69 73 73 69 6e 67 20 61 66 74  name missing aft
11b80 65 72 20 25 25 74 79 70 65 20 6b 65 79 77 6f 72  er %%type keywor
11b90 64 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  d");.        psp
11ba0 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
11bb0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
11bc0 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
11bd0 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20  DECL_ERROR;.    
11be0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11bf0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
11c00 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64  sp = Symbol_find
11c10 28 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (x);.        if(
11c20 28 73 70 29 20 26 26 20 28 73 70 2d 3e 64 61 74  (sp) && (sp->dat
11c30 61 74 79 70 65 29 29 7b 0a 20 20 20 20 20 20 20  atype)){.       
11c40 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
11c50 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
11c60 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
11c70 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20          "Symbol 
11c80 25 25 74 79 70 65 20 5c 22 25 73 5c 22 20 61 6c  %%type \"%s\" al
11c90 72 65 61 64 79 20 64 65 66 69 6e 65 64 22 2c 20  ready defined", 
11ca0 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
11cb0 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
11cc0 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
11cd0 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
11ce0 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20  ER_DECL_ERROR;. 
11cf0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
11d00 20 20 20 20 20 20 20 20 69 66 20 28 21 73 70 29          if (!sp)
11d10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 70  {.            sp
11d20 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
11d30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
11d40 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
11d50 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e  largslot = &sp->
11d60 64 61 74 61 74 79 70 65 3b 0a 20 20 20 20 20 20  datatype;.      
11d70 20 20 20 20 70 73 70 2d 3e 69 6e 73 65 72 74 4c      psp->insertL
11d80 69 6e 65 4d 61 63 72 6f 20 3d 20 30 3b 0a 20 20  ineMacro = 0;.  
11d90 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
11da0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
11db0 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20  _DECL_ARG;.     
11dc0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11dd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
11de0 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50  se WAITING_FOR_P
11df0 52 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c  RECEDENCE_SYMBOL
11e00 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
11e10 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='.' ){.       
11e20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
11e30 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f  ITING_FOR_DECL_O
11e40 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65  R_RULE;.      }e
11e50 6c 73 65 20 69 66 28 20 69 73 75 70 70 65 72 28  lse if( isupper(
11e60 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  x[0]) ){.       
11e70 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
11e80 73 70 3b 0a 20 20 20 20 20 20 20 20 73 70 20 3d  sp;.        sp =
11e90 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
11ea0 20 20 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e          if( sp->
11eb0 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  prec>=0 ){.     
11ec0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
11ed0 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
11ee0 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
11ef0 20 20 20 20 20 20 20 20 20 20 22 53 79 6d 62 6f            "Symbo
11f00 6c 20 5c 22 25 73 5c 22 20 68 61 73 20 61 6c 72  l \"%s\" has alr
11f10 65 61 64 79 20 62 65 20 67 69 76 65 6e 20 61 20  eady be given a 
11f20 70 72 65 63 65 64 65 6e 63 65 2e 22 2c 78 29 3b  precedence.",x);
11f30 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
11f40 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
11f50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11f60 20 20 20 20 20 73 70 2d 3e 70 72 65 63 20 3d 20       sp->prec = 
11f70 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72  psp->preccounter
11f80 3b 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e  ;.          sp->
11f90 61 73 73 6f 63 20 3d 20 70 73 70 2d 3e 64 65 63  assoc = psp->dec
11fa0 6c 61 73 73 6f 63 3b 0a 20 20 20 20 20 20 20 20  lassoc;.        
11fb0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
11fc0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
11fd0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
11fe0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
11ff0 20 20 20 20 20 20 20 20 20 20 22 43 61 6e 27 74            "Can't
12000 20 61 73 73 69 67 6e 20 61 20 70 72 65 63 65 64   assign a preced
12010 65 6e 63 65 20 74 6f 20 5c 22 25 73 5c 22 2e 22  ence to \"%s\"."
12020 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  ,x);.        psp
12030 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
12040 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
12050 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
12060 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47  ING_FOR_DECL_ARG
12070 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d  :.      if( x[0]
12080 3d 3d 27 7b 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27  =='{' || x[0]=='
12090 5c 22 27 20 7c 7c 20 69 73 61 6c 6e 75 6d 28 78  \"' || isalnum(x
120a0 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
120b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 6c 64  const char *zOld
120c0 2c 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 20 20 20  , *zNew;.       
120d0 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 2a 7a 3b   char *zBuf, *z;
120e0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4f 6c  .        int nOl
120f0 64 2c 20 6e 2c 20 6e 4c 69 6e 65 2c 20 6e 4e 65  d, n, nLine, nNe
12100 77 2c 20 6e 42 61 63 6b 3b 0a 20 20 20 20 20 20  w, nBack;.      
12110 20 20 69 6e 74 20 61 64 64 4c 69 6e 65 4d 61 63    int addLineMac
12120 72 6f 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  ro;.        char
12130 20 7a 4c 69 6e 65 5b 35 30 5d 3b 0a 20 20 20 20   zLine[50];.    
12140 20 20 20 20 7a 4e 65 77 20 3d 20 78 3b 0a 20 20      zNew = x;.  
12150 20 20 20 20 20 20 69 66 28 20 7a 4e 65 77 5b 30        if( zNew[0
12160 5d 3d 3d 27 22 27 20 7c 7c 20 7a 4e 65 77 5b 30  ]=='"' || zNew[0
12170 5d 3d 3d 27 7b 27 20 29 20 7a 4e 65 77 2b 2b 3b  ]=='{' ) zNew++;
12180 0a 20 20 20 20 20 20 20 20 6e 4e 65 77 20 3d 20  .        nNew = 
12190 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 7a 4e 65 77  lemonStrlen(zNew
121a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 2a  );.        if( *
121b0 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
121c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4f   ){.          zO
121d0 6c 64 20 3d 20 2a 70 73 70 2d 3e 64 65 63 6c 61  ld = *psp->decla
121e0 72 67 73 6c 6f 74 3b 0a 20 20 20 20 20 20 20 20  rgslot;.        
121f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
12200 20 7a 4f 6c 64 20 3d 20 22 22 3b 0a 20 20 20 20   zOld = "";.    
12210 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 4f      }.        nO
12220 6c 64 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  ld = lemonStrlen
12230 28 7a 4f 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  (zOld);.        
12240 6e 20 3d 20 6e 4f 6c 64 20 2b 20 6e 4e 65 77 20  n = nOld + nNew 
12250 2b 20 32 30 3b 0a 20 20 20 20 20 20 20 20 61 64  + 20;.        ad
12260 64 4c 69 6e 65 4d 61 63 72 6f 20 3d 20 21 70 73  dLineMacro = !ps
12270 70 2d 3e 67 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73  p->gp->nolinenos
12280 66 6c 61 67 20 26 26 20 70 73 70 2d 3e 69 6e 73  flag && psp->ins
12290 65 72 74 4c 69 6e 65 4d 61 63 72 6f 20 26 26 0a  ertLineMacro &&.
122a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
122b0 20 20 20 20 20 20 20 20 28 70 73 70 2d 3e 64 65          (psp->de
122c0 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 3d 3d 30 20  cllinenoslot==0 
122d0 7c 7c 20 70 73 70 2d 3e 64 65 63 6c 6c 69 6e 65  || psp->declline
122e0 6e 6f 73 6c 6f 74 5b 30 5d 21 3d 30 29 3b 0a 20  noslot[0]!=0);. 
122f0 20 20 20 20 20 20 20 69 66 28 20 61 64 64 4c 69         if( addLi
12300 6e 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20 20 20  neMacro ){.     
12310 20 20 20 20 20 66 6f 72 28 7a 3d 70 73 70 2d 3e       for(z=psp->
12320 66 69 6c 65 6e 61 6d 65 2c 20 6e 42 61 63 6b 3d  filename, nBack=
12330 30 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20 20  0; *z; z++){.   
12340 20 20 20 20 20 20 20 20 20 69 66 28 20 2a 7a 3d           if( *z=
12350 3d 27 5c 5c 27 20 29 20 6e 42 61 63 6b 2b 2b 3b  ='\\' ) nBack++;
12360 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
12370 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a         sprintf(z
12380 4c 69 6e 65 2c 20 22 23 6c 69 6e 65 20 25 64 20  Line, "#line %d 
12390 22 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  ", psp->tokenlin
123a0 65 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eno);.          
123b0 6e 4c 69 6e 65 20 3d 20 6c 65 6d 6f 6e 53 74 72  nLine = lemonStr
123c0 6c 65 6e 28 7a 4c 69 6e 65 29 3b 0a 20 20 20 20  len(zLine);.    
123d0 20 20 20 20 20 20 6e 20 2b 3d 20 6e 4c 69 6e 65        n += nLine
123e0 20 2b 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70   + lemonStrlen(p
123f0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 20 2b 20  sp->filename) + 
12400 6e 42 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nBack;.        }
12410 0a 20 20 20 20 20 20 20 20 2a 70 73 70 2d 3e 64  .        *psp->d
12420 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 28 63 68  eclargslot = (ch
12430 61 72 20 2a 29 20 72 65 61 6c 6c 6f 63 28 2a 70  ar *) realloc(*p
12440 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 2c  sp->declargslot,
12450 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75   n);.        zBu
12460 66 20 3d 20 2a 70 73 70 2d 3e 64 65 63 6c 61 72  f = *psp->declar
12470 67 73 6c 6f 74 20 2b 20 6e 4f 6c 64 3b 0a 20 20  gslot + nOld;.  
12480 20 20 20 20 20 20 69 66 28 20 61 64 64 4c 69 6e        if( addLin
12490 65 4d 61 63 72 6f 20 29 7b 0a 20 20 20 20 20 20  eMacro ){.      
124a0 20 20 20 20 69 66 28 20 6e 4f 6c 64 20 26 26 20      if( nOld && 
124b0 7a 42 75 66 5b 2d 31 5d 21 3d 27 5c 6e 27 20 29  zBuf[-1]!='\n' )
124c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 28  {.            *(
124d0 7a 42 75 66 2b 2b 29 20 3d 20 27 5c 6e 27 3b 0a  zBuf++) = '\n';.
124e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
124f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
12500 66 2c 20 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29  f, zLine, nLine)
12510 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 42 75 66  ;.          zBuf
12520 20 2b 3d 20 6e 4c 69 6e 65 3b 0a 20 20 20 20 20   += nLine;.     
12530 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
12540 20 27 22 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '"';.          
12550 66 6f 72 28 7a 3d 70 73 70 2d 3e 66 69 6c 65 6e  for(z=psp->filen
12560 61 6d 65 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20  ame; *z; z++){. 
12570 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 2a             if( *
12580 7a 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  z=='\\' ){.     
12590 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75 66 2b           *(zBuf+
125a0 2b 29 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20  +) = '\\';.     
125b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
125c0 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20 3d       *(zBuf++) =
125d0 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   *z;.          }
125e0 0a 20 20 20 20 20 20 20 20 20 20 2a 28 7a 42 75  .          *(zBu
125f0 66 2b 2b 29 20 3d 20 27 22 27 3b 0a 20 20 20 20  f++) = '"';.    
12600 20 20 20 20 20 20 2a 28 7a 42 75 66 2b 2b 29 20        *(zBuf++) 
12610 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
12620 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73  }.        if( ps
12630 70 2d 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f  p->decllinenoslo
12640 74 20 26 26 20 70 73 70 2d 3e 64 65 63 6c 6c 69  t && psp->declli
12650 6e 65 6e 6f 73 6c 6f 74 5b 30 5d 3d 3d 30 20 29  nenoslot[0]==0 )
12660 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
12670 3e 64 65 63 6c 6c 69 6e 65 6e 6f 73 6c 6f 74 5b  >decllinenoslot[
12680 30 5d 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  0] = psp->tokenl
12690 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d  ineno;.        }
126a0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
126b0 7a 42 75 66 2c 20 7a 4e 65 77 2c 20 6e 4e 65 77  zBuf, zNew, nNew
126c0 29 3b 0a 20 20 20 20 20 20 20 20 7a 42 75 66 20  );.        zBuf 
126d0 2b 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 20 20 20  += nNew;.       
126e0 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20 20 20 20   *zBuf = 0;.    
126f0 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
12700 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
12710 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
12720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12730 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
12740 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
12750 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
12760 20 20 20 22 49 6c 6c 65 67 61 6c 20 61 72 67 75     "Illegal argu
12770 6d 65 6e 74 20 74 6f 20 25 25 25 73 3a 20 25 73  ment to %%%s: %s
12780 22 2c 70 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f  ",psp->declkeywo
12790 72 64 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 70  rd,x);.        p
127a0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
127b0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
127c0 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
127d0 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  R_DECL_ERROR;.  
127e0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
127f0 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
12800 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42 41 43 4b  ING_FOR_FALLBACK
12810 5f 49 44 3a 0a 20 20 20 20 20 20 69 66 28 20 78  _ID:.      if( x
12820 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]=='.' ){.    
12830 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
12840 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
12850 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20  L_OR_RULE;.     
12860 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 75 70   }else if( !isup
12870 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  per(x[0]) ){.   
12880 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
12890 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70  p->filename, psp
128a0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
128b0 20 20 20 20 20 20 20 20 20 22 25 25 66 61 6c 6c           "%%fall
128c0 62 61 63 6b 20 61 72 67 75 6d 65 6e 74 20 5c 22  back argument \"
128d0 25 73 5c 22 20 73 68 6f 75 6c 64 20 62 65 20 61  %s\" should be a
128e0 20 74 6f 6b 65 6e 22 2c 20 78 29 3b 0a 20 20 20   token", x);.   
128f0 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
12900 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nt++;.      }els
12910 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
12920 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53  t symbol *sp = S
12930 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
12940 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e 66        if( psp->f
12950 61 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20  allback==0 ){.  
12960 20 20 20 20 20 20 20 20 70 73 70 2d 3e 66 61 6c          psp->fal
12970 6c 62 61 63 6b 20 3d 20 73 70 3b 0a 20 20 20 20  lback = sp;.    
12980 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
12990 2d 3e 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ->fallback ){.  
129a0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
129b0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 20  (psp->filename, 
129c0 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
129d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 4d  ,.            "M
129e0 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 66 61 6c  ore than one fal
129f0 6c 62 61 63 6b 20 61 73 73 69 67 6e 65 64 20 74  lback assigned t
12a00 6f 20 74 6f 6b 65 6e 20 25 73 22 2c 20 78 29 3b  o token %s", x);
12a10 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
12a20 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
12a30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12a40 20 20 20 20 20 73 70 2d 3e 66 61 6c 6c 62 61 63       sp->fallbac
12a50 6b 20 3d 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63  k = psp->fallbac
12a60 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  k;.          psp
12a70 2d 3e 67 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61  ->gp->has_fallba
12a80 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ck = 1;.        
12a90 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
12aa0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
12ab0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 57 49 4c 44  WAITING_FOR_WILD
12ac0 43 41 52 44 5f 49 44 3a 0a 20 20 20 20 20 20 69  CARD_ID:.      i
12ad0 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a  f( x[0]=='.' ){.
12ae0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
12af0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
12b00 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20  _DECL_OR_RULE;. 
12b10 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
12b20 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b  isupper(x[0]) ){
12b30 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
12b40 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
12b50 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e   psp->tokenlinen
12b60 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25 25  o,.          "%%
12b70 77 69 6c 64 63 61 72 64 20 61 72 67 75 6d 65 6e  wildcard argumen
12b80 74 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20  t \"%s\" should 
12b90 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29 3b  be a token", x);
12ba0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
12bb0 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
12bc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
12bd0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
12be0 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
12bf0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73  ;.        if( ps
12c00 70 2d 3e 67 70 2d 3e 77 69 6c 64 63 61 72 64 3d  p->gp->wildcard=
12c10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
12c20 70 73 70 2d 3e 67 70 2d 3e 77 69 6c 64 63 61 72  psp->gp->wildcar
12c30 64 20 3d 20 73 70 3b 0a 20 20 20 20 20 20 20 20  d = sp;.        
12c40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
12c50 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
12c60 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f  ilename, psp->to
12c70 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
12c80 20 20 20 20 20 20 20 22 45 78 74 72 61 20 77 69         "Extra wi
12c90 6c 64 63 61 72 64 20 74 6f 20 74 6f 6b 65 6e 3a  ldcard to token:
12ca0 20 25 73 22 2c 20 78 29 3b 0a 20 20 20 20 20 20   %s", x);.      
12cb0 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
12cc0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
12cd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
12ce0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53  ak;.    case RES
12cf0 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45  YNC_AFTER_RULE_E
12d00 52 52 4f 52 3a 0a 2f 2a 20 20 20 20 20 20 69 66  RROR:./*      if
12d10 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73  ( x[0]=='.' ) ps
12d20 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
12d30 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
12d40 55 4c 45 3b 0a 2a 2a 20 20 20 20 20 20 62 72 65  ULE;.**      bre
12d50 61 6b 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ak; */.    case 
12d60 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
12d70 4c 5f 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 69  L_ERROR:.      i
12d80 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70  f( x[0]=='.' ) p
12d90 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
12da0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
12db0 52 55 4c 45 3b 0a 20 20 20 20 20 20 69 66 28 20  RULE;.      if( 
12dc0 78 5b 30 5d 3d 3d 27 25 27 20 29 20 70 73 70 2d  x[0]=='%' ) psp-
12dd0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
12de0 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52  _FOR_DECL_KEYWOR
12df0 44 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  D;.      break;.
12e00 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 75 6e 20 74 68    }.}../* Run th
12e10 65 20 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6f  e preprocessor o
12e20 76 65 72 20 74 68 65 20 69 6e 70 75 74 20 66 69  ver the input fi
12e30 6c 65 20 74 65 78 74 2e 20 20 54 68 65 20 67 6c  le text.  The gl
12e40 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 0a 2a  obal variables.*
12e50 2a 20 61 7a 44 65 66 69 6e 65 5b 30 5d 20 74 68  * azDefine[0] th
12e60 72 6f 75 67 68 20 61 7a 44 65 66 69 6e 65 5b 6e  rough azDefine[n
12e70 44 65 66 69 6e 65 2d 31 5d 20 63 6f 6e 74 61 69  Define-1] contai
12e80 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ns the names of 
12e90 61 6c 6c 20 64 65 66 69 6e 65 64 0a 2a 2a 20 6d  all defined.** m
12ea0 61 63 72 6f 73 2e 20 20 54 68 69 73 20 72 6f 75  acros.  This rou
12eb0 74 69 6e 65 20 6c 6f 6f 6b 73 20 66 6f 72 20 22  tine looks for "
12ec0 25 69 66 64 65 66 22 20 61 6e 64 20 22 25 69 66  %ifdef" and "%if
12ed0 6e 64 65 66 22 20 61 6e 64 20 22 25 65 6e 64 69  ndef" and "%endi
12ee0 66 22 20 61 6e 64 0a 2a 2a 20 63 6f 6d 6d 65 6e  f" and.** commen
12ef0 74 73 20 74 68 65 6d 20 6f 75 74 2e 20 20 54 65  ts them out.  Te
12f00 78 74 20 69 6e 20 62 65 74 77 65 65 6e 20 69 73  xt in between is
12f10 20 61 6c 73 6f 20 63 6f 6d 6d 65 6e 74 65 64 20   also commented 
12f20 6f 75 74 20 61 73 20 61 70 70 72 6f 70 72 69 61  out as appropria
12f30 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  te..*/.static vo
12f40 69 64 20 70 72 65 70 72 6f 63 65 73 73 5f 69 6e  id preprocess_in
12f50 70 75 74 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  put(char *z){.  
12f60 69 6e 74 20 69 2c 20 6a 2c 20 6b 2c 20 6e 3b 0a  int i, j, k, n;.
12f70 20 20 69 6e 74 20 65 78 63 6c 75 64 65 20 3d 20    int exclude = 
12f80 30 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d  0;.  int start =
12f90 20 30 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f   0;.  int lineno
12fa0 20 3d 20 31 3b 0a 20 20 69 6e 74 20 73 74 61 72   = 1;.  int star
12fb0 74 5f 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20  t_lineno = 1;.  
12fc0 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
12fd0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
12fe0 5d 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f  ]=='\n' ) lineno
12ff0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  ++;.    if( z[i]
13000 21 3d 27 25 27 20 7c 7c 20 28 69 3e 30 20 26 26  !='%' || (i>0 &&
13010 20 7a 5b 69 2d 31 5d 21 3d 27 5c 6e 27 29 20 29   z[i-1]!='\n') )
13020 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
13030 66 28 20 73 74 72 6e 63 6d 70 28 26 7a 5b 69 5d  f( strncmp(&z[i]
13040 2c 22 25 65 6e 64 69 66 22 2c 36 29 3d 3d 30 20  ,"%endif",6)==0 
13050 26 26 20 69 73 73 70 61 63 65 28 7a 5b 69 2b 36  && isspace(z[i+6
13060 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ]) ){.      if( 
13070 65 78 63 6c 75 64 65 20 29 7b 0a 20 20 20 20 20  exclude ){.     
13080 20 20 20 65 78 63 6c 75 64 65 2d 2d 3b 0a 20 20     exclude--;.  
13090 20 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64        if( exclud
130a0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
130b0 20 20 66 6f 72 28 6a 3d 73 74 61 72 74 3b 20 6a    for(j=start; j
130c0 3c 69 3b 20 6a 2b 2b 29 20 69 66 28 20 7a 5b 6a  <i; j++) if( z[j
130d0 5d 21 3d 27 5c 6e 27 20 29 20 7a 5b 6a 5d 20 3d  ]!='\n' ) z[j] =
130e0 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a   ' ';.        }.
130f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
13100 72 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a  r(j=i; z[j] && z
13110 5b 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20  [j]!='\n'; j++) 
13120 7a 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  z[j] = ' ';.    
13130 7d 65 6c 73 65 20 69 66 28 20 28 73 74 72 6e 63  }else if( (strnc
13140 6d 70 28 26 7a 5b 69 5d 2c 22 25 69 66 64 65 66  mp(&z[i],"%ifdef
13150 22 2c 36 29 3d 3d 30 20 26 26 20 69 73 73 70 61  ",6)==0 && isspa
13160 63 65 28 7a 5b 69 2b 36 5d 29 29 0a 20 20 20 20  ce(z[i+6])).    
13170 20 20 20 20 20 20 7c 7c 20 28 73 74 72 6e 63 6d        || (strncm
13180 70 28 26 7a 5b 69 5d 2c 22 25 69 66 6e 64 65 66  p(&z[i],"%ifndef
13190 22 2c 37 29 3d 3d 30 20 26 26 20 69 73 73 70 61  ",7)==0 && isspa
131a0 63 65 28 7a 5b 69 2b 37 5d 29 29 20 29 7b 0a 20  ce(z[i+7])) ){. 
131b0 20 20 20 20 20 69 66 28 20 65 78 63 6c 75 64 65       if( exclude
131c0 20 29 7b 0a 20 20 20 20 20 20 20 20 65 78 63 6c   ){.        excl
131d0 75 64 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  ude++;.      }el
131e0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  se{.        for(
131f0 6a 3d 69 2b 37 3b 20 69 73 73 70 61 63 65 28 7a  j=i+7; isspace(z
13200 5b 6a 5d 29 3b 20 6a 2b 2b 29 7b 7d 0a 20 20 20  [j]); j++){}.   
13210 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b       for(n=0; z[
13220 6a 2b 6e 5d 20 26 26 20 21 69 73 73 70 61 63 65  j+n] && !isspace
13230 28 7a 5b 6a 2b 6e 5d 29 3b 20 6e 2b 2b 29 7b 7d  (z[j+n]); n++){}
13240 0a 20 20 20 20 20 20 20 20 65 78 63 6c 75 64 65  .        exclude
13250 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66 6f   = 1;.        fo
13260 72 28 6b 3d 30 3b 20 6b 3c 6e 44 65 66 69 6e 65  r(k=0; k<nDefine
13270 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; k++){.        
13280 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a    if( strncmp(az
13290 44 65 66 69 6e 65 5b 6b 5d 2c 26 7a 5b 6a 5d 2c  Define[k],&z[j],
132a0 6e 29 3d 3d 30 20 26 26 20 6c 65 6d 6f 6e 53 74  n)==0 && lemonSt
132b0 72 6c 65 6e 28 61 7a 44 65 66 69 6e 65 5b 6b 5d  rlen(azDefine[k]
132c0 29 3d 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  )==n ){.        
132d0 20 20 20 20 65 78 63 6c 75 64 65 20 3d 20 30 3b      exclude = 0;
132e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
132f0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
13300 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13310 20 20 69 66 28 20 7a 5b 69 2b 33 5d 3d 3d 27 6e    if( z[i+3]=='n
13320 27 20 29 20 65 78 63 6c 75 64 65 20 3d 20 21 65  ' ) exclude = !e
13330 78 63 6c 75 64 65 3b 0a 20 20 20 20 20 20 20 20  xclude;.        
13340 69 66 28 20 65 78 63 6c 75 64 65 20 29 7b 0a 20  if( exclude ){. 
13350 20 20 20 20 20 20 20 20 20 73 74 61 72 74 20 3d           start =
13360 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74   i;.          st
13370 61 72 74 5f 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e  art_lineno = lin
13380 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eno;.        }. 
13390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
133a0 28 6a 3d 69 3b 20 7a 5b 6a 5d 20 26 26 20 7a 5b  (j=i; z[j] && z[
133b0 6a 5d 21 3d 27 5c 6e 27 3b 20 6a 2b 2b 29 20 7a  j]!='\n'; j++) z
133c0 5b 6a 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 7d  [j] = ' ';.    }
133d0 0a 20 20 7d 0a 20 20 69 66 28 20 65 78 63 6c 75  .  }.  if( exclu
133e0 64 65 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  de ){.    fprint
133f0 66 28 73 74 64 65 72 72 2c 22 75 6e 74 65 72 6d  f(stderr,"unterm
13400 69 6e 61 74 65 64 20 25 25 69 66 64 65 66 20 73  inated %%ifdef s
13410 74 61 72 74 69 6e 67 20 6f 6e 20 6c 69 6e 65 20  tarting on line 
13420 25 64 5c 6e 22 2c 20 73 74 61 72 74 5f 6c 69 6e  %d\n", start_lin
13430 65 6e 6f 29 3b 0a 20 20 20 20 65 78 69 74 28 31  eno);.    exit(1
13440 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 49 6e 20  );.  }.}../* In 
13450 73 70 69 74 65 20 6f 66 20 69 74 73 20 6e 61 6d  spite of its nam
13460 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  e, this function
13470 20 69 73 20 72 65 61 6c 6c 79 20 61 20 73 63 61   is really a sca
13480 6e 6e 65 72 2e 20 20 49 74 20 72 65 61 64 0a 2a  nner.  It read.*
13490 2a 20 69 6e 20 74 68 65 20 65 6e 74 69 72 65 20  * in the entire 
134a0 69 6e 70 75 74 20 66 69 6c 65 20 28 61 6c 6c 20  input file (all 
134b0 61 74 20 6f 6e 63 65 29 20 74 68 65 6e 20 74 6f  at once) then to
134c0 6b 65 6e 69 7a 65 73 20 69 74 2e 20 20 45 61 63  kenizes it.  Eac
134d0 68 0a 2a 2a 20 74 6f 6b 65 6e 20 69 73 20 70 61  h.** token is pa
134e0 73 73 65 64 20 74 6f 20 74 68 65 20 66 75 6e 63  ssed to the func
134f0 74 69 6f 6e 20 22 70 61 72 73 65 6f 6e 65 74 6f  tion "parseoneto
13500 6b 65 6e 22 20 77 68 69 63 68 20 62 75 69 6c 64  ken" which build
13510 73 20 61 6c 6c 0a 2a 2a 20 74 68 65 20 61 70 70  s all.** the app
13520 72 6f 70 72 69 61 74 65 20 64 61 74 61 20 73 74  ropriate data st
13530 72 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20  ructures in the 
13540 67 6c 6f 62 61 6c 20 73 74 61 74 65 20 76 65 63  global state vec
13550 74 6f 72 20 22 67 70 22 2e 0a 2a 2f 0a 76 6f 69  tor "gp"..*/.voi
13560 64 20 50 61 72 73 65 28 73 74 72 75 63 74 20 6c  d Parse(struct l
13570 65 6d 6f 6e 20 2a 67 70 29 0a 7b 0a 20 20 73 74  emon *gp).{.  st
13580 72 75 63 74 20 70 73 74 61 74 65 20 70 73 3b 0a  ruct pstate ps;.
13590 20 20 46 49 4c 45 20 2a 66 70 3b 0a 20 20 63 68    FILE *fp;.  ch
135a0 61 72 20 2a 66 69 6c 65 62 75 66 3b 0a 20 20 69  ar *filebuf;.  i
135b0 6e 74 20 66 69 6c 65 73 69 7a 65 3b 0a 20 20 69  nt filesize;.  i
135c0 6e 74 20 6c 69 6e 65 6e 6f 3b 0a 20 20 69 6e 74  nt lineno;.  int
135d0 20 63 3b 0a 20 20 63 68 61 72 20 2a 63 70 2c 20   c;.  char *cp, 
135e0 2a 6e 65 78 74 63 70 3b 0a 20 20 69 6e 74 20 73  *nextcp;.  int s
135f0 74 61 72 74 6c 69 6e 65 20 3d 20 30 3b 0a 0a 20  tartline = 0;.. 
13600 20 6d 65 6d 73 65 74 28 26 70 73 2c 20 27 5c 30   memset(&ps, '\0
13610 27 2c 20 73 69 7a 65 6f 66 28 70 73 29 29 3b 0a  ', sizeof(ps));.
13620 20 20 70 73 2e 67 70 20 3d 20 67 70 3b 0a 20 20    ps.gp = gp;.  
13630 70 73 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 67 70  ps.filename = gp
13640 2d 3e 66 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 73  ->filename;.  ps
13650 2e 65 72 72 6f 72 63 6e 74 20 3d 20 30 3b 0a 20  .errorcnt = 0;. 
13660 20 70 73 2e 73 74 61 74 65 20 3d 20 49 4e 49 54   ps.state = INIT
13670 49 41 4c 49 5a 45 3b 0a 0a 20 20 2f 2a 20 42 65  IALIZE;..  /* Be
13680 67 69 6e 20 62 79 20 72 65 61 64 69 6e 67 20 74  gin by reading t
13690 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f  he input file */
136a0 0a 20 20 66 70 20 3d 20 66 6f 70 65 6e 28 70 73  .  fp = fopen(ps
136b0 2e 66 69 6c 65 6e 61 6d 65 2c 22 72 62 22 29 3b  .filename,"rb");
136c0 0a 20 20 69 66 28 20 66 70 3d 3d 30 20 29 7b 0a  .  if( fp==0 ){.
136d0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e      ErrorMsg(ps.
136e0 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27  filename,0,"Can'
136f0 74 20 6f 70 65 6e 20 74 68 69 73 20 66 69 6c 65  t open this file
13700 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 22 29 3b   for reading.");
13710 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e  .    gp->errorcn
13720 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  t++;.    return;
13730 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28 66 70 2c  .  }.  fseek(fp,
13740 30 2c 32 29 3b 0a 20 20 66 69 6c 65 73 69 7a 65  0,2);.  filesize
13750 20 3d 20 66 74 65 6c 6c 28 66 70 29 3b 0a 20 20   = ftell(fp);.  
13760 72 65 77 69 6e 64 28 66 70 29 3b 0a 20 20 66 69  rewind(fp);.  fi
13770 6c 65 62 75 66 20 3d 20 28 63 68 61 72 20 2a 29  lebuf = (char *)
13780 6d 61 6c 6c 6f 63 28 20 66 69 6c 65 73 69 7a 65  malloc( filesize
13790 2b 31 20 29 3b 0a 20 20 69 66 28 20 66 69 6c 65  +1 );.  if( file
137a0 62 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72  buf==0 ){.    Er
137b0 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61  rorMsg(ps.filena
137c0 6d 65 2c 30 2c 22 43 61 6e 27 74 20 61 6c 6c 6f  me,0,"Can't allo
137d0 63 61 74 65 20 25 64 20 6f 66 20 6d 65 6d 6f 72  cate %d of memor
137e0 79 20 74 6f 20 68 6f 6c 64 20 74 68 69 73 20 66  y to hold this f
137f0 69 6c 65 2e 22 2c 0a 20 20 20 20 20 20 66 69 6c  ile.",.      fil
13800 65 73 69 7a 65 2b 31 29 3b 0a 20 20 20 20 67 70  esize+1);.    gp
13810 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
13820 20 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20    fclose(fp);.  
13830 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
13840 69 66 28 20 66 72 65 61 64 28 66 69 6c 65 62 75  if( fread(filebu
13850 66 2c 31 2c 66 69 6c 65 73 69 7a 65 2c 66 70 29  f,1,filesize,fp)
13860 21 3d 66 69 6c 65 73 69 7a 65 20 29 7b 0a 20 20  !=filesize ){.  
13870 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69    ErrorMsg(ps.fi
13880 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20  lename,0,"Can't 
13890 72 65 61 64 20 69 6e 20 61 6c 6c 20 25 64 20 62  read in all %d b
138a0 79 74 65 73 20 6f 66 20 74 68 69 73 20 66 69 6c  ytes of this fil
138b0 65 2e 22 2c 0a 20 20 20 20 20 20 66 69 6c 65 73  e.",.      files
138c0 69 7a 65 29 3b 0a 20 20 20 20 66 72 65 65 28 66  ize);.    free(f
138d0 69 6c 65 62 75 66 29 3b 0a 20 20 20 20 67 70 2d  ilebuf);.    gp-
138e0 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
138f0 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 20   fclose(fp);.   
13900 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66   return;.  }.  f
13910 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 66 69 6c  close(fp);.  fil
13920 65 62 75 66 5b 66 69 6c 65 73 69 7a 65 5d 20 3d  ebuf[filesize] =
13930 20 30 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61   0;..  /* Make a
13940 6e 20 69 6e 69 74 69 61 6c 20 70 61 73 73 20 74  n initial pass t
13950 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65 20  hrough the file 
13960 74 6f 20 68 61 6e 64 6c 65 20 25 69 66 64 65 66  to handle %ifdef
13970 20 61 6e 64 20 25 69 66 6e 64 65 66 20 2a 2f 0a   and %ifndef */.
13980 20 20 70 72 65 70 72 6f 63 65 73 73 5f 69 6e 70    preprocess_inp
13990 75 74 28 66 69 6c 65 62 75 66 29 3b 0a 0a 20 20  ut(filebuf);..  
139a0 2f 2a 20 4e 6f 77 20 73 63 61 6e 20 74 68 65 20  /* Now scan the 
139b0 74 65 78 74 20 6f 66 20 74 68 65 20 69 6e 70 75  text of the inpu
139c0 74 20 66 69 6c 65 20 2a 2f 0a 20 20 6c 69 6e 65  t file */.  line
139d0 6e 6f 20 3d 20 31 3b 0a 20 20 66 6f 72 28 63 70  no = 1;.  for(cp
139e0 3d 66 69 6c 65 62 75 66 3b 20 28 63 3d 20 2a 63  =filebuf; (c= *c
139f0 70 29 21 3d 30 3b 20 29 7b 0a 20 20 20 20 69 66  p)!=0; ){.    if
13a00 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65  ( c=='\n' ) line
13a10 6e 6f 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20  no++;           
13a20 20 20 20 2f 2a 20 4b 65 65 70 20 74 72 61 63 6b     /* Keep track
13a30 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d   of the line num
13a40 62 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  ber */.    if( i
13a50 73 73 70 61 63 65 28 63 29 20 29 7b 20 63 70 2b  sspace(c) ){ cp+
13a60 2b 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 20 20  +; continue; }  
13a70 2f 2a 20 53 6b 69 70 20 61 6c 6c 20 77 68 69 74  /* Skip all whit
13a80 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69  e space */.    i
13a90 66 28 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b  f( c=='/' && cp[
13aa0 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 20 20 20 20  1]=='/' ){      
13ab0 20 20 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b 20      /* Skip C++ 
13ac0 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a  style comments *
13ad0 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20  /.      cp+=2;. 
13ae0 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20       while( (c= 
13af0 2a 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c  *cp)!=0 && c!='\
13b00 6e 27 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20  n' ) cp++;.     
13b10 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
13b20 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2f 27 20  .    if( c=='/' 
13b30 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b  && cp[1]=='*' ){
13b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69            /* Ski
13b50 70 20 43 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e  p C style commen
13b60 74 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d  ts */.      cp+=
13b70 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  2;.      while( 
13b80 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28  (c= *cp)!=0 && (
13b90 63 21 3d 27 2f 27 20 7c 7c 20 63 70 5b 2d 31 5d  c!='/' || cp[-1]
13ba0 21 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20 20 20  !='*') ){.      
13bb0 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
13bc0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
13bd0 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a    cp++;.      }.
13be0 20 20 20 20 20 20 69 66 28 20 63 20 29 20 63 70        if( c ) cp
13bf0 2b 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e  ++;.      contin
13c00 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 73  ue;.    }.    ps
13c10 2e 74 6f 6b 65 6e 73 74 61 72 74 20 3d 20 63 70  .tokenstart = cp
13c20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
13c30 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 62 65 67   /* Mark the beg
13c40 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 6f  inning of the to
13c50 6b 65 6e 20 2a 2f 0a 20 20 20 20 70 73 2e 74 6f  ken */.    ps.to
13c60 6b 65 6e 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65  kenlineno = line
13c70 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no;           /*
13c80 20 4c 69 6e 65 6e 75 6d 62 65 72 20 6f 6e 20 77   Linenumber on w
13c90 68 69 63 68 20 74 6f 6b 65 6e 20 62 65 67 69 6e  hich token begin
13ca0 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d  s */.    if( c==
13cb0 27 5c 22 27 20 29 7b 20 20 20 20 20 20 20 20 20  '\"' ){         
13cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
13cd0 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 20 2a  tring literals *
13ce0 2f 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20  /.      cp++;.  
13cf0 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a      while( (c= *
13d00 63 70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 22  cp)!=0 && c!='\"
13d10 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
13d20 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e   c=='\n' ) linen
13d30 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 63 70 2b  o++;.        cp+
13d40 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
13d50 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
13d60 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
13d70 2e 66 69 6c 65 6e 61 6d 65 2c 73 74 61 72 74 6c  .filename,startl
13d80 69 6e 65 2c 0a 22 53 74 72 69 6e 67 20 73 74 61  ine,."String sta
13d90 72 74 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69  rting on this li
13da0 6e 65 20 69 73 20 6e 6f 74 20 74 65 72 6d 69 6e  ne is not termin
13db0 61 74 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  ated before the 
13dc0 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  end of the file.
13dd0 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 2e 65  ");.        ps.e
13de0 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
13df0 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a     nextcp = cp;.
13e00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
13e10 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
13e20 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +1;.      }.    
13e30 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b 27  }else if( c=='{'
13e40 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20   ){             
13e50 20 20 2f 2a 20 41 20 62 6c 6f 63 6b 20 6f 66 20    /* A block of 
13e60 43 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  C code */.      
13e70 69 6e 74 20 6c 65 76 65 6c 3b 0a 20 20 20 20 20  int level;.     
13e80 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72   cp++;.      for
13e90 28 6c 65 76 65 6c 3d 31 3b 20 28 63 3d 20 2a 63  (level=1; (c= *c
13ea0 70 29 21 3d 30 20 26 26 20 28 6c 65 76 65 6c 3e  p)!=0 && (level>
13eb0 31 20 7c 7c 20 63 21 3d 27 7d 27 29 3b 20 63 70  1 || c!='}'); cp
13ec0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
13ed0 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e   c=='\n' ) linen
13ee0 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c 73  o++;.        els
13ef0 65 20 69 66 28 20 63 3d 3d 27 7b 27 20 29 20 6c  e if( c=='{' ) l
13f00 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  evel++;.        
13f10 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7d 27 20  else if( c=='}' 
13f20 29 20 6c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20  ) level--;.     
13f30 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27     else if( c=='
13f40 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27  /' && cp[1]=='*'
13f50 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20 63 6f 6d   ){  /* Skip com
13f60 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20  ments */.       
13f70 20 20 20 69 6e 74 20 70 72 65 76 63 3b 0a 20 20     int prevc;.  
13f80 20 20 20 20 20 20 20 20 63 70 20 3d 20 26 63 70          cp = &cp
13f90 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  [2];.          p
13fa0 72 65 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  revc = 0;.      
13fb0 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a      while( (c= *
13fc0 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d 27 2f  cp)!=0 && (c!='/
13fd0 27 20 7c 7c 20 70 72 65 76 63 21 3d 27 2a 27 29  ' || prevc!='*')
13fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
13ff0 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69  if( c=='\n' ) li
14000 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
14010 20 20 20 20 70 72 65 76 63 20 3d 20 63 3b 0a 20      prevc = c;. 
14020 20 20 20 20 20 20 20 20 20 20 20 63 70 2b 2b 3b             cp++;
14030 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14040 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
14050 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d  =='/' && cp[1]==
14060 27 2f 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20  '/' ){  /* Skip 
14070 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e  C++ style commen
14080 74 73 20 74 6f 6f 20 2a 2f 0a 20 20 20 20 20 20  ts too */.      
14090 20 20 20 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b      cp = &cp[2];
140a0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
140b0 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ( (c= *cp)!=0 &&
140c0 20 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b   c!='\n' ) cp++;
140d0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
140e0 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20   ) lineno++;.   
140f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
14100 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 5c 22  =='\'' || c=='\"
14110 27 20 29 7b 20 20 20 20 2f 2a 20 53 74 72 69 6e  ' ){    /* Strin
14120 67 20 61 20 63 68 61 72 61 63 74 65 72 20 6c 69  g a character li
14130 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20  terals */.      
14140 20 20 20 20 69 6e 74 20 73 74 61 72 74 63 68 61      int startcha
14150 72 2c 20 70 72 65 76 63 3b 0a 20 20 20 20 20 20  r, prevc;.      
14160 20 20 20 20 73 74 61 72 74 63 68 61 72 20 3d 20      startchar = 
14170 63 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65  c;.          pre
14180 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  vc = 0;.        
14190 20 20 66 6f 72 28 63 70 2b 2b 3b 20 28 63 3d 20    for(cp++; (c= 
141a0 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d 73  *cp)!=0 && (c!=s
141b0 74 61 72 74 63 68 61 72 20 7c 7c 20 70 72 65 76  tartchar || prev
141c0 63 3d 3d 27 5c 5c 27 29 3b 20 63 70 2b 2b 29 7b  c=='\\'); cp++){
141d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
141e0 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e   c=='\n' ) linen
141f0 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  o++;.           
14200 20 69 66 28 20 70 72 65 76 63 3d 3d 27 5c 5c 27   if( prevc=='\\'
14210 20 29 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20   ) prevc = 0;.  
14220 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 20            else  
14230 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 76              prev
14240 63 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  c = c;.         
14250 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
14260 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
14270 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ==0 ){.        E
14280 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e  rrorMsg(ps.filen
14290 61 6d 65 2c 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65  ame,ps.tokenline
142a0 6e 6f 2c 0a 22 43 20 63 6f 64 65 20 73 74 61 72  no,."C code star
142b0 74 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e  ting on this lin
142c0 65 20 69 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61  e is not termina
142d0 74 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 65  ted before the e
142e0 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 22  nd of the file."
142f0 29 3b 0a 20 20 20 20 20 20 20 20 70 73 2e 65 72  );.        ps.er
14300 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
14310 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20    nextcp = cp;. 
14320 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14330 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 2b      nextcp = cp+
14340 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
14350 65 6c 73 65 20 69 66 28 20 69 73 61 6c 6e 75 6d  else if( isalnum
14360 28 63 29 20 29 7b 20 20 20 20 20 20 20 20 20 20  (c) ){          
14370 2f 2a 20 49 64 65 6e 74 69 66 69 65 72 73 20 2a  /* Identifiers *
14380 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  /.      while( (
14390 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 69  c= *cp)!=0 && (i
143a0 73 61 6c 6e 75 6d 28 63 29 20 7c 7c 20 63 3d 3d  salnum(c) || c==
143b0 27 5f 27 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20  '_') ) cp++;.   
143c0 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a     nextcp = cp;.
143d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
143e0 3d 27 3a 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  =':' && cp[1]=='
143f0 3a 27 20 26 26 20 63 70 5b 32 5d 3d 3d 27 3d 27  :' && cp[2]=='='
14400 20 29 7b 20 2f 2a 20 54 68 65 20 6f 70 65 72 61   ){ /* The opera
14410 74 6f 72 20 22 3a 3a 3d 22 20 2a 2f 0a 20 20 20  tor "::=" */.   
14420 20 20 20 63 70 20 2b 3d 20 33 3b 0a 20 20 20 20     cp += 3;.    
14430 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20    nextcp = cp;. 
14440 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d     }else if( (c=
14450 3d 27 2f 27 20 7c 7c 20 63 3d 3d 27 7c 27 29 20  ='/' || c=='|') 
14460 26 26 20 69 73 61 6c 70 68 61 28 63 70 5b 31 5d  && isalpha(cp[1]
14470 29 20 29 7b 0a 20 20 20 20 20 20 63 70 20 2b 3d  ) ){.      cp +=
14480 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   2;.      while(
14490 20 28 63 20 3d 20 2a 63 70 29 21 3d 30 20 26 26   (c = *cp)!=0 &&
144a0 20 28 69 73 61 6c 6e 75 6d 28 63 29 20 7c 7c 20   (isalnum(c) || 
144b0 63 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b 3b 0a  c=='_') ) cp++;.
144c0 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
144d0 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20 20  p;.    }else{   
144e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144f0 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6f 74         /* All ot
14500 68 65 72 20 28 6f 6e 65 20 63 68 61 72 61 63 74  her (one charact
14510 65 72 29 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f  er) operators */
14520 0a 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20  .      cp++;.   
14530 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a     nextcp = cp;.
14540 20 20 20 20 7d 0a 20 20 20 20 63 20 3d 20 2a 63      }.    c = *c
14550 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b 20  p;.    *cp = 0; 
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14570 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 6c 20 74         /* Null t
14580 65 72 6d 69 6e 61 74 65 20 74 68 65 20 74 6f 6b  erminate the tok
14590 65 6e 20 2a 2f 0a 20 20 20 20 70 61 72 73 65 6f  en */.    parseo
145a0 6e 65 74 6f 6b 65 6e 28 26 70 73 29 3b 20 20 20  netoken(&ps);   
145b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
145c0 73 65 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a  se the token */.
145d0 20 20 20 20 2a 63 70 20 3d 20 63 3b 20 20 20 20      *cp = c;    
145e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
145f0 20 20 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74      /* Restore t
14600 68 65 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  he buffer */.   
14610 20 63 70 20 3d 20 6e 65 78 74 63 70 3b 0a 20 20   cp = nextcp;.  
14620 7d 0a 20 20 66 72 65 65 28 66 69 6c 65 62 75 66  }.  free(filebuf
14630 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
14640 20 20 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65        /* Release
14650 20 74 68 65 20 62 75 66 66 65 72 20 61 66 74 65   the buffer afte
14660 72 20 70 61 72 73 69 6e 67 20 2a 2f 0a 20 20 67  r parsing */.  g
14670 70 2d 3e 72 75 6c 65 20 3d 20 70 73 2e 66 69 72  p->rule = ps.fir
14680 73 74 72 75 6c 65 3b 0a 20 20 67 70 2d 3e 65 72  strule;.  gp->er
14690 72 6f 72 63 6e 74 20 3d 20 70 73 2e 65 72 72 6f  rorcnt = ps.erro
146a0 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  rcnt;.}./*******
146b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146c0 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
146d0 6c 65 20 22 70 6c 69 6e 6b 2e 63 22 20 2a 2a 2a  le "plink.c" ***
146e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
146f0 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  **/./*.** Routin
14700 65 73 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f  es processing co
14710 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6f 6c 6c  nfiguration foll
14720 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69  ow-set propagati
14730 6f 6e 20 6c 69 6e 6b 73 0a 2a 2a 20 69 6e 20 74  on links.** in t
14740 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20  he LEMON parser 
14750 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74  generator..*/.st
14760 61 74 69 63 20 73 74 72 75 63 74 20 70 6c 69 6e  atic struct plin
14770 6b 20 2a 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73  k *plink_freelis
14780 74 20 3d 20 30 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63  t = 0;../* Alloc
14790 61 74 65 20 61 20 6e 65 77 20 70 6c 69 6e 6b 20  ate a new plink 
147a0 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  */.struct plink 
147b0 2a 50 6c 69 6e 6b 5f 6e 65 77 28 29 7b 0a 20 20  *Plink_new(){.  
147c0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65  struct plink *ne
147d0 77 6c 69 6e 6b 3b 0a 0a 20 20 69 66 28 20 70 6c  wlink;..  if( pl
147e0 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d 3d 30 20  ink_freelist==0 
147f0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
14800 20 20 69 6e 74 20 61 6d 74 20 3d 20 31 30 30 3b    int amt = 100;
14810 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c  .    plink_freel
14820 69 73 74 20 3d 20 28 73 74 72 75 63 74 20 70 6c  ist = (struct pl
14830 69 6e 6b 20 2a 29 63 61 6c 6c 6f 63 28 20 61 6d  ink *)calloc( am
14840 74 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  t, sizeof(struct
14850 20 70 6c 69 6e 6b 29 20 29 3b 0a 20 20 20 20 69   plink) );.    i
14860 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73  f( plink_freelis
14870 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70  t==0 ){.      fp
14880 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20  rintf(stderr,.  
14890 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 61      "Unable to a
148a0 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
148b0 6f 72 20 61 20 6e 65 77 20 66 6f 6c 6c 6f 77 2d  or a new follow-
148c0 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20  set propagation 
148d0 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20 20 20 20 20  link.\n");.     
148e0 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
148f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
14900 6d 74 2d 31 3b 20 69 2b 2b 29 20 70 6c 69 6e 6b  mt-1; i++) plink
14910 5f 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e 65 78  _freelist[i].nex
14920 74 20 3d 20 26 70 6c 69 6e 6b 5f 66 72 65 65 6c  t = &plink_freel
14930 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20 70 6c  ist[i+1];.    pl
14940 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 61 6d 74  ink_freelist[amt
14950 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  -1].next = 0;.  
14960 7d 0a 20 20 6e 65 77 6c 69 6e 6b 20 3d 20 70 6c  }.  newlink = pl
14970 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20  ink_freelist;.  
14980 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d  plink_freelist =
14990 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 2d   plink_freelist-
149a0 3e 6e 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20  >next;.  return 
149b0 6e 65 77 6c 69 6e 6b 3b 0a 7d 0a 0a 2f 2a 20 41  newlink;.}../* A
149c0 64 64 20 61 20 70 6c 69 6e 6b 20 74 6f 20 61 20  dd a plink to a 
149d0 70 6c 69 6e 6b 20 6c 69 73 74 20 2a 2f 0a 76 6f  plink list */.vo
149e0 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28 73 74 72  id Plink_add(str
149f0 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 70 6c 70 70  uct plink **plpp
14a00 2c 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  , struct config 
14a10 2a 63 66 70 29 0a 7b 0a 20 20 73 74 72 75 63 74  *cfp).{.  struct
14a20 20 70 6c 69 6e 6b 20 2a 6e 65 77 6c 69 6e 6b 3b   plink *newlink;
14a30 0a 20 20 6e 65 77 6c 69 6e 6b 20 3d 20 50 6c 69  .  newlink = Pli
14a40 6e 6b 5f 6e 65 77 28 29 3b 0a 20 20 6e 65 77 6c  nk_new();.  newl
14a50 69 6e 6b 2d 3e 6e 65 78 74 20 3d 20 2a 70 6c 70  ink->next = *plp
14a60 70 3b 0a 20 20 2a 70 6c 70 70 20 3d 20 6e 65 77  p;.  *plpp = new
14a70 6c 69 6e 6b 3b 0a 20 20 6e 65 77 6c 69 6e 6b 2d  link;.  newlink-
14a80 3e 63 66 70 20 3d 20 63 66 70 3b 0a 7d 0a 0a 2f  >cfp = cfp;.}../
14a90 2a 20 54 72 61 6e 73 66 65 72 20 65 76 65 72 79  * Transfer every
14aa0 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69   plink on the li
14ab0 73 74 20 22 66 72 6f 6d 22 20 74 6f 20 74 68 65  st "from" to the
14ac0 20 6c 69 73 74 20 22 74 6f 22 20 2a 2f 0a 76 6f   list "to" */.vo
14ad0 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 73 74  id Plink_copy(st
14ae0 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 74 6f 2c  ruct plink **to,
14af0 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66   struct plink *f
14b00 72 6f 6d 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  rom).{.  struct 
14b10 70 6c 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a 20  plink *nextpl;. 
14b20 20 77 68 69 6c 65 28 20 66 72 6f 6d 20 29 7b 0a   while( from ){.
14b30 20 20 20 20 6e 65 78 74 70 6c 20 3d 20 66 72 6f      nextpl = fro
14b40 6d 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 66 72 6f  m->next;.    fro
14b50 6d 2d 3e 6e 65 78 74 20 3d 20 2a 74 6f 3b 0a 20  m->next = *to;. 
14b60 20 20 20 2a 74 6f 20 3d 20 66 72 6f 6d 3b 0a 20     *to = from;. 
14b70 20 20 20 66 72 6f 6d 20 3d 20 6e 65 78 74 70 6c     from = nextpl
14b80 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 44 65 6c 65  ;.  }.}../* Dele
14b90 74 65 20 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f  te every plink o
14ba0 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 76 6f  n the list */.vo
14bb0 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28  id Plink_delete(
14bc0 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c  struct plink *pl
14bd0 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c  p).{.  struct pl
14be0 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20  ink *nextpl;..  
14bf0 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20  while( plp ){.  
14c00 20 20 6e 65 78 74 70 6c 20 3d 20 70 6c 70 2d 3e    nextpl = plp->
14c10 6e 65 78 74 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e  next;.    plp->n
14c20 65 78 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65  ext = plink_free
14c30 6c 69 73 74 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f  list;.    plink_
14c40 66 72 65 65 6c 69 73 74 20 3d 20 70 6c 70 3b 0a  freelist = plp;.
14c50 20 20 20 20 70 6c 70 20 3d 20 6e 65 78 74 70 6c      plp = nextpl
14c60 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  ;.  }.}./*******
14c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c80 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
14c90 72 65 70 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  report.c" ******
14ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14cb0 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63  ****/./*.** Proc
14cc0 65 64 75 72 65 73 20 66 6f 72 20 67 65 6e 65 72  edures for gener
14cd0 61 74 69 6e 67 20 72 65 70 6f 72 74 73 20 61 6e  ating reports an
14ce0 64 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  d tables in the 
14cf0 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
14d00 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47  erator..*/../* G
14d10 65 6e 65 72 61 74 65 20 61 20 66 69 6c 65 6e 61  enerate a filena
14d20 6d 65 20 77 69 74 68 20 74 68 65 20 67 69 76 65  me with the give
14d30 6e 20 73 75 66 66 69 78 2e 20 20 53 70 61 63 65  n suffix.  Space
14d40 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
14d50 6e 61 6d 65 20 63 6f 6d 65 73 20 66 72 6f 6d 20  name comes from 
14d60 6d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73  malloc() and mus
14d70 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
14d80 65 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e  e calling.** fun
14d90 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54  ction..*/.PRIVAT
14da0 45 20 63 68 61 72 20 2a 66 69 6c 65 5f 6d 61 6b  E char *file_mak
14db0 65 6e 61 6d 65 28 73 74 72 75 63 74 20 6c 65 6d  ename(struct lem
14dc0 6f 6e 20 2a 6c 65 6d 70 2c 20 63 6f 6e 73 74 20  on *lemp, const 
14dd0 63 68 61 72 20 2a 73 75 66 66 69 78 29 0a 7b 0a  char *suffix).{.
14de0 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20    char *name;.  
14df0 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20 6e 61 6d  char *cp;..  nam
14e00 65 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f  e = (char*)mallo
14e10 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c  c( lemonStrlen(l
14e20 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 20 2b  emp->filename) +
14e30 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 75 66   lemonStrlen(suf
14e40 66 69 78 29 20 2b 20 35 20 29 3b 0a 20 20 69 66  fix) + 5 );.  if
14e50 28 20 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  ( name==0 ){.   
14e60 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14e70 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61 74 65 20  "Can't allocate 
14e80 73 70 61 63 65 20 66 6f 72 20 61 20 66 69 6c 65  space for a file
14e90 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20 20 20 20 65  name.\n");.    e
14ea0 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 73 74  xit(1);.  }.  st
14eb0 72 63 70 79 28 6e 61 6d 65 2c 6c 65 6d 70 2d 3e  rcpy(name,lemp->
14ec0 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 63 70 20  filename);.  cp 
14ed0 3d 20 73 74 72 72 63 68 72 28 6e 61 6d 65 2c 27  = strrchr(name,'
14ee0 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20 29 20  .');.  if( cp ) 
14ef0 2a 63 70 20 3d 20 30 3b 0a 20 20 73 74 72 63 61  *cp = 0;.  strca
14f00 74 28 6e 61 6d 65 2c 73 75 66 66 69 78 29 3b 0a  t(name,suffix);.
14f10 20 20 72 65 74 75 72 6e 20 6e 61 6d 65 3b 0a 7d    return name;.}
14f20 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65  ../* Open a file
14f30 20 77 69 74 68 20 61 20 6e 61 6d 65 20 62 61 73   with a name bas
14f40 65 64 20 6f 6e 20 74 68 65 20 6e 61 6d 65 20 6f  ed on the name o
14f50 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
14f60 2c 0a 2a 2a 20 62 75 74 20 77 69 74 68 20 61 20  ,.** but with a 
14f70 64 69 66 66 65 72 65 6e 74 20 28 73 70 65 63 69  different (speci
14f80 66 69 65 64 29 20 73 75 66 66 69 78 2c 20 61 6e  fied) suffix, an
14f90 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
14fa0 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 72  er.** to the str
14fb0 65 61 6d 20 2a 2f 0a 50 52 49 56 41 54 45 20 46  eam */.PRIVATE F
14fc0 49 4c 45 20 2a 66 69 6c 65 5f 6f 70 65 6e 28 0a  ILE *file_open(.
14fd0 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a    struct lemon *
14fe0 6c 65 6d 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68  lemp,.  const ch
14ff0 61 72 20 2a 73 75 66 66 69 78 2c 0a 20 20 63 6f  ar *suffix,.  co
15000 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 0a 29  nst char *mode.)
15010 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b 0a 0a 20  {.  FILE *fp;.. 
15020 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75 74 6e 61   if( lemp->outna
15030 6d 65 20 29 20 66 72 65 65 28 6c 65 6d 70 2d 3e  me ) free(lemp->
15040 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c 65 6d 70  outname);.  lemp
15050 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66 69 6c 65  ->outname = file
15060 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c 20  _makename(lemp, 
15070 73 75 66 66 69 78 29 3b 0a 20 20 66 70 20 3d 20  suffix);.  fp = 
15080 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f 75 74 6e  fopen(lemp->outn
15090 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20 69 66 28  ame,mode);.  if(
150a0 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f 64 65 3d   fp==0 && *mode=
150b0 3d 27 77 27 20 29 7b 0a 20 20 20 20 66 70 72 69  ='w' ){.    fpri
150c0 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27  ntf(stderr,"Can'
150d0 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c 22 25 73  t open file \"%s
150e0 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e 6f 75 74  \".\n",lemp->out
150f0 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d  name);.    lemp-
15100 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
15110 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
15120 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a 2f   return fp;.}../
15130 2a 20 44 75 70 6c 69 63 61 74 65 20 74 68 65 20  * Duplicate the 
15140 69 6e 70 75 74 20 66 69 6c 65 20 77 69 74 68 6f  input file witho
15150 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61 6e 64 20  ut comments and 
15160 77 69 74 68 6f 75 74 20 61 63 74 69 6f 6e 73 20  without actions 
15170 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20 2a 2f 0a  .** on rules */.
15180 76 6f 69 64 20 52 65 70 72 69 6e 74 28 73 74 72  void Reprint(str
15190 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29  uct lemon *lemp)
151a0 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  .{.  struct rule
151b0 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73   *rp;.  struct s
151c0 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74  ymbol *sp;.  int
151d0 20 69 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c 20 6c   i, j, maxlen, l
151e0 65 6e 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20 73 6b  en, ncolumns, sk
151f0 69 70 3b 0a 20 20 70 72 69 6e 74 66 28 22 2f 2f  ip;.  printf("//
15200 20 52 65 70 72 69 6e 74 20 6f 66 20 69 6e 70 75   Reprint of inpu
15210 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e  t file \"%s\".\n
15220 2f 2f 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 2c 6c  // Symbols:\n",l
15230 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a  emp->filename);.
15240 20 20 6d 61 78 6c 65 6e 20 3d 20 31 30 3b 0a 20    maxlen = 10;. 
15250 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
15260 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
15270 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e  .    sp = lemp->
15280 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
15290 6c 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65  len = lemonStrle
152a0 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  n(sp->name);.   
152b0 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20   if( len>maxlen 
152c0 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a  ) maxlen = len;.
152d0 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d 6e 73 20 3d    }.  ncolumns =
152e0 20 37 36 2f 28 6d 61 78 6c 65 6e 2b 35 29 3b 0a   76/(maxlen+5);.
152f0 20 20 69 66 28 20 6e 63 6f 6c 75 6d 6e 73 3c 31    if( ncolumns<1
15300 20 29 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 31 3b   ) ncolumns = 1;
15310 0a 20 20 73 6b 69 70 20 3d 20 28 6c 65 6d 70 2d  .  skip = (lemp-
15320 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e 63 6f 6c 75  >nsymbol + ncolu
15330 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f 6c 75 6d 6e  mns - 1)/ncolumn
15340 73 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  s;.  for(i=0; i<
15350 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  skip; i++){.    
15360 70 72 69 6e 74 66 28 22 2f 2f 22 29 3b 0a 20 20  printf("//");.  
15370 20 20 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6c 65 6d    for(j=i; j<lem
15380 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 3d 73  p->nsymbol; j+=s
15390 6b 69 70 29 7b 0a 20 20 20 20 20 20 73 70 20 3d  kip){.      sp =
153a0 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a   lemp->symbols[j
153b0 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ];.      assert(
153c0 20 73 70 2d 3e 69 6e 64 65 78 3d 3d 6a 20 29 3b   sp->index==j );
153d0 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20  .      printf(" 
153e0 25 33 64 20 25 2d 2a 2e 2a 73 22 2c 6a 2c 6d 61  %3d %-*.*s",j,ma
153f0 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c 73 70 2d 3e  xlen,maxlen,sp->
15400 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  name);.    }.   
15410 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
15420 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70   }.  for(rp=lemp
15430 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72  ->rule; rp; rp=r
15440 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 70 72  p->next){.    pr
15450 69 6e 74 66 28 22 25 73 22 2c 72 70 2d 3e 6c 68  intf("%s",rp->lh
15460 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 2f 2a  s->name);.    /*
15470 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61      if( rp->lhsa
15480 6c 69 61 73 20 29 20 70 72 69 6e 74 66 28 22 28  lias ) printf("(
15490 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61 6c 69 61  %s)",rp->lhsalia
154a0 73 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74  s); */.    print
154b0 66 28 22 20 3a 3a 3d 22 29 3b 0a 20 20 20 20 66  f(" ::=");.    f
154c0 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
154d0 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
154e0 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
154f0 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20  .      printf(" 
15500 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a  %s", sp->name);.
15510 20 20 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79        if( sp->ty
15520 70 65 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41  pe==MULTITERMINA
15530 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  L ){.        for
15540 28 6a 3d 31 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62  (j=1; j<sp->nsub
15550 73 79 6d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  sym; j++){.     
15560 20 20 20 20 20 70 72 69 6e 74 66 28 22 7c 25 73       printf("|%s
15570 22 2c 20 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d  ", sp->subsym[j]
15580 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  ->name);.       
15590 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
155a0 20 2f 2a 20 69 66 28 20 72 70 2d 3e 72 68 73 61   /* if( rp->rhsa
155b0 6c 69 61 73 5b 69 5d 20 29 20 70 72 69 6e 74 66  lias[i] ) printf
155c0 28 22 28 25 73 29 22 2c 72 70 2d 3e 72 68 73 61  ("(%s)",rp->rhsa
155d0 6c 69 61 73 5b 69 5d 29 3b 20 2a 2f 0a 20 20 20  lias[i]); */.   
155e0 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 2e   }.    printf(".
155f0 22 29 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e  ");.    if( rp->
15600 70 72 65 63 73 79 6d 20 29 20 70 72 69 6e 74 66  precsym ) printf
15610 28 22 20 5b 25 73 5d 22 2c 72 70 2d 3e 70 72 65  (" [%s]",rp->pre
15620 63 73 79 6d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  csym->name);.   
15630 20 2f 2a 20 69 66 28 20 72 70 2d 3e 63 6f 64 65   /* if( rp->code
15640 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 20 20 20   ) printf("\n   
15650 20 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b 20   %s",rp->code); 
15660 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c  */.    printf("\
15670 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 76 6f 69 64  n");.  }.}..void
15680 20 43 6f 6e 66 69 67 50 72 69 6e 74 28 46 49 4c   ConfigPrint(FIL
15690 45 20 2a 66 70 2c 20 73 74 72 75 63 74 20 63 6f  E *fp, struct co
156a0 6e 66 69 67 20 2a 63 66 70 29 0a 7b 0a 20 20 73  nfig *cfp).{.  s
156b0 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a  truct rule *rp;.
156c0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
156d0 2a 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  *sp;.  int i, j;
156e0 0a 20 20 72 70 20 3d 20 63 66 70 2d 3e 72 70 3b  .  rp = cfp->rp;
156f0 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25  .  fprintf(fp,"%
15700 73 20 3a 3a 3d 22 2c 72 70 2d 3e 6c 68 73 2d 3e  s ::=",rp->lhs->
15710 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  name);.  for(i=0
15720 3b 20 69 3c 3d 72 70 2d 3e 6e 72 68 73 3b 20 69  ; i<=rp->nrhs; i
15730 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d  ++){.    if( i==
15740 63 66 70 2d 3e 64 6f 74 20 29 20 66 70 72 69 6e  cfp->dot ) fprin
15750 74 66 28 66 70 2c 22 20 2a 22 29 3b 0a 20 20 20  tf(fp," *");.   
15760 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73   if( i==rp->nrhs
15770 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 70   ) break;.    sp
15780 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
15790 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20     fprintf(fp," 
157a0 25 73 22 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a  %s", sp->name);.
157b0 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
157c0 3d 3d 4d 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20  ==MULTITERMINAL 
157d0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 31  ){.      for(j=1
157e0 3b 20 6a 3c 73 70 2d 3e 6e 73 75 62 73 79 6d 3b  ; j<sp->nsubsym;
157f0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   j++){.        f
15800 70 72 69 6e 74 66 28 66 70 2c 22 7c 25 73 22 2c  printf(fp,"|%s",
15810 73 70 2d 3e 73 75 62 73 79 6d 5b 6a 5d 2d 3e 6e  sp->subsym[j]->n
15820 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
15830 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 23 64    }.  }.}../* #d
15840 65 66 69 6e 65 20 54 45 53 54 20 2a 2f 0a 23 69  efine TEST */.#i
15850 66 20 30 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73  f 0./* Print a s
15860 65 74 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  et */.PRIVATE vo
15870 69 64 20 53 65 74 50 72 69 6e 74 28 6f 75 74 2c  id SetPrint(out,
15880 73 65 74 2c 6c 65 6d 70 29 0a 46 49 4c 45 20 2a  set,lemp).FILE *
15890 6f 75 74 3b 0a 63 68 61 72 20 2a 73 65 74 3b 0a  out;.char *set;.
158a0 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
158b0 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  mp;.{.  int i;. 
158c0 20 63 68 61 72 20 2a 73 70 61 63 65 72 3b 0a 20   char *spacer;. 
158d0 20 73 70 61 63 65 72 20 3d 20 22 22 3b 0a 20 20   spacer = "";.  
158e0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 31 32  fprintf(out,"%12
158f0 73 5b 22 2c 22 22 29 3b 0a 20 20 66 6f 72 28 69  s[","");.  for(i
15900 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =0; i<lemp->nter
15910 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  minal; i++){.   
15920 20 69 66 28 20 53 65 74 46 69 6e 64 28 73 65 74   if( SetFind(set
15930 2c 69 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ,i) ){.      fpr
15940 69 6e 74 66 28 6f 75 74 2c 22 25 73 25 73 22 2c  intf(out,"%s%s",
15950 73 70 61 63 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d  spacer,lemp->sym
15960 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a  bols[i]->name);.
15970 20 20 20 20 20 20 73 70 61 63 65 72 20 3d 20 22        spacer = "
15980 20 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   ";.    }.  }.  
15990 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e  fprintf(out,"]\n
159a0 22 29 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20  ");.}../* Print 
159b0 61 20 70 6c 69 6e 6b 20 63 68 61 69 6e 20 2a 2f  a plink chain */
159c0 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 50 6c  .PRIVATE void Pl
159d0 69 6e 6b 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70  inkPrint(out,plp
159e0 2c 74 61 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b  ,tag).FILE *out;
159f0 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70  .struct plink *p
15a00 6c 70 3b 0a 63 68 61 72 20 2a 74 61 67 3b 0a 7b  lp;.char *tag;.{
15a10 0a 20 20 77 68 69 6c 65 28 20 70 6c 70 20 29 7b  .  while( plp ){
15a20 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
15a30 2c 22 25 31 32 73 25 73 20 28 73 74 61 74 65 20  ,"%12s%s (state 
15a40 25 32 64 29 20 22 2c 22 22 2c 74 61 67 2c 70 6c  %2d) ","",tag,pl
15a50 70 2d 3e 63 66 70 2d 3e 73 74 70 2d 3e 73 74 61  p->cfp->stp->sta
15a60 74 65 6e 75 6d 29 3b 0a 20 20 20 20 43 6f 6e 66  tenum);.    Conf
15a70 69 67 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2d  igPrint(out,plp-
15a80 3e 63 66 70 29 3b 0a 20 20 20 20 66 70 72 69 6e  >cfp);.    fprin
15a90 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20  tf(out,"\n");.  
15aa0 20 20 70 6c 70 20 3d 20 70 6c 70 2d 3e 6e 65 78    plp = plp->nex
15ab0 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  t;.  }.}.#endif.
15ac0 0a 2f 2a 20 50 72 69 6e 74 20 61 6e 20 61 63 74  ./* Print an act
15ad0 69 6f 6e 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ion to the given
15ae0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
15af0 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  .  Return FALSE 
15b00 69 66 0a 2a 2a 20 6e 6f 74 68 69 6e 67 20 77 61  if.** nothing wa
15b10 73 20 61 63 74 75 61 6c 6c 79 20 70 72 69 6e 74  s actually print
15b20 65 64 2e 0a 2a 2f 0a 69 6e 74 20 50 72 69 6e 74  ed..*/.int Print
15b30 41 63 74 69 6f 6e 28 73 74 72 75 63 74 20 61 63  Action(struct ac
15b40 74 69 6f 6e 20 2a 61 70 2c 20 46 49 4c 45 20 2a  tion *ap, FILE *
15b50 66 70 2c 20 69 6e 74 20 69 6e 64 65 6e 74 29 7b  fp, int indent){
15b60 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 20 3d 20  .  int result = 
15b70 31 3b 0a 20 20 73 77 69 74 63 68 28 20 61 70 2d  1;.  switch( ap-
15b80 3e 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  >type ){.    cas
15b90 65 20 53 48 49 46 54 3a 0a 20 20 20 20 20 20 66  e SHIFT:.      f
15ba0 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 73  printf(fp,"%*s s
15bb0 68 69 66 74 20 20 25 64 22 2c 69 6e 64 65 6e 74  hift  %d",indent
15bc0 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70  ,ap->sp->name,ap
15bd0 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e 75  ->x.stp->statenu
15be0 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
15bf0 0a 20 20 20 20 63 61 73 65 20 52 45 44 55 43 45  .    case REDUCE
15c00 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  :.      fprintf(
15c10 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20 25  fp,"%*s reduce %
15c20 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70  d",indent,ap->sp
15c30 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d  ->name,ap->x.rp-
15c40 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 62  >index);.      b
15c50 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41  reak;.    case A
15c60 43 43 45 50 54 3a 0a 20 20 20 20 20 20 66 70 72  CCEPT:.      fpr
15c70 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 61 63 63  intf(fp,"%*s acc
15c80 65 70 74 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  ept",indent,ap->
15c90 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
15ca0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
15cb0 20 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 66 70   ERROR:.      fp
15cc0 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 65 72  rintf(fp,"%*s er
15cd0 72 6f 72 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e  ror",indent,ap->
15ce0 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  sp->name);.     
15cf0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
15d00 20 53 52 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20   SRCONFLICT:.   
15d10 20 63 61 73 65 20 52 52 43 4f 4e 46 4c 49 43 54   case RRCONFLICT
15d20 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  :.      fprintf(
15d30 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20 25  fp,"%*s reduce %
15d40 2d 33 64 20 2a 2a 20 50 61 72 73 69 6e 67 20 63  -3d ** Parsing c
15d50 6f 6e 66 6c 69 63 74 20 2a 2a 22 2c 0a 20 20 20  onflict **",.   
15d60 20 20 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d 3e       indent,ap->
15d70 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72  sp->name,ap->x.r
15d80 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20  p->index);.     
15d90 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
15da0 20 53 53 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20   SSCONFLICT:.   
15db0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
15dc0 2a 73 20 73 68 69 66 74 20 20 25 2d 33 64 20 2a  *s shift  %-3d *
15dd0 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69  * Parsing confli
15de0 63 74 20 2a 2a 22 2c 20 0a 20 20 20 20 20 20 20  ct **", .       
15df0 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e   indent,ap->sp->
15e00 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e  name,ap->x.stp->
15e10 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20  statenum);.     
15e20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
15e30 20 53 48 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20   SH_RESOLVED:.  
15e40 20 20 20 20 69 66 28 20 73 68 6f 77 50 72 65 63      if( showPrec
15e50 65 64 65 6e 63 65 43 6f 6e 66 6c 69 63 74 20 29  edenceConflict )
15e60 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
15e70 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74 20  f(fp,"%*s shift 
15e80 20 25 2d 33 64 20 2d 2d 20 64 72 6f 70 70 65 64   %-3d -- dropped
15e90 20 62 79 20 70 72 65 63 65 64 65 6e 63 65 22 2c   by precedence",
15ea0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15eb0 20 69 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e   indent,ap->sp->
15ec0 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e  name,ap->x.stp->
15ed0 73 74 61 74 65 6e 75 6d 29 3b 0a 20 20 20 20 20  statenum);.     
15ee0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
15ef0 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20  result = 0;.    
15f00 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
15f10 0a 20 20 20 20 63 61 73 65 20 52 44 5f 52 45 53  .    case RD_RES
15f20 4f 4c 56 45 44 3a 0a 20 20 20 20 20 20 69 66 28  OLVED:.      if(
15f30 20 73 68 6f 77 50 72 65 63 65 64 65 6e 63 65 43   showPrecedenceC
15f40 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20 20 20  onflict ){.     
15f50 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
15f60 2a 73 20 72 65 64 75 63 65 20 25 2d 33 64 20 2d  *s reduce %-3d -
15f70 2d 20 64 72 6f 70 70 65 64 20 62 79 20 70 72 65  - dropped by pre
15f80 63 65 64 65 6e 63 65 22 2c 0a 20 20 20 20 20 20  cedence",.      
15f90 20 20 20 20 20 20 20 20 20 20 69 6e 64 65 6e 74            indent
15fa0 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70  ,ap->sp->name,ap
15fb0 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a  ->x.rp->index);.
15fc0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15fd0 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20 30 3b       result = 0;
15fe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
15ff0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4e  reak;.    case N
16000 4f 54 5f 55 53 45 44 3a 0a 20 20 20 20 20 20 72  OT_USED:.      r
16010 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20  esult = 0;.     
16020 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
16030 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0a  turn result;.}..
16040 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
16050 22 79 2e 6f 75 74 70 75 74 22 20 6c 6f 67 20 66  "y.output" log f
16060 69 6c 65 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f  ile */.void Repo
16070 72 74 4f 75 74 70 75 74 28 73 74 72 75 63 74 20  rtOutput(struct 
16080 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
16090 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
160a0 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73   state *stp;.  s
160b0 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
160c0 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69  p;.  struct acti
160d0 6f 6e 20 2a 61 70 3b 0a 20 20 46 49 4c 45 20 2a  on *ap;.  FILE *
160e0 66 70 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65  fp;..  fp = file
160f0 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74  _open(lemp,".out
16100 22 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 66  ","wb");.  if( f
16110 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
16120 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
16130 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
16140 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
16150 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66  sorted[i];.    f
16160 70 72 69 6e 74 66 28 66 70 2c 22 53 74 61 74 65  printf(fp,"State
16170 20 25 64 3a 5c 6e 22 2c 73 74 70 2d 3e 73 74 61   %d:\n",stp->sta
16180 74 65 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  tenum);.    if( 
16190 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20  lemp->basisflag 
161a0 29 20 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a 20  ) cfp=stp->bp;. 
161b0 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20     else         
161c0 20 20 20 20 20 20 20 20 20 63 66 70 3d 73 74 70           cfp=stp
161d0 2d 3e 63 66 70 3b 0a 20 20 20 20 77 68 69 6c 65  ->cfp;.    while
161e0 28 20 63 66 70 20 29 7b 0a 20 20 20 20 20 20 63  ( cfp ){.      c
161f0 68 61 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20 20  har buf[20];.   
16200 20 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3d     if( cfp->dot=
16210 3d 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29  =cfp->rp->nrhs )
16220 7b 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74  {.        sprint
16230 66 28 62 75 66 2c 22 28 25 64 29 22 2c 63 66 70  f(buf,"(%d)",cfp
16240 2d 3e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20  ->rp->index);.  
16250 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
16260 2c 22 20 20 20 20 25 35 73 20 22 2c 62 75 66 29  ,"    %5s ",buf)
16270 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
16280 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66         fprintf(f
16290 70 2c 22 20 20 20 20 20 20 20 20 20 20 22 29 3b  p,"          ");
162a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 43  .      }.      C
162b0 6f 6e 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66  onfigPrint(fp,cf
162c0 70 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74  p);.      fprint
162d0 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 20  f(fp,"\n");.#if 
162e0 30 0a 20 20 20 20 20 20 53 65 74 50 72 69 6e 74  0.      SetPrint
162f0 28 66 70 2c 63 66 70 2d 3e 66 77 73 2c 6c 65 6d  (fp,cfp->fws,lem
16300 70 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 50  p);.      PlinkP
16310 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66 70 6c  rint(fp,cfp->fpl
16320 70 2c 22 54 6f 20 20 22 29 3b 0a 20 20 20 20 20  p,"To  ");.     
16330 20 50 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63   PlinkPrint(fp,c
16340 66 70 2d 3e 62 70 6c 70 2c 22 46 72 6f 6d 22 29  fp->bplp,"From")
16350 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  ;.#endif.      i
16360 66 28 20 6c 65 6d 70 2d 3e 62 61 73 69 73 66 6c  f( lemp->basisfl
16370 61 67 20 29 20 63 66 70 3d 63 66 70 2d 3e 62 70  ag ) cfp=cfp->bp
16380 3b 0a 20 20 20 20 20 20 65 6c 73 65 20 20 20 20  ;.      else    
16390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 66                cf
163a0 70 3d 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20  p=cfp->next;.   
163b0 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 66   }.    fprintf(f
163c0 70 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72  p,"\n");.    for
163d0 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
163e0 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
163f0 20 20 20 20 20 69 66 28 20 50 72 69 6e 74 41 63       if( PrintAc
16400 74 69 6f 6e 28 61 70 2c 66 70 2c 33 30 29 20 29  tion(ap,fp,30) )
16410 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22   fprintf(fp,"\n"
16420 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72  );.    }.    fpr
16430 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20  intf(fp,"\n");. 
16440 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c   }.  fprintf(fp,
16450 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   "--------------
16460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16480 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 66 70  ------\n");.  fp
16490 72 69 6e 74 66 28 66 70 2c 20 22 53 79 6d 62 6f  rintf(fp, "Symbo
164a0 6c 73 3a 5c 6e 22 29 3b 0a 20 20 66 6f 72 28 69  ls:\n");.  for(i
164b0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
164c0 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  bol; i++){.    i
164d0 6e 74 20 6a 3b 0a 20 20 20 20 73 74 72 75 63 74  nt j;.    struct
164e0 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20   symbol *sp;..  
164f0 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d    sp = lemp->sym
16500 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 66 70 72  bols[i];.    fpr
16510 69 6e 74 66 28 66 70 2c 20 22 20 20 25 33 64 3a  intf(fp, "  %3d:
16520 20 25 73 22 2c 20 69 2c 20 73 70 2d 3e 6e 61 6d   %s", i, sp->nam
16530 65 29 3b 0a 20 20 20 20 69 66 28 20 73 70 2d 3e  e);.    if( sp->
16540 74 79 70 65 3d 3d 4e 4f 4e 54 45 52 4d 49 4e 41  type==NONTERMINA
16550 4c 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  L ){.      fprin
16560 74 66 28 66 70 2c 20 22 3a 22 29 3b 0a 20 20 20  tf(fp, ":");.   
16570 20 20 20 69 66 28 20 73 70 2d 3e 6c 61 6d 62 64     if( sp->lambd
16580 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  a ){.        fpr
16590 69 6e 74 66 28 66 70 2c 20 22 20 3c 6c 61 6d 62  intf(fp, " <lamb
165a0 64 61 3e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  da>");.      }. 
165b0 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
165c0 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b  lemp->nterminal;
165d0 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   j++){.        i
165e0 66 28 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20  f( sp->firstset 
165f0 26 26 20 53 65 74 46 69 6e 64 28 73 70 2d 3e 66  && SetFind(sp->f
16600 69 72 73 74 73 65 74 2c 20 6a 29 20 29 7b 0a 20  irstset, j) ){. 
16610 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66           fprintf
16620 28 66 70 2c 20 22 20 25 73 22 2c 20 6c 65 6d 70  (fp, " %s", lemp
16630 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 2d 3e 6e 61  ->symbols[j]->na
16640 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
16650 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
16660 20 66 70 72 69 6e 74 66 28 66 70 2c 20 22 5c 6e   fprintf(fp, "\n
16670 22 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  ");.  }.  fclose
16680 28 66 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  (fp);.  return;.
16690 7d 0a 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  }../* Search for
166a0 20 74 68 65 20 66 69 6c 65 20 22 6e 61 6d 65 22   the file "name"
166b0 20 77 68 69 63 68 20 69 73 20 69 6e 20 74 68 65   which is in the
166c0 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
166d0 61 73 0a 2a 2a 20 74 68 65 20 65 78 61 63 75 74  as.** the exacut
166e0 61 62 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45 20  able */.PRIVATE 
166f0 63 68 61 72 20 2a 70 61 74 68 73 65 61 72 63 68  char *pathsearch
16700 28 63 68 61 72 20 2a 61 72 67 76 30 2c 20 63 68  (char *argv0, ch
16710 61 72 20 2a 6e 61 6d 65 2c 20 69 6e 74 20 6d 6f  ar *name, int mo
16720 64 65 6d 61 73 6b 29 0a 7b 0a 20 20 63 6f 6e 73  demask).{.  cons
16730 74 20 63 68 61 72 20 2a 70 61 74 68 6c 69 73 74  t char *pathlist
16740 3b 0a 20 20 63 68 61 72 20 2a 70 61 74 68 62 75  ;.  char *pathbu
16750 66 70 74 72 3b 0a 20 20 63 68 61 72 20 2a 70 61  fptr;.  char *pa
16760 74 68 62 75 66 3b 0a 20 20 63 68 61 72 20 2a 70  thbuf;.  char *p
16770 61 74 68 2c 2a 63 70 3b 0a 20 20 63 68 61 72 20  ath,*cp;.  char 
16780 63 3b 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49 4e  c;..#ifdef __WIN
16790 33 32 5f 5f 0a 20 20 63 70 20 3d 20 73 74 72 72  32__.  cp = strr
167a0 63 68 72 28 61 72 67 76 30 2c 27 5c 5c 27 29 3b  chr(argv0,'\\');
167b0 0a 23 65 6c 73 65 0a 20 20 63 70 20 3d 20 73 74  .#else.  cp = st
167c0 72 72 63 68 72 28 61 72 67 76 30 2c 27 2f 27 29  rrchr(argv0,'/')
167d0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 63  ;.#endif.  if( c
167e0 70 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 63 70  p ){.    c = *cp
167f0 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a 20  ;.    *cp = 0;. 
16800 20 20 20 70 61 74 68 20 3d 20 28 63 68 61 72 20     path = (char 
16810 2a 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53  *)malloc( lemonS
16820 74 72 6c 65 6e 28 61 72 67 76 30 29 20 2b 20 6c  trlen(argv0) + l
16830 65 6d 6f 6e 53 74 72 6c 65 6e 28 6e 61 6d 65 29  emonStrlen(name)
16840 20 2b 20 32 20 29 3b 0a 20 20 20 20 69 66 28 20   + 2 );.    if( 
16850 70 61 74 68 20 29 20 73 70 72 69 6e 74 66 28 70  path ) sprintf(p
16860 61 74 68 2c 22 25 73 2f 25 73 22 2c 61 72 67 76  ath,"%s/%s",argv
16870 30 2c 6e 61 6d 65 29 3b 0a 20 20 20 20 2a 63 70  0,name);.    *cp
16880 20 3d 20 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = c;.  }else{. 
16890 20 20 20 70 61 74 68 6c 69 73 74 20 3d 20 67 65     pathlist = ge
168a0 74 65 6e 76 28 22 50 41 54 48 22 29 3b 0a 20 20  tenv("PATH");.  
168b0 20 20 69 66 28 20 70 61 74 68 6c 69 73 74 3d 3d    if( pathlist==
168c0 30 20 29 20 70 61 74 68 6c 69 73 74 20 3d 20 22  0 ) pathlist = "
168d0 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f 62 69 6e 22  .:/bin:/usr/bin"
168e0 3b 0a 20 20 20 20 70 61 74 68 62 75 66 20 3d 20  ;.    pathbuf = 
168f0 28 63 68 61 72 20 2a 29 20 6d 61 6c 6c 6f 63 28  (char *) malloc(
16900 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 70 61 74   lemonStrlen(pat
16910 68 6c 69 73 74 29 20 2b 20 31 20 29 3b 0a 20 20  hlist) + 1 );.  
16920 20 20 70 61 74 68 20 3d 20 28 63 68 61 72 20 2a    path = (char *
16930 29 6d 61 6c 6c 6f 63 28 20 6c 65 6d 6f 6e 53 74  )malloc( lemonSt
16940 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 2b 6c  rlen(pathlist)+l
16950 65 6d 6f 6e 53 74 72 6c 65 6e 28 6e 61 6d 65 29  emonStrlen(name)
16960 2b 32 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  +2 );.    if( (p
16970 61 74 68 62 75 66 20 21 3d 20 30 29 20 26 26 20  athbuf != 0) && 
16980 28 70 61 74 68 21 3d 30 29 20 29 7b 0a 20 20 20  (path!=0) ){.   
16990 20 20 20 70 61 74 68 62 75 66 70 74 72 20 3d 20     pathbufptr = 
169a0 70 61 74 68 62 75 66 3b 0a 20 20 20 20 20 20 73  pathbuf;.      s
169b0 74 72 63 70 79 28 70 61 74 68 62 75 66 2c 20 70  trcpy(pathbuf, p
169c0 61 74 68 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  athlist);.      
169d0 77 68 69 6c 65 28 20 2a 70 61 74 68 62 75 66 20  while( *pathbuf 
169e0 29 7b 0a 20 20 20 20 20 20 20 20 63 70 20 3d 20  ){.        cp = 
169f0 73 74 72 63 68 72 28 70 61 74 68 62 75 66 2c 27  strchr(pathbuf,'
16a00 3a 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  :');.        if(
16a10 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20 26 70   cp==0 ) cp = &p
16a20 61 74 68 62 75 66 5b 6c 65 6d 6f 6e 53 74 72 6c  athbuf[lemonStrl
16a30 65 6e 28 70 61 74 68 62 75 66 29 5d 3b 0a 20 20  en(pathbuf)];.  
16a40 20 20 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a 20        c = *cp;. 
16a50 20 20 20 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a         *cp = 0;.
16a60 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
16a70 70 61 74 68 2c 22 25 73 2f 25 73 22 2c 70 61 74  path,"%s/%s",pat
16a80 68 62 75 66 2c 6e 61 6d 65 29 3b 0a 20 20 20 20  hbuf,name);.    
16a90 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 20      *cp = c;.   
16aa0 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20       if( c==0 ) 
16ab0 70 61 74 68 62 75 66 5b 30 5d 20 3d 20 30 3b 0a  pathbuf[0] = 0;.
16ac0 20 20 20 20 20 20 20 20 65 6c 73 65 20 70 61 74          else pat
16ad0 68 62 75 66 20 3d 20 26 63 70 5b 31 5d 3b 0a 20  hbuf = &cp[1];. 
16ae0 20 20 20 20 20 20 20 69 66 28 20 61 63 63 65 73         if( acces
16af0 73 28 70 61 74 68 2c 6d 6f 64 65 6d 61 73 6b 29  s(path,modemask)
16b00 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
16b10 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65 28     }.      free(
16b20 70 61 74 68 62 75 66 70 74 72 29 3b 0a 20 20 20  pathbufptr);.   
16b30 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
16b40 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 47 69 76 65  path;.}../* Give
16b50 6e 20 61 6e 20 61 63 74 69 6f 6e 2c 20 63 6f 6d  n an action, com
16b60 70 75 74 65 20 74 68 65 20 69 6e 74 65 67 65 72  pute the integer
16b70 20 76 61 6c 75 65 20 66 6f 72 20 74 68 61 74 20   value for that 
16b80 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68 20  action.** which 
16b90 69 73 20 74 6f 20 62 65 20 70 75 74 20 69 6e 20  is to be put in 
16ba0 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
16bb0 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
16bc0 64 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 52 65  d machine..** Re
16bd0 74 75 72 6e 20 6e 65 67 61 74 69 76 65 20 69 66  turn negative if
16be0 20 6e 6f 20 61 63 74 69 6f 6e 20 73 68 6f 75 6c   no action shoul
16bf0 64 20 62 65 20 67 65 6e 65 72 61 74 65 64 2e 0a  d be generated..
16c00 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20 63  */.PRIVATE int c
16c10 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 73 74  ompute_action(st
16c20 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
16c30 2c 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  , struct action 
16c40 2a 61 70 29 0a 7b 0a 20 20 69 6e 74 20 61 63 74  *ap).{.  int act
16c50 3b 0a 20 20 73 77 69 74 63 68 28 20 61 70 2d 3e  ;.  switch( ap->
16c60 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
16c70 20 53 48 49 46 54 3a 20 20 61 63 74 20 3d 20 61   SHIFT:  act = a
16c80 70 2d 3e 78 2e 73 74 70 2d 3e 73 74 61 74 65 6e  p->x.stp->staten
16c90 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  um;            b
16ca0 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52  reak;.    case R
16cb0 45 44 55 43 45 3a 20 61 63 74 20 3d 20 61 70 2d  EDUCE: act = ap-
16cc0 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20 2b 20 6c  >x.rp->index + l
16cd0 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 62 72 65  emp->nstate; bre
16ce0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 45 52 52  ak;.    case ERR
16cf0 4f 52 3a 20 20 61 63 74 20 3d 20 6c 65 6d 70 2d  OR:  act = lemp-
16d00 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e  >nstate + lemp->
16d10 6e 72 75 6c 65 3b 20 20 20 20 20 62 72 65 61 6b  nrule;     break
16d20 3b 0a 20 20 20 20 63 61 73 65 20 41 43 43 45 50  ;.    case ACCEP
16d30 54 3a 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e  T: act = lemp->n
16d40 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72  state + lemp->nr
16d50 75 6c 65 20 2b 20 31 3b 20 62 72 65 61 6b 3b 0a  ule + 1; break;.
16d60 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 20 20      default:    
16d70 20 61 63 74 20 3d 20 2d 31 3b 20 62 72 65 61 6b   act = -1; break
16d80 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
16d90 63 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 4c  ct;.}..#define L
16da0 49 4e 45 53 49 5a 45 20 31 30 30 30 0a 2f 2a 20  INESIZE 1000./* 
16db0 54 68 65 20 6e 65 78 74 20 63 6c 75 73 74 65 72  The next cluster
16dc0 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65   of routines are
16dd0 20 66 6f 72 20 72 65 61 64 69 6e 67 20 74 68 65   for reading the
16de0 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 0a 2a   template file.*
16df0 2a 20 61 6e 64 20 77 72 69 74 69 6e 67 20 74 68  * and writing th
16e00 65 20 72 65 73 75 6c 74 73 20 74 6f 20 74 68 65  e results to the
16e10 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65   generated parse
16e20 72 20 2a 2f 0a 2f 2a 20 54 68 65 20 66 69 72 73  r */./* The firs
16e30 74 20 66 75 6e 63 74 69 6f 6e 20 74 72 61 6e 73  t function trans
16e40 66 65 72 73 20 64 61 74 61 20 66 72 6f 6d 20 22  fers data from "
16e50 69 6e 22 20 74 6f 20 22 6f 75 74 22 20 75 6e 74  in" to "out" unt
16e60 69 6c 0a 2a 2a 20 61 20 6c 69 6e 65 20 69 73 20  il.** a line is 
16e70 73 65 65 6e 20 77 68 69 63 68 20 62 65 67 69 6e  seen which begin
16e80 73 20 77 69 74 68 20 22 25 25 22 2e 20 20 54 68  s with "%%".  Th
16e90 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73  e line number is
16ea0 0a 2a 2a 20 74 72 61 63 6b 65 64 2e 0a 2a 2a 0a  .** tracked..**.
16eb0 2a 2a 20 69 66 20 6e 61 6d 65 21 3d 30 2c 20 74  ** if name!=0, t
16ec0 68 65 6e 20 61 6e 79 20 77 6f 72 64 20 74 68 61  hen any word tha
16ed0 74 20 62 65 67 69 6e 20 77 69 74 68 20 22 50 61  t begin with "Pa
16ee0 72 73 65 22 20 69 73 20 63 68 61 6e 67 65 64 20  rse" is changed 
16ef0 74 6f 0a 2a 2a 20 62 65 67 69 6e 20 77 69 74 68  to.** begin with
16f00 20 2a 6e 61 6d 65 20 69 6e 73 74 65 61 64 2e 0a   *name instead..
16f10 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20  */.PRIVATE void 
16f20 74 70 6c 74 5f 78 66 65 72 28 63 68 61 72 20 2a  tplt_xfer(char *
16f30 6e 61 6d 65 2c 20 46 49 4c 45 20 2a 69 6e 2c 20  name, FILE *in, 
16f40 46 49 4c 45 20 2a 6f 75 74 2c 20 69 6e 74 20 2a  FILE *out, int *
16f50 6c 69 6e 65 6e 6f 29 0a 7b 0a 20 20 69 6e 74 20  lineno).{.  int 
16f60 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 63 68 61  i, iStart;.  cha
16f70 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d  r line[LINESIZE]
16f80 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74 73  ;.  while( fgets
16f90 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69  (line,LINESIZE,i
16fa0 6e 29 20 26 26 20 28 6c 69 6e 65 5b 30 5d 21 3d  n) && (line[0]!=
16fb0 27 25 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d 21 3d  '%' || line[1]!=
16fc0 27 25 27 29 20 29 7b 0a 20 20 20 20 28 2a 6c 69  '%') ){.    (*li
16fd0 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69 53 74  neno)++;.    iSt
16fe0 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  art = 0;.    if(
16ff0 20 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 66   name ){.      f
17000 6f 72 28 69 3d 30 3b 20 6c 69 6e 65 5b 69 5d 3b  or(i=0; line[i];
17010 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
17020 66 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50 27 20  f( line[i]=='P' 
17030 26 26 20 73 74 72 6e 63 6d 70 28 26 6c 69 6e 65  && strncmp(&line
17040 5b 69 5d 2c 22 50 61 72 73 65 22 2c 35 29 3d 3d  [i],"Parse",5)==
17050 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
17060 69 3d 3d 30 20 7c 7c 20 21 69 73 61 6c 70 68 61  i==0 || !isalpha
17070 28 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a 20 20 20  (line[i-1])).   
17080 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
17090 20 20 69 66 28 20 69 3e 69 53 74 61 72 74 20 29    if( i>iStart )
170a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e   fprintf(out,"%.
170b0 2a 73 22 2c 69 2d 69 53 74 61 72 74 2c 26 6c 69  *s",i-iStart,&li
170c0 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 20  ne[iStart]);.   
170d0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
170e0 75 74 2c 22 25 73 22 2c 6e 61 6d 65 29 3b 0a 20  ut,"%s",name);. 
170f0 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b           i += 4;
17100 0a 20 20 20 20 20 20 20 20 20 20 69 53 74 61 72  .          iStar
17110 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20  t = i+1;.       
17120 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
17130 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
17140 2c 22 25 73 22 2c 26 6c 69 6e 65 5b 69 53 74 61  ,"%s",&line[iSta
17150 72 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  rt]);.  }.}../* 
17160 54 68 65 20 6e 65 78 74 20 66 75 6e 63 74 69 6f  The next functio
17170 6e 20 66 69 6e 64 73 20 74 68 65 20 74 65 6d 70  n finds the temp
17180 6c 61 74 65 20 66 69 6c 65 20 61 6e 64 20 6f 70  late file and op
17190 65 6e 73 20 69 74 2c 20 72 65 74 75 72 6e 69 6e  ens it, returnin
171a0 67 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  g.** a pointer t
171b0 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c  o the opened fil
171c0 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20 46 49  e. */.PRIVATE FI
171d0 4c 45 20 2a 74 70 6c 74 5f 6f 70 65 6e 28 73 74  LE *tplt_open(st
171e0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
171f0 29 0a 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61  ).{.  static cha
17200 72 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 5b 5d  r templatename[]
17210 20 3d 20 22 6c 65 6d 70 61 72 2e 63 22 3b 0a 20   = "lempar.c";. 
17220 20 63 68 61 72 20 62 75 66 5b 31 30 30 30 5d 3b   char buf[1000];
17230 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63  .  FILE *in;.  c
17240 68 61 72 20 2a 74 70 6c 74 6e 61 6d 65 3b 0a 20  har *tpltname;. 
17250 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 20 2f 2a   char *cp;..  /*
17260 20 66 69 72 73 74 2c 20 73 65 65 20 69 66 20 75   first, see if u
17270 73 65 72 20 73 70 65 63 69 66 69 65 64 20 61 20  ser specified a 
17280 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 6e 61 6d  template filenam
17290 65 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64  e on the command
172a0 20 6c 69 6e 65 2e 20 2a 2f 0a 20 20 69 66 20 28   line. */.  if (
172b0 75 73 65 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d  user_templatenam
172c0 65 20 21 3d 20 30 29 20 7b 0a 20 20 20 20 69 66  e != 0) {.    if
172d0 28 20 61 63 63 65 73 73 28 75 73 65 72 5f 74 65  ( access(user_te
172e0 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34 29 3d  mplatename,004)=
172f0 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  =-1 ){.      fpr
17300 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e  intf(stderr,"Can
17310 27 74 20 66 69 6e 64 20 74 68 65 20 70 61 72 73  't find the pars
17320 65 72 20 64 72 69 76 65 72 20 74 65 6d 70 6c 61  er driver templa
17330 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c  te file \"%s\".\
17340 6e 22 2c 0a 20 20 20 20 20 20 20 20 75 73 65 72  n",.        user
17350 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a  _templatename);.
17360 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
17370 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 72 65  rcnt++;.      re
17380 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
17390 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 75 73 65    in = fopen(use
173a0 72 5f 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 22  r_templatename,"
173b0 72 62 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  rb");.    if( in
173c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 72  ==0 ){.      fpr
173d0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e  intf(stderr,"Can
173e0 27 74 20 6f 70 65 6e 20 74 68 65 20 74 65 6d 70  't open the temp
173f0 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22  late file \"%s\"
17400 2e 5c 6e 22 2c 75 73 65 72 5f 74 65 6d 70 6c 61  .\n",user_templa
17410 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 6c  tename);.      l
17420 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
17430 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
17440 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
17450 6e 20 69 6e 3b 0a 20 20 7d 0a 0a 20 20 63 70 20  n in;.  }..  cp 
17460 3d 20 73 74 72 72 63 68 72 28 6c 65 6d 70 2d 3e  = strrchr(lemp->
17470 66 69 6c 65 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20  filename,'.');. 
17480 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20 20 73   if( cp ){.    s
17490 70 72 69 6e 74 66 28 62 75 66 2c 22 25 2e 2a 73  printf(buf,"%.*s
174a0 2e 6c 74 22 2c 28 69 6e 74 29 28 63 70 2d 6c 65  .lt",(int)(cp-le
174b0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 2c 6c 65  mp->filename),le
174c0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
174d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69   }else{.    spri
174e0 6e 74 66 28 62 75 66 2c 22 25 73 2e 6c 74 22 2c  ntf(buf,"%s.lt",
174f0 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b  lemp->filename);
17500 0a 20 20 7d 0a 20 20 69 66 28 20 61 63 63 65 73  .  }.  if( acces
17510 73 28 62 75 66 2c 30 30 34 29 3d 3d 30 20 29 7b  s(buf,004)==0 ){
17520 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20  .    tpltname = 
17530 62 75 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  buf;.  }else if(
17540 20 61 63 63 65 73 73 28 74 65 6d 70 6c 61 74 65   access(template
17550 6e 61 6d 65 2c 30 30 34 29 3d 3d 30 20 29 7b 0a  name,004)==0 ){.
17560 20 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 74      tpltname = t
17570 65 6d 70 6c 61 74 65 6e 61 6d 65 3b 0a 20 20 7d  emplatename;.  }
17580 65 6c 73 65 7b 0a 20 20 20 20 74 70 6c 74 6e 61  else{.    tpltna
17590 6d 65 20 3d 20 70 61 74 68 73 65 61 72 63 68 28  me = pathsearch(
175a0 6c 65 6d 70 2d 3e 61 72 67 76 30 2c 74 65 6d 70  lemp->argv0,temp
175b0 6c 61 74 65 6e 61 6d 65 2c 30 29 3b 0a 20 20 7d  latename,0);.  }
175c0 0a 20 20 69 66 28 20 74 70 6c 74 6e 61 6d 65 3d  .  if( tpltname=
175d0 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  =0 ){.    fprint
175e0 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20  f(stderr,"Can't 
175f0 66 69 6e 64 20 74 68 65 20 70 61 72 73 65 72 20  find the parser 
17600 64 72 69 76 65 72 20 74 65 6d 70 6c 61 74 65 20  driver template 
17610 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c  file \"%s\".\n",
17620 0a 20 20 20 20 74 65 6d 70 6c 61 74 65 6e 61 6d  .    templatenam
17630 65 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72  e);.    lemp->er
17640 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65  rorcnt++;.    re
17650 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 6e  turn 0;.  }.  in
17660 20 3d 20 66 6f 70 65 6e 28 74 70 6c 74 6e 61 6d   = fopen(tpltnam
17670 65 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69  e,"rb");.  if( i
17680 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  n==0 ){.    fpri
17690 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27  ntf(stderr,"Can'
176a0 74 20 6f 70 65 6e 20 74 68 65 20 74 65 6d 70 6c  t open the templ
176b0 61 74 65 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e  ate file \"%s\".
176c0 5c 6e 22 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65  \n",templatename
176d0 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72  );.    lemp->err
176e0 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74  orcnt++;.    ret
176f0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
17700 75 72 6e 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72  urn in;.}../* Pr
17710 69 6e 74 20 61 20 23 6c 69 6e 65 20 64 69 72 65  int a #line dire
17720 63 74 69 76 65 20 6c 69 6e 65 20 74 6f 20 74 68  ctive line to th
17730 65 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 2a  e output file. *
17740 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 74  /.PRIVATE void t
17750 70 6c 74 5f 6c 69 6e 65 64 69 72 28 46 49 4c 45  plt_linedir(FILE
17760 20 2a 6f 75 74 2c 20 69 6e 74 20 6c 69 6e 65 6e   *out, int linen
17770 6f 2c 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d  o, char *filenam
17780 65 29 0a 7b 0a 20 20 66 70 72 69 6e 74 66 28 6f  e).{.  fprintf(o
17790 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 22  ut,"#line %d \""
177a0 2c 6c 69 6e 65 6e 6f 29 3b 0a 20 20 77 68 69 6c  ,lineno);.  whil
177b0 65 28 20 2a 66 69 6c 65 6e 61 6d 65 20 29 7b 0a  e( *filename ){.
177c0 20 20 20 20 69 66 28 20 2a 66 69 6c 65 6e 61 6d      if( *filenam
177d0 65 20 3d 3d 20 27 5c 5c 27 20 29 20 70 75 74 63  e == '\\' ) putc
177e0 28 27 5c 5c 27 2c 6f 75 74 29 3b 0a 20 20 20 20  ('\\',out);.    
177f0 70 75 74 63 28 2a 66 69 6c 65 6e 61 6d 65 2c 6f  putc(*filename,o
17800 75 74 29 3b 0a 20 20 20 20 66 69 6c 65 6e 61 6d  ut);.    filenam
17810 65 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  e++;.  }.  fprin
17820 74 66 28 6f 75 74 2c 22 5c 22 5c 6e 22 29 3b 0a  tf(out,"\"\n");.
17830 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 74  }../* Print a st
17840 72 69 6e 67 20 74 6f 20 74 68 65 20 66 69 6c 65  ring to the file
17850 20 61 6e 64 20 6b 65 65 70 20 74 68 65 20 6c 69   and keep the li
17860 6e 65 6e 75 6d 62 65 72 20 75 70 20 74 6f 20 64  nenumber up to d
17870 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 76  ate */.PRIVATE v
17880 6f 69 64 20 74 70 6c 74 5f 70 72 69 6e 74 28 46  oid tplt_print(F
17890 49 4c 45 20 2a 6f 75 74 2c 20 73 74 72 75 63 74  ILE *out, struct
178a0 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20 63 68   lemon *lemp, ch
178b0 61 72 20 2a 73 74 72 2c 20 69 6e 74 20 2a 6c 69  ar *str, int *li
178c0 6e 65 6e 6f 29 0a 7b 0a 20 20 69 66 28 20 73 74  neno).{.  if( st
178d0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  r==0 ) return;. 
178e0 20 77 68 69 6c 65 28 20 2a 73 74 72 20 29 7b 0a   while( *str ){.
178f0 20 20 20 20 70 75 74 63 28 2a 73 74 72 2c 6f 75      putc(*str,ou
17900 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 73 74 72  t);.    if( *str
17910 3d 3d 27 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e  =='\n' ) (*linen
17920 6f 29 2b 2b 3b 0a 20 20 20 20 73 74 72 2b 2b 3b  o)++;.    str++;
17930 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72 5b 2d  .  }.  if( str[-
17940 31 5d 21 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20  1]!='\n' ){.    
17950 70 75 74 63 28 27 5c 6e 27 2c 6f 75 74 29 3b 0a  putc('\n',out);.
17960 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b      (*lineno)++;
17970 0a 20 20 7d 0a 20 20 69 66 20 28 21 6c 65 6d 70  .  }.  if (!lemp
17980 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29  ->nolinenosflag)
17990 20 7b 0a 20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29   {.    (*lineno)
179a0 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72  ++; tplt_linedir
179b0 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d  (out,*lineno,lem
179c0 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 0a 20 20  p->outname); .  
179d0 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  }.  return;.}../
179e0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
179f0 6e 67 20 72 6f 75 74 69 6e 65 20 65 6d 69 74 73  ng routine emits
17a00 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 64 65   code for the de
17a10 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
17a20 0a 2a 2a 20 73 79 6d 62 6f 6c 20 73 70 0a 2a 2f  .** symbol sp.*/
17a30 0a 76 6f 69 64 20 65 6d 69 74 5f 64 65 73 74 72  .void emit_destr
17a40 75 63 74 6f 72 5f 63 6f 64 65 28 0a 20 20 46 49  uctor_code(.  FI
17a50 4c 45 20 2a 6f 75 74 2c 0a 20 20 73 74 72 75 63  LE *out,.  struc
17a60 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c 0a 20 20  t symbol *sp,.  
17a70 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
17a80 6d 70 2c 0a 20 20 69 6e 74 20 2a 6c 69 6e 65 6e  mp,.  int *linen
17a90 6f 0a 29 7b 0a 20 63 68 61 72 20 2a 63 70 20 3d  o.){. char *cp =
17aa0 20 30 3b 0a 0a 20 69 66 28 20 73 70 2d 3e 74 79   0;.. if( sp->ty
17ab0 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  pe==TERMINAL ){.
17ac0 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 74 6f     cp = lemp->to
17ad0 6b 65 6e 64 65 73 74 3b 0a 20 20 20 69 66 28 20  kendest;.   if( 
17ae0 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  cp==0 ) return;.
17af0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
17b00 7b 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29  {\n"); (*lineno)
17b10 2b 2b 3b 0a 20 7d 65 6c 73 65 20 69 66 28 20 73  ++;. }else if( s
17b20 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 29 7b  p->destructor ){
17b30 0a 20 20 20 63 70 20 3d 20 73 70 2d 3e 64 65 73  .   cp = sp->des
17b40 74 72 75 63 74 6f 72 3b 0a 20 20 20 66 70 72 69  tructor;.   fpri
17b50 6e 74 66 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20  ntf(out,"{\n"); 
17b60 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20  (*lineno)++;.   
17b70 69 66 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e  if (!lemp->nolin
17b80 65 6e 6f 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69  enosflag) { (*li
17b90 6e 65 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69  neno)++; tplt_li
17ba0 6e 65 64 69 72 28 6f 75 74 2c 73 70 2d 3e 64 65  nedir(out,sp->de
17bb0 73 74 4c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 66  stLineno,lemp->f
17bc0 69 6c 65 6e 61 6d 65 29 3b 20 7d 0a 20 7d 65 6c  ilename); }. }el
17bd0 73 65 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72  se if( lemp->var
17be0 64 65 73 74 20 29 7b 0a 20 20 20 63 70 20 3d 20  dest ){.   cp = 
17bf0 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20  lemp->vardest;. 
17c00 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65    if( cp==0 ) re
17c10 74 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66  turn;.   fprintf
17c20 28 6f 75 74 2c 22 7b 5c 6e 22 29 3b 20 28 2a 6c  (out,"{\n"); (*l
17c30 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 7d 65 6c 73 65  ineno)++;. }else
17c40 7b 0a 20 20 20 61 73 73 65 72 74 28 20 30 20 29  {.   assert( 0 )
17c50 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70  ;  /* Cannot hap
17c60 70 65 6e 20 2a 2f 0a 20 7d 0a 20 66 6f 72 28 3b  pen */. }. for(;
17c70 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20   *cp; cp++){.   
17c80 69 66 28 20 2a 63 70 3d 3d 27 24 27 20 26 26 20  if( *cp=='$' && 
17c90 63 70 5b 31 5d 3d 3d 27 24 27 20 29 7b 0a 20 20  cp[1]=='$' ){.  
17ca0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
17cb0 28 79 79 70 6d 69 6e 6f 72 2d 3e 79 79 25 64 29  (yypminor->yy%d)
17cc0 22 2c 73 70 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20  ",sp->dtnum);.  
17cd0 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 63 6f     cp++;.     co
17ce0 6e 74 69 6e 75 65 3b 0a 20 20 20 7d 0a 20 20 20  ntinue;.   }.   
17cf0 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20  if( *cp=='\n' ) 
17d00 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20  (*lineno)++;.   
17d10 66 70 75 74 63 28 2a 63 70 2c 6f 75 74 29 3b 0a  fputc(*cp,out);.
17d20 20 7d 0a 20 66 70 72 69 6e 74 66 28 6f 75 74 2c   }. fprintf(out,
17d30 22 5c 6e 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29  "\n"); (*lineno)
17d40 2b 2b 3b 0a 20 69 66 20 28 21 6c 65 6d 70 2d 3e  ++;. if (!lemp->
17d50 6e 6f 6c 69 6e 65 6e 6f 73 66 6c 61 67 29 20 7b  nolinenosflag) {
17d60 20 0a 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b   .   (*lineno)++
17d70 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72 28 6f  ; tplt_linedir(o
17d80 75 74 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d  ut,*lineno,lemp-
17d90 3e 6f 75 74 6e 61 6d 65 29 3b 20 0a 20 7d 0a 20  >outname); . }. 
17da0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e  fprintf(out,"}\n
17db0 22 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  "); (*lineno)++;
17dc0 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a  . return;.}../*.
17dd0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 28  ** Return TRUE (
17de0 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20 74 68 65  non-zero) if the
17df0 20 67 69 76 65 6e 20 73 79 6d 62 6f 6c 20 68 61   given symbol ha
17e00 73 20 61 20 64 65 73 74 72 75 63 74 6f 72 2e 0a  s a destructor..
17e10 2a 2f 0a 69 6e 74 20 68 61 73 5f 64 65 73 74 72  */.int has_destr
17e20 75 63 74 6f 72 28 73 74 72 75 63 74 20 73 79 6d  uctor(struct sym
17e30 62 6f 6c 20 2a 73 70 2c 20 73 74 72 75 63 74 20  bol *sp, struct 
17e40 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b 0a 20  lemon *lemp).{. 
17e50 20 69 6e 74 20 72 65 74 3b 0a 20 20 69 66 28 20   int ret;.  if( 
17e60 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  sp->type==TERMIN
17e70 41 4c 20 29 7b 0a 20 20 20 20 72 65 74 20 3d 20  AL ){.    ret = 
17e80 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 21  lemp->tokendest!
17e90 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  =0;.  }else{.   
17ea0 20 72 65 74 20 3d 20 6c 65 6d 70 2d 3e 76 61 72   ret = lemp->var
17eb0 64 65 73 74 21 3d 30 20 7c 7c 20 73 70 2d 3e 64  dest!=0 || sp->d
17ec0 65 73 74 72 75 63 74 6f 72 21 3d 30 3b 0a 20 20  estructor!=0;.  
17ed0 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  }.  return ret;.
17ee0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
17ef0 74 65 78 74 20 74 6f 20 61 20 64 79 6e 61 6d 69  text to a dynami
17f00 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
17f10 73 74 72 69 6e 67 2e 20 20 49 66 20 7a 54 65 78  string.  If zTex
17f20 74 20 69 73 20 30 20 74 68 65 6e 0a 2a 2a 20 72  t is 0 then.** r
17f30 65 73 65 74 20 74 68 65 20 73 74 72 69 6e 67 20  eset the string 
17f40 74 6f 20 62 65 20 65 6d 70 74 79 20 61 67 61 69  to be empty agai
17f50 6e 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72  n.  Always retur
17f60 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  n the complete t
17f70 65 78 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 74  ext.** of the st
17f80 72 69 6e 67 20 28 77 68 69 63 68 20 69 73 20 6f  ring (which is o
17f90 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20  verwritten with 
17fa0 65 61 63 68 20 63 61 6c 6c 29 2e 0a 2a 2a 0a 2a  each call)..**.*
17fb0 2a 20 6e 20 62 79 74 65 73 20 6f 66 20 7a 54 65  * n bytes of zTe
17fc0 78 74 20 61 72 65 20 73 74 6f 72 65 64 2e 20 20  xt are stored.  
17fd0 49 66 20 6e 3d 3d 30 20 74 68 65 6e 20 61 6c 6c  If n==0 then all
17fe0 20 6f 66 20 7a 54 65 78 74 20 75 70 20 74 6f 20   of zText up to 
17ff0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 5c 30 30  the first.** \00
18000 30 20 74 65 72 6d 69 6e 61 74 6f 72 20 69 73 20  0 terminator is 
18010 73 74 6f 72 65 64 2e 20 20 7a 54 65 78 74 20 63  stored.  zText c
18020 61 6e 20 63 6f 6e 74 61 69 6e 20 75 70 20 74 6f  an contain up to
18030 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20 6f   two instances o
18040 66 0a 2a 2a 20 25 64 2e 20 20 54 68 65 20 76 61  f.** %d.  The va
18050 6c 75 65 73 20 6f 66 20 70 31 20 61 6e 64 20 70  lues of p1 and p
18060 32 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  2 are written in
18070 74 6f 20 74 68 65 20 66 69 72 73 74 20 61 6e 64  to the first and
18080 20 73 65 63 6f 6e 64 0a 2a 2a 20 25 64 2e 0a 2a   second.** %d..*
18090 2a 0a 2a 2a 20 49 66 20 6e 3d 3d 2d 31 2c 20 74  *.** If n==-1, t
180a0 68 65 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73  hen the previous
180b0 20 63 68 61 72 61 63 74 65 72 20 69 73 20 6f 76   character is ov
180c0 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 50 52  erwritten..*/.PR
180d0 49 56 41 54 45 20 63 68 61 72 20 2a 61 70 70 65  IVATE char *appe
180e0 6e 64 5f 73 74 72 28 63 6f 6e 73 74 20 63 68 61  nd_str(const cha
180f0 72 20 2a 7a 54 65 78 74 2c 20 69 6e 74 20 6e 2c  r *zText, int n,
18100 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29   int p1, int p2)
18110 7b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  {.  static char 
18120 65 6d 70 74 79 5b 31 5d 20 3d 20 7b 20 30 20 7d  empty[1] = { 0 }
18130 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  ;.  static char 
18140 2a 7a 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  *z = 0;.  static
18150 20 69 6e 74 20 61 6c 6c 6f 63 65 64 20 3d 20 30   int alloced = 0
18160 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 75  ;.  static int u
18170 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  sed = 0;.  int c
18180 3b 0a 20 20 63 68 61 72 20 7a 49 6e 74 5b 34 30  ;.  char zInt[40
18190 5d 3b 0a 20 20 69 66 28 20 7a 54 65 78 74 3d 3d  ];.  if( zText==
181a0 30 20 29 7b 0a 20 20 20 20 75 73 65 64 20 3d 20  0 ){.    used = 
181b0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 7a 3b  0;.    return z;
181c0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3c 3d 30 20  .  }.  if( n<=0 
181d0 29 7b 0a 20 20 20 20 69 66 28 20 6e 3c 30 20 29  ){.    if( n<0 )
181e0 7b 0a 20 20 20 20 20 20 75 73 65 64 20 2b 3d 20  {.      used += 
181f0 6e 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  n;.      assert(
18200 20 75 73 65 64 3e 3d 30 20 29 3b 0a 20 20 20 20   used>=0 );.    
18210 7d 0a 20 20 20 20 6e 20 3d 20 6c 65 6d 6f 6e 53  }.    n = lemonS
18220 74 72 6c 65 6e 28 7a 54 65 78 74 29 3b 0a 20 20  trlen(zText);.  
18230 7d 0a 20 20 69 66 28 20 28 69 6e 74 29 20 28 6e  }.  if( (int) (n
18240 2b 73 69 7a 65 6f 66 28 7a 49 6e 74 29 2a 32 2b  +sizeof(zInt)*2+
18250 75 73 65 64 29 20 3e 3d 20 61 6c 6c 6f 63 65 64  used) >= alloced
18260 20 29 7b 0a 20 20 20 20 61 6c 6c 6f 63 65 64 20   ){.    alloced 
18270 3d 20 6e 20 2b 20 73 69 7a 65 6f 66 28 7a 49 6e  = n + sizeof(zIn
18280 74 29 2a 32 20 2b 20 75 73 65 64 20 2b 20 32 30  t)*2 + used + 20
18290 30 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72  0;.    z = (char
182a0 20 2a 29 20 72 65 61 6c 6c 6f 63 28 7a 2c 20 20   *) realloc(z,  
182b0 61 6c 6c 6f 63 65 64 29 3b 0a 20 20 7d 0a 20 20  alloced);.  }.  
182c0 69 66 28 20 7a 3d 3d 30 20 29 20 72 65 74 75 72  if( z==0 ) retur
182d0 6e 20 65 6d 70 74 79 3b 0a 20 20 77 68 69 6c 65  n empty;.  while
182e0 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20  ( n-- > 0 ){.   
182f0 20 63 20 3d 20 2a 28 7a 54 65 78 74 2b 2b 29 3b   c = *(zText++);
18300 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20  .    if( c=='%' 
18310 26 26 20 6e 3e 30 20 26 26 20 7a 54 65 78 74 5b  && n>0 && zText[
18320 30 5d 3d 3d 27 64 27 20 29 7b 0a 20 20 20 20 20  0]=='d' ){.     
18330 20 73 70 72 69 6e 74 66 28 7a 49 6e 74 2c 20 22   sprintf(zInt, "
18340 25 64 22 2c 20 70 31 29 3b 0a 20 20 20 20 20 20  %d", p1);.      
18350 70 31 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 73  p1 = p2;.      s
18360 74 72 63 70 79 28 26 7a 5b 75 73 65 64 5d 2c 20  trcpy(&z[used], 
18370 7a 49 6e 74 29 3b 0a 20 20 20 20 20 20 75 73 65  zInt);.      use
18380 64 20 2b 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  d += lemonStrlen
18390 28 26 7a 5b 75 73 65 64 5d 29 3b 0a 20 20 20 20  (&z[used]);.    
183a0 20 20 7a 54 65 78 74 2b 2b 3b 0a 20 20 20 20 20    zText++;.     
183b0 20 6e 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   n--;.    }else{
183c0 0a 20 20 20 20 20 20 7a 5b 75 73 65 64 2b 2b 5d  .      z[used++]
183d0 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = c;.    }.  }.
183e0 20 20 7a 5b 75 73 65 64 5d 20 3d 20 30 3b 0a 20    z[used] = 0;. 
183f0 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a   return z;.}../*
18400 0a 2a 2a 20 7a 43 6f 64 65 20 69 73 20 61 20 73  .** zCode is a s
18410 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 74 68  tring that is th
18420 65 20 61 63 74 69 6f 6e 20 61 73 73 6f 63 69 61  e action associa
18430 74 65 64 20 77 69 74 68 20 61 20 72 75 6c 65 2e  ted with a rule.
18440 20 20 45 78 70 61 6e 64 0a 2a 2a 20 74 68 65 20    Expand.** the 
18450 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 69 73 20  symbols in this 
18460 73 74 72 69 6e 67 20 73 6f 20 74 68 61 74 20 74  string so that t
18470 68 65 20 72 65 66 65 72 20 74 6f 20 65 6c 65 6d  he refer to elem
18480 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 72 73  ents of the pars
18490 65 72 0a 2a 2a 20 73 74 61 63 6b 2e 0a 2a 2f 0a  er.** stack..*/.
184a0 50 52 49 56 41 54 45 20 76 6f 69 64 20 74 72 61  PRIVATE void tra
184b0 6e 73 6c 61 74 65 5f 63 6f 64 65 28 73 74 72 75  nslate_code(stru
184c0 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 2c 20  ct lemon *lemp, 
184d0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 29  struct rule *rp)
184e0 7b 0a 20 20 63 68 61 72 20 2a 63 70 2c 20 2a 78  {.  char *cp, *x
184f0 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  p;.  int i;.  ch
18500 61 72 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 20  ar lhsused = 0; 
18510 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
18520 65 20 4c 48 53 20 65 6c 65 6d 65 6e 74 20 68 61  e LHS element ha
18530 73 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20  s been used */. 
18540 20 63 68 61 72 20 75 73 65 64 5b 4d 41 58 52 48   char used[MAXRH
18550 53 5d 3b 20 20 20 2f 2a 20 54 72 75 65 20 66 6f  S];   /* True fo
18560 72 20 65 61 63 68 20 52 48 53 20 65 6c 65 6d 65  r each RHS eleme
18570 6e 74 20 77 68 69 63 68 20 69 73 20 75 73 65 64  nt which is used
18580 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */..  for(i=0; 
18590 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
185a0 20 75 73 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 20   used[i] = 0;.  
185b0 6c 68 73 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20  lhsused = 0;..  
185c0 69 66 28 20 72 70 2d 3e 63 6f 64 65 3d 3d 30 20  if( rp->code==0 
185d0 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68  ){.    static ch
185e0 61 72 20 6e 65 77 6c 69 6e 65 73 74 72 5b 32 5d  ar newlinestr[2]
185f0 20 3d 20 7b 20 27 5c 6e 27 2c 20 27 5c 30 27 20   = { '\n', '\0' 
18600 7d 3b 0a 20 20 20 20 72 70 2d 3e 63 6f 64 65 20  };.    rp->code 
18610 3d 20 6e 65 77 6c 69 6e 65 73 74 72 3b 0a 20 20  = newlinestr;.  
18620 20 20 72 70 2d 3e 6c 69 6e 65 20 3d 20 72 70 2d    rp->line = rp-
18630 3e 72 75 6c 65 6c 69 6e 65 3b 0a 20 20 7d 0a 0a  >ruleline;.  }..
18640 20 20 61 70 70 65 6e 64 5f 73 74 72 28 30 2c 30    append_str(0,0
18650 2c 30 2c 30 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  ,0,0);..  /* Thi
18660 73 20 63 6f 6e 73 74 20 63 61 73 74 20 69 73 20  s const cast is 
18670 77 72 6f 6e 67 20 62 75 74 20 68 61 72 6d 6c 65  wrong but harmle
18680 73 73 2c 20 69 66 20 77 65 27 72 65 20 63 61 72  ss, if we're car
18690 65 66 75 6c 2e 20 2a 2f 0a 20 20 66 6f 72 28 63  eful. */.  for(c
186a0 70 3d 28 63 68 61 72 20 2a 29 72 70 2d 3e 63 6f  p=(char *)rp->co
186b0 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a  de; *cp; cp++){.
186c0 20 20 20 20 69 66 28 20 69 73 61 6c 70 68 61 28      if( isalpha(
186d0 2a 63 70 29 20 26 26 20 28 63 70 3d 3d 72 70 2d  *cp) && (cp==rp-
186e0 3e 63 6f 64 65 20 7c 7c 20 28 21 69 73 61 6c 6e  >code || (!isaln
186f0 75 6d 28 63 70 5b 2d 31 5d 29 20 26 26 20 63 70  um(cp[-1]) && cp
18700 5b 2d 31 5d 21 3d 27 5f 27 29 29 20 29 7b 0a 20  [-1]!='_')) ){. 
18710 20 20 20 20 20 63 68 61 72 20 73 61 76 65 64 3b       char saved;
18720 0a 20 20 20 20 20 20 66 6f 72 28 78 70 3d 20 26  .      for(xp= &
18730 63 70 5b 31 5d 3b 20 69 73 61 6c 6e 75 6d 28 2a  cp[1]; isalnum(*
18740 78 70 29 20 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b  xp) || *xp=='_';
18750 20 78 70 2b 2b 29 3b 0a 20 20 20 20 20 20 73 61   xp++);.      sa
18760 76 65 64 20 3d 20 2a 78 70 3b 0a 20 20 20 20 20  ved = *xp;.     
18770 20 2a 78 70 20 3d 20 30 3b 0a 20 20 20 20 20 20   *xp = 0;.      
18780 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73  if( rp->lhsalias
18790 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70   && strcmp(cp,rp
187a0 2d 3e 6c 68 73 61 6c 69 61 73 29 3d 3d 30 20 29  ->lhsalias)==0 )
187b0 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  {.        append
187c0 5f 73 74 72 28 22 79 79 67 6f 74 6f 6d 69 6e 6f  _str("yygotomino
187d0 72 2e 79 79 25 64 22 2c 30 2c 72 70 2d 3e 6c 68  r.yy%d",0,rp->lh
187e0 73 2d 3e 64 74 6e 75 6d 2c 30 29 3b 0a 20 20 20  s->dtnum,0);.   
187f0 20 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20       cp = xp;.  
18800 20 20 20 20 20 20 6c 68 73 75 73 65 64 20 3d 20        lhsused = 
18810 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
18820 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
18830 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
18840 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
18850 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d   rp->rhsalias[i]
18860 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70   && strcmp(cp,rp
18870 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d  ->rhsalias[i])==
18880 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
18890 20 69 66 28 20 63 70 21 3d 72 70 2d 3e 63 6f 64   if( cp!=rp->cod
188a0 65 20 26 26 20 63 70 5b 2d 31 5d 3d 3d 27 40 27  e && cp[-1]=='@'
188b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
188c0 20 20 2f 2a 20 49 66 20 74 68 65 20 61 72 67 75    /* If the argu
188d0 6d 65 6e 74 20 69 73 20 6f 66 20 74 68 65 20 66  ment is of the f
188e0 6f 72 6d 20 40 58 20 74 68 65 6e 20 73 75 62 73  orm @X then subs
188f0 74 69 74 75 74 65 64 0a 20 20 20 20 20 20 20 20  tituted.        
18900 20 20 20 20 20 20 2a 2a 20 74 68 65 20 74 6f 6b        ** the tok
18910 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 58 2c 20  en number of X, 
18920 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  not the value of
18930 20 58 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20   X */.          
18940 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 22      append_str("
18950 79 79 6d 73 70 5b 25 64 5d 2e 6d 61 6a 6f 72 22  yymsp[%d].major"
18960 2c 2d 31 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31  ,-1,i-rp->nrhs+1
18970 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,0);.           
18980 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
18990 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
189a0 62 6f 6c 20 2a 73 70 20 3d 20 72 70 2d 3e 72 68  bol *sp = rp->rh
189b0 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  s[i];.          
189c0 20 20 20 20 69 6e 74 20 64 74 6e 75 6d 3b 0a 20      int dtnum;. 
189d0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
189e0 20 73 70 2d 3e 74 79 70 65 3d 3d 4d 55 4c 54 49   sp->type==MULTI
189f0 54 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20  TERMINAL ){.    
18a00 20 20 20 20 20 20 20 20 20 20 20 20 64 74 6e 75              dtnu
18a10 6d 20 3d 20 73 70 2d 3e 73 75 62 73 79 6d 5b 30  m = sp->subsym[0
18a20 5d 2d 3e 64 74 6e 75 6d 3b 0a 20 20 20 20 20 20  ]->dtnum;.      
18a30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
18a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
18a50 74 6e 75 6d 20 3d 20 73 70 2d 3e 64 74 6e 75 6d  tnum = sp->dtnum
18a60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
18a70 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
18a80 61 70 70 65 6e 64 5f 73 74 72 28 22 79 79 6d 73  append_str("yyms
18a90 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25 64  p[%d].minor.yy%d
18aa0 22 2c 30 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31  ",0,i-rp->nrhs+1
18ab0 2c 20 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20  , dtnum);.      
18ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
18ad0 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20      cp = xp;.   
18ae0 20 20 20 20 20 20 20 20 20 75 73 65 64 5b 69 5d           used[i]
18af0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
18b00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
18b10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
18b20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 78 70       }.      *xp
18b30 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 7d 0a   = saved;.    }.
18b40 20 20 20 20 61 70 70 65 6e 64 5f 73 74 72 28 63      append_str(c
18b50 70 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  p, 1, 0, 0);.  }
18b60 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a   /* End loop */.
18b70 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 6d  .  /* Check to m
18b80 61 6b 65 20 73 75 72 65 20 74 68 65 20 4c 48 53  ake sure the LHS
18b90 20 68 61 73 20 62 65 65 6e 20 75 73 65 64 20 2a   has been used *
18ba0 2f 0a 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61  /.  if( rp->lhsa
18bb0 6c 69 61 73 20 26 26 20 21 6c 68 73 75 73 65 64  lias && !lhsused
18bc0 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73 67   ){.    ErrorMsg
18bd0 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
18be0 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20  rp->ruleline,.  
18bf0 20 20 20 20 22 4c 61 62 65 6c 20 5c 22 25 73 5c      "Label \"%s\
18c00 22 20 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22  " for \"%s(%s)\"
18c10 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22   is never used."
18c20 2c 0a 20 20 20 20 20 20 20 20 72 70 2d 3e 6c 68  ,.        rp->lh
18c30 73 61 6c 69 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e  salias,rp->lhs->
18c40 6e 61 6d 65 2c 72 70 2d 3e 6c 68 73 61 6c 69 61  name,rp->lhsalia
18c50 73 29 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72  s);.    lemp->er
18c60 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 7d 0a 0a 20  rorcnt++;.  }.. 
18c70 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 64 65 73   /* Generate des
18c80 74 72 75 63 74 6f 72 20 63 6f 64 65 20 66 6f 72  tructor code for
18c90 20 52 48 53 20 73 79 6d 62 6f 6c 73 20 77 68 69   RHS symbols whi
18ca0 63 68 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ch are not used 
18cb0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 72 65 64 75  in the.  ** redu
18cc0 63 65 20 63 6f 64 65 20 2a 2f 0a 20 20 66 6f 72  ce code */.  for
18cd0 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
18ce0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
18cf0 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20  rp->rhsalias[i] 
18d00 26 26 20 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20  && !used[i] ){. 
18d10 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
18d20 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d  mp->filename,rp-
18d30 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20  >ruleline,.     
18d40 20 20 20 22 4c 61 62 65 6c 20 25 73 20 66 6f 72     "Label %s for
18d50 20 5c 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e   \"%s(%s)\" is n
18d60 65 76 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20  ever used.",.   
18d70 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61       rp->rhsalia
18d80 73 5b 69 5d 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d  s[i],rp->rhs[i]-
18d90 3e 6e 61 6d 65 2c 72 70 2d 3e 72 68 73 61 6c 69  >name,rp->rhsali
18da0 61 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 6c 65  as[i]);.      le
18db0 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
18dc0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 70      }else if( rp
18dd0 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 3d 3d 30  ->rhsalias[i]==0
18de0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61   ){.      if( ha
18df0 73 5f 64 65 73 74 72 75 63 74 6f 72 28 72 70 2d  s_destructor(rp-
18e00 3e 72 68 73 5b 69 5d 2c 6c 65 6d 70 29 20 29 7b  >rhs[i],lemp) ){
18e10 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 5f  .        append_
18e20 73 74 72 28 22 20 20 79 79 5f 64 65 73 74 72 75  str("  yy_destru
18e30 63 74 6f 72 28 79 79 70 50 61 72 73 65 72 2c 25  ctor(yypParser,%
18e40 64 2c 26 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e  d,&yymsp[%d].min
18e50 6f 72 29 3b 5c 6e 22 2c 20 30 2c 0a 20 20 20 20  or);\n", 0,.    
18e60 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69         rp->rhs[i
18e70 5d 2d 3e 69 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e  ]->index,i-rp->n
18e80 72 68 73 2b 31 29 3b 0a 20 20 20 20 20 20 7d 65  rhs+1);.      }e
18e90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
18ea0 4e 6f 20 64 65 73 74 72 75 63 74 6f 72 20 64 65  No destructor de
18eb0 66 69 6e 65 64 20 66 6f 72 20 74 68 69 73 20 74  fined for this t
18ec0 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  erm */.      }. 
18ed0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
18ee0 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20 20 20 63  p->code ){.    c
18ef0 70 20 3d 20 61 70 70 65 6e 64 5f 73 74 72 28 30  p = append_str(0
18f00 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 72 70 2d  ,0,0,0);.    rp-
18f10 3e 63 6f 64 65 20 3d 20 53 74 72 73 61 66 65 28  >code = Strsafe(
18f20 63 70 3f 63 70 3a 22 22 29 3b 0a 20 20 7d 0a 7d  cp?cp:"");.  }.}
18f30 0a 0a 2f 2a 20 0a 2a 2a 20 47 65 6e 65 72 61 74  ../* .** Generat
18f40 65 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65  e code which exe
18f50 63 75 74 65 73 20 77 68 65 6e 20 74 68 65 20 72  cutes when the r
18f60 75 6c 65 20 22 72 70 22 20 69 73 20 72 65 64 75  ule "rp" is redu
18f70 63 65 64 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74  ced.  Write.** t
18f80 68 65 20 63 6f 64 65 20 74 6f 20 22 6f 75 74 22  he code to "out"
18f90 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e  .  Make sure lin
18fa0 65 6e 6f 20 73 74 61 79 73 20 75 70 2d 74 6f 2d  eno stays up-to-
18fb0 64 61 74 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45  date..*/.PRIVATE
18fc0 20 76 6f 69 64 20 65 6d 69 74 5f 63 6f 64 65 28   void emit_code(
18fd0 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c 0a 20 20  .  FILE *out,.  
18fe0 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c  struct rule *rp,
18ff0 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  .  struct lemon 
19000 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74 20 2a 6c 69  *lemp,.  int *li
19010 6e 65 6e 6f 0a 29 7b 0a 20 63 6f 6e 73 74 20 63  neno.){. const c
19020 68 61 72 20 2a 63 70 3b 0a 0a 20 2f 2a 20 47 65  har *cp;.. /* Ge
19030 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64  nerate code to d
19040 6f 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74  o the reduce act
19050 69 6f 6e 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e  ion */. if( rp->
19060 63 6f 64 65 20 29 7b 0a 20 20 20 69 66 20 28 21  code ){.   if (!
19070 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e 6f 73 66  lemp->nolinenosf
19080 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65 6e 6f 29  lag) { (*lineno)
19090 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65 64 69 72  ++; tplt_linedir
190a0 28 6f 75 74 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65  (out,rp->line,le
190b0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 20 7d  mp->filename); }
190c0 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  .   fprintf(out,
190d0 22 7b 25 73 22 2c 72 70 2d 3e 63 6f 64 65 29 3b  "{%s",rp->code);
190e0 0a 20 20 20 66 6f 72 28 63 70 3d 72 70 2d 3e 63  .   for(cp=rp->c
190f0 6f 64 65 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b  ode; *cp; cp++){
19100 0a 20 20 20 20 20 69 66 28 20 2a 63 70 3d 3d 27  .     if( *cp=='
19110 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n' ) (*lineno)+
19120 2b 3b 0a 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c  +;.   } /* End l
19130 6f 6f 70 20 2a 2f 0a 20 20 20 66 70 72 69 6e 74  oop */.   fprint
19140 66 28 6f 75 74 2c 22 7d 5c 6e 22 29 3b 20 28 2a  f(out,"}\n"); (*
19150 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 69 66  lineno)++;.   if
19160 20 28 21 6c 65 6d 70 2d 3e 6e 6f 6c 69 6e 65 6e   (!lemp->nolinen
19170 6f 73 66 6c 61 67 29 20 7b 20 28 2a 6c 69 6e 65  osflag) { (*line
19180 6e 6f 29 2b 2b 3b 20 74 70 6c 74 5f 6c 69 6e 65  no)++; tplt_line
19190 64 69 72 28 6f 75 74 2c 2a 6c 69 6e 65 6e 6f 2c  dir(out,*lineno,
191a0 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20  lemp->outname); 
191b0 7d 0a 20 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20  }. } /* End if( 
191c0 72 70 2d 3e 63 6f 64 65 20 29 20 2a 2f 0a 0a 20  rp->code ) */.. 
191d0 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
191e0 20 50 72 69 6e 74 20 74 68 65 20 64 65 66 69 6e   Print the defin
191f0 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e 69  ition of the uni
19200 6f 6e 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  on used for the 
19210 70 61 72 73 65 72 27 73 20 64 61 74 61 20 73 74  parser's data st
19220 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 75 6e 69  ack..** This uni
19230 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 66 69 65 6c  on contains fiel
19240 64 73 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73  ds for every pos
19250 73 69 62 6c 65 20 64 61 74 61 20 74 79 70 65 20  sible data type 
19260 66 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e  for tokens.** an
19270 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e 20  d nonterminals. 
19280 20 49 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20   In the process 
19290 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 64  of computing and
192a0 20 70 72 69 6e 74 69 6e 67 20 74 68 69 73 0a 2a   printing this.*
192b0 2a 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73 65  * union, also se
192c0 74 20 74 68 65 20 22 2e 64 74 6e 75 6d 22 20 66  t the ".dtnum" f
192d0 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 74 65  ield of every te
192e0 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65  rminal and nonte
192f0 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c  rminal.** symbol
19300 2e 0a 2a 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f  ..*/.void print_
19310 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 0a 20 20 46  stack_union(.  F
19320 49 4c 45 20 2a 6f 75 74 2c 20 20 20 20 20 20 20  ILE *out,       
19330 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
19340 65 20 6f 75 74 70 75 74 20 73 74 72 65 61 6d 20  e output stream 
19350 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f  */.  struct lemo
19360 6e 20 2a 6c 65 6d 70 2c 20 20 20 20 20 20 20 20  n *lemp,        
19370 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 69 6e 66   /* The main inf
19380 6f 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  o structure for 
19390 74 68 69 73 20 70 61 72 73 65 72 20 2a 2f 0a 20  this parser */. 
193a0 20 69 6e 74 20 2a 70 6c 69 6e 65 6e 6f 2c 20 20   int *plineno,  
193b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
193c0 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c  Pointer to the l
193d0 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ine number */.  
193e0 69 6e 74 20 6d 68 66 6c 61 67 20 20 20 20 20 20  int mhflag      
193f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
19400 72 75 65 20 69 66 20 67 65 6e 65 72 61 74 69 6e  rue if generatin
19410 67 20 6d 61 6b 65 68 65 61 64 65 72 73 20 6f 75  g makeheaders ou
19420 74 70 75 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  tput */.){.  int
19430 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65   lineno = *pline
19440 6e 6f 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 69  no;    /* The li
19450 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ne number of the
19460 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 63 68 61   output */.  cha
19470 72 20 2a 2a 74 79 70 65 73 3b 20 20 20 20 20 20  r **types;      
19480 20 20 20 20 20 20 20 2f 2a 20 41 20 68 61 73 68         /* A hash
19490 20 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79   table of dataty
194a0 70 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72  pes */.  int arr
194b0 61 79 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  aysize;         
194c0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
194d0 65 20 22 74 79 70 65 73 22 20 61 72 72 61 79 20  e "types" array 
194e0 2a 2f 0a 20 20 69 6e 74 20 6d 61 78 64 74 6c 65  */.  int maxdtle
194f0 6e 67 74 68 3b 20 20 20 20 20 20 20 20 20 20 2f  ngth;          /
19500 2a 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68  * Maximum length
19510 20 6f 66 20 61 6e 79 20 22 2e 64 61 74 61 74 79   of any ".dataty
19520 70 65 22 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  pe" field. */.  
19530 63 68 61 72 20 2a 73 74 64 64 74 3b 20 20 20 20  char *stddt;    
19540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61            /* Sta
19550 6e 64 61 72 64 69 7a 65 64 20 6e 61 6d 65 20 66  ndardized name f
19560 6f 72 20 61 20 64 61 74 61 74 79 70 65 20 2a 2f  or a datatype */
19570 0a 20 20 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20  .  int i,j;     
19580 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19590 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
195a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 61 73 68  .  unsigned hash
195b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
195c0 46 6f 72 20 68 61 73 68 69 6e 67 20 74 68 65 20  For hashing the 
195d0 6e 61 6d 65 20 6f 66 20 61 20 74 79 70 65 20 2a  name of a type *
195e0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
195f0 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  name;         /*
19600 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72   Name of the par
19610 73 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  ser */..  /* All
19620 6f 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61  ocate and initia
19630 6c 69 7a 65 20 74 79 70 65 73 5b 5d 20 61 6e 64  lize types[] and
19640 20 61 6c 6c 6f 63 61 74 65 20 73 74 64 64 74 5b   allocate stddt[
19650 5d 20 2a 2f 0a 20 20 61 72 72 61 79 73 69 7a 65  ] */.  arraysize
19660 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c   = lemp->nsymbol
19670 20 2a 20 32 3b 0a 20 20 74 79 70 65 73 20 3d 20   * 2;.  types = 
19680 28 63 68 61 72 2a 2a 29 63 61 6c 6c 6f 63 28 20  (char**)calloc( 
19690 61 72 72 61 79 73 69 7a 65 2c 20 73 69 7a 65 6f  arraysize, sizeo
196a0 66 28 63 68 61 72 2a 29 20 29 3b 0a 20 20 69 66  f(char*) );.  if
196b0 28 20 74 79 70 65 73 3d 3d 30 20 29 7b 0a 20 20  ( types==0 ){.  
196c0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
196d0 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  ,"Out of memory.
196e0 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
196f0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
19700 3b 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69  ; i<arraysize; i
19710 2b 2b 29 20 74 79 70 65 73 5b 69 5d 20 3d 20 30  ++) types[i] = 0
19720 3b 0a 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20  ;.  maxdtlength 
19730 3d 20 30 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  = 0;.  if( lemp-
19740 3e 76 61 72 74 79 70 65 20 29 7b 0a 20 20 20 20  >vartype ){.    
19750 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65  maxdtlength = le
19760 6d 6f 6e 53 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e  monStrlen(lemp->
19770 76 61 72 74 79 70 65 29 3b 0a 20 20 7d 0a 20 20  vartype);.  }.  
19780 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
19790 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
197a0 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
197b0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
197c0 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
197d0 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73  ls[i];.    if( s
197e0 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 29  p->datatype==0 )
197f0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6c   continue;.    l
19800 65 6e 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e  en = lemonStrlen
19810 28 73 70 2d 3e 64 61 74 61 74 79 70 65 29 3b 0a  (sp->datatype);.
19820 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 64      if( len>maxd
19830 74 6c 65 6e 67 74 68 20 29 20 6d 61 78 64 74 6c  tlength ) maxdtl
19840 65 6e 67 74 68 20 3d 20 6c 65 6e 3b 0a 20 20 7d  ength = len;.  }
19850 0a 20 20 73 74 64 64 74 20 3d 20 28 63 68 61 72  .  stddt = (char
19860 2a 29 6d 61 6c 6c 6f 63 28 20 6d 61 78 64 74 6c  *)malloc( maxdtl
19870 65 6e 67 74 68 2a 32 20 2b 20 31 20 29 3b 0a 20  ength*2 + 1 );. 
19880 20 69 66 28 20 73 74 64 64 74 3d 3d 30 20 29 7b   if( stddt==0 ){
19890 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
198a0 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f  err,"Out of memo
198b0 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  ry.\n");.    exi
198c0 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  t(1);.  }..  /* 
198d0 42 75 69 6c 64 20 61 20 68 61 73 68 20 74 61 62  Build a hash tab
198e0 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65 73 2e  le of datatypes.
198f0 20 54 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69   The ".dtnum" fi
19900 65 6c 64 20 6f 66 20 65 61 63 68 20 73 79 6d 62  eld of each symb
19910 6f 6c 0a 20 20 2a 2a 20 69 73 20 66 69 6c 6c 65  ol.  ** is fille
19920 64 20 69 6e 20 77 69 74 68 20 74 68 65 20 68 61  d in with the ha
19930 73 68 20 69 6e 64 65 78 20 70 6c 75 73 20 31 2e  sh index plus 1.
19940 20 20 41 20 22 2e 64 74 6e 75 6d 22 20 76 61 6c    A ".dtnum" val
19950 75 65 20 6f 66 20 30 20 69 73 0a 20 20 2a 2a 20  ue of 0 is.  ** 
19960 75 73 65 64 20 66 6f 72 20 74 65 72 6d 69 6e 61  used for termina
19970 6c 20 73 79 6d 62 6f 6c 73 2e 20 20 49 66 20 74  l symbols.  If t
19980 68 65 72 65 20 69 73 20 6e 6f 20 25 64 65 66 61  here is no %defa
19990 75 6c 74 5f 74 79 70 65 20 64 65 66 69 6e 65 64  ult_type defined
199a0 20 74 68 65 6e 0a 20 20 2a 2a 20 30 20 69 73 20   then.  ** 0 is 
199b0 61 6c 73 6f 20 75 73 65 64 20 61 73 20 74 68 65  also used as the
199c0 20 2e 64 74 6e 75 6d 20 76 61 6c 75 65 20 66 6f   .dtnum value fo
199d0 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77  r nonterminals w
199e0 68 69 63 68 20 64 6f 20 6e 6f 74 20 73 70 65 63  hich do not spec
199f0 69 66 79 0a 20 20 2a 2a 20 61 20 64 61 74 61 74  ify.  ** a datat
19a00 79 70 65 20 75 73 69 6e 67 20 74 68 65 20 25 74  ype using the %t
19a10 79 70 65 20 64 69 72 65 63 74 69 76 65 2e 0a 20  ype directive.. 
19a20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
19a30 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
19a40 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
19a50 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65   symbol *sp = le
19a60 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a  mp->symbols[i];.
19a70 20 20 20 20 63 68 61 72 20 2a 63 70 3b 0a 20 20      char *cp;.  
19a80 20 20 69 66 28 20 73 70 3d 3d 6c 65 6d 70 2d 3e    if( sp==lemp->
19a90 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20  errsym ){.      
19aa0 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 61 72 72 61  sp->dtnum = arra
19ab0 79 73 69 7a 65 2b 31 3b 0a 20 20 20 20 20 20 63  ysize+1;.      c
19ac0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
19ad0 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 21     if( sp->type!
19ae0 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c 20  =NONTERMINAL || 
19af0 28 73 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30  (sp->datatype==0
19b00 20 26 26 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70   && lemp->vartyp
19b10 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73  e==0) ){.      s
19b20 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20  p->dtnum = 0;.  
19b30 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
19b40 20 20 7d 0a 20 20 20 20 63 70 20 3d 20 73 70 2d    }.    cp = sp-
19b50 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20 20 69  >datatype;.    i
19b60 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20  f( cp==0 ) cp = 
19b70 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3b 0a 20  lemp->vartype;. 
19b80 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 77 68     j = 0;.    wh
19b90 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 63 70  ile( isspace(*cp
19ba0 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 77 68  ) ) cp++;.    wh
19bb0 69 6c 65 28 20 2a 63 70 20 29 20 73 74 64 64 74  ile( *cp ) stddt
19bc0 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b 0a 20  [j++] = *cp++;. 
19bd0 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26     while( j>0 &&
19be0 20 69 73 73 70 61 63 65 28 73 74 64 64 74 5b 6a   isspace(stddt[j
19bf0 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20 20 20  -1]) ) j--;.    
19c00 73 74 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20  stddt[j] = 0;.  
19c10 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65    if( lemp->toke
19c20 6e 74 79 70 65 20 26 26 20 73 74 72 63 6d 70 28  ntype && strcmp(
19c30 73 74 64 64 74 2c 20 6c 65 6d 70 2d 3e 74 6f 6b  stddt, lemp->tok
19c40 65 6e 74 79 70 65 29 3d 3d 30 20 29 7b 0a 20 20  entype)==0 ){.  
19c50 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20      sp->dtnum = 
19c60 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
19c70 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73  e;.    }.    has
19c80 68 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 6a  h = 0;.    for(j
19c90 3d 30 3b 20 73 74 64 64 74 5b 6a 5d 3b 20 6a 2b  =0; stddt[j]; j+
19ca0 2b 29 7b 0a 20 20 20 20 20 20 68 61 73 68 20 3d  +){.      hash =
19cb0 20 68 61 73 68 2a 35 33 20 2b 20 73 74 64 64 74   hash*53 + stddt
19cc0 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  [j];.    }.    h
19cd0 61 73 68 20 3d 20 28 68 61 73 68 20 26 20 30 78  ash = (hash & 0x
19ce0 37 66 66 66 66 66 66 66 29 25 61 72 72 61 79 73  7fffffff)%arrays
19cf0 69 7a 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ize;.    while( 
19d00 74 79 70 65 73 5b 68 61 73 68 5d 20 29 7b 0a 20  types[hash] ){. 
19d10 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
19d20 74 79 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64  types[hash],stdd
19d30 74 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  t)==0 ){.       
19d40 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73   sp->dtnum = has
19d50 68 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 62  h + 1;.        b
19d60 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
19d70 20 20 20 20 68 61 73 68 2b 2b 3b 0a 20 20 20 20      hash++;.    
19d80 20 20 69 66 28 20 68 61 73 68 3e 3d 61 72 72 61    if( hash>=arra
19d90 79 73 69 7a 65 20 29 20 68 61 73 68 20 3d 20 30  ysize ) hash = 0
19da0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
19db0 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d 30 20 29  types[hash]==0 )
19dc0 7b 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75  {.      sp->dtnu
19dd0 6d 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20 20  m = hash + 1;.  
19de0 20 20 20 20 74 79 70 65 73 5b 68 61 73 68 5d 20      types[hash] 
19df0 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28  = (char*)malloc(
19e00 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 73 74 64   lemonStrlen(std
19e10 64 74 29 2b 31 20 29 3b 0a 20 20 20 20 20 20 69  dt)+1 );.      i
19e20 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d  f( types[hash]==
19e30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  0 ){.        fpr
19e40 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74  intf(stderr,"Out
19e50 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b   of memory.\n");
19e60 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29  .        exit(1)
19e70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
19e80 73 74 72 63 70 79 28 74 79 70 65 73 5b 68 61 73  strcpy(types[has
19e90 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20 20 20 7d  h],stddt);.    }
19ea0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e 74  .  }..  /* Print
19eb0 20 6f 75 74 20 74 68 65 20 64 65 66 69 6e 69 74   out the definit
19ec0 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45 4e 54 59  ion of YYTOKENTY
19ed0 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f 52 54 59  PE and YYMINORTY
19ee0 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d 20 6c  PE */.  name = l
19ef0 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70  emp->name ? lemp
19f00 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22  ->name : "Parse"
19f10 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c  ;.  lineno = *pl
19f20 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20 6d 68 66  ineno;.  if( mhf
19f30 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f  lag ){ fprintf(o
19f40 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43  ut,"#if INTERFAC
19f50 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  E\n"); lineno++;
19f60 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
19f70 2c 22 23 64 65 66 69 6e 65 20 25 73 54 4f 4b 45  ,"#define %sTOKE
19f80 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e 61 6d 65  NTYPE %s\n",name
19f90 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 6f 6b 65  ,.    lemp->toke
19fa0 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f 6b 65  ntype?lemp->toke
19fb0 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22 29 3b 20  ntype:"void*"); 
19fc0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28   lineno++;.  if(
19fd0 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e   mhflag ){ fprin
19fe0 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e  tf(out,"#endif\n
19ff0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a  "); lineno++; }.
1a000 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 74    fprintf(out,"t
1a010 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 5c 6e  ypedef union {\n
1a020 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1a030 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69  fprintf(out,"  i
1a040 6e 74 20 79 79 69 6e 69 74 3b 5c 6e 22 29 3b 20  nt yyinit;\n"); 
1a050 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1a060 6e 74 66 28 6f 75 74 2c 22 20 20 25 73 54 4f 4b  ntf(out,"  %sTOK
1a070 45 4e 54 59 50 45 20 79 79 30 3b 5c 6e 22 2c 6e  ENTYPE yy0;\n",n
1a080 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
1a090 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 72    for(i=0; i<arr
1a0a0 61 79 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  aysize; i++){.  
1a0b0 20 20 69 66 28 20 74 79 70 65 73 5b 69 5d 3d 3d    if( types[i]==
1a0c0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1a0d0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1a0e0 20 25 73 20 79 79 25 64 3b 5c 6e 22 2c 74 79 70   %s yy%d;\n",typ
1a0f0 65 73 5b 69 5d 2c 69 2b 31 29 3b 20 6c 69 6e 65  es[i],i+1); line
1a100 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 74  no++;.    free(t
1a110 79 70 65 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  ypes[i]);.  }.  
1a120 69 66 28 20 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  if( lemp->errsym
1a130 2d 3e 75 73 65 43 6e 74 20 29 7b 0a 20 20 20 20  ->useCnt ){.    
1a140 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 69  fprintf(out,"  i
1a150 6e 74 20 79 79 25 64 3b 5c 6e 22 2c 6c 65 6d 70  nt yy%d;\n",lemp
1a160 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29  ->errsym->dtnum)
1a170 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
1a180 20 20 66 72 65 65 28 73 74 64 64 74 29 3b 0a 20    free(stddt);. 
1a190 20 66 72 65 65 28 74 79 70 65 73 29 3b 0a 20 20   free(types);.  
1a1a0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 20 59  fprintf(out,"} Y
1a1b0 59 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e 22 29 3b  YMINORTYPE;\n");
1a1c0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a 70 6c   lineno++;.  *pl
1a1d0 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a  ineno = lineno;.
1a1e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1a1f0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 43 20  the name of a C 
1a200 64 61 74 61 74 79 70 65 20 61 62 6c 65 20 74 6f  datatype able to
1a210 20 72 65 70 72 65 73 65 6e 74 20 76 61 6c 75 65   represent value
1a220 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 6c 77 72  s between.** lwr
1a230 20 61 6e 64 20 75 70 72 2c 20 69 6e 63 6c 75 73   and upr, inclus
1a240 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ive..*/.static c
1a250 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e 69 6d  onst char *minim
1a260 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e 74  um_size_type(int
1a270 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 29 7b 0a   lwr, int upr){.
1a280 20 20 69 66 28 20 6c 77 72 3e 3d 30 20 29 7b 0a    if( lwr>=0 ){.
1a290 20 20 20 20 69 66 28 20 75 70 72 3c 3d 32 35 35      if( upr<=255
1a2a0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1a2b0 20 22 75 6e 73 69 67 6e 65 64 20 63 68 61 72 22   "unsigned char"
1a2c0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1a2d0 75 70 72 3c 36 35 35 33 35 20 29 7b 0a 20 20 20  upr<65535 ){.   
1a2e0 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67     return "unsig
1a2f0 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 22 3b 0a  ned short int";.
1a300 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a310 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67 6e 65   return "unsigne
1a320 64 20 69 6e 74 22 3b 0a 20 20 20 20 7d 0a 20 20  d int";.    }.  
1a330 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d  }else if( lwr>=-
1a340 31 32 37 20 26 26 20 75 70 72 3c 3d 31 32 37 20  127 && upr<=127 
1a350 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22 73  ){.    return "s
1a360 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20 20 7d  igned char";.  }
1a370 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d 33  else if( lwr>=-3
1a380 32 37 36 37 20 26 26 20 75 70 72 3c 33 32 37 36  2767 && upr<3276
1a390 37 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  7 ){.    return 
1a3a0 22 73 68 6f 72 74 22 3b 0a 20 20 7d 65 6c 73 65  "short";.  }else
1a3b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22 69 6e  {.    return "in
1a3c0 74 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t";.  }.}../*.**
1a3d0 20 45 61 63 68 20 73 74 61 74 65 20 63 6f 6e 74   Each state cont
1a3e0 61 69 6e 73 20 61 20 73 65 74 20 6f 66 20 74 6f  ains a set of to
1a3f0 6b 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ken transaction 
1a400 61 6e 64 20 61 20 73 65 74 20 6f 66 0a 2a 2a 20  and a set of.** 
1a410 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 74 72 61 6e  nonterminal tran
1a420 73 61 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20  sactions.  Each 
1a430 6f 66 20 74 68 65 73 65 20 73 65 74 73 20 6d 61  of these sets ma
1a440 6b 65 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 0a  kes an instance.
1a450 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
1a460 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
1a470 41 6e 20 61 72 72 61 79 20 6f 66 20 74 68 65 73  An array of thes
1a480 65 20 73 74 72 75 63 74 75 72 65 73 20 69 73 20  e structures is 
1a490 75 73 65 64 0a 2a 2a 20 74 6f 20 6f 72 64 65 72  used.** to order
1a4a0 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66   the creation of
1a4b0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
1a4c0 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c  yy_action[] tabl
1a4d0 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 61 78 73  e..*/.struct axs
1a4e0 65 74 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74  et {.  struct st
1a4f0 61 74 65 20 2a 73 74 70 3b 20 20 20 2f 2a 20 41  ate *stp;   /* A
1a500 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
1a510 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  ate */.  int isT
1a520 6b 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  kn;           /*
1a530 20 54 72 75 65 20 74 6f 20 75 73 65 20 74 6f 6b   True to use tok
1a540 65 6e 73 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ens.  False for 
1a550 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 2a 2f  non-terminals */
1a560 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b 20  .  int nAction; 
1a570 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1a580 72 20 6f 66 20 61 63 74 69 6f 6e 73 20 2a 2f 0a  r of actions */.
1a590 20 20 69 6e 74 20 69 4f 72 64 65 72 3b 20 20 20    int iOrder;   
1a5a0 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e         /* Origin
1a5b0 61 6c 20 6f 72 64 65 72 20 6f 66 20 61 63 74 69  al order of acti
1a5c0 6f 6e 20 73 65 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f  on sets */.};../
1a5d0 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 6f 20  *.** Compare to 
1a5e0 61 78 73 65 74 20 73 74 72 75 63 74 75 72 65 73  axset structures
1a5f0 20 66 6f 72 20 73 6f 72 74 69 6e 67 20 70 75 72   for sorting pur
1a600 70 6f 73 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  poses.*/.static 
1a610 69 6e 74 20 61 78 73 65 74 5f 63 6f 6d 70 61 72  int axset_compar
1a620 65 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 61 2c  e(const void *a,
1a630 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 29 7b   const void *b){
1a640 0a 20 20 73 74 72 75 63 74 20 61 78 73 65 74 20  .  struct axset 
1a650 2a 70 31 20 3d 20 28 73 74 72 75 63 74 20 61 78  *p1 = (struct ax
1a660 73 65 74 2a 29 61 3b 0a 20 20 73 74 72 75 63 74  set*)a;.  struct
1a670 20 61 78 73 65 74 20 2a 70 32 20 3d 20 28 73 74   axset *p2 = (st
1a680 72 75 63 74 20 61 78 73 65 74 2a 29 62 3b 0a 20  ruct axset*)b;. 
1a690 20 69 6e 74 20 63 3b 0a 20 20 63 20 3d 20 70 32   int c;.  c = p2
1a6a0 2d 3e 6e 41 63 74 69 6f 6e 20 2d 20 70 31 2d 3e  ->nAction - p1->
1a6b0 6e 41 63 74 69 6f 6e 3b 0a 20 20 69 66 28 20 63  nAction;.  if( c
1a6c0 3d 3d 30 20 29 7b 0a 20 20 20 20 63 20 3d 20 70  ==0 ){.    c = p
1a6d0 32 2d 3e 69 4f 72 64 65 72 20 2d 20 70 31 2d 3e  2->iOrder - p1->
1a6e0 69 4f 72 64 65 72 3b 0a 20 20 7d 0a 20 20 61 73  iOrder;.  }.  as
1a6f0 73 65 72 74 28 20 63 21 3d 30 20 7c 7c 20 70 31  sert( c!=0 || p1
1a700 3d 3d 70 32 20 29 3b 0a 20 20 72 65 74 75 72 6e  ==p2 );.  return
1a710 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69   c;.}../*.** Wri
1a720 74 65 20 74 65 78 74 20 6f 6e 20 22 6f 75 74 22  te text on "out"
1a730 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
1a740 74 68 65 20 72 75 6c 65 20 22 72 70 22 2e 0a 2a  the rule "rp"..*
1a750 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 77 72  /.static void wr
1a760 69 74 65 52 75 6c 65 54 65 78 74 28 46 49 4c 45  iteRuleText(FILE
1a770 20 2a 6f 75 74 2c 20 73 74 72 75 63 74 20 72 75   *out, struct ru
1a780 6c 65 20 2a 72 70 29 7b 0a 20 20 69 6e 74 20 6a  le *rp){.  int j
1a790 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1a7a0 22 25 73 20 3a 3a 3d 22 2c 20 72 70 2d 3e 6c 68  "%s ::=", rp->lh
1a7b0 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  s->name);.  for(
1a7c0 6a 3d 30 3b 20 6a 3c 72 70 2d 3e 6e 72 68 73 3b  j=0; j<rp->nrhs;
1a7d0 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   j++){.    struc
1a7e0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 72  t symbol *sp = r
1a7f0 70 2d 3e 72 68 73 5b 6a 5d 3b 0a 20 20 20 20 66  p->rhs[j];.    f
1a800 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 25 73 22  printf(out," %s"
1a810 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  , sp->name);.   
1a820 20 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4d   if( sp->type==M
1a830 55 4c 54 49 54 45 52 4d 49 4e 41 4c 20 29 7b 0a  ULTITERMINAL ){.
1a840 20 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20        int k;.   
1a850 20 20 20 66 6f 72 28 6b 3d 31 3b 20 6b 3c 73 70     for(k=1; k<sp
1a860 2d 3e 6e 73 75 62 73 79 6d 3b 20 6b 2b 2b 29 7b  ->nsubsym; k++){
1a870 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
1a880 28 6f 75 74 2c 22 7c 25 73 22 2c 73 70 2d 3e 73  (out,"|%s",sp->s
1a890 75 62 73 79 6d 5b 6b 5d 2d 3e 6e 61 6d 65 29 3b  ubsym[k]->name);
1a8a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1a8b0 20 7d 0a 7d 0a 0a 0a 2f 2a 20 47 65 6e 65 72 61   }.}.../* Genera
1a8c0 74 65 20 43 20 73 6f 75 72 63 65 20 63 6f 64 65  te C source code
1a8d0 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 20   for the parser 
1a8e0 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72 74 54 61  */.void ReportTa
1a8f0 62 6c 65 28 0a 20 20 73 74 72 75 63 74 20 6c 65  ble(.  struct le
1a900 6d 6f 6e 20 2a 6c 65 6d 70 2c 0a 20 20 69 6e 74  mon *lemp,.  int
1a910 20 6d 68 66 6c 61 67 20 20 20 20 20 2f 2a 20 4f   mhflag     /* O
1a920 75 74 70 75 74 20 69 6e 20 6d 61 6b 65 68 65 61  utput in makehea
1a930 64 65 72 73 20 66 6f 72 6d 61 74 20 69 66 20 74  ders format if t
1a940 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 46 49 4c 45  rue */.){.  FILE
1a950 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68   *out, *in;.  ch
1a960 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45  ar line[LINESIZE
1a970 5d 3b 0a 20 20 69 6e 74 20 20 6c 69 6e 65 6e 6f  ];.  int  lineno
1a980 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
1a990 20 2a 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20   *stp;.  struct 
1a9a0 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 73 74  action *ap;.  st
1a9b0 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20  ruct rule *rp;. 
1a9c0 20 73 74 72 75 63 74 20 61 63 74 74 61 62 20 2a   struct acttab *
1a9d0 70 41 63 74 74 61 62 3b 0a 20 20 69 6e 74 20 69  pActtab;.  int i
1a9e0 2c 20 6a 2c 20 6e 3b 0a 20 20 63 6f 6e 73 74 20  , j, n;.  const 
1a9f0 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 69 6e  char *name;.  in
1aa00 74 20 6d 6e 54 6b 6e 4f 66 73 74 2c 20 6d 78 54  t mnTknOfst, mxT
1aa10 6b 6e 4f 66 73 74 3b 0a 20 20 69 6e 74 20 6d 6e  knOfst;.  int mn
1aa20 4e 74 4f 66 73 74 2c 20 6d 78 4e 74 4f 66 73 74  NtOfst, mxNtOfst
1aa30 3b 0a 20 20 73 74 72 75 63 74 20 61 78 73 65 74  ;.  struct axset
1aa40 20 2a 61 78 3b 0a 0a 20 20 69 6e 20 3d 20 74 70   *ax;..  in = tp
1aa50 6c 74 5f 6f 70 65 6e 28 6c 65 6d 70 29 3b 0a 20  lt_open(lemp);. 
1aa60 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74   if( in==0 ) ret
1aa70 75 72 6e 3b 0a 20 20 6f 75 74 20 3d 20 66 69 6c  urn;.  out = fil
1aa80 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 63 22  e_open(lemp,".c"
1aa90 2c 22 77 62 22 29 3b 0a 20 20 69 66 28 20 6f 75  ,"wb");.  if( ou
1aaa0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66 63 6c 6f  t==0 ){.    fclo
1aab0 73 65 28 69 6e 29 3b 0a 20 20 20 20 72 65 74 75  se(in);.    retu
1aac0 72 6e 3b 0a 20 20 7d 0a 20 20 6c 69 6e 65 6e 6f  rn;.  }.  lineno
1aad0 20 3d 20 31 3b 0a 20 20 74 70 6c 74 5f 78 66 65   = 1;.  tplt_xfe
1aae0 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1aaf0 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1ab00 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65   /* Generate the
1ab10 20 69 6e 63 6c 75 64 65 20 63 6f 64 65 2c 20 69   include code, i
1ab20 66 20 61 6e 79 20 2a 2f 0a 20 20 74 70 6c 74 5f  f any */.  tplt_
1ab30 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c  print(out,lemp,l
1ab40 65 6d 70 2d 3e 69 6e 63 6c 75 64 65 2c 26 6c 69  emp->include,&li
1ab50 6e 65 6e 6f 29 3b 0a 20 20 69 66 28 20 6d 68 66  neno);.  if( mhf
1ab60 6c 61 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20  lag ){.    char 
1ab70 2a 6e 61 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b  *name = file_mak
1ab80 65 6e 61 6d 65 28 6c 65 6d 70 2c 20 22 2e 68 22  ename(lemp, ".h"
1ab90 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1aba0 75 74 2c 22 23 69 6e 63 6c 75 64 65 20 5c 22 25  ut,"#include \"%
1abb0 73 5c 22 5c 6e 22 2c 20 6e 61 6d 65 29 3b 20 6c  s\"\n", name); l
1abc0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65  ineno++;.    fre
1abd0 65 28 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 74  e(name);.  }.  t
1abe0 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1abf0 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1ac00 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1ac10 61 74 65 20 23 64 65 66 69 6e 65 73 20 66 6f 72  ate #defines for
1ac20 20 61 6c 6c 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20   all tokens */. 
1ac30 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20   if( mhflag ){. 
1ac40 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
1ac50 72 65 66 69 78 3b 0a 20 20 20 20 66 70 72 69 6e  refix;.    fprin
1ac60 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45  tf(out,"#if INTE
1ac70 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e  RFACE\n"); linen
1ac80 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d  o++;.    if( lem
1ac90 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20 29  p->tokenprefix )
1aca0 20 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e   prefix = lemp->
1acb0 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 20  tokenprefix;.   
1acc0 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20   else           
1acd0 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20           prefix 
1ace0 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d  = "";.    for(i=
1acf0 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  1; i<lemp->nterm
1ad00 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  inal; i++){.    
1ad10 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1ad20 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25  define %s%-30s %
1ad30 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d  2d\n",prefix,lem
1ad40 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
1ad50 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 6c 69  ame,i);.      li
1ad60 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  neno++;.    }.  
1ad70 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1ad80 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e  endif\n"); linen
1ad90 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
1ada0 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1adb0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1adc0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1add0 74 68 65 20 64 65 66 69 6e 65 73 20 2a 2f 0a 20  the defines */. 
1ade0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1adf0 65 66 69 6e 65 20 59 59 43 4f 44 45 54 59 50 45  efine YYCODETYPE
1ae00 20 25 73 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e 69   %s\n",.    mini
1ae10 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 30 2c  mum_size_type(0,
1ae20 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 31   lemp->nsymbol+1
1ae30 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  )); lineno++;.  
1ae40 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
1ae50 66 69 6e 65 20 59 59 4e 4f 43 4f 44 45 20 25 64  fine YYNOCODE %d
1ae60 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  \n",lemp->nsymbo
1ae70 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  l+1);  lineno++;
1ae80 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
1ae90 23 64 65 66 69 6e 65 20 59 59 41 43 54 49 4f 4e  #define YYACTION
1aea0 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20  TYPE %s\n",.    
1aeb0 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
1aec0 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  e(0, lemp->nstat
1aed0 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2b 35 29  e+lemp->nrule+5)
1aee0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
1aef0 69 66 28 20 6c 65 6d 70 2d 3e 77 69 6c 64 63 61  if( lemp->wildca
1af00 72 64 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  rd ){.    fprint
1af10 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1af20 59 57 49 4c 44 43 41 52 44 20 25 64 5c 6e 22 2c  YWILDCARD %d\n",
1af30 0a 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 77 69  .       lemp->wi
1af40 6c 64 63 61 72 64 2d 3e 69 6e 64 65 78 29 3b 20  ldcard->index); 
1af50 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
1af60 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f  print_stack_unio
1af70 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26 6c 69 6e 65  n(out,lemp,&line
1af80 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a 20 20 66 70  no,mhflag);.  fp
1af90 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 69 66 6e  rintf(out, "#ifn
1afa0 64 65 66 20 59 59 53 54 41 43 4b 44 45 50 54 48  def YYSTACKDEPTH
1afb0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1afc0 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74 61 63    if( lemp->stac
1afd0 6b 73 69 7a 65 20 29 7b 0a 20 20 20 20 66 70 72  ksize ){.    fpr
1afe0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
1aff0 65 20 59 59 53 54 41 43 4b 44 45 50 54 48 20 25  e YYSTACKDEPTH %
1b000 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73 74 61 63 6b  s\n",lemp->stack
1b010 73 69 7a 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  size);  lineno++
1b020 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
1b030 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
1b040 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54 48  ine YYSTACKDEPTH
1b050 20 31 30 30 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e   100\n");  linen
1b060 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  o++;.  }.  fprin
1b070 74 66 28 6f 75 74 2c 20 22 23 65 6e 64 69 66 5c  tf(out, "#endif\
1b080 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1b090 20 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20   if( mhflag ){. 
1b0a0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1b0b0 23 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22  #if INTERFACE\n"
1b0c0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
1b0d0 0a 20 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e  .  name = lemp->
1b0e0 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d  name ? lemp->nam
1b0f0 65 20 3a 20 22 50 61 72 73 65 22 3b 0a 20 20 69  e : "Parse";.  i
1b100 66 28 20 6c 65 6d 70 2d 3e 61 72 67 20 26 26 20  f( lemp->arg && 
1b110 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d 20 29 7b 0a  lemp->arg[0] ){.
1b120 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69      int i;.    i
1b130 20 3d 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28 6c   = lemonStrlen(l
1b140 65 6d 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20 77  emp->arg);.    w
1b150 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 69 73  hile( i>=1 && is
1b160 73 70 61 63 65 28 6c 65 6d 70 2d 3e 61 72 67 5b  space(lemp->arg[
1b170 69 2d 31 5d 29 20 29 20 69 2d 2d 3b 0a 20 20 20  i-1]) ) i--;.   
1b180 20 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20   while( i>=1 && 
1b190 28 69 73 61 6c 6e 75 6d 28 6c 65 6d 70 2d 3e 61  (isalnum(lemp->a
1b1a0 72 67 5b 69 2d 31 5d 29 20 7c 7c 20 6c 65 6d 70  rg[i-1]) || lemp
1b1b0 2d 3e 61 72 67 5b 69 2d 31 5d 3d 3d 27 5f 27 29  ->arg[i-1]=='_')
1b1c0 20 29 20 69 2d 2d 3b 0a 20 20 20 20 66 70 72 69   ) i--;.    fpri
1b1d0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1b1e0 20 25 73 41 52 47 5f 53 44 45 43 4c 20 25 73 3b   %sARG_SDECL %s;
1b1f0 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61  \n",name,lemp->a
1b200 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  rg);  lineno++;.
1b210 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b220 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 50  "#define %sARG_P
1b230 44 45 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d 65  DECL ,%s\n",name
1b240 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69  ,lemp->arg);  li
1b250 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
1b260 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
1b270 20 25 73 41 52 47 5f 46 45 54 43 48 20 25 73 20   %sARG_FETCH %s 
1b280 3d 20 79 79 70 50 61 72 73 65 72 2d 3e 25 73 5c  = yypParser->%s\
1b290 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1b2a0 20 20 20 20 20 6e 61 6d 65 2c 6c 65 6d 70 2d 3e       name,lemp->
1b2b0 61 72 67 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69  arg,&lemp->arg[i
1b2c0 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ]);  lineno++;. 
1b2d0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1b2e0 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 54  #define %sARG_ST
1b2f0 4f 52 45 20 79 79 70 50 61 72 73 65 72 2d 3e 25  ORE yypParser->%
1b300 73 20 3d 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  s = %s\n",.     
1b310 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65              name
1b320 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 2c 26  ,&lemp->arg[i],&
1b330 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20  lemp->arg[i]);  
1b340 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73  lineno++;.  }els
1b350 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  e{.    fprintf(o
1b360 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52  ut,"#define %sAR
1b370 47 5f 53 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29  G_SDECL\n",name)
1b380 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ;  lineno++;.   
1b390 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1b3a0 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44 45 43  efine %sARG_PDEC
1b3b0 4c 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e  L\n",name);  lin
1b3c0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  eno++;.    fprin
1b3d0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1b3e0 25 73 41 52 47 5f 46 45 54 43 48 5c 6e 22 2c 6e  %sARG_FETCH\n",n
1b3f0 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
1b400 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1b410 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53  "#define %sARG_S
1b420 54 4f 52 45 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c  TORE\n",name); l
1b430 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69  ineno++;.  }.  i
1b440 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20  f( mhflag ){.   
1b450 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65   fprintf(out,"#e
1b460 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  ndif\n"); lineno
1b470 2b 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74  ++;.  }.  fprint
1b480 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1b490 59 4e 53 54 41 54 45 20 25 64 5c 6e 22 2c 6c 65  YNSTATE %d\n",le
1b4a0 6d 70 2d 3e 6e 73 74 61 74 65 29 3b 20 20 6c 69  mp->nstate);  li
1b4b0 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74  neno++;.  fprint
1b4c0 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59  f(out,"#define Y
1b4d0 59 4e 52 55 4c 45 20 25 64 5c 6e 22 2c 6c 65 6d  YNRULE %d\n",lem
1b4e0 70 2d 3e 6e 72 75 6c 65 29 3b 20 20 6c 69 6e 65  p->nrule);  line
1b4f0 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70  no++;.  if( lemp
1b500 2d 3e 65 72 72 73 79 6d 2d 3e 75 73 65 43 6e 74  ->errsym->useCnt
1b510 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
1b520 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45  out,"#define YYE
1b530 52 52 4f 52 53 59 4d 42 4f 4c 20 25 64 5c 6e 22  RRORSYMBOL %d\n"
1b540 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 69  ,lemp->errsym->i
1b550 6e 64 65 78 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  ndex);  lineno++
1b560 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1b570 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45 52 52  t,"#define YYERR
1b580 53 59 4d 44 54 20 79 79 25 64 5c 6e 22 2c 6c 65  SYMDT yy%d\n",le
1b590 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75  mp->errsym->dtnu
1b5a0 6d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  m);  lineno++;. 
1b5b0 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 68   }.  if( lemp->h
1b5c0 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  as_fallback ){. 
1b5d0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
1b5e0 23 64 65 66 69 6e 65 20 59 59 46 41 4c 4c 42 41  #define YYFALLBA
1b5f0 43 4b 20 31 5c 6e 22 29 3b 20 20 6c 69 6e 65 6e  CK 1\n");  linen
1b600 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
1b610 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1b620 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1b630 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
1b640 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  the action table
1b650 20 61 6e 64 20 69 74 73 20 61 73 73 6f 63 69 61   and its associa
1b660 74 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  tes:.  **.  **  
1b670 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 20 20 20 20  yy_action[]     
1b680 20 20 20 41 20 73 69 6e 67 6c 65 20 74 61 62 6c     A single tabl
1b690 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6c 6c  e containing all
1b6a0 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 20 20   actions..  **  
1b6b0 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d 20 20  yy_lookahead[]  
1b6c0 20 20 20 41 20 74 61 62 6c 65 20 63 6f 6e 74 61     A table conta
1b6d0 69 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 6b 61 68  ining the lookah
1b6e0 65 61 64 20 66 6f 72 20 65 61 63 68 20 65 6e 74  ead for each ent
1b6f0 72 79 20 69 6e 0a 20 20 2a 2a 20 20 20 20 20 20  ry in.  **      
1b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 79                 y
1b710 79 5f 61 63 74 69 6f 6e 2e 20 20 55 73 65 64 20  y_action.  Used 
1b720 74 6f 20 64 65 74 65 63 74 20 68 61 73 68 20 63  to detect hash c
1b730 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a 2a 20  ollisions..  ** 
1b740 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d   yy_shift_ofst[]
1b750 20 20 20 20 46 6f 72 20 65 61 63 68 20 73 74 61      For each sta
1b760 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74 20 69  te, the offset i
1b770 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 66 6f  nto yy_action fo
1b780 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20  r.  **          
1b790 20 20 20 20 20 20 20 20 20 20 20 73 68 69 66 74             shift
1b7a0 69 6e 67 20 74 65 72 6d 69 6e 61 6c 73 2e 0a 20  ing terminals.. 
1b7b0 20 2a 2a 20 20 79 79 5f 72 65 64 75 63 65 5f 6f   **  yy_reduce_o
1b7c0 66 73 74 5b 5d 20 20 20 46 6f 72 20 65 61 63 68  fst[]   For each
1b7d0 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73   state, the offs
1b7e0 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f  et into yy_actio
1b7f0 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20  n for.  **      
1b800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1b810 68 69 66 74 69 6e 67 20 6e 6f 6e 2d 74 65 72 6d  hifting non-term
1b820 69 6e 61 6c 73 20 61 66 74 65 72 20 61 20 72 65  inals after a re
1b830 64 75 63 65 2e 0a 20 20 2a 2a 20 20 79 79 5f 64  duce..  **  yy_d
1b840 65 66 61 75 6c 74 5b 5d 20 20 20 20 20 20 20 44  efault[]       D
1b850 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 66 6f  efault action fo
1b860 72 20 65 61 63 68 20 73 74 61 74 65 2e 0a 20 20  r each state..  
1b870 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  */..  /* Compute
1b880 20 74 68 65 20 61 63 74 69 6f 6e 73 20 6f 6e 20   the actions on 
1b890 61 6c 6c 20 73 74 61 74 65 73 20 61 6e 64 20 63  all states and c
1b8a0 6f 75 6e 74 20 74 68 65 6d 20 75 70 20 2a 2f 0a  ount them up */.
1b8b0 20 20 61 78 20 3d 20 28 73 74 72 75 63 74 20 61    ax = (struct a
1b8c0 78 73 65 74 20 2a 29 20 63 61 6c 6c 6f 63 28 6c  xset *) calloc(l
1b8d0 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 2c 20 73  emp->nstate*2, s
1b8e0 69 7a 65 6f 66 28 61 78 5b 30 5d 29 29 3b 0a 20  izeof(ax[0]));. 
1b8f0 20 69 66 28 20 61 78 3d 3d 30 20 29 7b 0a 20 20   if( ax==0 ){.  
1b900 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
1b910 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c  ,"malloc failed\
1b920 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
1b930 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1b940 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
1b950 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
1b960 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
1b970 3b 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 73 74  ;.    ax[i*2].st
1b980 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61 78 5b  p = stp;.    ax[
1b990 69 2a 32 5d 2e 69 73 54 6b 6e 20 3d 20 31 3b 0a  i*2].isTkn = 1;.
1b9a0 20 20 20 20 61 78 5b 69 2a 32 5d 2e 6e 41 63 74      ax[i*2].nAct
1b9b0 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 54 6b 6e 41  ion = stp->nTknA
1b9c0 63 74 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31  ct;.    ax[i*2+1
1b9d0 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20  ].stp = stp;.   
1b9e0 20 61 78 5b 69 2a 32 2b 31 5d 2e 69 73 54 6b 6e   ax[i*2+1].isTkn
1b9f0 20 3d 20 30 3b 0a 20 20 20 20 61 78 5b 69 2a 32   = 0;.    ax[i*2
1ba00 2b 31 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74  +1].nAction = st
1ba10 70 2d 3e 6e 4e 74 41 63 74 3b 0a 20 20 7d 0a 20  p->nNtAct;.  }. 
1ba20 20 6d 78 54 6b 6e 4f 66 73 74 20 3d 20 6d 6e 54   mxTknOfst = mnT
1ba30 6b 6e 4f 66 73 74 20 3d 20 30 3b 0a 20 20 6d 78  knOfst = 0;.  mx
1ba40 4e 74 4f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73  NtOfst = mnNtOfs
1ba50 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  t = 0;..  /* Com
1ba60 70 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20  pute the action 
1ba70 74 61 62 6c 65 2e 20 20 49 6e 20 6f 72 64 65 72  table.  In order
1ba80 20 74 6f 20 74 72 79 20 74 6f 20 6b 65 65 70 20   to try to keep 
1ba90 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
1baa0 20 20 2a 2a 20 61 63 74 69 6f 6e 20 74 61 62 6c    ** action tabl
1bab0 65 20 74 6f 20 61 20 6d 69 6e 69 6d 75 6d 2c 20  e to a minimum, 
1bac0 74 68 65 20 68 65 75 72 69 73 74 69 63 20 6f 66  the heuristic of
1bad0 20 70 6c 61 63 69 6e 67 20 74 68 65 20 6c 61 72   placing the lar
1bae0 67 65 73 74 20 61 63 74 69 6f 6e 0a 20 20 2a 2a  gest action.  **
1baf0 20 73 65 74 73 20 66 69 72 73 74 20 69 73 20 75   sets first is u
1bb00 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  sed..  */.  for(
1bb10 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
1bb20 61 74 65 2a 32 3b 20 69 2b 2b 29 20 61 78 5b 69  ate*2; i++) ax[i
1bb30 5d 2e 69 4f 72 64 65 72 20 3d 20 69 3b 0a 20 20  ].iOrder = i;.  
1bb40 71 73 6f 72 74 28 61 78 2c 20 6c 65 6d 70 2d 3e  qsort(ax, lemp->
1bb50 6e 73 74 61 74 65 2a 32 2c 20 73 69 7a 65 6f 66  nstate*2, sizeof
1bb60 28 61 78 5b 30 5d 29 2c 20 61 78 73 65 74 5f 63  (ax[0]), axset_c
1bb70 6f 6d 70 61 72 65 29 3b 0a 20 20 70 41 63 74 74  ompare);.  pActt
1bb80 61 62 20 3d 20 61 63 74 74 61 62 5f 61 6c 6c 6f  ab = acttab_allo
1bb90 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  c();.  for(i=0; 
1bba0 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32  i<lemp->nstate*2
1bbb0 20 26 26 20 61 78 5b 69 5d 2e 6e 41 63 74 69 6f   && ax[i].nActio
1bbc0 6e 3e 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  n>0; i++){.    s
1bbd0 74 70 20 3d 20 61 78 5b 69 5d 2e 73 74 70 3b 0a  tp = ax[i].stp;.
1bbe0 20 20 20 20 69 66 28 20 61 78 5b 69 5d 2e 69 73      if( ax[i].is
1bbf0 54 6b 6e 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  Tkn ){.      for
1bc00 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
1bc10 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
1bc20 20 20 20 20 20 20 20 69 6e 74 20 61 63 74 69 6f         int actio
1bc30 6e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  n;.        if( a
1bc40 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3e 3d 6c 65  p->sp->index>=le
1bc50 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20  mp->nterminal ) 
1bc60 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1bc70 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75    action = compu
1bc80 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20  te_action(lemp, 
1bc90 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ap);.        if(
1bca0 20 61 63 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74   action<0 ) cont
1bcb0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63  inue;.        ac
1bcc0 74 74 61 62 5f 61 63 74 69 6f 6e 28 70 41 63 74  ttab_action(pAct
1bcd0 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64  tab, ap->sp->ind
1bce0 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20  ex, action);.   
1bcf0 20 20 20 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e     }.      stp->
1bd00 69 54 6b 6e 4f 66 73 74 20 3d 20 61 63 74 74 61  iTknOfst = actta
1bd10 62 5f 69 6e 73 65 72 74 28 70 41 63 74 74 61 62  b_insert(pActtab
1bd20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70  );.      if( stp
1bd30 2d 3e 69 54 6b 6e 4f 66 73 74 3c 6d 6e 54 6b 6e  ->iTknOfst<mnTkn
1bd40 4f 66 73 74 20 29 20 6d 6e 54 6b 6e 4f 66 73 74  Ofst ) mnTknOfst
1bd50 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74   = stp->iTknOfst
1bd60 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 70 2d  ;.      if( stp-
1bd70 3e 69 54 6b 6e 4f 66 73 74 3e 6d 78 54 6b 6e 4f  >iTknOfst>mxTknO
1bd80 66 73 74 20 29 20 6d 78 54 6b 6e 4f 66 73 74 20  fst ) mxTknOfst 
1bd90 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b  = stp->iTknOfst;
1bda0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bdb0 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
1bdc0 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
1bdd0 74 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  t){.        int 
1bde0 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  action;.        
1bdf0 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
1be00 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  x<lemp->ntermina
1be10 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
1be20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70        if( ap->sp
1be30 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d 70 2d 3e 6e  ->index==lemp->n
1be40 73 79 6d 62 6f 6c 20 29 20 63 6f 6e 74 69 6e 75  symbol ) continu
1be50 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69 6f  e;.        actio
1be60 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69  n = compute_acti
1be70 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20  on(lemp, ap);.  
1be80 20 20 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e        if( action
1be90 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  <0 ) continue;. 
1bea0 20 20 20 20 20 20 20 61 63 74 74 61 62 5f 61 63         acttab_ac
1beb0 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61 70  tion(pActtab, ap
1bec0 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63 74  ->sp->index, act
1bed0 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ion);.      }.  
1bee0 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74      stp->iNtOfst
1bef0 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65 72 74   = acttab_insert
1bf00 28 70 41 63 74 74 61 62 29 3b 0a 20 20 20 20 20  (pActtab);.     
1bf10 20 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73   if( stp->iNtOfs
1bf20 74 3c 6d 6e 4e 74 4f 66 73 74 20 29 20 6d 6e 4e  t<mnNtOfst ) mnN
1bf30 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74  tOfst = stp->iNt
1bf40 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20  Ofst;.      if( 
1bf50 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3e 6d 78 4e  stp->iNtOfst>mxN
1bf60 74 4f 66 73 74 20 29 20 6d 78 4e 74 4f 66 73 74  tOfst ) mxNtOfst
1bf70 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b   = stp->iNtOfst;
1bf80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 72 65  .    }.  }.  fre
1bf90 65 28 61 78 29 3b 0a 0a 20 20 2f 2a 20 4f 75 74  e(ax);..  /* Out
1bfa0 70 75 74 20 74 68 65 20 79 79 5f 61 63 74 69 6f  put the yy_actio
1bfb0 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 6e 20 3d  n table */.  n =
1bfc0 20 61 63 74 74 61 62 5f 73 69 7a 65 28 70 41 63   acttab_size(pAc
1bfd0 74 74 61 62 29 3b 0a 20 20 66 70 72 69 6e 74 66  ttab);.  fprintf
1bfe0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
1bff0 5f 41 43 54 54 41 42 5f 43 4f 55 4e 54 20 28 25  _ACTTAB_COUNT (%
1c000 64 29 5c 6e 22 2c 20 6e 29 3b 20 6c 69 6e 65 6e  d)\n", n); linen
1c010 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
1c020 75 74 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74  ut,"static const
1c030 20 59 59 41 43 54 49 4f 4e 54 59 50 45 20 79 79   YYACTIONTYPE yy
1c040 5f 61 63 74 69 6f 6e 5b 5d 20 3d 20 7b 5c 6e 22  _action[] = {\n"
1c050 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1c060 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
1c070 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 63 74  ++){.    int act
1c080 69 6f 6e 20 3d 20 61 63 74 74 61 62 5f 79 79 61  ion = acttab_yya
1c090 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 69  ction(pActtab, i
1c0a0 29 3b 0a 20 20 20 20 69 66 28 20 61 63 74 69 6f  );.    if( actio
1c0b0 6e 3c 30 20 29 20 61 63 74 69 6f 6e 20 3d 20 6c  n<0 ) action = l
1c0c0 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65  emp->nstate + le
1c0d0 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20 32 3b 0a 20  mp->nrule + 2;. 
1c0e0 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70     if( j==0 ) fp
1c0f0 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25  rintf(out," /* %
1c100 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20  5d */ ", i);.   
1c110 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
1c120 25 34 64 2c 22 2c 20 61 63 74 69 6f 6e 29 3b 0a  %4d,", action);.
1c130 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
1c140 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
1c150 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
1c160 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
1c170 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
1c180 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
1c190 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
1c1a0 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
1c1b0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20  ); lineno++;..  
1c1c0 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79  /* Output the yy
1c1d0 5f 6c 6f 6f 6b 61 68 65 61 64 20 74 61 62 6c 65  _lookahead table
1c1e0 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
1c1f0 74 2c 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20  t,"static const 
1c200 59 59 43 4f 44 45 54 59 50 45 20 79 79 5f 6c 6f  YYCODETYPE yy_lo
1c210 6f 6b 61 68 65 61 64 5b 5d 20 3d 20 7b 5c 6e 22  okahead[] = {\n"
1c220 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
1c230 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
1c240 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 61 20  ++){.    int la 
1c250 3d 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b 61  = acttab_yylooka
1c260 68 65 61 64 28 70 41 63 74 74 61 62 2c 20 69 29  head(pActtab, i)
1c270 3b 0a 20 20 20 20 69 66 28 20 6c 61 3c 30 20 29  ;.    if( la<0 )
1c280 20 6c 61 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d   la = lemp->nsym
1c290 62 6f 6c 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  bol;.    if( j==
1c2a0 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  0 ) fprintf(out,
1c2b0 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69  " /* %5d */ ", i
1c2c0 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1c2d0 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6c 61 29  ut, " %4d,", la)
1c2e0 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c  ;.    if( j==9 |
1c2f0 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20  | i==n-1 ){.    
1c300 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1c310 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1c320 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20        j = 0;.   
1c330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b   }else{.      j+
1c340 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  +;.    }.  }.  f
1c350 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c  printf(out, "};\
1c360 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a  n"); lineno++;..
1c370 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20    /* Output the 
1c380 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20  yy_shift_ofst[] 
1c390 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e  table */.  fprin
1c3a0 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65  tf(out, "#define
1c3b0 20 59 59 5f 53 48 49 46 54 5f 55 53 45 5f 44 46   YY_SHIFT_USE_DF
1c3c0 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54 6b  LT (%d)\n", mnTk
1c3d0 6e 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f  nOfst-1); lineno
1c3e0 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e  ++;.  n = lemp->
1c3f0 6e 73 74 61 74 65 3b 0a 20 20 77 68 69 6c 65 28  nstate;.  while(
1c400 20 6e 3e 30 20 26 26 20 6c 65 6d 70 2d 3e 73 6f   n>0 && lemp->so
1c410 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69 54 6b 6e 4f  rted[n-1]->iTknO
1c420 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29  fst==NO_OFFSET )
1c430 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e 74 66 28   n--;.  fprintf(
1c440 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59  out, "#define YY
1c450 5f 53 48 49 46 54 5f 43 4f 55 4e 54 20 28 25 64  _SHIFT_COUNT (%d
1c460 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20 6c 69 6e 65  )\n", n-1); line
1c470 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1c480 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59  out, "#define YY
1c490 5f 53 48 49 46 54 5f 4d 49 4e 20 20 20 28 25 64  _SHIFT_MIN   (%d
1c4a0 29 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74 29  )\n", mnTknOfst)
1c4b0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70  ; lineno++;.  fp
1c4c0 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66  rintf(out, "#def
1c4d0 69 6e 65 20 59 59 5f 53 48 49 46 54 5f 4d 41 58  ine YY_SHIFT_MAX
1c4e0 20 20 20 28 25 64 29 5c 6e 22 2c 20 6d 78 54 6b     (%d)\n", mxTk
1c4f0 6e 4f 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  nOfst); lineno++
1c500 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
1c510 20 22 73 74 61 74 69 63 20 63 6f 6e 73 74 20 25   "static const %
1c520 73 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b  s yy_shift_ofst[
1c530 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20 20 20  ] = {\n", .     
1c540 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a       minimum_siz
1c550 65 5f 74 79 70 65 28 6d 6e 54 6b 6e 4f 66 73 74  e_type(mnTknOfst
1c560 2d 31 2c 20 6d 78 54 6b 6e 4f 66 73 74 29 29 3b  -1, mxTknOfst));
1c570 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72   lineno++;.  for
1c580 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  (i=j=0; i<n; i++
1c590 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 3b  ){.    int ofst;
1c5a0 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
1c5b0 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
1c5c0 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e  ofst = stp->iTkn
1c5d0 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f 66  Ofst;.    if( of
1c5e0 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20  st==NO_OFFSET ) 
1c5f0 6f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74  ofst = mnTknOfst
1c600 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a 3d   - 1;.    if( j=
1c610 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  =0 ) fprintf(out
1c620 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20  ," /* %5d */ ", 
1c630 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i);.    fprintf(
1c640 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f 66  out, " %4d,", of
1c650 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d  st);.    if( j==
1c660 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20  9 || i==n-1 ){. 
1c670 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
1c680 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  , "\n"); lineno+
1c690 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a  +;.      j = 0;.
1c6a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c6b0 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   j++;.    }.  }.
1c6c0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1c6d0 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  };\n"); lineno++
1c6e0 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74  ;..  /* Output t
1c6f0 68 65 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73  he yy_reduce_ofs
1c700 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  t[] table */.  f
1c710 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64 65  printf(out, "#de
1c720 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f 55  fine YY_REDUCE_U
1c730 53 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22 2c  SE_DFLT (%d)\n",
1c740 20 6d 6e 4e 74 4f 66 73 74 2d 31 29 3b 20 6c 69   mnNtOfst-1); li
1c750 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65  neno++;.  n = le
1c760 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 77 68  mp->nstate;.  wh
1c770 69 6c 65 28 20 6e 3e 30 20 26 26 20 6c 65 6d 70  ile( n>0 && lemp
1c780 2d 3e 73 6f 72 74 65 64 5b 6e 2d 31 5d 2d 3e 69  ->sorted[n-1]->i
1c790 4e 74 4f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45  NtOfst==NO_OFFSE
1c7a0 54 20 29 20 6e 2d 2d 3b 0a 20 20 66 70 72 69 6e  T ) n--;.  fprin
1c7b0 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65  tf(out, "#define
1c7c0 20 59 59 5f 52 45 44 55 43 45 5f 43 4f 55 4e 54   YY_REDUCE_COUNT
1c7d0 20 28 25 64 29 5c 6e 22 2c 20 6e 2d 31 29 3b 20   (%d)\n", n-1); 
1c7e0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
1c7f0 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
1c800 65 20 59 59 5f 52 45 44 55 43 45 5f 4d 49 4e 20  e YY_REDUCE_MIN 
1c810 20 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f    (%d)\n", mnNtO
1c820 66 73 74 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  fst); lineno++;.
1c830 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1c840 23 64 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43  #define YY_REDUC
1c850 45 5f 4d 41 58 20 20 20 28 25 64 29 5c 6e 22 2c  E_MAX   (%d)\n",
1c860 20 6d 78 4e 74 4f 66 73 74 29 3b 20 6c 69 6e 65   mxNtOfst); line
1c870 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28  no++;.  fprintf(
1c880 6f 75 74 2c 20 22 73 74 61 74 69 63 20 63 6f 6e  out, "static con
1c890 73 74 20 25 73 20 79 79 5f 72 65 64 75 63 65 5f  st %s yy_reduce_
1c8a0 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a  ofst[] = {\n", .
1c8b0 20 20 20 20 20 20 20 20 20 20 6d 69 6e 69 6d 75            minimu
1c8c0 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 4e 74  m_size_type(mnNt
1c8d0 4f 66 73 74 2d 31 2c 20 6d 78 4e 74 4f 66 73 74  Ofst-1, mxNtOfst
1c8e0 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  )); lineno++;.  
1c8f0 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
1c900 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66  i++){.    int of
1c910 73 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65  st;.    stp = le
1c920 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20  mp->sorted[i];. 
1c930 20 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69     ofst = stp->i
1c940 4e 74 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20  NtOfst;.    if( 
1c950 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20  ofst==NO_OFFSET 
1c960 29 20 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73  ) ofst = mnNtOfs
1c970 74 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a  t - 1;.    if( j
1c980 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75  ==0 ) fprintf(ou
1c990 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c  t," /* %5d */ ",
1c9a0 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66   i);.    fprintf
1c9b0 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f  (out, " %4d,", o
1c9c0 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d  fst);.    if( j=
1c9d0 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
1c9e0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1c9f0 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
1ca00 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
1ca10 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1ca20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
1ca30 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
1ca40 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
1ca50 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  +;..  /* Output 
1ca60 74 68 65 20 64 65 66 61 75 6c 74 20 61 63 74 69  the default acti
1ca70 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70  on table */.  fp
1ca80 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61 74  rintf(out, "stat
1ca90 69 63 20 63 6f 6e 73 74 20 59 59 41 43 54 49 4f  ic const YYACTIO
1caa0 4e 54 59 50 45 20 79 79 5f 64 65 66 61 75 6c 74  NTYPE yy_default
1cab0 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65  [] = {\n"); line
1cac0 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70  no++;.  n = lemp
1cad0 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 66 6f 72 28  ->nstate;.  for(
1cae0 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  i=j=0; i<n; i++)
1caf0 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  {.    stp = lemp
1cb00 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
1cb10 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70 72 69   if( j==0 ) fpri
1cb20 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25 35 64  ntf(out," /* %5d
1cb30 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20 20 66   */ ", i);.    f
1cb40 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 25 34  printf(out, " %4
1cb50 64 2c 22 2c 20 73 74 70 2d 3e 69 44 66 6c 74 29  d,", stp->iDflt)
1cb60 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c  ;.    if( j==9 |
1cb70 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20  | i==n-1 ){.    
1cb80 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
1cb90 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1cba0 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20        j = 0;.   
1cbb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b   }else{.      j+
1cbc0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  +;.    }.  }.  f
1cbd0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c  printf(out, "};\
1cbe0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1cbf0 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1cc00 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1cc10 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
1cc20 65 72 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  erate the table 
1cc30 6f 66 20 66 61 6c 6c 62 61 63 6b 20 74 6f 6b 65  of fallback toke
1cc40 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c  ns..  */.  if( l
1cc50 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63  emp->has_fallbac
1cc60 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 78 20  k ){.    int mx 
1cc70 3d 20 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  = lemp->ntermina
1cc80 6c 20 2d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65  l - 1;.    while
1cc90 28 20 6d 78 3e 30 20 26 26 20 6c 65 6d 70 2d 3e  ( mx>0 && lemp->
1cca0 73 79 6d 62 6f 6c 73 5b 6d 78 5d 2d 3e 66 61 6c  symbols[mx]->fal
1ccb0 6c 62 61 63 6b 3d 3d 30 20 29 7b 20 6d 78 2d 2d  lback==0 ){ mx--
1ccc0 3b 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ; }.    for(i=0;
1ccd0 20 69 3c 3d 6d 78 3b 20 69 2b 2b 29 7b 0a 20 20   i<=mx; i++){.  
1cce0 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
1ccf0 6c 20 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d  l *p = lemp->sym
1cd00 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69  bols[i];.      i
1cd10 66 28 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d  f( p->fallback==
1cd20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  0 ){.        fpr
1cd30 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20 30  intf(out, "    0
1cd40 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 6e 6f  ,  /* %10s => no
1cd50 74 68 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70 2d 3e  thing */\n", p->
1cd60 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
1cd70 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69  se{.        fpri
1cd80 6e 74 66 28 6f 75 74 2c 20 22 20 20 25 33 64 2c  ntf(out, "  %3d,
1cd90 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 25 73 20    /* %10s => %s 
1cda0 2a 2f 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c 62 61  */\n", p->fallba
1cdb0 63 6b 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20 20  ck->index,.     
1cdc0 20 20 20 20 20 70 2d 3e 6e 61 6d 65 2c 20 70 2d       p->name, p-
1cdd0 3e 66 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d 65 29  >fallback->name)
1cde0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1cdf0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
1ce00 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
1ce10 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e 2c 20  lemp->name, in, 
1ce20 6f 75 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  out, &lineno);..
1ce30 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1ce40 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1ce50 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61   the symbolic na
1ce60 6d 65 20 6f 66 20 65 76 65 72 79 20 73 79 6d 62  me of every symb
1ce70 6f 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ol.  */.  for(i=
1ce80 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
1ce90 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70  ol; i++){.    sp
1cea0 72 69 6e 74 66 28 6c 69 6e 65 2c 22 5c 22 25 73  rintf(line,"\"%s
1ceb0 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  \",",lemp->symbo
1cec0 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ls[i]->name);.  
1ced0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1cee0 20 25 2d 31 35 73 22 2c 6c 69 6e 65 29 3b 0a 20   %-15s",line);. 
1cef0 20 20 20 69 66 28 20 28 69 26 33 29 3d 3d 33 20     if( (i&3)==3 
1cf00 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  ){ fprintf(out,"
1cf10 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20  \n"); lineno++; 
1cf20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 26 33  }.  }.  if( (i&3
1cf30 29 21 3d 30 20 29 7b 20 66 70 72 69 6e 74 66 28  )!=0 ){ fprintf(
1cf40 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  out,"\n"); linen
1cf50 6f 2b 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f 78 66  o++; }.  tplt_xf
1cf60 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1cf70 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1cf80 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20    /* Generate a 
1cf90 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67  table containing
1cfa0 20 61 20 74 65 78 74 20 73 74 72 69 6e 67 20 74   a text string t
1cfb0 68 61 74 20 64 65 73 63 72 69 62 65 73 20 65 76  hat describes ev
1cfc0 65 72 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69 6e  ery.  ** rule in
1cfd0 20 74 68 65 20 72 75 6c 65 20 73 65 74 20 6f 66   the rule set of
1cfe0 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 54   the grammar.  T
1cff0 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
1d000 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 77 68 65  is used.  ** whe
1d010 6e 20 74 72 61 63 69 6e 67 20 52 45 44 55 43 45  n tracing REDUCE
1d020 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20   actions..  */. 
1d030 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65 6d   for(i=0, rp=lem
1d040 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d  p->rule; rp; rp=
1d050 72 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b 0a  rp->next, i++){.
1d060 20 20 20 20 61 73 73 65 72 74 28 20 72 70 2d 3e      assert( rp->
1d070 69 6e 64 65 78 3d 3d 69 20 29 3b 0a 20 20 20 20  index==i );.    
1d080 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
1d090 20 25 33 64 20 2a 2f 20 5c 22 22 2c 20 69 29 3b   %3d */ \"", i);
1d0a0 0a 20 20 20 20 77 72 69 74 65 52 75 6c 65 54 65  .    writeRuleTe
1d0b0 78 74 28 6f 75 74 2c 20 72 70 29 3b 0a 20 20 20  xt(out, rp);.   
1d0c0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22   fprintf(out,"\"
1d0d0 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ,\n"); lineno++;
1d0e0 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
1d0f0 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f  (lemp->name,in,o
1d100 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20  ut,&lineno);..  
1d110 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  /* Generate code
1d120 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20   which executes 
1d130 65 76 65 72 79 20 74 69 6d 65 20 61 20 73 79 6d  every time a sym
1d140 62 6f 6c 20 69 73 20 70 6f 70 70 65 64 20 66 72  bol is popped fr
1d150 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 63  om.  ** the stac
1d160 6b 20 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69  k while processi
1d170 6e 67 20 65 72 72 6f 72 73 20 6f 72 20 77 68 69  ng errors or whi
1d180 6c 65 20 64 65 73 74 72 6f 79 69 6e 67 20 74 68  le destroying th
1d190 65 20 70 61 72 73 65 72 2e 20 0a 20 20 2a 2a 20  e parser. .  ** 
1d1a0 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c  (In other words,
1d1b0 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 25 64   generate the %d
1d1c0 65 73 74 72 75 63 74 6f 72 20 61 63 74 69 6f 6e  estructor action
1d1d0 73 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65  s).  */.  if( le
1d1e0 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29 7b  mp->tokendest ){
1d1f0 0a 20 20 20 20 69 6e 74 20 6f 6e 63 65 20 3d 20  .    int once = 
1d200 31 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  1;.    for(i=0; 
1d210 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
1d220 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
1d230 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
1d240 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69   lemp->symbols[i
1d250 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 70 3d  ];.      if( sp=
1d260 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 21 3d  =0 || sp->type!=
1d270 54 45 52 4d 49 4e 41 4c 20 29 20 63 6f 6e 74 69  TERMINAL ) conti
1d280 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  nue;.      if( o
1d290 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 66  nce ){.        f
1d2a0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20  printf(out, "   
1d2b0 20 20 20 2f 2a 20 54 45 52 4d 49 4e 41 4c 20 44     /* TERMINAL D
1d2c0 65 73 74 72 75 63 74 6f 72 20 2a 2f 5c 6e 22 29  estructor */\n")
1d2d0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
1d2e0 20 20 20 20 6f 6e 63 65 20 3d 20 30 3b 0a 20 20      once = 0;.  
1d2f0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
1d300 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73  ntf(out,"    cas
1d310 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e  e %d: /* %s */\n
1d320 22 2c 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70  ", sp->index, sp
1d330 2d 3e 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b  ->name); lineno+
1d340 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  +;.    }.    for
1d350 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
1d360 79 6d 62 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e 73  ymbol && lemp->s
1d370 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65 21  ymbols[i]->type!
1d380 3d 54 45 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b  =TERMINAL; i++);
1d390 0a 20 20 20 20 69 66 28 20 69 3c 6c 65 6d 70 2d  .    if( i<lemp-
1d3a0 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20  >nsymbol ){.    
1d3b0 20 20 65 6d 69 74 5f 64 65 73 74 72 75 63 74 6f    emit_destructo
1d3c0 72 5f 63 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d  r_code(out,lemp-
1d3d0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70  >symbols[i],lemp
1d3e0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20  ,&lineno);.     
1d3f0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1d400 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20      break;\n"); 
1d410 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
1d420 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e    }.  if( lemp->
1d430 76 61 72 64 65 73 74 20 29 7b 0a 20 20 20 20 73  vardest ){.    s
1d440 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64 66  truct symbol *df
1d450 6c 74 5f 73 70 20 3d 20 30 3b 0a 20 20 20 20 69  lt_sp = 0;.    i
1d460 6e 74 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 20  nt once = 1;.   
1d470 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
1d480 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
1d490 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79  .      struct sy
1d4a0 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d  mbol *sp = lemp-
1d4b0 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
1d4c0 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20     if( sp==0 || 
1d4d0 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  sp->type==TERMIN
1d4e0 41 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  AL ||.          
1d4f0 73 70 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c 20  sp->index<=0 || 
1d500 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d  sp->destructor!=
1d510 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1d520 20 20 20 20 69 66 28 20 6f 6e 63 65 20 29 7b 0a      if( once ){.
1d530 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
1d540 6f 75 74 2c 20 22 20 20 20 20 20 20 2f 2a 20 44  out, "      /* D
1d550 65 66 61 75 6c 74 20 4e 4f 4e 2d 54 45 52 4d 49  efault NON-TERMI
1d560 4e 41 4c 20 44 65 73 74 72 75 63 74 6f 72 20 2a  NAL Destructor *
1d570 2f 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  /\n"); lineno++;
1d580 0a 20 20 20 20 20 20 20 20 6f 6e 63 65 20 3d 20  .        once = 
1d590 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1d5a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1d5b0 20 20 63 61 73 65 20 25 64 3a 20 2f 2a 20 25 73    case %d: /* %s
1d5c0 20 2a 2f 5c 6e 22 2c 20 73 70 2d 3e 69 6e 64 65   */\n", sp->inde
1d5d0 78 2c 20 73 70 2d 3e 6e 61 6d 65 29 3b 20 6c 69  x, sp->name); li
1d5e0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 64 66  neno++;.      df
1d5f0 6c 74 5f 73 70 20 3d 20 73 70 3b 0a 20 20 20 20  lt_sp = sp;.    
1d600 7d 0a 20 20 20 20 69 66 28 20 64 66 6c 74 5f 73  }.    if( dflt_s
1d610 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 6d  p!=0 ){.      em
1d620 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  it_destructor_co
1d630 64 65 28 6f 75 74 2c 64 66 6c 74 5f 73 70 2c 6c  de(out,dflt_sp,l
1d640 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  emp,&lineno);.  
1d650 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
1d660 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b  out,"      break
1d670 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
1d680 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
1d690 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
1d6a0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
1d6b0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
1d6c0 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
1d6d0 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c  .    if( sp==0 |
1d6e0 7c 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d  | sp->type==TERM
1d6f0 49 4e 41 4c 20 7c 7c 20 73 70 2d 3e 64 65 73 74  INAL || sp->dest
1d700 72 75 63 74 6f 72 3d 3d 30 20 29 20 63 6f 6e 74  ructor==0 ) cont
1d710 69 6e 75 65 3b 0a 20 20 20 20 66 70 72 69 6e 74  inue;.    fprint
1d720 66 28 6f 75 74 2c 22 20 20 20 20 63 61 73 65 20  f(out,"    case 
1d730 25 64 3a 20 2f 2a 20 25 73 20 2a 2f 5c 6e 22 2c  %d: /* %s */\n",
1d740 20 73 70 2d 3e 69 6e 64 65 78 2c 20 73 70 2d 3e   sp->index, sp->
1d750 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
1d760 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65  ..    /* Combine
1d770 20 64 75 70 6c 69 63 61 74 65 20 64 65 73 74 72   duplicate destr
1d780 75 63 74 6f 72 73 20 69 6e 74 6f 20 61 20 73 69  uctors into a si
1d790 6e 67 6c 65 20 63 61 73 65 20 2a 2f 0a 20 20 20  ngle case */.   
1d7a0 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6c 65   for(j=i+1; j<le
1d7b0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 6a 2b 2b  mp->nsymbol; j++
1d7c0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
1d7d0 73 79 6d 62 6f 6c 20 2a 73 70 32 20 3d 20 6c 65  symbol *sp2 = le
1d7e0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a  mp->symbols[j];.
1d7f0 20 20 20 20 20 20 69 66 28 20 73 70 32 20 26 26        if( sp2 &&
1d800 20 73 70 32 2d 3e 74 79 70 65 21 3d 54 45 52 4d   sp2->type!=TERM
1d810 49 4e 41 4c 20 26 26 20 73 70 32 2d 3e 64 65 73  INAL && sp2->des
1d820 74 72 75 63 74 6f 72 0a 20 20 20 20 20 20 20 20  tructor.        
1d830 20 20 26 26 20 73 70 32 2d 3e 64 74 6e 75 6d 3d    && sp2->dtnum=
1d840 3d 73 70 2d 3e 64 74 6e 75 6d 0a 20 20 20 20 20  =sp->dtnum.     
1d850 20 20 20 20 20 26 26 20 73 74 72 63 6d 70 28 73       && strcmp(s
1d860 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 2c 73 70  p->destructor,sp
1d870 32 2d 3e 64 65 73 74 72 75 63 74 6f 72 29 3d 3d  2->destructor)==
1d880 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 66 70  0 ){.         fp
1d890 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63  rintf(out,"    c
1d8a0 61 73 65 20 25 64 3a 20 2f 2a 20 25 73 20 2a 2f  ase %d: /* %s */
1d8b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1d8c0 20 20 20 20 20 20 73 70 32 2d 3e 69 6e 64 65 78        sp2->index
1d8d0 2c 20 73 70 32 2d 3e 6e 61 6d 65 29 3b 20 6c 69  , sp2->name); li
1d8e0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
1d8f0 20 73 70 32 2d 3e 64 65 73 74 72 75 63 74 6f 72   sp2->destructor
1d900 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1d910 20 20 7d 0a 0a 20 20 20 20 65 6d 69 74 5f 64 65    }..    emit_de
1d920 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75  structor_code(ou
1d930 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  t,lemp->symbols[
1d940 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  i],lemp,&lineno)
1d950 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
1d960 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c  t,"      break;\
1d970 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
1d980 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
1d990 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1d9a0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1d9b0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
1d9c0 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68  hich executes wh
1d9d0 65 6e 65 76 65 72 20 74 68 65 20 70 61 72 73 65  enever the parse
1d9e0 72 20 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77  r stack overflow
1d9f0 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e  s */.  tplt_prin
1da00 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d  t(out,lemp,lemp-
1da10 3e 6f 76 65 72 66 6c 6f 77 2c 26 6c 69 6e 65 6e  >overflow,&linen
1da20 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  o);.  tplt_xfer(
1da30 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1da40 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1da50 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74  * Generate the t
1da60 61 62 6c 65 20 6f 66 20 72 75 6c 65 20 69 6e 66  able of rule inf
1da70 6f 72 6d 61 74 69 6f 6e 20 0a 20 20 2a 2a 0a 20  ormation .  **. 
1da80 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 63   ** Note: This c
1da90 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ode depends on t
1daa0 68 65 20 66 61 63 74 20 74 68 61 74 20 72 75 6c  he fact that rul
1dab0 65 73 20 61 72 65 20 6e 75 6d 62 65 72 0a 20 20  es are number.  
1dac0 2a 2a 20 73 65 71 75 65 6e 74 75 61 6c 6c 79 20  ** sequentually 
1dad0 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30  beginning with 0
1dae0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d  ..  */.  for(rp=
1daf0 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
1db00 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
1db10 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1db20 20 7b 20 25 64 2c 20 25 64 20 7d 2c 5c 6e 22 2c   { %d, %d },\n",
1db30 72 70 2d 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c 72  rp->lhs->index,r
1db40 70 2d 3e 6e 72 68 73 29 3b 20 6c 69 6e 65 6e 6f  p->nrhs); lineno
1db50 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78  ++;.  }.  tplt_x
1db60 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
1db70 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
1db80 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  .  /* Generate c
1db90 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74  ode which execut
1dba0 69 6f 6e 20 64 75 72 69 6e 67 20 65 61 63 68 20  ion during each 
1dbb0 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20 2a 2f  REDUCE action */
1dbc0 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
1dbd0 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
1dbe0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 74 72 61 6e  >next){.    tran
1dbf0 73 6c 61 74 65 5f 63 6f 64 65 28 6c 65 6d 70 2c  slate_code(lemp,
1dc00 20 72 70 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46   rp);.  }.  /* F
1dc10 69 72 73 74 20 6f 75 74 70 75 74 20 72 75 6c 65  irst output rule
1dc20 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  s other than the
1dc30 20 64 65 66 61 75 6c 74 3a 20 72 75 6c 65 20 2a   default: rule *
1dc40 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  /.  for(rp=lemp-
1dc50 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
1dc60 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 73 74 72  ->next){.    str
1dc70 75 63 74 20 72 75 6c 65 20 2a 72 70 32 3b 20 20  uct rule *rp2;  
1dc80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dc90 4f 74 68 65 72 20 72 75 6c 65 73 20 77 69 74 68  Other rules with
1dca0 20 74 68 65 20 73 61 6d 65 20 61 63 74 69 6f 6e   the same action
1dcb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 70 2d 3e   */.    if( rp->
1dcc0 63 6f 64 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  code==0 ) contin
1dcd0 75 65 3b 0a 20 20 20 20 69 66 28 20 72 70 2d 3e  ue;.    if( rp->
1dce0 63 6f 64 65 5b 30 5d 3d 3d 27 5c 6e 27 20 26 26  code[0]=='\n' &&
1dcf0 20 72 70 2d 3e 63 6f 64 65 5b 31 5d 3d 3d 30 20   rp->code[1]==0 
1dd00 29 20 63 6f 6e 74 69 6e 75 65 3b 20 2f 2a 20 57  ) continue; /* W
1dd10 69 6c 6c 20 62 65 20 64 65 66 61 75 6c 74 3a 20  ill be default: 
1dd20 2a 2f 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  */.    fprintf(o
1dd30 75 74 2c 22 20 20 20 20 20 20 63 61 73 65 20 25  ut,"      case %
1dd40 64 3a 20 2f 2a 20 22 2c 20 72 70 2d 3e 69 6e 64  d: /* ", rp->ind
1dd50 65 78 29 3b 0a 20 20 20 20 77 72 69 74 65 52 75  ex);.    writeRu
1dd60 6c 65 54 65 78 74 28 6f 75 74 2c 20 72 70 29 3b  leText(out, rp);
1dd70 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1dd80 2c 20 22 20 2a 2f 5c 6e 22 29 3b 20 6c 69 6e 65  , " */\n"); line
1dd90 6e 6f 2b 2b 3b 0a 20 20 20 20 66 6f 72 28 72 70  no++;.    for(rp
1dda0 32 3d 72 70 2d 3e 6e 65 78 74 3b 20 72 70 32 3b  2=rp->next; rp2;
1ddb0 20 72 70 32 3d 72 70 32 2d 3e 6e 65 78 74 29 7b   rp2=rp2->next){
1ddc0 0a 20 20 20 20 20 20 69 66 28 20 72 70 32 2d 3e  .      if( rp2->
1ddd0 63 6f 64 65 3d 3d 72 70 2d 3e 63 6f 64 65 20 29  code==rp->code )
1dde0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
1ddf0 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63 61 73  f(out,"      cas
1de00 65 20 25 64 3a 20 2f 2a 20 22 2c 20 72 70 32 2d  e %d: /* ", rp2-
1de10 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20  >index);.       
1de20 20 77 72 69 74 65 52 75 6c 65 54 65 78 74 28 6f   writeRuleText(o
1de30 75 74 2c 20 72 70 32 29 3b 0a 20 20 20 20 20 20  ut, rp2);.      
1de40 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
1de50 2a 2f 20 79 79 74 65 73 74 63 61 73 65 28 79 79  */ yytestcase(yy
1de60 72 75 6c 65 6e 6f 3d 3d 25 64 29 3b 5c 6e 22 2c  ruleno==%d);\n",
1de70 20 72 70 32 2d 3e 69 6e 64 65 78 29 3b 20 6c 69   rp2->index); li
1de80 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
1de90 72 70 32 2d 3e 63 6f 64 65 20 3d 20 30 3b 0a 20  rp2->code = 0;. 
1dea0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1deb0 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74 2c 72   emit_code(out,r
1dec0 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b  p,lemp,&lineno);
1ded0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
1dee0 2c 22 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ,"        break;
1def0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1df00 20 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 30      rp->code = 0
1df10 3b 0a 20 20 7d 0a 20 20 2f 2a 20 46 69 6e 61 6c  ;.  }.  /* Final
1df20 6c 79 2c 20 6f 75 74 70 75 74 20 74 68 65 20 64  ly, output the d
1df30 65 66 61 75 6c 74 3a 20 72 75 6c 65 2e 20 20 57  efault: rule.  W
1df40 65 20 63 68 6f 6f 73 65 20 61 73 20 74 68 65 20  e choose as the 
1df50 64 65 66 61 75 6c 74 3a 20 61 6c 6c 0a 20 20 2a  default: all.  *
1df60 2a 20 65 6d 70 74 79 20 61 63 74 69 6f 6e 73 2e  * empty actions.
1df70 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
1df80 74 2c 22 20 20 20 20 20 20 64 65 66 61 75 6c 74  t,"      default
1df90 3a 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  :\n"); lineno++;
1dfa0 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e  .  for(rp=lemp->
1dfb0 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
1dfc0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  >next){.    if( 
1dfd0 72 70 2d 3e 63 6f 64 65 3d 3d 30 20 29 20 63 6f  rp->code==0 ) co
1dfe0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 61 73 73 65  ntinue;.    asse
1dff0 72 74 28 20 72 70 2d 3e 63 6f 64 65 5b 30 5d 3d  rt( rp->code[0]=
1e000 3d 27 5c 6e 27 20 26 26 20 72 70 2d 3e 63 6f 64  ='\n' && rp->cod
1e010 65 5b 31 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 66  e[1]==0 );.    f
1e020 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
1e030 20 20 2f 2a 20 28 25 64 29 20 22 2c 20 72 70 2d    /* (%d) ", rp-
1e040 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 77 72 69  >index);.    wri
1e050 74 65 52 75 6c 65 54 65 78 74 28 6f 75 74 2c 20  teRuleText(out, 
1e060 72 70 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  rp);.    fprintf
1e070 28 6f 75 74 2c 20 22 20 2a 2f 20 79 79 74 65 73  (out, " */ yytes
1e080 74 63 61 73 65 28 79 79 72 75 6c 65 6e 6f 3d 3d  tcase(yyruleno==
1e090 25 64 29 3b 5c 6e 22 2c 20 72 70 2d 3e 69 6e 64  %d);\n", rp->ind
1e0a0 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ex); lineno++;. 
1e0b0 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
1e0c0 2c 22 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ,"        break;
1e0d0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
1e0e0 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
1e0f0 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
1e100 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
1e110 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63  nerate code whic
1e120 68 20 65 78 65 63 75 74 65 73 20 69 66 20 61 20  h executes if a 
1e130 70 61 72 73 65 20 66 61 69 6c 73 20 2a 2f 0a 20  parse fails */. 
1e140 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
1e150 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 66 61 69 6c 75  lemp,lemp->failu
1e160 72 65 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74  re,&lineno);.  t
1e170 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1e180 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1e190 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1e1a0 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
1e1b0 78 65 63 75 74 65 73 20 77 68 65 6e 20 61 20 73  xecutes when a s
1e1c0 79 6e 74 61 78 20 65 72 72 6f 72 20 6f 63 63 75  yntax error occu
1e1d0 72 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  rs */.  tplt_pri
1e1e0 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
1e1f0 2d 3e 65 72 72 6f 72 2c 26 6c 69 6e 65 6e 6f 29  ->error,&lineno)
1e200 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
1e210 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1e220 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1e230 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68  Generate code wh
1e240 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65  ich executes whe
1e250 6e 20 74 68 65 20 70 61 72 73 65 72 20 61 63 63  n the parser acc
1e260 65 70 74 73 20 69 74 73 20 69 6e 70 75 74 20 2a  epts its input *
1e270 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f  /.  tplt_print(o
1e280 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 61 63  ut,lemp,lemp->ac
1e290 63 65 70 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  cept,&lineno);. 
1e2a0 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
1e2b0 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
1e2c0 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 41 70 70  neno);..  /* App
1e2d0 65 6e 64 20 61 6e 79 20 61 64 64 69 74 69 6f 6e  end any addition
1e2e0 20 63 6f 64 65 20 74 68 65 20 75 73 65 72 20 64   code the user d
1e2f0 65 73 69 72 65 73 20 2a 2f 0a 20 20 74 70 6c 74  esires */.  tplt
1e300 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c  _print(out,lemp,
1e310 6c 65 6d 70 2d 3e 65 78 74 72 61 63 6f 64 65 2c  lemp->extracode,
1e320 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 66 63 6c  &lineno);..  fcl
1e330 6f 73 65 28 69 6e 29 3b 0a 20 20 66 63 6c 6f 73  ose(in);.  fclos
1e340 65 28 6f 75 74 29 3b 0a 20 20 72 65 74 75 72 6e  e(out);.  return
1e350 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65  ;.}../* Generate
1e360 20 61 20 68 65 61 64 65 72 20 66 69 6c 65 20 66   a header file f
1e370 6f 72 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f  or the parser */
1e380 0a 76 6f 69 64 20 52 65 70 6f 72 74 48 65 61 64  .void ReportHead
1e390 65 72 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  er(struct lemon 
1e3a0 2a 6c 65 6d 70 29 0a 7b 0a 20 20 46 49 4c 45 20  *lemp).{.  FILE 
1e3b0 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 6f 6e  *out, *in;.  con
1e3c0 73 74 20 63 68 61 72 20 2a 70 72 65 66 69 78 3b  st char *prefix;
1e3d0 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e  .  char line[LIN
1e3e0 45 53 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70  ESIZE];.  char p
1e3f0 61 74 74 65 72 6e 5b 4c 49 4e 45 53 49 5a 45 5d  attern[LINESIZE]
1e400 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66  ;.  int i;..  if
1e410 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65  ( lemp->tokenpre
1e420 66 69 78 20 29 20 70 72 65 66 69 78 20 3d 20 6c  fix ) prefix = l
1e430 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78  emp->tokenprefix
1e440 3b 0a 20 20 65 6c 73 65 20 20 20 20 20 20 20 20  ;.  else        
1e450 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66              pref
1e460 69 78 20 3d 20 22 22 3b 0a 20 20 69 6e 20 3d 20  ix = "";.  in = 
1e470 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22  file_open(lemp,"
1e480 2e 68 22 2c 22 72 62 22 29 3b 0a 20 20 69 66 28  .h","rb");.  if(
1e490 20 69 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e   in ){.    int n
1e4a0 65 78 74 43 68 61 72 3b 0a 20 20 20 20 66 6f 72  extChar;.    for
1e4b0 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74  (i=1; i<lemp->nt
1e4c0 65 72 6d 69 6e 61 6c 20 26 26 20 66 67 65 74 73  erminal && fgets
1e4d0 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69  (line,LINESIZE,i
1e4e0 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  n); i++){.      
1e4f0 73 70 72 69 6e 74 66 28 70 61 74 74 65 72 6e 2c  sprintf(pattern,
1e500 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73  "#define %s%-30s
1e510 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c   %2d\n",prefix,l
1e520 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
1e530 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20  >name,i);.      
1e540 69 66 28 20 73 74 72 63 6d 70 28 6c 69 6e 65 2c  if( strcmp(line,
1e550 70 61 74 74 65 72 6e 29 20 29 20 62 72 65 61 6b  pattern) ) break
1e560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 78 74  ;.    }.    next
1e570 43 68 61 72 20 3d 20 66 67 65 74 63 28 69 6e 29  Char = fgetc(in)
1e580 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  ;.    fclose(in)
1e590 3b 0a 20 20 20 20 69 66 28 20 69 3d 3d 6c 65 6d  ;.    if( i==lem
1e5a0 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26 20  p->nterminal && 
1e5b0 6e 65 78 74 43 68 61 72 3d 3d 45 4f 46 20 29 7b  nextChar==EOF ){
1e5c0 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 20 63 68 61  .      /* No cha
1e5d0 6e 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  nge in the file.
1e5e0 20 20 44 6f 6e 27 74 20 72 65 77 72 69 74 65 20    Don't rewrite 
1e5f0 69 74 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  it. */.      ret
1e600 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  urn;.    }.  }. 
1e610 20 6f 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e   out = file_open
1e620 28 6c 65 6d 70 2c 22 2e 68 22 2c 22 77 62 22 29  (lemp,".h","wb")
1e630 3b 0a 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20  ;.  if( out ){. 
1e640 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65     for(i=1; i<le
1e650 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69  mp->nterminal; i
1e660 2b 2b 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ++){.      fprin
1e670 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
1e680 25 73 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70  %s%-30s %2d\n",p
1e690 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62  refix,lemp->symb
1e6a0 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b  ols[i]->name,i);
1e6b0 0a 20 20 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73  .    }.    fclos
1e6c0 65 28 6f 75 74 29 3b 20 20 0a 20 20 7d 0a 20 20  e(out);  .  }.  
1e6d0 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65  return;.}../* Re
1e6e0 64 75 63 65 20 74 68 65 20 73 69 7a 65 20 6f 66  duce the size of
1e6f0 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
1e700 65 73 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c  es, if possible,
1e710 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 0a 2a   by making use.*
1e720 2a 20 6f 66 20 64 65 66 61 75 6c 74 73 2e 0a 2a  * of defaults..*
1e730 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20 76 65 72  *.** In this ver
1e740 73 69 6f 6e 2c 20 77 65 20 74 61 6b 65 20 74 68  sion, we take th
1e750 65 20 6d 6f 73 74 20 66 72 65 71 75 65 6e 74 20  e most frequent 
1e760 52 45 44 55 43 45 20 61 63 74 69 6f 6e 20 61 6e  REDUCE action an
1e770 64 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 74 68 65  d make.** it the
1e780 20 64 65 66 61 75 6c 74 2e 20 20 45 78 63 65 70   default.  Excep
1e790 74 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  t, there is no d
1e7a0 65 66 61 75 6c 74 20 69 66 20 74 68 65 20 77 69  efault if the wi
1e7b0 6c 64 63 61 72 64 20 74 6f 6b 65 6e 0a 2a 2a 20  ldcard token.** 
1e7c0 69 73 20 61 20 70 6f 73 73 69 62 6c 65 20 6c 6f  is a possible lo
1e7d0 6f 6b 2d 61 68 65 61 64 2e 0a 2a 2f 0a 76 6f 69  ok-ahead..*/.voi
1e7e0 64 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73  d CompressTables
1e7f0 28 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  (struct lemon *l
1e800 65 6d 70 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  emp).{.  struct 
1e810 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
1e820 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c  ruct action *ap,
1e830 20 2a 61 70 32 3b 0a 20 20 73 74 72 75 63 74 20   *ap2;.  struct 
1e840 72 75 6c 65 20 2a 72 70 2c 20 2a 72 70 32 2c 20  rule *rp, *rp2, 
1e850 2a 72 62 65 73 74 3b 0a 20 20 69 6e 74 20 6e 62  *rbest;.  int nb
1e860 65 73 74 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 3b  est, n;.  int i;
1e870 0a 20 20 69 6e 74 20 75 73 65 73 57 69 6c 64 63  .  int usesWildc
1e880 61 72 64 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ard;..  for(i=0;
1e890 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
1e8a0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
1e8b0 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
1e8c0 3b 0a 20 20 20 20 6e 62 65 73 74 20 3d 20 30 3b  ;.    nbest = 0;
1e8d0 0a 20 20 20 20 72 62 65 73 74 20 3d 20 30 3b 0a  .    rbest = 0;.
1e8e0 20 20 20 20 75 73 65 73 57 69 6c 64 63 61 72 64      usesWildcard
1e8f0 20 3d 20 30 3b 0a 0a 20 20 20 20 66 6f 72 28 61   = 0;..    for(a
1e900 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
1e910 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
1e920 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d     if( ap->type=
1e930 3d 53 48 49 46 54 20 26 26 20 61 70 2d 3e 73 70  =SHIFT && ap->sp
1e940 3d 3d 6c 65 6d 70 2d 3e 77 69 6c 64 63 61 72 64  ==lemp->wildcard
1e950 20 29 7b 0a 20 20 20 20 20 20 20 20 75 73 65 73   ){.        uses
1e960 57 69 6c 64 63 61 72 64 20 3d 20 31 3b 0a 20 20  Wildcard = 1;.  
1e970 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1e980 61 70 2d 3e 74 79 70 65 21 3d 52 45 44 55 43 45  ap->type!=REDUCE
1e990 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1e9a0 20 20 20 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70     rp = ap->x.rp
1e9b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e  ;.      if( rp->
1e9c0 6c 68 73 53 74 61 72 74 20 29 20 63 6f 6e 74 69  lhsStart ) conti
1e9d0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nue;.      if( r
1e9e0 70 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69  p==rbest ) conti
1e9f0 6e 75 65 3b 0a 20 20 20 20 20 20 6e 20 3d 20 31  nue;.      n = 1
1ea00 3b 0a 20 20 20 20 20 20 66 6f 72 28 61 70 32 3d  ;.      for(ap2=
1ea10 61 70 2d 3e 6e 65 78 74 3b 20 61 70 32 3b 20 61  ap->next; ap2; a
1ea20 70 32 3d 61 70 32 2d 3e 6e 65 78 74 29 7b 0a 20  p2=ap2->next){. 
1ea30 20 20 20 20 20 20 20 69 66 28 20 61 70 32 2d 3e         if( ap2->
1ea40 74 79 70 65 21 3d 52 45 44 55 43 45 20 29 20 63  type!=REDUCE ) c
1ea50 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1ea60 20 72 70 32 20 3d 20 61 70 32 2d 3e 78 2e 72 70   rp2 = ap2->x.rp
1ea70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70  ;.        if( rp
1ea80 32 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69  2==rbest ) conti
1ea90 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
1eaa0 20 72 70 32 3d 3d 72 70 20 29 20 6e 2b 2b 3b 0a   rp2==rp ) n++;.
1eab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1eac0 28 20 6e 3e 6e 62 65 73 74 20 29 7b 0a 20 20 20  ( n>nbest ){.   
1ead0 20 20 20 20 20 6e 62 65 73 74 20 3d 20 6e 3b 0a       nbest = n;.
1eae0 20 20 20 20 20 20 20 20 72 62 65 73 74 20 3d 20          rbest = 
1eaf0 72 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rp;.      }.    
1eb00 7d 0a 20 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  }. .    /* Do no
1eb10 74 20 6d 61 6b 65 20 61 20 64 65 66 61 75 6c 74  t make a default
1eb20 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   if the number o
1eb30 66 20 72 75 6c 65 73 20 74 6f 20 64 65 66 61 75  f rules to defau
1eb40 6c 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  lt.    ** is not
1eb50 20 61 74 20 6c 65 61 73 74 20 31 20 6f 72 20 69   at least 1 or i
1eb60 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 74  f the wildcard t
1eb70 6f 6b 65 6e 20 69 73 20 61 20 70 6f 73 73 69 62  oken is a possib
1eb80 6c 65 0a 20 20 20 20 2a 2a 20 6c 6f 6f 6b 61 68  le.    ** lookah
1eb90 65 61 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ead..    */.    
1eba0 69 66 28 20 6e 62 65 73 74 3c 31 20 7c 7c 20 75  if( nbest<1 || u
1ebb0 73 65 73 57 69 6c 64 63 61 72 64 20 29 20 63 6f  sesWildcard ) co
1ebc0 6e 74 69 6e 75 65 3b 0a 0a 0a 20 20 20 20 2f 2a  ntinue;...    /*
1ebd0 20 43 6f 6d 62 69 6e 65 20 6d 61 74 63 68 69 6e   Combine matchin
1ebe0 67 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 73  g REDUCE actions
1ebf0 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 64   into a single d
1ec00 65 66 61 75 6c 74 20 2a 2f 0a 20 20 20 20 66 6f  efault */.    fo
1ec10 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70  r(ap=stp->ap; ap
1ec20 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
1ec30 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
1ec40 70 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70  pe==REDUCE && ap
1ec50 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20  ->x.rp==rbest ) 
1ec60 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1ec70 20 61 73 73 65 72 74 28 20 61 70 20 29 3b 0a 20   assert( ap );. 
1ec80 20 20 20 61 70 2d 3e 73 70 20 3d 20 53 79 6d 62     ap->sp = Symb
1ec90 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61 75 6c 74  ol_new("{default
1eca0 7d 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  }");.    for(ap=
1ecb0 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3b 20 61 70  ap->next; ap; ap
1ecc0 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
1ecd0 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d    if( ap->type==
1ece0 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e  REDUCE && ap->x.
1ecf0 72 70 3d 3d 72 62 65 73 74 20 29 20 61 70 2d 3e  rp==rbest ) ap->
1ed00 74 79 70 65 20 3d 20 4e 4f 54 5f 55 53 45 44 3b  type = NOT_USED;
1ed10 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 70 2d 3e  .    }.    stp->
1ed20 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74  ap = Action_sort
1ed30 28 73 74 70 2d 3e 61 70 29 3b 0a 20 20 7d 0a 7d  (stp->ap);.  }.}
1ed40 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  .../*.** Compare
1ed50 20 74 77 6f 20 73 74 61 74 65 73 20 66 6f 72 20   two states for 
1ed60 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65 73  sorting purposes
1ed70 2e 20 20 54 68 65 20 73 6d 61 6c 6c 65 72 20 73  .  The smaller s
1ed80 74 61 74 65 20 69 73 20 74 68 65 0a 2a 2a 20 6f  tate is the.** o
1ed90 6e 65 20 77 69 74 68 20 74 68 65 20 6d 6f 73 74  ne with the most
1eda0 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 61 63   non-terminal ac
1edb0 74 69 6f 6e 73 2e 20 20 49 66 20 74 68 65 79 20  tions.  If they 
1edc0 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 75  have the same nu
1edd0 6d 62 65 72 0a 2a 2a 20 6f 66 20 6e 6f 6e 2d 74  mber.** of non-t
1ede0 65 72 6d 69 6e 61 6c 20 61 63 74 69 6f 6e 73 2c  erminal actions,
1edf0 20 74 68 65 6e 20 74 68 65 20 73 6d 61 6c 6c 65   then the smalle
1ee00 72 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  r is the one wit
1ee10 68 20 74 68 65 20 6d 6f 73 74 0a 2a 2a 20 74 6f  h the most.** to
1ee20 6b 65 6e 20 61 63 74 69 6f 6e 73 2e 0a 2a 2f 0a  ken actions..*/.
1ee30 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 74 65  static int state
1ee40 52 65 73 6f 72 74 43 6f 6d 70 61 72 65 28 63 6f  ResortCompare(co
1ee50 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e  nst void *a, con
1ee60 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 63  st void *b){.  c
1ee70 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74  onst struct stat
1ee80 65 20 2a 70 41 20 3d 20 2a 28 63 6f 6e 73 74 20  e *pA = *(const 
1ee90 73 74 72 75 63 74 20 73 74 61 74 65 2a 2a 29 61  struct state**)a
1eea0 3b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74  ;.  const struct
1eeb0 20 73 74 61 74 65 20 2a 70 42 20 3d 20 2a 28 63   state *pB = *(c
1eec0 6f 6e 73 74 20 73 74 72 75 63 74 20 73 74 61 74  onst struct stat
1eed0 65 2a 2a 29 62 3b 0a 20 20 69 6e 74 20 6e 3b 0a  e**)b;.  int n;.
1eee0 0a 20 20 6e 20 3d 20 70 42 2d 3e 6e 4e 74 41 63  .  n = pB->nNtAc
1eef0 74 20 2d 20 70 41 2d 3e 6e 4e 74 41 63 74 3b 0a  t - pA->nNtAct;.
1ef00 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
1ef10 20 20 6e 20 3d 20 70 42 2d 3e 6e 54 6b 6e 41 63    n = pB->nTknAc
1ef20 74 20 2d 20 70 41 2d 3e 6e 54 6b 6e 41 63 74 3b  t - pA->nTknAct;
1ef30 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  .    if( n==0 ){
1ef40 0a 20 20 20 20 20 20 6e 20 3d 20 70 42 2d 3e 73  .      n = pB->s
1ef50 74 61 74 65 6e 75 6d 20 2d 20 70 41 2d 3e 73 74  tatenum - pA->st
1ef60 61 74 65 6e 75 6d 3b 0a 20 20 20 20 7d 0a 20 20  atenum;.    }.  
1ef70 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 21 3d 30  }.  assert( n!=0
1ef80 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a   );.  return n;.
1ef90 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 75 6d 62  }.../*.** Renumb
1efa0 65 72 20 61 6e 64 20 72 65 73 6f 72 74 20 73 74  er and resort st
1efb0 61 74 65 73 20 73 6f 20 74 68 61 74 20 73 74 61  ates so that sta
1efc0 74 65 73 20 77 69 74 68 20 66 65 77 65 72 20 63  tes with fewer c
1efd0 68 6f 69 63 65 73 0a 2a 2a 20 6f 63 63 75 72 20  hoices.** occur 
1efe0 61 74 20 74 68 65 20 65 6e 64 2e 20 20 45 78 63  at the end.  Exc
1eff0 65 70 74 2c 20 6b 65 65 70 20 73 74 61 74 65 20  ept, keep state 
1f000 30 20 61 73 20 74 68 65 20 66 69 72 73 74 20 73  0 as the first s
1f010 74 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 52 65  tate..*/.void Re
1f020 73 6f 72 74 53 74 61 74 65 73 28 73 74 72 75 63  sortStates(struc
1f030 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 29 0a 7b  t lemon *lemp).{
1f040 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
1f050 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20  ct state *stp;. 
1f060 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
1f070 61 70 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ap;..  for(i=0; 
1f080 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  i<lemp->nstate; 
1f090 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
1f0a0 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
1f0b0 0a 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63  .    stp->nTknAc
1f0c0 74 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74 20  t = stp->nNtAct 
1f0d0 3d 20 30 3b 0a 20 20 20 20 73 74 70 2d 3e 69 44  = 0;.    stp->iD
1f0e0 66 6c 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  flt = lemp->nsta
1f0f0 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  te + lemp->nrule
1f100 3b 0a 20 20 20 20 73 74 70 2d 3e 69 54 6b 6e 4f  ;.    stp->iTknO
1f110 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b  fst = NO_OFFSET;
1f120 0a 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f 66 73  .    stp->iNtOfs
1f130 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20  t = NO_OFFSET;. 
1f140 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61     for(ap=stp->a
1f150 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65  p; ap; ap=ap->ne
1f160 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  xt){.      if( c
1f170 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65  ompute_action(le
1f180 6d 70 2c 61 70 29 3e 3d 30 20 29 7b 0a 20 20 20  mp,ap)>=0 ){.   
1f190 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d       if( ap->sp-
1f1a0 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65  >index<lemp->nte
1f1b0 72 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  rminal ){.      
1f1c0 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74      stp->nTknAct
1f1d0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
1f1e0 65 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e  e if( ap->sp->in
1f1f0 64 65 78 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  dex<lemp->nsymbo
1f200 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  l ){.          s
1f210 74 70 2d 3e 6e 4e 74 41 63 74 2b 2b 3b 0a 20 20  tp->nNtAct++;.  
1f220 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f230 20 20 20 20 20 20 20 73 74 70 2d 3e 69 44 66 6c         stp->iDfl
1f240 74 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74 69  t = compute_acti
1f250 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20 20  on(lemp, ap);.  
1f260 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f270 20 20 20 20 7d 0a 20 20 7d 0a 20 20 71 73 6f 72      }.  }.  qsor
1f280 74 28 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b  t(&lemp->sorted[
1f290 31 5d 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  1], lemp->nstate
1f2a0 2d 31 2c 20 73 69 7a 65 6f 66 28 6c 65 6d 70 2d  -1, sizeof(lemp-
1f2b0 3e 73 6f 72 74 65 64 5b 30 5d 29 2c 0a 20 20 20  >sorted[0]),.   
1f2c0 20 20 20 20 20 73 74 61 74 65 52 65 73 6f 72 74       stateResort
1f2d0 43 6f 6d 70 61 72 65 29 3b 0a 20 20 66 6f 72 28  Compare);.  for(
1f2e0 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
1f2f0 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 6c  ate; i++){.    l
1f300 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e  emp->sorted[i]->
1f310 73 74 61 74 65 6e 75 6d 20 3d 20 69 3b 0a 20 20  statenum = i;.  
1f320 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}.../*********
1f330 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
1f340 65 20 66 69 6c 65 20 22 73 65 74 2e 63 22 20 2a  e file "set.c" *
1f350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f370 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6d  ***/./*.** Set m
1f380 61 6e 69 70 75 6c 61 74 69 6f 6e 20 72 6f 75 74  anipulation rout
1f390 69 6e 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d  ines for the LEM
1f3a0 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
1f3b0 74 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20  tor..*/..static 
1f3c0 69 6e 74 20 73 69 7a 65 20 3d 20 30 3b 0a 0a 2f  int size = 0;../
1f3d0 2a 20 53 65 74 20 74 68 65 20 73 65 74 20 73 69  * Set the set si
1f3e0 7a 65 20 2a 2f 0a 76 6f 69 64 20 53 65 74 53 69  ze */.void SetSi
1f3f0 7a 65 28 69 6e 74 20 6e 29 0a 7b 0a 20 20 73 69  ze(int n).{.  si
1f400 7a 65 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20  ze = n+1;.}../* 
1f410 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73  Allocate a new s
1f420 65 74 20 2a 2f 0a 63 68 61 72 20 2a 53 65 74 4e  et */.char *SetN
1f430 65 77 28 29 7b 0a 20 20 63 68 61 72 20 2a 73 3b  ew(){.  char *s;
1f440 0a 20 20 73 20 3d 20 28 63 68 61 72 2a 29 63 61  .  s = (char*)ca
1f450 6c 6c 6f 63 28 20 73 69 7a 65 2c 20 31 29 3b 0a  lloc( size, 1);.
1f460 20 20 69 66 28 20 73 3d 3d 30 20 29 7b 0a 20 20    if( s==0 ){.  
1f470 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20 6d 65    extern void me
1f480 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20  mory_error();.  
1f490 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29    memory_error()
1f4a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
1f4b0 3b 0a 7d 0a 0a 2f 2a 20 44 65 61 6c 6c 6f 63 61  ;.}../* Dealloca
1f4c0 74 65 20 61 20 73 65 74 20 2a 2f 0a 76 6f 69 64  te a set */.void
1f4d0 20 53 65 74 46 72 65 65 28 63 68 61 72 20 2a 73   SetFree(char *s
1f4e0 29 0a 7b 0a 20 20 66 72 65 65 28 73 29 3b 0a 7d  ).{.  free(s);.}
1f4f0 0a 0a 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 65  ../* Add a new e
1f500 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 73 65  lement to the se
1f510 74 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  t.  Return TRUE 
1f520 69 66 20 74 68 65 20 65 6c 65 6d 65 6e 74 20 77  if the element w
1f530 61 73 20 61 64 64 65 64 0a 2a 2a 20 61 6e 64 20  as added.** and 
1f540 46 41 4c 53 45 20 69 66 20 69 74 20 77 61 73 20  FALSE if it was 
1f550 61 6c 72 65 61 64 79 20 74 68 65 72 65 2e 20 2a  already there. *
1f560 2f 0a 69 6e 74 20 53 65 74 41 64 64 28 63 68 61  /.int SetAdd(cha
1f570 72 20 2a 73 2c 20 69 6e 74 20 65 29 0a 7b 0a 20  r *s, int e).{. 
1f580 20 69 6e 74 20 72 76 3b 0a 20 20 61 73 73 65 72   int rv;.  asser
1f590 74 28 20 65 3e 3d 30 20 26 26 20 65 3c 73 69 7a  t( e>=0 && e<siz
1f5a0 65 20 29 3b 0a 20 20 72 76 20 3d 20 73 5b 65 5d  e );.  rv = s[e]
1f5b0 3b 0a 20 20 73 5b 65 5d 20 3d 20 31 3b 0a 20 20  ;.  s[e] = 1;.  
1f5c0 72 65 74 75 72 6e 20 21 72 76 3b 0a 7d 0a 0a 2f  return !rv;.}../
1f5d0 2a 20 41 64 64 20 65 76 65 72 79 20 65 6c 65 6d  * Add every elem
1f5e0 65 6e 74 20 6f 66 20 73 32 20 74 6f 20 73 31 2e  ent of s2 to s1.
1f5f0 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
1f600 20 73 31 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a   s1 changes. */.
1f610 69 6e 74 20 53 65 74 55 6e 69 6f 6e 28 63 68 61  int SetUnion(cha
1f620 72 20 2a 73 31 2c 20 63 68 61 72 20 2a 73 32 29  r *s1, char *s2)
1f630 0a 7b 0a 20 20 69 6e 74 20 69 2c 20 70 72 6f 67  .{.  int i, prog
1f640 72 65 73 73 3b 0a 20 20 70 72 6f 67 72 65 73 73  ress;.  progress
1f650 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
1f660 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20   i<size; i++){. 
1f670 20 20 20 69 66 28 20 73 32 5b 69 5d 3d 3d 30 20     if( s2[i]==0 
1f680 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1f690 69 66 28 20 73 31 5b 69 5d 3d 3d 30 20 29 7b 0a  if( s1[i]==0 ){.
1f6a0 20 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d        progress =
1f6b0 20 31 3b 0a 20 20 20 20 20 20 73 31 5b 69 5d 20   1;.      s1[i] 
1f6c0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
1f6d0 20 72 65 74 75 72 6e 20 70 72 6f 67 72 65 73 73   return progress
1f6e0 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}./***********
1f6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
1f700 20 74 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65   the file "table
1f710 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
1f720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1f730 2f 0a 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65  /./*.** All code
1f740 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 68 61   in this file ha
1f750 73 20 62 65 65 6e 20 61 75 74 6f 6d 61 74 69 63  s been automatic
1f760 61 6c 6c 79 20 67 65 6e 65 72 61 74 65 64 0a 2a  ally generated.*
1f770 2a 20 66 72 6f 6d 20 61 20 73 70 65 63 69 66 69  * from a specifi
1f780 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 66 69  cation in the fi
1f790 6c 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  le.**           
1f7a0 20 20 20 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20     "table.q".** 
1f7b0 62 79 20 74 68 65 20 61 73 73 6f 63 69 61 74 69  by the associati
1f7c0 76 65 20 61 72 72 61 79 20 63 6f 64 65 20 62 75  ve array code bu
1f7d0 69 6c 64 69 6e 67 20 70 72 6f 67 72 61 6d 20 22  ilding program "
1f7e0 61 61 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f  aagen"..** Do no
1f7f0 74 20 65 64 69 74 20 74 68 69 73 20 66 69 6c 65  t edit this file
1f800 21 20 20 49 6e 73 74 65 61 64 2c 20 65 64 69 74  !  Instead, edit
1f810 20 74 68 65 20 73 70 65 63 69 66 69 63 61 74 69   the specificati
1f820 6f 6e 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e  on.** file, then
1f830 20 72 65 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f   rerun aagen..*/
1f840 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20  ./*.** Code for 
1f850 70 72 6f 63 65 73 73 69 6e 67 20 74 61 62 6c 65  processing table
1f860 73 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70  s in the LEMON p
1f870 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e  arser generator.
1f880 0a 2a 2f 0a 0a 50 52 49 56 41 54 45 20 75 6e 73  .*/..PRIVATE uns
1f890 69 67 6e 65 64 20 73 74 72 68 61 73 68 28 63 6f  igned strhash(co
1f8a0 6e 73 74 20 63 68 61 72 20 2a 78 29 0a 7b 0a 20  nst char *x).{. 
1f8b0 20 75 6e 73 69 67 6e 65 64 20 68 20 3d 20 30 3b   unsigned h = 0;
1f8c0 0a 20 20 77 68 69 6c 65 28 20 2a 78 20 29 20 68  .  while( *x ) h
1f8d0 20 3d 20 68 2a 31 33 20 2b 20 2a 28 78 2b 2b 29   = h*13 + *(x++)
1f8e0 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a  ;.  return h;.}.
1f8f0 0a 2f 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73  ./* Works like s
1f900 74 72 64 75 70 2c 20 73 6f 72 74 20 6f 66 2e 20  trdup, sort of. 
1f910 20 53 61 76 65 20 61 20 73 74 72 69 6e 67 20 69   Save a string i
1f920 6e 20 6d 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72  n malloced memor
1f930 79 2c 20 62 75 74 0a 2a 2a 20 6b 65 65 70 20 73  y, but.** keep s
1f940 74 72 69 6e 67 73 20 69 6e 20 61 20 74 61 62 6c  trings in a tabl
1f950 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 61  e so that the sa
1f960 6d 65 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74  me string is not
1f970 20 69 6e 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e   in more.** than
1f980 20 6f 6e 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63   one place..*/.c
1f990 6f 6e 73 74 20 63 68 61 72 20 2a 53 74 72 73 61  onst char *Strsa
1f9a0 66 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 79  fe(const char *y
1f9b0 29 0a 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ).{.  const char
1f9c0 20 2a 7a 3b 0a 20 20 63 68 61 72 20 2a 63 70 79   *z;.  char *cpy
1f9d0 3b 0a 0a 20 20 69 66 28 20 79 3d 3d 30 20 29 20  ;..  if( y==0 ) 
1f9e0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 20 3d 20  return 0;.  z = 
1f9f0 53 74 72 73 61 66 65 5f 66 69 6e 64 28 79 29 3b  Strsafe_find(y);
1fa00 0a 20 20 69 66 28 20 7a 3d 3d 30 20 26 26 20 28  .  if( z==0 && (
1fa10 63 70 79 3d 28 63 68 61 72 20 2a 29 6d 61 6c 6c  cpy=(char *)mall
1fa20 6f 63 28 20 6c 65 6d 6f 6e 53 74 72 6c 65 6e 28  oc( lemonStrlen(
1fa30 79 29 2b 31 20 29 29 21 3d 30 20 29 7b 0a 20 20  y)+1 ))!=0 ){.  
1fa40 20 20 73 74 72 63 70 79 28 63 70 79 2c 79 29 3b    strcpy(cpy,y);
1fa50 0a 20 20 20 20 7a 20 3d 20 63 70 79 3b 0a 20 20  .    z = cpy;.  
1fa60 20 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74    Strsafe_insert
1fa70 28 7a 29 3b 0a 20 20 7d 0a 20 20 4d 65 6d 6f 72  (z);.  }.  Memor
1fa80 79 43 68 65 63 6b 28 7a 29 3b 0a 20 20 72 65 74  yCheck(z);.  ret
1fa90 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  urn z;.}../* The
1faa0 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
1fab0 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
1fac0 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f  ing structure fo
1fad0 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69  r each.** associ
1fae0 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
1faf0 79 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 73 74 72  ype "x1"..*/.str
1fb00 75 63 74 20 73 5f 78 31 20 7b 0a 20 20 69 6e 74  uct s_x1 {.  int
1fb10 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
1fb20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
1fb30 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
1fb40 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20  slots. */.      
1fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb60 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65      /*   Must be
1fb70 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72   a power of 2 gr
1fb80 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f  eater than or */
1fb90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
1fbb0 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20  equal to 1 */.  
1fbc0 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20  int count;      
1fbd0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1fbe0 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73  r of currently s
1fbf0 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20  lots filled */. 
1fc00 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
1fc10 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64   *tbl;  /* The d
1fc20 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20  ata stored here 
1fc30 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31  */.  struct s_x1
1fc40 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48  node **ht;  /* H
1fc50 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f  ash table for lo
1fc60 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  okups */.};../* 
1fc70 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
1fc80 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
1fc90 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72  ructure for ever
1fca0 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a  y data element.*
1fcb0 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74  * in an associat
1fcc0 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
1fcd0 65 20 22 78 31 22 2e 0a 2a 2f 0a 74 79 70 65 64  e "x1"..*/.typed
1fce0 65 66 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f  ef struct s_x1no
1fcf0 64 65 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  de {.  const cha
1fd00 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  r *data;        
1fd10 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20  /* The data */. 
1fd20 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65   struct s_x1node
1fd30 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78   *next;   /* Nex
1fd40 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65  t entry with the
1fd50 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20   same hash */.  
1fd60 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20  struct s_x1node 
1fd70 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76  **from;  /* Prev
1fd80 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78  ious link */.} x
1fd90 31 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65  1node;../* There
1fda0 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73   is only one ins
1fdb0 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72  tance of the arr
1fdc0 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65  ay, which is the
1fdd0 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74   following */.st
1fde0 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 31  atic struct s_x1
1fdf0 20 2a 78 31 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63   *x1a;../* Alloc
1fe00 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69  ate a new associ
1fe10 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76  ative array */.v
1fe20 6f 69 64 20 53 74 72 73 61 66 65 5f 69 6e 69 74  oid Strsafe_init
1fe30 28 29 7b 0a 20 20 69 66 28 20 78 31 61 20 29 20  (){.  if( x1a ) 
1fe40 72 65 74 75 72 6e 3b 0a 20 20 78 31 61 20 3d 20  return;.  x1a = 
1fe50 28 73 74 72 75 63 74 20 73 5f 78 31 2a 29 6d 61  (struct s_x1*)ma
1fe60 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72  lloc( sizeof(str
1fe70 75 63 74 20 73 5f 78 31 29 20 29 3b 0a 20 20 69  uct s_x1) );.  i
1fe80 66 28 20 78 31 61 20 29 7b 0a 20 20 20 20 78 31  f( x1a ){.    x1
1fe90 61 2d 3e 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a  a->size = 1024;.
1fea0 20 20 20 20 78 31 61 2d 3e 63 6f 75 6e 74 20 3d      x1a->count =
1feb0 20 30 3b 0a 20 20 20 20 78 31 61 2d 3e 74 62 6c   0;.    x1a->tbl
1fec0 20 3d 20 28 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x1node*)mall
1fed0 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65  oc( .      (size
1fee0 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x1node) + siz
1fef0 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 2a 31 30  eof(x1node*))*10
1ff00 32 34 20 29 3b 0a 20 20 20 20 69 66 28 20 78 31  24 );.    if( x1
1ff10 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
1ff20 20 20 20 66 72 65 65 28 78 31 61 29 3b 0a 20 20     free(x1a);.  
1ff30 20 20 20 20 78 31 61 20 3d 20 30 3b 0a 20 20 20      x1a = 0;.   
1ff40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1ff50 74 20 69 3b 0a 20 20 20 20 20 20 78 31 61 2d 3e  t i;.      x1a->
1ff60 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26  ht = (x1node**)&
1ff70 28 78 31 61 2d 3e 74 62 6c 5b 31 30 32 34 5d 29  (x1a->tbl[1024])
1ff80 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1ff90 20 69 3c 31 30 32 34 3b 20 69 2b 2b 29 20 78 31   i<1024; i++) x1
1ffa0 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  a->ht[i] = 0;.  
1ffb0 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73    }.  }.}./* Ins
1ffc0 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
1ffd0 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e   into the array.
1ffe0 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
1fff0 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20   successful..** 
20000 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20  Prior data with 
20010 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
20020 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20  NOT overwritten 
20030 2a 2f 0a 69 6e 74 20 53 74 72 73 61 66 65 5f 69  */.int Strsafe_i
20040 6e 73 65 72 74 28 63 6f 6e 73 74 20 63 68 61 72  nsert(const char
20050 20 2a 64 61 74 61 29 0a 7b 0a 20 20 78 31 6e 6f   *data).{.  x1no
20060 64 65 20 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e  de *np;.  unsign
20070 65 64 20 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ed h;.  unsigned
20080 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d   ph;..  if( x1a=
20090 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
200a0 20 70 68 20 3d 20 73 74 72 68 61 73 68 28 64 61   ph = strhash(da
200b0 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20  ta);.  h = ph & 
200c0 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x1a->size-1);. 
200d0 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d   np = x1a->ht[h]
200e0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
200f0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
20100 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61 29 3d 3d  np->data,data)==
20110 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  0 ){.      /* An
20120 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
20130 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
20140 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20  y is found. */. 
20150 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63       /* Fail bec
20160 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69  ause overwrite i
20170 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f  s not allows. */
20180 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
20190 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20  .    }.    np = 
201a0 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
201b0 69 66 28 20 78 31 61 2d 3e 63 6f 75 6e 74 3e 3d  if( x1a->count>=
201c0 78 31 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20  x1a->size ){.   
201d0 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65   /* Need to make
201e0 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
201f0 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e  bigger */.    in
20200 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74  t i,size;.    st
20210 72 75 63 74 20 73 5f 78 31 20 61 72 72 61 79 3b  ruct s_x1 array;
20220 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20  .    array.size 
20230 3d 20 73 69 7a 65 20 3d 20 78 31 61 2d 3e 73 69  = size = x1a->si
20240 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e  ze*2;.    array.
20250 63 6f 75 6e 74 20 3d 20 78 31 61 2d 3e 63 6f 75  count = x1a->cou
20260 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62  nt;.    array.tb
20270 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29 6d 61 6c  l = (x1node*)mal
20280 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65  loc(.      (size
20290 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x1node) + siz
202a0 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 2a 73 69  eof(x1node*))*si
202b0 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72  ze );.    if( ar
202c0 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74  ray.tbl==0 ) ret
202d0 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20  urn 0;  /* Fail 
202e0 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61  due to malloc fa
202f0 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72  ilure */.    arr
20300 61 79 2e 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a  ay.ht = (x1node*
20310 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69  *)&(array.tbl[si
20320 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ze]);.    for(i=
20330 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20  0; i<size; i++) 
20340 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b  array.ht[i] = 0;
20350 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
20360 78 31 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29  x1a->count; i++)
20370 7b 0a 20 20 20 20 20 20 78 31 6e 6f 64 65 20 2a  {.      x1node *
20380 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20  oldnp, *newnp;. 
20390 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78       oldnp = &(x
203a0 31 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  1a->tbl[i]);.   
203b0 20 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6f     h = strhash(o
203c0 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26 20 28 73  ldnp->data) & (s
203d0 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65  ize-1);.      ne
203e0 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62  wnp = &(array.tb
203f0 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  l[i]);.      if(
20400 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61   array.ht[h] ) a
20410 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  rray.ht[h]->from
20420 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74   = &(newnp->next
20430 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  );.      newnp->
20440 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b  next = array.ht[
20450 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  h];.      newnp-
20460 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64  >data = oldnp->d
20470 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  ata;.      newnp
20480 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79  ->from = &(array
20490 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61  .ht[h]);.      a
204a0 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77  rray.ht[h] = new
204b0 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72  np;.    }.    fr
204c0 65 65 28 78 31 61 2d 3e 74 62 6c 29 3b 0a 20 20  ee(x1a->tbl);.  
204d0 20 20 2a 78 31 61 20 3d 20 61 72 72 61 79 3b 0a    *x1a = array;.
204e0 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20    }.  /* Insert 
204f0 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a  the new data */.
20500 20 20 68 20 3d 20 70 68 20 26 20 28 78 31 61 2d    h = ph & (x1a-
20510 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
20520 20 26 28 78 31 61 2d 3e 74 62 6c 5b 78 31 61 2d   &(x1a->tbl[x1a-
20530 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70  >count++]);.  np
20540 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20  ->data = data;. 
20550 20 69 66 28 20 78 31 61 2d 3e 68 74 5b 68 5d 20   if( x1a->ht[h] 
20560 29 20 78 31 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72  ) x1a->ht[h]->fr
20570 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29  om = &(np->next)
20580 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78  ;.  np->next = x
20590 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 31 61  1a->ht[h];.  x1a
205a0 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20  ->ht[h] = np;.  
205b0 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 31 61  np->from = &(x1a
205c0 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75  ->ht[h]);.  retu
205d0 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  rn 1;.}../* Retu
205e0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
205f0 64 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f  data assigned to
20600 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20   the given key. 
20610 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20   Return NULL.** 
20620 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20  if no such key. 
20630 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 53  */.const char *S
20640 74 72 73 61 66 65 5f 66 69 6e 64 28 63 6f 6e 73  trsafe_find(cons
20650 74 20 63 68 61 72 20 2a 6b 65 79 29 0a 7b 0a 20  t char *key).{. 
20660 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 78   unsigned h;.  x
20670 31 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  1node *np;..  if
20680 28 20 78 31 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x1a==0 ) retur
20690 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 72 68 61  n 0;.  h = strha
206a0 73 68 28 6b 65 79 29 20 26 20 28 78 31 61 2d 3e  sh(key) & (x1a->
206b0 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20  size-1);.  np = 
206c0 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68  x1a->ht[h];.  wh
206d0 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69  ile( np ){.    i
206e0 66 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61  f( strcmp(np->da
206f0 74 61 2c 6b 65 79 29 3d 3d 30 20 29 20 62 72 65  ta,key)==0 ) bre
20700 61 6b 3b 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d  ak;.    np = np-
20710 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74  >next;.  }.  ret
20720 75 72 6e 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74  urn np ? np->dat
20730 61 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  a : 0;.}../* Ret
20740 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
20750 20 74 68 65 20 28 74 65 72 6d 69 6e 61 6c 20 6f   the (terminal o
20760 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 29 20 73  r nonterminal) s
20770 79 6d 62 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43 72  ymbol "x"..** Cr
20780 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f  eate a new symbo
20790 6c 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  l if this is the
207a0 20 66 69 72 73 74 20 74 69 6d 65 20 22 78 22 20   first time "x" 
207b0 68 61 73 20 62 65 65 6e 20 73 65 65 6e 2e 0a 2a  has been seen..*
207c0 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  /.struct symbol 
207d0 2a 53 79 6d 62 6f 6c 5f 6e 65 77 28 63 6f 6e 73  *Symbol_new(cons
207e0 74 20 63 68 61 72 20 2a 78 29 0a 7b 0a 20 20 73  t char *x).{.  s
207f0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
20800 3b 0a 0a 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c  ;..  sp = Symbol
20810 5f 66 69 6e 64 28 78 29 3b 0a 20 20 69 66 28 20  _find(x);.  if( 
20820 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73 70 20  sp==0 ){.    sp 
20830 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  = (struct symbol
20840 20 2a 29 63 61 6c 6c 6f 63 28 31 2c 20 73 69 7a   *)calloc(1, siz
20850 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
20860 6c 29 20 29 3b 0a 20 20 20 20 4d 65 6d 6f 72 79  l) );.    Memory
20870 43 68 65 63 6b 28 73 70 29 3b 0a 20 20 20 20 73  Check(sp);.    s
20880 70 2d 3e 6e 61 6d 65 20 3d 20 53 74 72 73 61 66  p->name = Strsaf
20890 65 28 78 29 3b 0a 20 20 20 20 73 70 2d 3e 74 79  e(x);.    sp->ty
208a0 70 65 20 3d 20 69 73 75 70 70 65 72 28 2a 78 29  pe = isupper(*x)
208b0 20 3f 20 54 45 52 4d 49 4e 41 4c 20 3a 20 4e 4f   ? TERMINAL : NO
208c0 4e 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20 73  NTERMINAL;.    s
208d0 70 2d 3e 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20  p->rule = 0;.   
208e0 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20   sp->fallback = 
208f0 30 3b 0a 20 20 20 20 73 70 2d 3e 70 72 65 63 20  0;.    sp->prec 
20900 3d 20 2d 31 3b 0a 20 20 20 20 73 70 2d 3e 61 73  = -1;.    sp->as
20910 73 6f 63 20 3d 20 55 4e 4b 3b 0a 20 20 20 20 73  soc = UNK;.    s
20920 70 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 30 3b  p->firstset = 0;
20930 0a 20 20 20 20 73 70 2d 3e 6c 61 6d 62 64 61 20  .    sp->lambda 
20940 3d 20 4c 45 4d 4f 4e 5f 46 41 4c 53 45 3b 0a 20  = LEMON_FALSE;. 
20950 20 20 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f     sp->destructo
20960 72 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64  r = 0;.    sp->d
20970 65 73 74 4c 69 6e 65 6e 6f 20 3d 20 30 3b 0a 20  estLineno = 0;. 
20980 20 20 20 73 70 2d 3e 64 61 74 61 74 79 70 65 20     sp->datatype 
20990 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 75 73 65  = 0;.    sp->use
209a0 43 6e 74 20 3d 20 30 3b 0a 20 20 20 20 53 79 6d  Cnt = 0;.    Sym
209b0 62 6f 6c 5f 69 6e 73 65 72 74 28 73 70 2c 73 70  bol_insert(sp,sp
209c0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  ->name);.  }.  s
209d0 70 2d 3e 75 73 65 43 6e 74 2b 2b 3b 0a 20 20 72  p->useCnt++;.  r
209e0 65 74 75 72 6e 20 73 70 3b 0a 7d 0a 0a 2f 2a 20  eturn sp;.}../* 
209f0 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 79 6d 62  Compare two symb
20a00 6f 6c 73 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20  ols for working 
20a10 70 75 72 70 6f 73 65 73 0a 2a 2a 0a 2a 2a 20 53  purposes.**.** S
20a20 79 6d 62 6f 6c 73 20 74 68 61 74 20 62 65 67 69  ymbols that begi
20a30 6e 20 77 69 74 68 20 75 70 70 65 72 20 63 61 73  n with upper cas
20a40 65 20 6c 65 74 74 65 72 73 20 28 74 65 72 6d 69  e letters (termi
20a50 6e 61 6c 73 20 6f 72 20 74 6f 6b 65 6e 73 29 0a  nals or tokens).
20a60 2a 2a 20 6d 75 73 74 20 73 6f 72 74 20 62 65 66  ** must sort bef
20a70 6f 72 65 20 73 79 6d 62 6f 6c 73 20 74 68 61 74  ore symbols that
20a80 20 62 65 67 69 6e 20 77 69 74 68 20 6c 6f 77 65   begin with lowe
20a90 72 20 63 61 73 65 20 6c 65 74 74 65 72 73 0a 2a  r case letters.*
20aa0 2a 20 28 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73  * (non-terminals
20ab0 29 2e 20 20 4f 74 68 65 72 20 74 68 61 6e 20 74  ).  Other than t
20ac0 68 61 74 2c 20 74 68 65 20 6f 72 64 65 72 20 64  hat, the order d
20ad0 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e 0a  oes not matter..
20ae0 2a 2a 0a 2a 2a 20 57 65 20 66 69 6e 64 20 65 78  **.** We find ex
20af0 70 65 72 69 6d 65 6e 74 61 6c 6c 79 20 74 68 61  perimentally tha
20b00 74 20 6c 65 61 76 69 6e 67 20 74 68 65 20 73 79  t leaving the sy
20b10 6d 62 6f 6c 73 20 69 6e 20 74 68 65 69 72 20 6f  mbols in their o
20b20 72 69 67 69 6e 61 6c 0a 2a 2a 20 6f 72 64 65 72  riginal.** order
20b30 20 28 74 68 65 20 6f 72 64 65 72 20 74 68 65 79   (the order they
20b40 20 61 70 70 65 61 72 65 64 20 69 6e 20 74 68 65   appeared in the
20b50 20 67 72 61 6d 6d 61 72 20 66 69 6c 65 29 20 67   grammar file) g
20b60 69 76 65 73 20 74 68 65 0a 2a 2a 20 73 6d 61 6c  ives the.** smal
20b70 6c 65 73 74 20 70 61 72 73 65 72 20 74 61 62 6c  lest parser tabl
20b80 65 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f  es in SQLite..*/
20b90 0a 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28  .int Symbolcmpp(
20ba0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 5f 61 2c 20  const void *_a, 
20bb0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 5f 62 29 0a  const void *_b).
20bc0 7b 0a 20 20 63 6f 6e 73 74 20 73 74 72 75 63 74  {.  const struct
20bd0 20 73 79 6d 62 6f 6c 20 2a 2a 61 20 3d 20 28 63   symbol **a = (c
20be0 6f 6e 73 74 20 73 74 72 75 63 74 20 73 79 6d 62  onst struct symb
20bf0 6f 6c 20 2a 2a 29 20 5f 61 3b 0a 20 20 63 6f 6e  ol **) _a;.  con
20c00 73 74 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  st struct symbol
20c10 20 2a 2a 62 20 3d 20 28 63 6f 6e 73 74 20 73 74   **b = (const st
20c20 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 29 20  ruct symbol **) 
20c30 5f 62 3b 0a 20 20 69 6e 74 20 69 31 20 3d 20 28  _b;.  int i1 = (
20c40 2a 2a 61 29 2e 69 6e 64 65 78 20 2b 20 31 30 30  **a).index + 100
20c50 30 30 30 30 30 2a 28 28 2a 2a 61 29 2e 6e 61 6d  00000*((**a).nam
20c60 65 5b 30 5d 3e 27 5a 27 29 3b 0a 20 20 69 6e 74  e[0]>'Z');.  int
20c70 20 69 32 20 3d 20 28 2a 2a 62 29 2e 69 6e 64 65   i2 = (**b).inde
20c80 78 20 2b 20 31 30 30 30 30 30 30 30 2a 28 28 2a  x + 10000000*((*
20c90 2a 62 29 2e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 29  *b).name[0]>'Z')
20ca0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 31 21 3d  ;.  assert( i1!=
20cb0 69 32 20 7c 7c 20 73 74 72 63 6d 70 28 28 2a 2a  i2 || strcmp((**
20cc0 61 29 2e 6e 61 6d 65 2c 28 2a 2a 62 29 2e 6e 61  a).name,(**b).na
20cd0 6d 65 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  me)==0 );.  retu
20ce0 72 6e 20 69 31 2d 69 32 3b 0a 7d 0a 0a 2f 2a 20  rn i1-i2;.}../* 
20cf0 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
20d00 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
20d10 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
20d20 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73   for each.** ass
20d30 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
20d40 66 20 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a  f type "x2"..*/.
20d50 73 74 72 75 63 74 20 73 5f 78 32 20 7b 0a 20 20  struct s_x2 {.  
20d60 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
20d70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
20d80 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
20d90 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20  le slots. */.   
20da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20db0 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74         /*   Must
20dc0 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
20dd0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
20de0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
20df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20e00 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f     equal to 1 */
20e10 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20  .  int count;   
20e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
20e30 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c  mber of currentl
20e40 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a  y slots filled *
20e50 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e  /.  struct s_x2n
20e60 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68  ode *tbl;  /* Th
20e70 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65  e data stored he
20e80 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  re */.  struct s
20e90 5f 78 32 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f  _x2node **ht;  /
20ea0 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
20eb0 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a   lookups */.};..
20ec0 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
20ed0 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
20ee0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
20ef0 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e  very data elemen
20f00 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63  t.** in an assoc
20f10 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
20f20 74 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 74 79  type "x2"..*/.ty
20f30 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78  pedef struct s_x
20f40 32 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74  2node {.  struct
20f50 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 20 20   symbol *data;  
20f60 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
20f70 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
20f80 6b 65 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  key;         /* 
20f90 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72  The key */.  str
20fa0 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 6e 65  uct s_x2node *ne
20fb0 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e  xt;   /* Next en
20fc0 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
20fd0 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75  e hash */.  stru
20fe0 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 66 72  ct s_x2node **fr
20ff0 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  om;  /* Previous
21000 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 32 6e 6f 64   link */.} x2nod
21010 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  e;../* There is 
21020 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63  only one instanc
21030 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20  e of the array, 
21040 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c  which is the fol
21050 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63  lowing */.static
21060 20 73 74 72 75 63 74 20 73 5f 78 32 20 2a 78 32   struct s_x2 *x2
21070 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  a;../* Allocate 
21080 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76  a new associativ
21090 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20  e array */.void 
210a0 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 29 7b 0a 20  Symbol_init(){. 
210b0 20 69 66 28 20 78 32 61 20 29 20 72 65 74 75 72   if( x2a ) retur
210c0 6e 3b 0a 20 20 78 32 61 20 3d 20 28 73 74 72 75  n;.  x2a = (stru
210d0 63 74 20 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63 28  ct s_x2*)malloc(
210e0 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
210f0 5f 78 32 29 20 29 3b 0a 20 20 69 66 28 20 78 32  _x2) );.  if( x2
21100 61 20 29 7b 0a 20 20 20 20 78 32 61 2d 3e 73 69  a ){.    x2a->si
21110 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 32  ze = 128;.    x2
21120 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  a->count = 0;.  
21130 20 20 78 32 61 2d 3e 74 62 6c 20 3d 20 28 78 32    x2a->tbl = (x2
21140 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20  node*)malloc( . 
21150 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 32 6e       (sizeof(x2n
21160 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 32  ode) + sizeof(x2
21170 6e 6f 64 65 2a 29 29 2a 31 32 38 20 29 3b 0a 20  node*))*128 );. 
21180 20 20 20 69 66 28 20 78 32 61 2d 3e 74 62 6c 3d     if( x2a->tbl=
21190 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  =0 ){.      free
211a0 28 78 32 61 29 3b 0a 20 20 20 20 20 20 78 32 61  (x2a);.      x2a
211b0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
211c0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
211d0 20 20 20 20 78 32 61 2d 3e 68 74 20 3d 20 28 78      x2a->ht = (x
211e0 32 6e 6f 64 65 2a 2a 29 26 28 78 32 61 2d 3e 74  2node**)&(x2a->t
211f0 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20  bl[128]);.      
21200 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20  for(i=0; i<128; 
21210 69 2b 2b 29 20 78 32 61 2d 3e 68 74 5b 69 5d 20  i++) x2a->ht[i] 
21220 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
21230 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  ./* Insert a new
21240 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65   record into the
21250 20 61 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20   array.  Return 
21260 54 52 55 45 20 69 66 20 73 75 63 63 65 73 73 66  TRUE if successf
21270 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74  ul..** Prior dat
21280 61 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  a with the same 
21290 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77  key is NOT overw
212a0 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 79  ritten */.int Sy
212b0 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73 74 72 75  mbol_insert(stru
212c0 63 74 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 2c  ct symbol *data,
212d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 65 79   const char *key
212e0 29 0a 7b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70  ).{.  x2node *np
212f0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a  ;.  unsigned h;.
21300 20 20 75 6e 73 69 67 6e 65 64 20 70 68 3b 0a 0a    unsigned ph;..
21310 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72    if( x2a==0 ) r
21320 65 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20  eturn 0;.  ph = 
21330 73 74 72 68 61 73 68 28 6b 65 79 29 3b 0a 20 20  strhash(key);.  
21340 68 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73  h = ph & (x2a->s
21350 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
21360 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  2a->ht[h];.  whi
21370 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
21380 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 6b 65 79  ( strcmp(np->key
21390 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ,key)==0 ){.    
213a0 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
213b0 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
213c0 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e  same key is foun
213d0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46  d. */.      /* F
213e0 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72  ail because over
213f0 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c  write is not all
21400 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ows. */.      re
21410 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
21420 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
21430 0a 20 20 7d 0a 20 20 69 66 28 20 78 32 61 2d 3e  .  }.  if( x2a->
21440 63 6f 75 6e 74 3e 3d 78 32 61 2d 3e 73 69 7a 65  count>=x2a->size
21450 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20   ){.    /* Need 
21460 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68  to make the hash
21470 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f   table bigger */
21480 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b  .    int i,size;
21490 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 32  .    struct s_x2
214a0 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61   array;.    arra
214b0 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20  y.size = size = 
214c0 78 32 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20  x2a->size*2;.   
214d0 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78   array.count = x
214e0 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61  2a->count;.    a
214f0 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 32 6e 6f  rray.tbl = (x2no
21500 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20  de*)malloc(.    
21510 20 20 28 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65    (sizeof(x2node
21520 29 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64  ) + sizeof(x2nod
21530 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20  e*))*size );.   
21540 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d   if( array.tbl==
21550 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  0 ) return 0;  /
21560 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61  * Fail due to ma
21570 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a  lloc failure */.
21580 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28      array.ht = (
21590 78 32 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79  x2node**)&(array
215a0 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20  .tbl[size]);.   
215b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
215c0 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b  ; i++) array.ht[
215d0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  i] = 0;.    for(
215e0 69 3d 30 3b 20 69 3c 78 32 61 2d 3e 63 6f 75 6e  i=0; i<x2a->coun
215f0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78  t; i++){.      x
21600 32 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e  2node *oldnp, *n
21610 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e  ewnp;.      oldn
21620 70 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c 5b 69  p = &(x2a->tbl[i
21630 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 73 74  ]);.      h = st
21640 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79  rhash(oldnp->key
21650 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20  ) & (size-1);.  
21660 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72      newnp = &(ar
21670 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  ray.tbl[i]);.   
21680 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b     if( array.ht[
21690 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d  h] ) array.ht[h]
216a0 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70  ->from = &(newnp
216b0 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ->next);.      n
216c0 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72  ewnp->next = arr
216d0 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20  ay.ht[h];.      
216e0 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64  newnp->key = old
216f0 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e  np->key;.      n
21700 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64  ewnp->data = old
21710 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20  np->data;.      
21720 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  newnp->from = &(
21730 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20  array.ht[h]);.  
21740 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20      array.ht[h] 
21750 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20  = newnp;.    }. 
21760 20 20 20 66 72 65 65 28 78 32 61 2d 3e 74 62 6c     free(x2a->tbl
21770 29 3b 0a 20 20 20 20 2a 78 32 61 20 3d 20 61 72  );.    *x2a = ar
21780 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e  ray;.  }.  /* In
21790 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74  sert the new dat
217a0 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20  a */.  h = ph & 
217b0 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x2a->size-1);. 
217c0 20 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74 62 6c   np = &(x2a->tbl
217d0 5b 78 32 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b  [x2a->count++]);
217e0 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79  .  np->key = key
217f0 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64  ;.  np->data = d
21800 61 74 61 3b 0a 20 20 69 66 28 20 78 32 61 2d 3e  ata;.  if( x2a->
21810 68 74 5b 68 5d 20 29 20 78 32 61 2d 3e 68 74 5b  ht[h] ) x2a->ht[
21820 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d  h]->from = &(np-
21830 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65  >next);.  np->ne
21840 78 74 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b  xt = x2a->ht[h];
21850 0a 20 20 78 32 61 2d 3e 68 74 5b 68 5d 20 3d 20  .  x2a->ht[h] = 
21860 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d  np;.  np->from =
21870 20 26 28 78 32 61 2d 3e 68 74 5b 68 5d 29 3b 0a   &(x2a->ht[h]);.
21880 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
21890 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
218a0 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67  er to data assig
218b0 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ned to the given
218c0 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55   key.  Return NU
218d0 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68  LL.** if no such
218e0 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20   key. */.struct 
218f0 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66  symbol *Symbol_f
21900 69 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ind(const char *
21910 6b 65 79 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65  key).{.  unsigne
21920 64 20 68 3b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e  d h;.  x2node *n
21930 70 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30  p;..  if( x2a==0
21940 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68   ) return 0;.  h
21950 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29 20   = strhash(key) 
21960 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x2a->size-1);
21970 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b  .  np = x2a->ht[
21980 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
21990 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
219a0 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d  p(np->key,key)==
219b0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e  0 ) break;.    n
219c0 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
219d0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20  }.  return np ? 
219e0 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a  np->data : 0;.}.
219f0 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ./* Return the n
21a00 2d 74 68 20 64 61 74 61 2e 20 20 52 65 74 75 72  -th data.  Retur
21a10 6e 20 4e 55 4c 4c 20 69 66 20 6e 20 69 73 20 6f  n NULL if n is o
21a20 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 2a 2f 0a  ut of range. */.
21a30 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
21a40 79 6d 62 6f 6c 5f 4e 74 68 28 69 6e 74 20 6e 29  ymbol_Nth(int n)
21a50 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  .{.  struct symb
21a60 6f 6c 20 2a 64 61 74 61 3b 0a 20 20 69 66 28 20  ol *data;.  if( 
21a70 78 32 61 20 26 26 20 6e 3e 30 20 26 26 20 6e 3c  x2a && n>0 && n<
21a80 3d 78 32 61 2d 3e 63 6f 75 6e 74 20 29 7b 0a 20  =x2a->count ){. 
21a90 20 20 20 64 61 74 61 20 3d 20 78 32 61 2d 3e 74     data = x2a->t
21aa0 62 6c 5b 6e 2d 31 5d 2e 64 61 74 61 3b 0a 20 20  bl[n-1].data;.  
21ab0 7d 65 6c 73 65 7b 0a 20 20 20 20 64 61 74 61 20  }else{.    data 
21ac0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
21ad0 6e 20 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 20 52 65  n data;.}../* Re
21ae0 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
21af0 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 69 6e   the array */.in
21b00 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29  t Symbol_count()
21b10 0a 7b 0a 20 20 72 65 74 75 72 6e 20 78 32 61 20  .{.  return x2a 
21b20 3f 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3a 20 30  ? x2a->count : 0
21b30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
21b40 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74  n array of point
21b50 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20  ers to all data 
21b60 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
21b70 20 54 68 65 20 61 72 72 61 79 20 69 73 20 6f 62   The array is ob
21b80 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
21b90 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  oc.  Return NULL
21ba0 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   if memory alloc
21bb0 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d  ation.** problem
21bc0 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72 72  s, or if the arr
21bd0 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a  ay is empty. */.
21be0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
21bf0 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 29  Symbol_arrayof()
21c00 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  .{.  struct symb
21c10 6f 6c 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e  ol **array;.  in
21c20 74 20 69 2c 73 69 7a 65 3b 0a 20 20 69 66 28 20  t i,size;.  if( 
21c30 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  x2a==0 ) return 
21c40 30 3b 0a 20 20 73 69 7a 65 20 3d 20 78 32 61 2d  0;.  size = x2a-
21c50 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79 20  >count;.  array 
21c60 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  = (struct symbol
21c70 20 2a 2a 29 63 61 6c 6c 6f 63 28 73 69 7a 65 2c   **)calloc(size,
21c80 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
21c90 79 6d 62 6f 6c 20 2a 29 29 3b 0a 20 20 69 66 28  ymbol *));.  if(
21ca0 20 61 72 72 61 79 20 29 7b 0a 20 20 20 20 66 6f   array ){.    fo
21cb0 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69  r(i=0; i<size; i
21cc0 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d 20 78  ++) array[i] = x
21cd0 32 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 3b  2a->tbl[i].data;
21ce0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72  .  }.  return ar
21cf0 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61  ray;.}../* Compa
21d00 72 65 20 74 77 6f 20 63 6f 6e 66 69 67 75 72 61  re two configura
21d10 74 69 6f 6e 73 20 2a 2f 0a 69 6e 74 20 43 6f 6e  tions */.int Con
21d20 66 69 67 63 6d 70 28 63 6f 6e 73 74 20 63 68 61  figcmp(const cha
21d30 72 20 2a 5f 61 2c 63 6f 6e 73 74 20 63 68 61 72  r *_a,const char
21d40 20 2a 5f 62 29 0a 7b 0a 20 20 63 6f 6e 73 74 20   *_b).{.  const 
21d50 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61  struct config *a
21d60 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69   = (struct confi
21d70 67 20 2a 29 20 5f 61 3b 0a 20 20 63 6f 6e 73 74  g *) _a;.  const
21d80 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
21d90 62 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66  b = (struct conf
21da0 69 67 20 2a 29 20 5f 62 3b 0a 20 20 69 6e 74 20  ig *) _b;.  int 
21db0 78 3b 0a 20 20 78 20 3d 20 61 2d 3e 72 70 2d 3e  x;.  x = a->rp->
21dc0 69 6e 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69  index - b->rp->i
21dd0 6e 64 65 78 3b 0a 20 20 69 66 28 20 78 3d 3d 30  ndex;.  if( x==0
21de0 20 29 20 78 20 3d 20 61 2d 3e 64 6f 74 20 2d 20   ) x = a->dot - 
21df0 62 2d 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e  b->dot;.  return
21e00 20 78 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72   x;.}../* Compar
21e10 65 20 74 77 6f 20 73 74 61 74 65 73 20 2a 2f 0a  e two states */.
21e20 50 52 49 56 41 54 45 20 69 6e 74 20 73 74 61 74  PRIVATE int stat
21e30 65 63 6d 70 28 73 74 72 75 63 74 20 63 6f 6e 66  ecmp(struct conf
21e40 69 67 20 2a 61 2c 20 73 74 72 75 63 74 20 63 6f  ig *a, struct co
21e50 6e 66 69 67 20 2a 62 29 0a 7b 0a 20 20 69 6e 74  nfig *b).{.  int
21e60 20 72 63 3b 0a 20 20 66 6f 72 28 72 63 3d 30 3b   rc;.  for(rc=0;
21e70 20 72 63 3d 3d 30 20 26 26 20 61 20 26 26 20 62   rc==0 && a && b
21e80 3b 20 20 61 3d 61 2d 3e 62 70 2c 20 62 3d 62 2d  ;  a=a->bp, b=b-
21e90 3e 62 70 29 7b 0a 20 20 20 20 72 63 20 3d 20 61  >bp){.    rc = a
21ea0 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d  ->rp->index - b-
21eb0 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 20 20  >rp->index;.    
21ec0 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d  if( rc==0 ) rc =
21ed0 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74   a->dot - b->dot
21ee0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
21ef0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 61 20 29  0 ){.    if( a )
21f00 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 69 66 28   rc = 1;.    if(
21f10 20 62 20 29 20 72 63 20 3d 20 2d 31 3b 0a 20 20   b ) rc = -1;.  
21f20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
21f30 0a 0a 2f 2a 20 48 61 73 68 20 61 20 73 74 61 74  ../* Hash a stat
21f40 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 75 6e 73  e */.PRIVATE uns
21f50 69 67 6e 65 64 20 73 74 61 74 65 68 61 73 68 28  igned statehash(
21f60 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61  struct config *a
21f70 29 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 68  ).{.  unsigned h
21f80 3d 30 3b 0a 20 20 77 68 69 6c 65 28 20 61 20 29  =0;.  while( a )
21f90 7b 0a 20 20 20 20 68 20 3d 20 68 2a 35 37 31 20  {.    h = h*571 
21fa0 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33  + a->rp->index*3
21fb0 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 20 20  7 + a->dot;.    
21fc0 61 20 3d 20 61 2d 3e 62 70 3b 0a 20 20 7d 0a 20  a = a->bp;.  }. 
21fd0 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a   return h;.}../*
21fe0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
21ff0 73 74 61 74 65 20 73 74 72 75 63 74 75 72 65 20  state structure 
22000 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  */.struct state 
22010 2a 53 74 61 74 65 5f 6e 65 77 28 29 0a 7b 0a 20  *State_new().{. 
22020 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 6e   struct state *n
22030 65 77 73 74 61 74 65 3b 0a 20 20 6e 65 77 73 74  ewstate;.  newst
22040 61 74 65 20 3d 20 28 73 74 72 75 63 74 20 73 74  ate = (struct st
22050 61 74 65 20 2a 29 63 61 6c 6c 6f 63 28 31 2c 20  ate *)calloc(1, 
22060 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 74  sizeof(struct st
22070 61 74 65 29 20 29 3b 0a 20 20 4d 65 6d 6f 72 79  ate) );.  Memory
22080 43 68 65 63 6b 28 6e 65 77 73 74 61 74 65 29 3b  Check(newstate);
22090 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 73 74 61  .  return newsta
220a0 74 65 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20  te;.}../* There 
220b0 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  is one instance 
220c0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
220d0 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
220e0 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69  ach.** associati
220f0 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
22100 20 22 78 33 22 2e 0a 2a 2f 0a 73 74 72 75 63 74   "x3"..*/.struct
22110 20 73 5f 78 33 20 7b 0a 20 20 69 6e 74 20 73 69   s_x3 {.  int si
22120 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
22130 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
22140 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f  of available slo
22150 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ts. */.         
22160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22170 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20   /*   Must be a 
22180 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74  power of 2 great
22190 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20  er than or */.  
221a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221b0 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75          /*   equ
221c0 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74  al to 1 */.  int
221d0 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20   count;         
221e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
221f0 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74  f currently slot
22200 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74  s filled */.  st
22210 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a 74  ruct s_x3node *t
22220 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  bl;  /* The data
22230 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a   stored here */.
22240 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64    struct s_x3nod
22250 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68  e **ht;  /* Hash
22260 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75   table for looku
22270 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65  ps */.};../* The
22280 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
22290 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
222a0 74 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64  ture for every d
222b0 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69  ata element.** i
222c0 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65  n an associative
222d0 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22   array of type "
222e0 78 33 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  x3"..*/.typedef 
222f0 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20  struct s_x3node 
22300 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  {.  struct state
22310 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
22320 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22330 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75 63 74  data */.  struct
22340 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 20 20 20   config *key;   
22350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22360 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20  /* The key */.  
22370 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20  struct s_x3node 
22380 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74  *next;   /* Next
22390 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
223a0 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73  same hash */.  s
223b0 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20 2a  truct s_x3node *
223c0 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69  *from;  /* Previ
223d0 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 33  ous link */.} x3
223e0 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20  node;../* There 
223f0 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74  is only one inst
22400 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61  ance of the arra
22410 79 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  y, which is the 
22420 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61  following */.sta
22430 74 69 63 20 73 74 72 75 63 74 20 73 5f 78 33 20  tic struct s_x3 
22440 2a 78 33 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61  *x3a;../* Alloca
22450 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61  te a new associa
22460 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f  tive array */.vo
22470 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28 29 7b  id State_init(){
22480 0a 20 20 69 66 28 20 78 33 61 20 29 20 72 65 74  .  if( x3a ) ret
22490 75 72 6e 3b 0a 20 20 78 33 61 20 3d 20 28 73 74  urn;.  x3a = (st
224a0 72 75 63 74 20 73 5f 78 33 2a 29 6d 61 6c 6c 6f  ruct s_x3*)mallo
224b0 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  c( sizeof(struct
224c0 20 73 5f 78 33 29 20 29 3b 0a 20 20 69 66 28 20   s_x3) );.  if( 
224d0 78 33 61 20 29 7b 0a 20 20 20 20 78 33 61 2d 3e  x3a ){.    x3a->
224e0 73 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20 20 20  size = 128;.    
224f0 78 33 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a  x3a->count = 0;.
22500 20 20 20 20 78 33 61 2d 3e 74 62 6c 20 3d 20 28      x3a->tbl = (
22510 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20  x3node*)malloc( 
22520 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
22530 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  3node) + sizeof(
22540 78 33 6e 6f 64 65 2a 29 29 2a 31 32 38 20 29 3b  x3node*))*128 );
22550 0a 20 20 20 20 69 66 28 20 78 33 61 2d 3e 74 62  .    if( x3a->tb
22560 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 72  l==0 ){.      fr
22570 65 65 28 78 33 61 29 3b 0a 20 20 20 20 20 20 78  ee(x3a);.      x
22580 33 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  3a = 0;.    }els
22590 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  e{.      int i;.
225a0 20 20 20 20 20 20 78 33 61 2d 3e 68 74 20 3d 20        x3a->ht = 
225b0 28 78 33 6e 6f 64 65 2a 2a 29 26 28 78 33 61 2d  (x3node**)&(x3a-
225c0 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20 20 20  >tbl[128]);.    
225d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 32 38    for(i=0; i<128
225e0 3b 20 69 2b 2b 29 20 78 33 61 2d 3e 68 74 5b 69  ; i++) x3a->ht[i
225f0 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  ] = 0;.    }.  }
22600 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20 6e  .}./* Insert a n
22610 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74  ew record into t
22620 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75 72  he array.  Retur
22630 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65 73  n TRUE if succes
22640 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20 64  sful..** Prior d
22650 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61 6d  ata with the sam
22660 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76 65  e key is NOT ove
22670 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74 20  rwritten */.int 
22680 53 74 61 74 65 5f 69 6e 73 65 72 74 28 73 74 72  State_insert(str
22690 75 63 74 20 73 74 61 74 65 20 2a 64 61 74 61 2c  uct state *data,
226a0 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
226b0 6b 65 79 29 0a 7b 0a 20 20 78 33 6e 6f 64 65 20  key).{.  x3node 
226c0 2a 6e 70 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  *np;.  unsigned 
226d0 68 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 70 68  h;.  unsigned ph
226e0 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20  ;..  if( x3a==0 
226f0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68  ) return 0;.  ph
22700 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65 79   = statehash(key
22710 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  );.  h = ph & (x
22720 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  3a->size-1);.  n
22730 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x3a->ht[h];.
22740 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
22750 20 20 20 69 66 28 20 73 74 61 74 65 63 6d 70 28     if( statecmp(
22760 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20  np->key,key)==0 
22770 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  ){.      /* An e
22780 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69  xisting entry wi
22790 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
227a0 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20  is found. */.   
227b0 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75     /* Fail becau
227c0 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20  se overwrite is 
227d0 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20  not allows. */. 
227e0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
227f0 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70     }.    np = np
22800 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  ->next;.  }.  if
22810 28 20 78 33 61 2d 3e 63 6f 75 6e 74 3e 3d 78 33  ( x3a->count>=x3
22820 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f  a->size ){.    /
22830 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74  * Need to make t
22840 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69  he hash table bi
22850 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  gger */.    int 
22860 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75  i,size;.    stru
22870 63 74 20 73 5f 78 33 20 61 72 72 61 79 3b 0a 20  ct s_x3 array;. 
22880 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20     array.size = 
22890 73 69 7a 65 20 3d 20 78 33 61 2d 3e 73 69 7a 65  size = x3a->size
228a0 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f  *2;.    array.co
228b0 75 6e 74 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74  unt = x3a->count
228c0 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20  ;.    array.tbl 
228d0 3d 20 28 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f  = (x3node*)mallo
228e0 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66  c(.      (sizeof
228f0 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x3node) + sizeo
22900 66 28 78 33 6e 6f 64 65 2a 29 29 2a 73 69 7a 65  f(x3node*))*size
22910 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61   );.    if( arra
22920 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72  y.tbl==0 ) retur
22930 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75  n 0;  /* Fail du
22940 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e to malloc fail
22950 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79  ure */.    array
22960 2e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29  .ht = (x3node**)
22970 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65  &(array.tbl[size
22980 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ]);.    for(i=0;
22990 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72   i<size; i++) ar
229a0 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  ray.ht[i] = 0;. 
229b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 33     for(i=0; i<x3
229c0 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a  a->count; i++){.
229d0 20 20 20 20 20 20 78 33 6e 6f 64 65 20 2a 6f 6c        x3node *ol
229e0 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20  dnp, *newnp;.   
229f0 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 33 61     oldnp = &(x3a
22a00 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  ->tbl[i]);.     
22a10 20 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6f   h = statehash(o
22a20 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 73 69  ldnp->key) & (si
22a30 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77  ze-1);.      new
22a40 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c  np = &(array.tbl
22a50 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
22a60 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72  array.ht[h] ) ar
22a70 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  ray.ht[h]->from 
22a80 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29  = &(newnp->next)
22a90 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e  ;.      newnp->n
22aa0 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68  ext = array.ht[h
22ab0 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  ];.      newnp->
22ac0 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79  key = oldnp->key
22ad0 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64  ;.      newnp->d
22ae0 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74  ata = oldnp->dat
22af0 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e  a;.      newnp->
22b00 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68  from = &(array.h
22b10 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72  t[h]);.      arr
22b20 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70  ay.ht[h] = newnp
22b30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  ;.    }.    free
22b40 28 78 33 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20  (x3a->tbl);.    
22b50 2a 78 33 61 20 3d 20 61 72 72 61 79 3b 0a 20 20  *x3a = array;.  
22b60 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68  }.  /* Insert th
22b70 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20  e new data */.  
22b80 68 20 3d 20 70 68 20 26 20 28 78 33 61 2d 3e 73  h = ph & (x3a->s
22b90 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26  ize-1);.  np = &
22ba0 28 78 33 61 2d 3e 74 62 6c 5b 78 33 61 2d 3e 63  (x3a->tbl[x3a->c
22bb0 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e  ount++]);.  np->
22bc0 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d  key = key;.  np-
22bd0 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20  >data = data;.  
22be0 69 66 28 20 78 33 61 2d 3e 68 74 5b 68 5d 20 29  if( x3a->ht[h] )
22bf0 20 78 33 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f   x3a->ht[h]->fro
22c00 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b  m = &(np->next);
22c10 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 33  .  np->next = x3
22c20 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 33 61 2d  a->ht[h];.  x3a-
22c30 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e  >ht[h] = np;.  n
22c40 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 33 61 2d  p->from = &(x3a-
22c50 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72  >ht[h]);.  retur
22c60 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  n 1;.}../* Retur
22c70 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  n a pointer to d
22c80 61 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20  ata assigned to 
22c90 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20  the given key.  
22ca0 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69  Return NULL.** i
22cb0 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a  f no such key. *
22cc0 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65 20 2a  /.struct state *
22cd0 53 74 61 74 65 5f 66 69 6e 64 28 73 74 72 75 63  State_find(struc
22ce0 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 29 0a 7b  t config *key).{
22cf0 0a 20 20 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20  .  unsigned h;. 
22d00 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20   x3node *np;..  
22d10 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72 65 74  if( x3a==0 ) ret
22d20 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73 74 61  urn 0;.  h = sta
22d30 74 65 68 61 73 68 28 6b 65 79 29 20 26 20 28 78  tehash(key) & (x
22d40 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  3a->size-1);.  n
22d50 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a  p = x3a->ht[h];.
22d60 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20    while( np ){. 
22d70 20 20 20 69 66 28 20 73 74 61 74 65 63 6d 70 28     if( statecmp(
22d80 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20  np->key,key)==0 
22d90 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20  ) break;.    np 
22da0 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
22db0 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70    return np ? np
22dc0 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->data : 0;.}../
22dd0 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 72 72 61  * Return an arra
22de0 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f  y of pointers to
22df0 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 74 68 65   all data in the
22e00 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65 20 61   table..** The a
22e10 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64  rray is obtained
22e20 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20 20 52   from malloc.  R
22e30 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6d 65  eturn NULL if me
22e40 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  mory allocation.
22e50 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f 72 20  ** problems, or 
22e60 69 66 20 74 68 65 20 61 72 72 61 79 20 69 73 20  if the array is 
22e70 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75 63 74  empty. */.struct
22e80 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65 5f 61   state **State_a
22e90 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72  rrayof().{.  str
22ea0 75 63 74 20 73 74 61 74 65 20 2a 2a 61 72 72 61  uct state **arra
22eb0 79 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b  y;.  int i,size;
22ec0 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20  .  if( x3a==0 ) 
22ed0 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65  return 0;.  size
22ee0 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b 0a 20   = x3a->count;. 
22ef0 20 61 72 72 61 79 20 3d 20 28 73 74 72 75 63 74   array = (struct
22f00 20 73 74 61 74 65 20 2a 2a 29 6d 61 6c 6c 6f 63   state **)malloc
22f10 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
22f20 73 74 61 74 65 20 2a 29 2a 73 69 7a 65 20 29 3b  state *)*size );
22f30 0a 20 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a  .  if( array ){.
22f40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
22f50 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b  ize; i++) array[
22f60 69 5d 20 3d 20 78 33 61 2d 3e 74 62 6c 5b 69 5d  i] = x3a->tbl[i]
22f70 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74  .data;.  }.  ret
22f80 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a  urn array;.}../*
22f90 20 48 61 73 68 20 61 20 63 6f 6e 66 69 67 75 72   Hash a configur
22fa0 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45  ation */.PRIVATE
22fb0 20 75 6e 73 69 67 6e 65 64 20 63 6f 6e 66 69 67   unsigned config
22fc0 68 61 73 68 28 73 74 72 75 63 74 20 63 6f 6e 66  hash(struct conf
22fd0 69 67 20 2a 61 29 0a 7b 0a 20 20 75 6e 73 69 67  ig *a).{.  unsig
22fe0 6e 65 64 20 68 3d 30 3b 0a 20 20 68 20 3d 20 68  ned h=0;.  h = h
22ff0 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e  *571 + a->rp->in
23000 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b  dex*37 + a->dot;
23010 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a  .  return h;.}..
23020 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
23030 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
23040 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
23050 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20  ure for each.** 
23060 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
23070 79 20 6f 66 20 74 79 70 65 20 22 78 34 22 2e 0a  y of type "x4"..
23080 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 34 20 7b  */.struct s_x4 {
23090 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20  .  int size;    
230a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
230b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
230c0 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a  lable slots. */.
230d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d            /*   M
230f0 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
23100 66 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e  f 2 greater than
23110 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20   or */.         
23120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23130 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31   /*   equal to 1
23140 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b   */.  int count;
23150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23160 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65   Number of curre
23170 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65  ntly slots fille
23180 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  d */.  struct s_
23190 78 34 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a  x4node *tbl;  /*
231a0 20 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64   The data stored
231b0 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63   here */.  struc
231c0 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 68 74 3b  t s_x4node **ht;
231d0 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
231e0 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d  for lookups */.}
231f0 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  ;../* There is o
23200 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
23210 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f  his structure fo
23220 72 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65  r every data ele
23230 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73  ment.** in an as
23240 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
23250 6f 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f  of type "x4"..*/
23260 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
23270 73 5f 78 34 6e 6f 64 65 20 7b 0a 20 20 73 74 72  s_x4node {.  str
23280 75 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74 61  uct config *data
23290 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
232a0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
232b0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e  /.  struct s_x4n
232c0 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20  ode *next;   /* 
232d0 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20  Next entry with 
232e0 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f  the same hash */
232f0 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f  .  struct s_x4no
23300 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50  de **from;  /* P
23310 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a  revious link */.
23320 7d 20 78 34 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68  } x4node;../* Th
23330 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
23340 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
23350 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20  array, which is 
23360 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
23370 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73  .static struct s
23380 5f 78 34 20 2a 78 34 61 3b 0a 0a 2f 2a 20 41 6c  _x4 *x4a;../* Al
23390 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73  locate a new ass
233a0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a  ociative array *
233b0 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62  /.void Configtab
233c0 6c 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28  le_init(){.  if(
233d0 20 78 34 61 20 29 20 72 65 74 75 72 6e 3b 0a 20   x4a ) return;. 
233e0 20 78 34 61 20 3d 20 28 73 74 72 75 63 74 20 73   x4a = (struct s
233f0 5f 78 34 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a  _x4*)malloc( siz
23400 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 34 29  eof(struct s_x4)
23410 20 29 3b 0a 20 20 69 66 28 20 78 34 61 20 29 7b   );.  if( x4a ){
23420 0a 20 20 20 20 78 34 61 2d 3e 73 69 7a 65 20 3d  .    x4a->size =
23430 20 36 34 3b 0a 20 20 20 20 78 34 61 2d 3e 63 6f   64;.    x4a->co
23440 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 34 61  unt = 0;.    x4a
23450 2d 3e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a  ->tbl = (x4node*
23460 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20  )malloc( .      
23470 28 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20  (sizeof(x4node) 
23480 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a  + sizeof(x4node*
23490 29 29 2a 36 34 20 29 3b 0a 20 20 20 20 69 66 28  ))*64 );.    if(
234a0 20 78 34 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a   x4a->tbl==0 ){.
234b0 20 20 20 20 20 20 66 72 65 65 28 78 34 61 29 3b        free(x4a);
234c0 0a 20 20 20 20 20 20 78 34 61 20 3d 20 30 3b 0a  .      x4a = 0;.
234d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
234e0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 34   int i;.      x4
234f0 61 2d 3e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a  a->ht = (x4node*
23500 2a 29 26 28 78 34 61 2d 3e 74 62 6c 5b 36 34 5d  *)&(x4a->tbl[64]
23510 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
23520 3b 20 69 3c 36 34 3b 20 69 2b 2b 29 20 78 34 61  ; i<64; i++) x4a
23530 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  ->ht[i] = 0;.   
23540 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65   }.  }.}./* Inse
23550 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
23560 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20  into the array. 
23570 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
23580 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50  successful..** P
23590 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74  rior data with t
235a0 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e  he same key is N
235b0 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a  OT overwritten *
235c0 2f 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c  /.int Configtabl
235d0 65 5f 69 6e 73 65 72 74 28 73 74 72 75 63 74 20  e_insert(struct 
235e0 63 6f 6e 66 69 67 20 2a 64 61 74 61 29 0a 7b 0a  config *data).{.
235f0 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20    x4node *np;.  
23600 75 6e 73 69 67 6e 65 64 20 68 3b 0a 20 20 75 6e  unsigned h;.  un
23610 73 69 67 6e 65 64 20 70 68 3b 0a 0a 20 20 69 66  signed ph;..  if
23620 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x4a==0 ) retur
23630 6e 20 30 3b 0a 20 20 70 68 20 3d 20 63 6f 6e 66  n 0;.  ph = conf
23640 69 67 68 61 73 68 28 64 61 74 61 29 3b 0a 20 20  ighash(data);.  
23650 68 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73  h = ph & (x4a->s
23660 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
23670 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  4a->ht[h];.  whi
23680 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
23690 28 20 43 6f 6e 66 69 67 63 6d 70 28 28 63 6f 6e  ( Configcmp((con
236a0 73 74 20 63 68 61 72 20 2a 29 20 6e 70 2d 3e 64  st char *) np->d
236b0 61 74 61 2c 28 63 6f 6e 73 74 20 63 68 61 72 20  ata,(const char 
236c0 2a 29 20 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20  *) data)==0 ){. 
236d0 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
236e0 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74  ing entry with t
236f0 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66  he same key is f
23700 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  ound. */.      /
23710 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f  * Fail because o
23720 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20  verwrite is not 
23730 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20  allows. */.     
23740 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
23750 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
23760 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 34  xt;.  }.  if( x4
23770 61 2d 3e 63 6f 75 6e 74 3e 3d 78 34 61 2d 3e 73  a->count>=x4a->s
23780 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ize ){.    /* Ne
23790 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68  ed to make the h
237a0 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72  ash table bigger
237b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69   */.    int i,si
237c0 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73  ze;.    struct s
237d0 5f 78 34 20 61 72 72 61 79 3b 0a 20 20 20 20 61  _x4 array;.    a
237e0 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65  rray.size = size
237f0 20 3d 20 78 34 61 2d 3e 73 69 7a 65 2a 32 3b 0a   = x4a->size*2;.
23800 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20      array.count 
23810 3d 20 78 34 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20  = x4a->count;.  
23820 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78    array.tbl = (x
23830 34 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20  4node*)malloc(. 
23840 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 34 6e       (sizeof(x4n
23850 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 34  ode) + sizeof(x4
23860 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a  node*))*size );.
23870 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62      if( array.tb
23880 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
23890 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f    /* Fail due to
238a0 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
238b0 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20  */.    array.ht 
238c0 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 61 72  = (x4node**)&(ar
238d0 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a  ray.tbl[size]);.
238e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
238f0 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e  ize; i++) array.
23900 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66  ht[i] = 0;.    f
23910 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63  or(i=0; i<x4a->c
23920 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ount; i++){.    
23930 20 20 78 34 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c    x4node *oldnp,
23940 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f   *newnp;.      o
23950 6c 64 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62  ldnp = &(x4a->tb
23960 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d  l[i]);.      h =
23970 20 63 6f 6e 66 69 67 68 61 73 68 28 6f 6c 64 6e   confighash(oldn
23980 70 2d 3e 64 61 74 61 29 20 26 20 28 73 69 7a 65  p->data) & (size
23990 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  -1);.      newnp
239a0 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69   = &(array.tbl[i
239b0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72  ]);.      if( ar
239c0 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61  ray.ht[h] ) arra
239d0 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  y.ht[h]->from = 
239e0 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a  &(newnp->next);.
239f0 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78        newnp->nex
23a00 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b  t = array.ht[h];
23a10 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61  .      newnp->da
23a20 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61  ta = oldnp->data
23a30 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66  ;.      newnp->f
23a40 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74  rom = &(array.ht
23a50 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61  [h]);.      arra
23a60 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b  y.ht[h] = newnp;
23a70 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
23a80 78 34 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a  x4a->tbl);.    *
23a90 78 34 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d  x4a = array;.  }
23aa0 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
23ab0 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68   new data */.  h
23ac0 20 3d 20 70 68 20 26 20 28 78 34 61 2d 3e 73 69   = ph & (x4a->si
23ad0 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28  ze-1);.  np = &(
23ae0 78 34 61 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63 6f  x4a->tbl[x4a->co
23af0 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64  unt++]);.  np->d
23b00 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66  ata = data;.  if
23b10 28 20 78 34 61 2d 3e 68 74 5b 68 5d 20 29 20 78  ( x4a->ht[h] ) x
23b20 34 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  4a->ht[h]->from 
23b30 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  = &(np->next);. 
23b40 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 34 61 2d   np->next = x4a-
23b50 3e 68 74 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e 68  >ht[h];.  x4a->h
23b60 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d  t[h] = np;.  np-
23b70 3e 66 72 6f 6d 20 3d 20 26 28 78 34 61 2d 3e 68  >from = &(x4a->h
23b80 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20  t[h]);.  return 
23b90 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  1;.}../* Return 
23ba0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
23bb0 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  a assigned to th
23bc0 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65  e given key.  Re
23bd0 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  turn NULL.** if 
23be0 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a  no such key. */.
23bf0 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
23c00 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e 64 28  onfigtable_find(
23c10 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b  struct config *k
23c20 65 79 29 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20  ey).{.  int h;. 
23c30 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20   x4node *np;..  
23c40 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74  if( x4a==0 ) ret
23c50 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 63 6f 6e  urn 0;.  h = con
23c60 66 69 67 68 61 73 68 28 6b 65 79 29 20 26 20 28  fighash(key) & (
23c70 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x4a->size-1);.  
23c80 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b  np = x4a->ht[h];
23c90 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a  .  while( np ){.
23ca0 20 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d      if( Configcm
23cb0 70 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  p((const char *)
23cc0 20 6e 70 2d 3e 64 61 74 61 2c 28 63 6f 6e 73 74   np->data,(const
23cd0 20 63 68 61 72 20 2a 29 20 6b 65 79 29 3d 3d 30   char *) key)==0
23ce0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70   ) break;.    np
23cf0 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
23d00 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e  .  return np ? n
23d10 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a  p->data : 0;.}..
23d20 2f 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61  /* Remove all da
23d30 74 61 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  ta from the tabl
23d40 65 2e 20 20 50 61 73 73 20 65 61 63 68 20 64 61  e.  Pass each da
23d50 74 61 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ta to the functi
23d60 6f 6e 20 22 66 22 0a 2a 2a 20 61 73 20 69 74 20  on "f".** as it 
23d70 69 73 20 72 65 6d 6f 76 65 64 2e 20 20 28 22 66  is removed.  ("f
23d80 22 20 6d 61 79 20 62 65 20 6e 75 6c 6c 20 74 6f  " may be null to
23d90 20 61 76 6f 69 64 20 74 68 69 73 20 73 74 65 70   avoid this step
23da0 2e 29 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  .) */.void Confi
23db0 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 69 6e 74  gtable_clear(int
23dc0 28 2a 66 29 28 73 74 72 75 63 74 20 63 6f 6e 66  (*f)(struct conf
23dd0 69 67 20 2a 29 29 0a 7b 0a 20 20 69 6e 74 20 69  ig *)).{.  int i
23de0 3b 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20 7c  ;.  if( x4a==0 |
23df0 7c 20 78 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30 20  | x4a->count==0 
23e00 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
23e10 66 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78  f ) for(i=0; i<x
23e20 34 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 20  4a->count; i++) 
23e30 28 2a 66 29 28 78 34 61 2d 3e 74 62 6c 5b 69 5d  (*f)(x4a->tbl[i]
23e40 2e 64 61 74 61 29 3b 0a 20 20 66 6f 72 28 69 3d  .data);.  for(i=
23e50 30 3b 20 69 3c 78 34 61 2d 3e 73 69 7a 65 3b 20  0; i<x4a->size; 
23e60 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20  i++) x4a->ht[i] 
23e70 3d 20 30 3b 0a 20 20 78 34 61 2d 3e 63 6f 75 6e  = 0;.  x4a->coun
23e80 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  t = 0;.  return;
23e90 0a 7d 0a                                         .}.