/ Hex Artifact Content
Login

Artifact 38a39c623df325bcbd67152d6f92e09edbee8b83:


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 0a 65 78 74   <stdlib.h>..ext
0190: 65 72 6e 20 76 6f 69 64 20 71 73 6f 72 74 28 29  ern void qsort()
01a0: 3b 0a 65 78 74 65 72 6e 20 64 6f 75 62 6c 65 20  ;.extern double 
01b0: 73 74 72 74 6f 64 28 29 3b 0a 65 78 74 65 72 6e  strtod();.extern
01c0: 20 6c 6f 6e 67 20 73 74 72 74 6f 6c 28 29 3b 0a   long strtol();.
01d0: 65 78 74 65 72 6e 20 76 6f 69 64 20 66 72 65 65  extern void free
01e0: 28 29 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 61  ();.extern int a
01f0: 63 63 65 73 73 28 29 3b 0a 65 78 74 65 72 6e 20  ccess();.extern 
0200: 69 6e 74 20 61 74 6f 69 28 29 3b 0a 0a 23 69 66  int atoi();..#if
0210: 6e 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23  ndef __WIN32__.#
0220: 20 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 57     if defined(_W
0230: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
0240: 28 57 49 4e 33 32 29 0a 23 09 64 65 66 69 6e 65  (WIN32).#.define
0250: 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23 20 20 20 65   __WIN32__.#   e
0260: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  ndif.#endif../* 
0270: 23 64 65 66 69 6e 65 20 50 52 49 56 41 54 45 20  #define PRIVATE 
0280: 73 74 61 74 69 63 20 2a 2f 0a 23 64 65 66 69 6e  static */.#defin
0290: 65 20 50 52 49 56 41 54 45 0a 0a 23 69 66 64 65  e PRIVATE..#ifde
02a0: 66 20 54 45 53 54 0a 23 64 65 66 69 6e 65 20 4d  f TEST.#define M
02b0: 41 58 52 48 53 20 35 20 20 20 20 20 20 20 2f 2a  AXRHS 5       /*
02c0: 20 53 65 74 20 6c 6f 77 20 74 6f 20 65 78 65 72   Set low to exer
02d0: 63 69 73 65 20 65 78 63 65 70 74 69 6f 6e 20 63  cise exception c
02e0: 6f 64 65 20 2a 2f 0a 23 65 6c 73 65 0a 23 64 65  ode */.#else.#de
02f0: 66 69 6e 65 20 4d 41 58 52 48 53 20 31 30 30 30  fine MAXRHS 1000
0300: 0a 23 65 6e 64 69 66 0a 0a 63 68 61 72 20 2a 6d  .#endif..char *m
0310: 73 6f 72 74 28 29 3b 0a 65 78 74 65 72 6e 20 76  sort();.extern v
0320: 6f 69 64 20 2a 6d 61 6c 6c 6f 63 28 29 3b 0a 0a  oid *malloc();..
0330: 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  /******** From t
0340: 68 65 20 66 69 6c 65 20 22 61 63 74 69 6f 6e 2e  he file "action.
0350: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63 74  ********/.struct
0380: 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f   action *Action_
0390: 6e 65 77 28 29 3b 0a 73 74 72 75 63 74 20 61 63  new();.struct ac
03a0: 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72  tion *Action_sor
03b0: 74 28 29 3b 0a 76 6f 69 64 20 41 63 74 69 6f 6e  t();.void Action
03c0: 5f 61 64 64 28 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  _add();../******
03d0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
03e0: 65 20 22 61 73 73 65 72 74 2e 68 22 20 2a 2a 2a  e "assert.h" ***
03f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0410: 2a 2f 0a 76 6f 69 64 20 6d 79 61 73 73 65 72 74  */.void myassert
0420: 28 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ();.#ifndef NDEB
0430: 55 47 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  UG.#  define ass
0440: 65 72 74 28 58 29 20 69 66 28 21 28 58 29 29 6d  ert(X) if(!(X))m
0450: 79 61 73 73 65 72 74 28 5f 5f 46 49 4c 45 5f 5f  yassert(__FILE__
0460: 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73 65  ,__LINE__).#else
0470: 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
0480: 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 2a  t(X).#endif../**
0490: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
04a0: 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 68 22  e file "build.h"
04b0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
04c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
04d0: 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64  *****/.void Find
04e0: 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73 28  RulePrecedences(
04f0: 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 69 72 73  );.void FindFirs
0500: 74 53 65 74 73 28 29 3b 0a 76 6f 69 64 20 46 69  tSets();.void Fi
0510: 6e 64 53 74 61 74 65 73 28 29 3b 0a 76 6f 69 64  ndStates();.void
0520: 20 46 69 6e 64 4c 69 6e 6b 73 28 29 3b 0a 76 6f   FindLinks();.vo
0530: 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74  id FindFollowSet
0540: 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 41 63  s();.void FindAc
0550: 74 69 6f 6e 73 28 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  tions();../*****
0560: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
0570: 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e 68  le "configlist.h
0580: 22 20 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: 2a 2a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  ***/.void Config
05b0: 6c 69 73 74 5f 69 6e 69 74 28 2f 2a 20 76 6f 69  list_init(/* voi
05c0: 64 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 63 6f  d */);.struct co
05d0: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
05e0: 5f 61 64 64 28 2f 2a 20 73 74 72 75 63 74 20 72  _add(/* struct r
05f0: 75 6c 65 20 2a 2c 20 69 6e 74 20 2a 2f 29 3b 0a  ule *, int */);.
0600: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
0610: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73  onfiglist_addbas
0620: 69 73 28 2f 2a 20 73 74 72 75 63 74 20 72 75 6c  is(/* struct rul
0630: 65 20 2a 2c 20 69 6e 74 20 2a 2f 29 3b 0a 76 6f  e *, int */);.vo
0640: 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c  id Configlist_cl
0650: 6f 73 75 72 65 28 2f 2a 20 76 6f 69 64 20 2a 2f  osure(/* void */
0660: 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  );.void Configli
0670: 73 74 5f 73 6f 72 74 28 2f 2a 20 76 6f 69 64 20  st_sort(/* void 
0680: 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67  */);.void Config
0690: 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28 2f  list_sortbasis(/
06a0: 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 73 74 72 75  * void */);.stru
06b0: 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
06c0: 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 2f 2a 20  glist_return(/* 
06d0: 76 6f 69 64 20 2a 2f 29 3b 0a 73 74 72 75 63 74  void */);.struct
06e0: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c   config *Configl
06f0: 69 73 74 5f 62 61 73 69 73 28 2f 2a 20 76 6f 69  ist_basis(/* voi
0700: 64 20 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66  d */);.void Conf
0710: 69 67 6c 69 73 74 5f 65 61 74 28 2f 2a 20 73 74  iglist_eat(/* st
0720: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f  ruct config * */
0730: 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  );.void Configli
0740: 73 74 5f 72 65 73 65 74 28 2f 2a 20 76 6f 69 64  st_reset(/* void
0750: 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   */);../********
0760: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
0770: 22 65 72 72 6f 72 2e 68 22 20 2a 2a 2a 2a 2a 2a  "error.h" ******
0780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
07a0: 2a 2f 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67  */.void ErrorMsg
07b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69  (const char *, i
07c0: 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c  nt,const char *,
07d0: 20 2e 2e 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 20   ...);../****** 
07e0: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6f  From the file "o
07f0: 70 74 69 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  ption.h" *******
0800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0820: 2a 2a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 6f 70  ***/.struct s_op
0830: 74 69 6f 6e 73 20 7b 0a 20 20 65 6e 75 6d 20 7b  tions {.  enum {
0840: 20 4f 50 54 5f 46 4c 41 47 3d 31 2c 20 20 4f 50   OPT_FLAG=1,  OP
0850: 54 5f 49 4e 54 2c 20 20 4f 50 54 5f 44 42 4c 2c  T_INT,  OPT_DBL,
0860: 20 20 4f 50 54 5f 53 54 52 2c 0a 20 20 20 20 20    OPT_STR,.     
0870: 20 20 20 20 4f 50 54 5f 46 46 4c 41 47 2c 20 4f      OPT_FFLAG, O
0880: 50 54 5f 46 49 4e 54 2c 20 4f 50 54 5f 46 44 42  PT_FINT, OPT_FDB
0890: 4c 2c 20 4f 50 54 5f 46 53 54 52 7d 20 74 79 70  L, OPT_FSTR} typ
08a0: 65 3b 0a 20 20 63 68 61 72 20 2a 6c 61 62 65 6c  e;.  char *label
08b0: 3b 0a 20 20 63 68 61 72 20 2a 61 72 67 3b 0a 20  ;.  char *arg;. 
08c0: 20 63 68 61 72 20 2a 6d 65 73 73 61 67 65 3b 0a   char *message;.
08d0: 7d 3b 0a 69 6e 74 20 20 20 20 4f 70 74 49 6e 69  };.int    OptIni
08e0: 74 28 2f 2a 20 63 68 61 72 2a 2a 2c 73 74 72 75  t(/* char**,stru
08f0: 63 74 20 73 5f 6f 70 74 69 6f 6e 73 2a 2c 46 49  ct s_options*,FI
0900: 4c 45 2a 20 2a 2f 29 3b 0a 69 6e 74 20 20 20 20  LE* */);.int    
0910: 4f 70 74 4e 41 72 67 73 28 2f 2a 20 76 6f 69 64  OptNArgs(/* void
0920: 20 2a 2f 29 3b 0a 63 68 61 72 20 20 2a 4f 70 74   */);.char  *Opt
0930: 41 72 67 28 2f 2a 20 69 6e 74 20 2a 2f 29 3b 0a  Arg(/* int */);.
0940: 76 6f 69 64 20 20 20 4f 70 74 45 72 72 28 2f 2a  void   OptErr(/*
0950: 20 69 6e 74 20 2a 2f 29 3b 0a 76 6f 69 64 20 20   int */);.void  
0960: 20 4f 70 74 50 72 69 6e 74 28 2f 2a 20 76 6f 69   OptPrint(/* voi
0970: 64 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  d */);../*******
0980: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
0990: 22 70 61 72 73 65 2e 68 22 20 2a 2a 2a 2a 2a 2a  "parse.h" ******
09a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09c0: 2a 2a 2a 2f 0a 76 6f 69 64 20 50 61 72 73 65 28  ***/.void Parse(
09d0: 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  /* struct lemon 
09e0: 2a 6c 65 6d 70 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a  *lemp */);../***
09f0: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
0a00: 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 68 22 20 2a  file "plink.h" *
0a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a30: 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63 74 20 70  ******/.struct p
0a40: 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28  link *Plink_new(
0a50: 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 76 6f 69  /* void */);.voi
0a60: 64 20 50 6c 69 6e 6b 5f 61 64 64 28 2f 2a 20 73  d Plink_add(/* s
0a70: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20  truct plink **, 
0a80: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
0a90: 2a 2f 29 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  */);.void Plink_
0aa0: 63 6f 70 79 28 2f 2a 20 73 74 72 75 63 74 20 70  copy(/* struct p
0ab0: 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75 63 74 20  link **, struct 
0ac0: 70 6c 69 6e 6b 20 2a 20 2a 2f 29 3b 0a 76 6f 69  plink * */);.voi
0ad0: 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 2f  d Plink_delete(/
0ae0: 2a 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  * struct plink *
0af0: 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   */);../********
0b00: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
0b10: 20 22 72 65 70 6f 72 74 2e 68 22 20 2a 2a 2a 2a   "report.h" ****
0b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b40: 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28  */.void Reprint(
0b50: 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  /* struct lemon 
0b60: 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 52 65 70 6f  * */);.void Repo
0b70: 72 74 4f 75 74 70 75 74 28 2f 2a 20 73 74 72 75  rtOutput(/* stru
0b80: 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a  ct lemon * */);.
0b90: 76 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c 65  void ReportTable
0ba0: 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  (/* struct lemon
0bb0: 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 52 65 70   * */);.void Rep
0bc0: 6f 72 74 48 65 61 64 65 72 28 2f 2a 20 73 74 72  ortHeader(/* str
0bd0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b  uct lemon * */);
0be0: 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73 73 54 61  .void CompressTa
0bf0: 62 6c 65 73 28 2f 2a 20 73 74 72 75 63 74 20 6c  bles(/* struct l
0c00: 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a 0a 2f 2a 2a  emon * */);../**
0c10: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
0c20: 65 20 66 69 6c 65 20 22 73 65 74 2e 68 22 20 2a  e file "set.h" *
0c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c50: 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 20 53  *******/.void  S
0c60: 65 74 53 69 7a 65 28 2f 2a 20 69 6e 74 20 4e 20  etSize(/* int N 
0c70: 2a 2f 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  */);            
0c80: 20 2f 2a 20 41 6c 6c 20 73 65 74 73 20 77 69 6c   /* All sets wil
0c90: 6c 20 62 65 20 6f 66 20 73 69 7a 65 20 4e 20 2a  l be of size N *
0ca0: 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28 2f  /.char *SetNew(/
0cb0: 2a 20 76 6f 69 64 20 2a 2f 29 3b 20 20 20 20 20  * void */);     
0cc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e            /* A n
0cd0: 65 77 20 73 65 74 20 66 6f 72 20 65 6c 65 6d 65  ew set for eleme
0ce0: 6e 74 20 30 2e 2e 4e 20 2a 2f 0a 76 6f 69 64 20  nt 0..N */.void 
0cf0: 20 53 65 74 46 72 65 65 28 2f 2a 20 63 68 61 72   SetFree(/* char
0d00: 2a 20 2a 2f 29 3b 20 20 20 20 20 20 20 20 20 20  * */);          
0d10: 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65     /* Deallocate
0d20: 20 61 20 73 65 74 20 2a 2f 0a 0a 69 6e 74 20 53   a set */..int S
0d30: 65 74 41 64 64 28 2f 2a 20 63 68 61 72 2a 2c 69  etAdd(/* char*,i
0d40: 6e 74 20 2a 2f 29 3b 20 20 20 20 20 20 20 20 20  nt */);         
0d50: 20 20 20 2f 2a 20 41 64 64 20 65 6c 65 6d 65 6e     /* Add elemen
0d60: 74 20 74 6f 20 61 20 73 65 74 20 2a 2f 0a 69 6e  t to a set */.in
0d70: 74 20 53 65 74 55 6e 69 6f 6e 28 2f 2a 20 63 68  t SetUnion(/* ch
0d80: 61 72 20 2a 41 2c 63 68 61 72 20 2a 42 20 2a 2f  ar *A,char *B */
0d90: 29 3b 20 20 20 20 2f 2a 20 41 20 3c 2d 20 41 20  );    /* A <- A 
0da0: 55 20 42 2c 20 74 68 72 75 20 65 6c 65 6d 65 6e  U B, thru elemen
0db0: 74 20 4e 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20  t N */..#define 
0dc0: 53 65 74 46 69 6e 64 28 58 2c 59 29 20 28 58 5b  SetFind(X,Y) (X[
0dd0: 59 5d 29 20 20 20 20 20 20 20 2f 2a 20 54 72 75  Y])       /* Tru
0de0: 65 20 69 66 20 59 20 69 73 20 69 6e 20 73 65 74  e if Y is in set
0df0: 20 58 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   X */../********
0e00: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
0e10: 20 22 73 74 72 75 63 74 2e 68 22 20 2a 2a 2a 2a   "struct.h" ****
0e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e40: 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 63 69 70  */./*.** Princip
0e50: 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72  al data structur
0e60: 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e  es for the LEMON
0e70: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0e80: 72 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20 65  r..*/..typedef e
0e90: 6e 75 6d 20 7b 42 5f 46 41 4c 53 45 3d 30 2c 20  num {B_FALSE=0, 
0ea0: 42 5f 54 52 55 45 7d 20 42 6f 6f 6c 65 61 6e 3b  B_TRUE} Boolean;
0eb0: 0a 0a 2f 2a 20 53 79 6d 62 6f 6c 73 20 28 74 65  ../* Symbols (te
0ec0: 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74  rminals and nont
0ed0: 65 72 6d 69 6e 61 6c 73 29 20 6f 66 20 74 68 65  erminals) of the
0ee0: 20 67 72 61 6d 6d 61 72 20 61 72 65 20 73 74 6f   grammar are sto
0ef0: 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f  red.** in the fo
0f00: 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 73 74 72 75  llowing: */.stru
0f10: 63 74 20 73 79 6d 62 6f 6c 20 7b 0a 20 20 63 68  ct symbol {.  ch
0f20: 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20  ar *name;       
0f30: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
0f40: 66 20 74 68 65 20 73 79 6d 62 6f 6c 20 2a 2f 0a  f the symbol */.
0f50: 20 20 69 6e 74 20 69 6e 64 65 78 3b 20 20 20 20    int index;    
0f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0f70: 64 65 78 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  dex number for t
0f80: 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20  his symbol */.  
0f90: 65 6e 75 6d 20 7b 0a 20 20 20 20 54 45 52 4d 49  enum {.    TERMI
0fa0: 4e 41 4c 2c 0a 20 20 20 20 4e 4f 4e 54 45 52 4d  NAL,.    NONTERM
0fb0: 49 4e 41 4c 0a 20 20 7d 20 74 79 70 65 3b 20 20  INAL.  } type;  
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fd0: 2f 2a 20 53 79 6d 62 6f 6c 73 20 61 72 65 20 61  /* Symbols are a
0fe0: 6c 6c 20 65 69 74 68 65 72 20 54 45 52 4d 49 4e  ll either TERMIN
0ff0: 41 4c 53 20 6f 72 20 4e 54 73 20 2a 2f 0a 20 20  ALS or NTs */.  
1000: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 75 6c  struct rule *rul
1010: 65 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b  e;       /* Link
1020: 65 64 20 6c 69 73 74 20 6f 66 20 72 75 6c 65 73  ed list of rules
1030: 20 6f 66 20 74 68 69 73 20 28 69 66 20 61 6e 20   of this (if an 
1040: 4e 54 29 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  NT) */.  struct 
1050: 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b  symbol *fallback
1060: 3b 20 2f 2a 20 66 61 6c 6c 62 61 63 6b 20 74 6f  ; /* fallback to
1070: 6b 65 6e 20 69 6e 20 63 61 73 65 20 74 68 69 73  ken in case this
1080: 20 74 6f 6b 65 6e 20 64 6f 65 73 6e 27 74 20 70   token doesn't p
1090: 61 72 73 65 20 2a 2f 0a 20 20 69 6e 74 20 70 72  arse */.  int pr
10a0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
10b0: 20 20 20 2f 2a 20 50 72 65 63 65 64 65 6e 63 65     /* Precedence
10c0: 20 69 66 20 64 65 66 69 6e 65 64 20 28 2d 31 20   if defined (-1 
10d0: 6f 74 68 65 72 77 69 73 65 29 20 2a 2f 0a 20 20  otherwise) */.  
10e0: 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 7b 0a 20  enum e_assoc {. 
10f0: 20 20 20 4c 45 46 54 2c 0a 20 20 20 20 52 49 47     LEFT,.    RIG
1100: 48 54 2c 0a 20 20 20 20 4e 4f 4e 45 2c 0a 20 20  HT,.    NONE,.  
1110: 20 20 55 4e 4b 0a 20 20 7d 20 61 73 73 6f 63 3b    UNK.  } assoc;
1120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1130: 20 2f 2a 20 41 73 73 6f 63 69 61 74 69 76 69 74   /* Associativit
1140: 79 20 69 66 20 70 72 65 64 65 63 65 6e 63 65 20  y if predecence 
1150: 69 73 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20  is defined */.  
1160: 63 68 61 72 20 2a 66 69 72 73 74 73 65 74 3b 20  char *firstset; 
1170: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1180: 74 2d 73 65 74 20 66 6f 72 20 61 6c 6c 20 72 75  t-set for all ru
1190: 6c 65 73 20 6f 66 20 74 68 69 73 20 73 79 6d 62  les of this symb
11a0: 6f 6c 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20  ol */.  Boolean 
11b0: 6c 61 6d 62 64 61 3b 20 20 20 20 20 20 20 20 20  lambda;         
11c0: 20 2f 2a 20 54 72 75 65 20 69 66 20 4e 54 20 61   /* True if NT a
11d0: 6e 64 20 63 61 6e 20 67 65 6e 65 72 61 74 65 20  nd can generate 
11e0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20  an empty string 
11f0: 2a 2f 0a 20 20 63 68 61 72 20 2a 64 65 73 74 72  */.  char *destr
1200: 75 63 74 6f 72 3b 20 20 20 20 20 20 20 20 2f 2a  uctor;        /*
1210: 20 43 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   Code which exec
1220: 75 74 65 73 20 77 68 65 6e 65 76 65 72 20 74 68  utes whenever th
1230: 69 73 20 73 79 6d 62 6f 6c 20 69 73 0a 20 20 20  is symbol is.   
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1250: 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 70 70 65          ** poppe
1260: 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  d from the stack
1270: 20 64 75 72 69 6e 67 20 65 72 72 6f 72 20 70 72   during error pr
1280: 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e  ocessing */.  in
1290: 74 20 64 65 73 74 72 75 63 74 6f 72 6c 6e 3b 20  t destructorln; 
12a0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
12b0: 75 6d 62 65 72 20 6f 66 20 64 65 73 74 72 75 63  umber of destruc
12c0: 74 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  tor code */.  ch
12d0: 61 72 20 2a 64 61 74 61 74 79 70 65 3b 20 20 20  ar *datatype;   
12e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
12f0: 74 61 20 74 79 70 65 20 6f 66 20 69 6e 66 6f 72  ta type of infor
1300: 6d 61 74 69 6f 6e 20 68 65 6c 64 20 62 79 20 74  mation held by t
1310: 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  his.            
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1330: 2a 20 6f 62 6a 65 63 74 2e 20 4f 6e 6c 79 20 75  * object. Only u
1340: 73 65 64 20 69 66 20 74 79 70 65 3d 3d 4e 4f 4e  sed if type==NON
1350: 54 45 52 4d 49 4e 41 4c 20 2a 2f 0a 20 20 69 6e  TERMINAL */.  in
1360: 74 20 64 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  t dtnum;        
1370: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1380: 74 61 20 74 79 70 65 20 6e 75 6d 62 65 72 2e 20  ta type number. 
1390: 20 49 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20   In the parser, 
13a0: 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  the value.      
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c0: 20 20 20 20 20 2a 2a 20 73 74 61 63 6b 20 69 73       ** stack is
13d0: 20 61 20 75 6e 69 6f 6e 2e 20 20 54 68 65 20 2e   a union.  The .
13e0: 79 79 25 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20  yy%d element of 
13f0: 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  this.           
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 2a 2a 20 75 6e 69 6f 6e 20 69 73 20 74 68 65 20  ** union is the 
1420: 63 6f 72 72 65 63 74 20 64 61 74 61 20 74 79 70  correct data typ
1430: 65 20 66 6f 72 20 74 68 69 73 20 6f 62 6a 65 63  e for this objec
1440: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68  t */.};../* Each
1450: 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65   production rule
1460: 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20   in the grammar 
1470: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
1480: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
1490: 72 75 63 74 75 72 65 2e 20 20 2a 2f 0a 73 74 72  ructure.  */.str
14a0: 75 63 74 20 72 75 6c 65 20 7b 0a 20 20 73 74 72  uct rule {.  str
14b0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b  uct symbol *lhs;
14c0: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61        /* Left-ha
14d0: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 72  nd side of the r
14e0: 75 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c  ule */.  char *l
14f0: 68 73 61 6c 69 61 73 3b 20 20 20 20 20 20 20 20  hsalias;        
1500: 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74    /* Alias for t
1510: 68 65 20 4c 48 53 20 28 4e 55 4c 4c 20 69 66 20  he LHS (NULL if 
1520: 6e 6f 6e 65 29 20 2a 2f 0a 20 20 69 6e 74 20 72  none) */.  int r
1530: 75 6c 65 6c 69 6e 65 3b 20 20 20 20 20 20 20 20  uleline;        
1540: 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62      /* Line numb
1550: 65 72 20 66 6f 72 20 74 68 65 20 72 75 6c 65 20  er for the rule 
1560: 2a 2f 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20 20  */.  int nrhs;  
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1580: 20 4e 75 6d 62 65 72 20 6f 66 20 52 48 53 20 73   Number of RHS s
1590: 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 73 74 72 75  ymbols */.  stru
15a0: 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 72 68 73 3b  ct symbol **rhs;
15b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20       /* The RHS 
15c0: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61  symbols */.  cha
15d0: 72 20 2a 2a 72 68 73 61 6c 69 61 73 3b 20 20 20  r **rhsalias;   
15e0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 6c 69 61        /* An alia
15f0: 73 20 66 6f 72 20 65 61 63 68 20 52 48 53 20 73  s for each RHS s
1600: 79 6d 62 6f 6c 20 28 4e 55 4c 4c 20 69 66 20 6e  ymbol (NULL if n
1610: 6f 6e 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6c 69  one) */.  int li
1620: 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ne;             
1630: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
1640: 72 20 61 74 20 77 68 69 63 68 20 63 6f 64 65 20  r at which code 
1650: 62 65 67 69 6e 73 20 2a 2f 0a 20 20 63 68 61 72  begins */.  char
1660: 20 2a 63 6f 64 65 3b 20 20 20 20 20 20 20 20 20   *code;         
1670: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65       /* The code
1680: 20 65 78 65 63 75 74 65 64 20 77 68 65 6e 20 74   executed when t
1690: 68 69 73 20 72 75 6c 65 20 69 73 20 72 65 64 75  his rule is redu
16a0: 63 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ced */.  struct 
16b0: 73 79 6d 62 6f 6c 20 2a 70 72 65 63 73 79 6d 3b  symbol *precsym;
16c0: 20 20 2f 2a 20 50 72 65 63 65 64 65 6e 63 65 20    /* Precedence 
16d0: 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68 69 73 20  symbol for this 
16e0: 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  rule */.  int in
16f0: 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
1700: 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6e     /* An index n
1710: 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 72  umber for this r
1720: 75 6c 65 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e  ule */.  Boolean
1730: 20 63 61 6e 52 65 64 75 63 65 3b 20 20 20 20 20   canReduce;     
1740: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
1750: 73 20 72 75 6c 65 20 69 73 20 65 76 65 72 20 72  s rule is ever r
1760: 65 64 75 63 65 64 20 2a 2f 0a 20 20 73 74 72 75  educed */.  stru
1770: 63 74 20 72 75 6c 65 20 2a 6e 65 78 74 6c 68 73  ct rule *nextlhs
1780: 3b 20 20 20 20 2f 2a 20 4e 65 78 74 20 72 75 6c  ;    /* Next rul
1790: 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
17a0: 4c 48 53 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  LHS */.  struct 
17b0: 72 75 6c 65 20 2a 6e 65 78 74 3b 20 20 20 20 20  rule *next;     
17c0: 20 20 2f 2a 20 4e 65 78 74 20 72 75 6c 65 20 69    /* Next rule i
17d0: 6e 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73  n the global lis
17e0: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 20 63 6f  t */.};../* A co
17f0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 73 20 61  nfiguration is a
1800: 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65   production rule
1810: 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20   of the grammar 
1820: 74 6f 67 65 74 68 65 72 20 77 69 74 68 0a 2a 2a  together with.**
1830: 20 61 20 6d 61 72 6b 20 28 64 6f 74 29 20 73 68   a mark (dot) sh
1840: 6f 77 69 6e 67 20 68 6f 77 20 6d 75 63 68 20 6f  owing how much o
1850: 66 20 74 68 61 74 20 72 75 6c 65 20 68 61 73 20  f that rule has 
1860: 62 65 65 6e 20 70 72 6f 63 65 73 73 65 64 20 73  been processed s
1870: 6f 20 66 61 72 2e 0a 2a 2a 20 43 6f 6e 66 69 67  o far..** Config
1880: 75 72 61 74 69 6f 6e 73 20 61 6c 73 6f 20 63 6f  urations also co
1890: 6e 74 61 69 6e 20 61 20 66 6f 6c 6c 6f 77 2d 73  ntain a follow-s
18a0: 65 74 20 77 68 69 63 68 20 69 73 20 61 20 6c 69  et which is a li
18b0: 73 74 20 6f 66 20 74 65 72 6d 69 6e 61 6c 0a 2a  st of terminal.*
18c0: 2a 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20  * symbols which 
18d0: 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 69  are allowed to i
18e0: 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
18f0: 77 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  w the end of the
1900: 20 72 75 6c 65 2e 0a 2a 2a 20 45 76 65 72 79 20   rule..** Every 
1910: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 73  configuration is
1920: 20 72 65 63 6f 72 64 65 64 20 61 73 20 61 6e 20   recorded as an 
1930: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1940: 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 73 74  following: */.st
1950: 72 75 63 74 20 63 6f 6e 66 69 67 20 7b 0a 20 20  ruct config {.  
1960: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
1970: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1980: 72 75 6c 65 20 75 70 6f 6e 20 77 68 69 63 68 20  rule upon which 
1990: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
19a0: 6e 20 69 73 20 62 61 73 65 64 20 2a 2f 0a 20 20  n is based */.  
19b0: 69 6e 74 20 64 6f 74 3b 20 20 20 20 20 20 20 20  int dot;        
19c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19d0: 70 61 72 73 65 20 70 6f 69 6e 74 20 2a 2f 0a 20  parse point */. 
19e0: 20 63 68 61 72 20 2a 66 77 73 3b 20 20 20 20 20   char *fws;     
19f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 6c            /* Fol
1a00: 6c 6f 77 2d 73 65 74 20 66 6f 72 20 74 68 69 73  low-set for this
1a10: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   configuration o
1a20: 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1a30: 70 6c 69 6e 6b 20 2a 66 70 6c 70 3b 20 20 20 20  plink *fplp;    
1a40: 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20    /* Follow-set 
1a50: 66 6f 72 77 61 72 64 20 70 72 6f 70 61 67 61 74  forward propagat
1a60: 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73  ion links */.  s
1a70: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 62 70 6c  truct plink *bpl
1a80: 70 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f  p;      /* Follo
1a90: 77 2d 73 65 74 20 62 61 63 6b 77 61 72 64 73 20  w-set backwards 
1aa0: 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b  propagation link
1ab0: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  s */.  struct st
1ac0: 61 74 65 20 2a 73 74 70 3b 20 20 20 20 20 20 20  ate *stp;       
1ad0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74  /* Pointer to st
1ae0: 61 74 65 20 77 68 69 63 68 20 63 6f 6e 74 61 69  ate which contai
1af0: 6e 73 20 74 68 69 73 20 2a 2f 0a 20 20 65 6e 75  ns this */.  enu
1b00: 6d 20 7b 0a 20 20 20 20 43 4f 4d 50 4c 45 54 45  m {.    COMPLETE
1b10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1b20: 2a 20 54 68 65 20 73 74 61 74 75 73 20 69 73 20  * The status is 
1b30: 75 73 65 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c  used during foll
1b40: 6f 77 73 65 74 20 61 6e 64 20 2a 2f 0a 20 20 20  owset and */.   
1b50: 20 49 4e 43 4f 4d 50 4c 45 54 45 20 20 20 20 20   INCOMPLETE     
1b60: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 73 68          /*    sh
1b70: 69 66 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e 73  ift computations
1b80: 20 2a 2f 0a 20 20 7d 20 73 74 61 74 75 73 3b 0a   */.  } status;.
1b90: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
1ba0: 2a 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65  *next;     /* Ne
1bb0: 78 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  xt configuration
1bc0: 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 2a 2f   in the state */
1bd0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
1be0: 20 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54   *bp;       /* T
1bf0: 68 65 20 6e 65 78 74 20 62 61 73 69 73 20 63 6f  he next basis co
1c00: 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d  nfiguration */.}
1c10: 3b 0a 0a 2f 2a 20 45 76 65 72 79 20 73 68 69 66  ;../* Every shif
1c20: 74 20 6f 72 20 72 65 64 75 63 65 20 6f 70 65 72  t or reduce oper
1c30: 61 74 69 6f 6e 20 69 73 20 73 74 6f 72 65 64 20  ation is stored 
1c40: 61 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  as one of the fo
1c50: 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 72 75 63  llowing */.struc
1c60: 74 20 61 63 74 69 6f 6e 20 7b 0a 20 20 73 74 72  t action {.  str
1c70: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20  uct symbol *sp; 
1c80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f        /* The loo
1c90: 6b 2d 61 68 65 61 64 20 73 79 6d 62 6f 6c 20 2a  k-ahead symbol *
1ca0: 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 63 74 69 6f  /.  enum e_actio
1cb0: 6e 20 7b 0a 20 20 20 20 53 48 49 46 54 2c 0a 20  n {.    SHIFT,. 
1cc0: 20 20 20 41 43 43 45 50 54 2c 0a 20 20 20 20 52     ACCEPT,.    R
1cd0: 45 44 55 43 45 2c 0a 20 20 20 20 45 52 52 4f 52  EDUCE,.    ERROR
1ce0: 2c 0a 20 20 20 20 43 4f 4e 46 4c 49 43 54 2c 20  ,.    CONFLICT, 
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d00: 2a 20 57 61 73 20 61 20 72 65 64 75 63 65 2c 20  * Was a reduce, 
1d10: 62 75 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f  but part of a co
1d20: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20 53 48  nflict */.    SH
1d30: 5f 52 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20  _RESOLVED,      
1d40: 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20         /* Was a 
1d50: 73 68 69 66 74 2e 20 20 50 72 65 63 65 64 65 6e  shift.  Preceden
1d60: 63 65 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66  ce resolved conf
1d70: 6c 69 63 74 20 2a 2f 0a 20 20 20 20 52 44 5f 52  lict */.    RD_R
1d80: 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20  ESOLVED,        
1d90: 20 20 20 20 20 2f 2a 20 57 61 73 20 72 65 64 75       /* Was redu
1da0: 63 65 2e 20 20 50 72 65 63 65 64 65 6e 63 65 20  ce.  Precedence 
1db0: 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63  resolved conflic
1dc0: 74 20 2a 2f 0a 20 20 20 20 4e 4f 54 5f 55 53 45  t */.    NOT_USE
1dd0: 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D               
1de0: 20 20 2f 2a 20 44 65 6c 65 74 65 64 20 62 79 20    /* Deleted by 
1df0: 63 6f 6d 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  compression */. 
1e00: 20 7d 20 74 79 70 65 3b 0a 20 20 75 6e 69 6f 6e   } type;.  union
1e10: 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74   {.    struct st
1e20: 61 74 65 20 2a 73 74 70 3b 20 20 20 20 20 2f 2a  ate *stp;     /*
1e30: 20 54 68 65 20 6e 65 77 20 73 74 61 74 65 2c 20   The new state, 
1e40: 69 66 20 61 20 73 68 69 66 74 20 2a 2f 0a 20 20  if a shift */.  
1e50: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
1e60: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
1e70: 72 75 6c 65 2c 20 69 66 20 61 20 72 65 64 75 63  rule, if a reduc
1e80: 65 20 2a 2f 0a 20 20 7d 20 78 3b 0a 20 20 73 74  e */.  } x;.  st
1e90: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 78  ruct action *nex
1ea0: 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61  t;     /* Next a
1eb0: 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 73  ction for this s
1ec0: 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  tate */.  struct
1ed0: 20 61 63 74 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65   action *collide
1ee0: 3b 20 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f  ;  /* Next actio
1ef0: 6e 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  n with the same 
1f00: 68 61 73 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45  hash */.};../* E
1f10: 61 63 68 20 73 74 61 74 65 20 6f 66 20 74 68 65  ach state of the
1f20: 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65   generated parse
1f30: 72 27 73 20 66 69 6e 69 74 65 20 73 74 61 74 65  r's finite state
1f40: 20 6d 61 63 68 69 6e 65 0a 2a 2a 20 69 73 20 65   machine.** is e
1f50: 6e 63 6f 64 65 64 20 61 73 20 61 6e 20 69 6e 73  ncoded as an ins
1f60: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
1f70: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1f80: 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74  . */.struct stat
1f90: 65 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  e {.  struct con
1fa0: 66 69 67 20 2a 62 70 3b 20 20 20 20 20 20 20 2f  fig *bp;       /
1fb0: 2a 20 54 68 65 20 62 61 73 69 73 20 63 6f 6e 66  * The basis conf
1fc0: 69 67 75 72 61 74 69 6f 6e 73 20 66 6f 72 20 74  igurations for t
1fd0: 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73  his state */.  s
1fe0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
1ff0: 70 3b 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63  p;      /* All c
2000: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 69 6e  onfigurations in
2010: 20 74 68 69 73 20 73 65 74 20 2a 2f 0a 20 20 69   this set */.  i
2020: 6e 74 20 69 6e 64 65 78 3b 20 20 20 20 20 20 20  nt index;       
2030: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 71 75 65          /* Seque
2040: 6e 63 69 61 6c 20 6e 75 6d 62 65 72 20 66 6f 72  ncial number for
2050: 20 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20   this state */. 
2060: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
2070: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72  ap;       /* Arr
2080: 61 79 20 6f 66 20 61 63 74 69 6f 6e 73 20 66 6f  ay of actions fo
2090: 72 20 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a  r this state */.
20a0: 20 20 69 6e 74 20 6e 54 6b 6e 41 63 74 2c 20 6e    int nTknAct, n
20b0: 4e 74 41 63 74 3b 20 20 20 20 20 2f 2a 20 4e 75  NtAct;     /* Nu
20c0: 6d 62 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20  mber of actions 
20d0: 6f 6e 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64  on terminals and
20e0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 2a 2f   nonterminals */
20f0: 0a 20 20 69 6e 74 20 69 54 6b 6e 4f 66 73 74 2c  .  int iTknOfst,
2100: 20 69 4e 74 4f 66 73 74 3b 20 20 20 2f 2a 20 79   iNtOfst;   /* y
2110: 79 5f 61 63 74 69 6f 6e 5b 5d 20 6f 66 66 73 65  y_action[] offse
2120: 74 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c 73 20  t for terminals 
2130: 61 6e 64 20 6e 6f 6e 74 65 72 6d 73 20 2a 2f 0a  and nonterms */.
2140: 20 20 69 6e 74 20 69 44 66 6c 74 3b 20 20 20 20    int iDflt;    
2150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
2160: 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 2a 2f 0a  fault action */.
2170: 7d 3b 0a 23 64 65 66 69 6e 65 20 4e 4f 5f 4f 46  };.#define NO_OF
2180: 46 53 45 54 20 28 2d 32 31 34 37 34 38 33 36 34  FSET (-214748364
2190: 37 29 0a 0a 2f 2a 20 41 20 66 6f 6c 6c 6f 77 73  7)../* A follows
21a0: 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  et propagation l
21b0: 69 6e 6b 20 69 6e 64 69 63 61 74 65 73 20 74 68  ink indicates th
21c0: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
21d0: 6f 66 20 6f 6e 65 0a 2a 2a 20 63 6f 6e 66 69 67  of one.** config
21e0: 75 72 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77 73 65  uration followse
21f0: 74 20 73 68 6f 75 6c 64 20 62 65 20 70 72 6f 70  t should be prop
2200: 61 67 61 74 65 64 20 74 6f 20 61 6e 6f 74 68 65  agated to anothe
2210: 72 20 77 68 65 6e 65 76 65 72 0a 2a 2a 20 74 68  r whenever.** th
2220: 65 20 66 69 72 73 74 20 63 68 61 6e 67 65 73 2e  e first changes.
2230: 20 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b   */.struct plink
2240: 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66   {.  struct conf
2250: 69 67 20 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a  ig *cfp;      /*
2260: 20 54 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   The configurati
2270: 6f 6e 20 74 6f 20 77 68 69 63 68 20 6c 69 6e 6b  on to which link
2280: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70  ed */.  struct p
2290: 6c 69 6e 6b 20 2a 6e 65 78 74 3b 20 20 20 20 20  link *next;     
22a0: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 72 6f   /* The next pro
22b0: 70 61 67 61 74 65 20 6c 69 6e 6b 20 2a 2f 0a 7d  pagate link */.}
22c0: 3b 0a 0a 2f 2a 20 54 68 65 20 73 74 61 74 65 20  ;../* The state 
22d0: 76 65 63 74 6f 72 20 66 6f 72 20 74 68 65 20 65  vector for the e
22e0: 6e 74 69 72 65 20 70 61 72 73 65 72 20 67 65 6e  ntire parser gen
22f0: 65 72 61 74 6f 72 20 69 73 20 72 65 63 6f 72 64  erator is record
2300: 65 64 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73  ed as.** follows
2310: 2e 20 20 28 4c 45 4d 4f 4e 20 75 73 65 73 20 6e  .  (LEMON uses n
2320: 6f 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  o global variabl
2330: 65 73 20 61 6e 64 20 6d 61 6b 65 73 20 6c 69 74  es and makes lit
2340: 74 6c 65 20 75 73 65 20 6f 66 0a 2a 2a 20 73 74  tle use of.** st
2350: 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 2e 20  atic variables. 
2360: 20 46 69 65 6c 64 73 20 69 6e 20 74 68 65 20 66   Fields in the f
2370: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2380: 72 65 20 63 61 6e 20 62 65 20 74 68 6f 75 67 68  re can be though
2390: 74 0a 2a 2a 20 6f 66 20 61 73 20 62 65 67 69 6e  t.** of as begin
23a0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
23b0: 73 20 69 6e 20 74 68 65 20 70 72 6f 67 72 61 6d  s in the program
23c0: 2e 29 20 2a 2f 0a 73 74 72 75 63 74 20 6c 65 6d  .) */.struct lem
23d0: 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74  on {.  struct st
23e0: 61 74 65 20 2a 2a 73 6f 72 74 65 64 3b 20 20 20  ate **sorted;   
23f0: 2f 2a 20 54 61 62 6c 65 20 6f 66 20 73 74 61 74  /* Table of stat
2400: 65 73 20 73 6f 72 74 65 64 20 62 79 20 73 74 61  es sorted by sta
2410: 74 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  te number */.  s
2420: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 75 6c 65  truct rule *rule
2430: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
2440: 6f 66 20 61 6c 6c 20 72 75 6c 65 73 20 2a 2f 0a  of all rules */.
2450: 20 20 69 6e 74 20 6e 73 74 61 74 65 3b 20 20 20    int nstate;   
2460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2470: 6d 62 65 72 20 6f 66 20 73 74 61 74 65 73 20 2a  mber of states *
2480: 2f 0a 20 20 69 6e 74 20 6e 72 75 6c 65 3b 20 20  /.  int nrule;  
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a0: 4e 75 6d 62 65 72 20 6f 66 20 72 75 6c 65 73 20  Number of rules 
24b0: 2a 2f 0a 20 20 69 6e 74 20 6e 73 79 6d 62 6f 6c  */.  int nsymbol
24c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24d0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 69   Number of termi
24e0: 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69  nal and nontermi
24f0: 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  nal symbols */. 
2500: 20 69 6e 74 20 6e 74 65 72 6d 69 6e 61 6c 3b 20   int nterminal; 
2510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2520: 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20  ber of terminal 
2530: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 73 74 72  symbols */.  str
2540: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 73 79 6d  uct symbol **sym
2550: 62 6f 6c 73 3b 20 2f 2a 20 53 6f 72 74 65 64 20  bols; /* Sorted 
2560: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
2570: 73 20 74 6f 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  s to symbols */.
2580: 20 20 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20    int errorcnt; 
2590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25a0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 2a  mber of errors *
25b0: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
25c0: 6c 20 2a 65 72 72 73 79 6d 3b 20 20 20 2f 2a 20  l *errsym;   /* 
25d0: 54 68 65 20 65 72 72 6f 72 20 73 79 6d 62 6f 6c  The error symbol
25e0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65   */.  char *name
25f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2600: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 67 65  * Name of the ge
2610: 6e 65 72 61 74 65 64 20 70 61 72 73 65 72 20 2a  nerated parser *
2620: 2f 0a 20 20 63 68 61 72 20 2a 61 72 67 3b 20 20  /.  char *arg;  
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2640: 44 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 74  Declaration of t
2650: 68 65 20 33 74 68 20 61 72 67 75 6d 65 6e 74 20  he 3th argument 
2660: 74 6f 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 63  to parser */.  c
2670: 68 61 72 20 2a 74 6f 6b 65 6e 74 79 70 65 3b 20  har *tokentype; 
2680: 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
2690: 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62  of terminal symb
26a0: 6f 6c 73 20 69 6e 20 74 68 65 20 70 61 72 73 65  ols in the parse
26b0: 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61  r stack */.  cha
26c0: 72 20 2a 76 61 72 74 79 70 65 3b 20 20 20 20 20  r *vartype;     
26d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 65 66        /* The def
26e0: 61 75 6c 74 20 74 79 70 65 20 6f 66 20 6e 6f 6e  ault type of non
26f0: 2d 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c  -terminal symbol
2700: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73 74 61  s */.  char *sta
2710: 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rt;             
2720: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
2730: 74 61 72 74 20 73 79 6d 62 6f 6c 20 66 6f 72 20  tart symbol for 
2740: 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20  the grammar */. 
2750: 20 63 68 61 72 20 2a 73 74 61 63 6b 73 69 7a 65   char *stacksize
2760: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  ;         /* Siz
2770: 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20  e of the parser 
2780: 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20  stack */.  char 
2790: 2a 69 6e 63 6c 75 64 65 3b 20 20 20 20 20 20 20  *include;       
27a0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70      /* Code to p
27b0: 75 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ut at the start 
27c0: 6f 66 20 74 68 65 20 43 20 66 69 6c 65 20 2a 2f  of the C file */
27d0: 0a 20 20 69 6e 74 20 20 69 6e 63 6c 75 64 65 6c  .  int  includel
27e0: 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  n;          /* L
27f0: 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 73  ine number for s
2800: 74 61 72 74 20 6f 66 20 69 6e 63 6c 75 64 65 20  tart of include 
2810: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
2820: 65 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20  error;          
2830: 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78     /* Code to ex
2840: 65 63 75 74 65 20 77 68 65 6e 20 61 6e 20 65 72  ecute when an er
2850: 72 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  ror is seen */. 
2860: 20 69 6e 74 20 20 65 72 72 6f 72 6c 6e 3b 20 20   int  errorln;  
2870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
2880: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 73 74 61  e number for sta
2890: 72 74 20 6f 66 20 65 72 72 6f 72 20 63 6f 64 65  rt of error code
28a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 76 65 72   */.  char *over
28b0: 66 6c 6f 77 3b 20 20 20 20 20 20 20 20 20 20 2f  flow;          /
28c0: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
28d0: 65 20 6f 6e 20 61 20 73 74 61 63 6b 20 6f 76 65  e on a stack ove
28e0: 72 66 6c 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 20  rflow */.  int  
28f0: 6f 76 65 72 66 6c 6f 77 6c 6e 3b 20 20 20 20 20  overflowln;     
2900: 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62      /* Line numb
2910: 65 72 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20  er for start of 
2920: 6f 76 65 72 66 6c 6f 77 20 63 6f 64 65 20 2a 2f  overflow code */
2930: 0a 20 20 63 68 61 72 20 2a 66 61 69 6c 75 72 65  .  char *failure
2940: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
2950: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f  ode to execute o
2960: 6e 20 70 61 72 73 65 72 20 66 61 69 6c 75 72 65  n parser failure
2970: 20 2a 2f 0a 20 20 69 6e 74 20 20 66 61 69 6c 75   */.  int  failu
2980: 72 65 6c 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  reln;          /
2990: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f  * Line number fo
29a0: 72 20 73 74 61 72 74 20 6f 66 20 66 61 69 6c 75  r start of failu
29b0: 72 65 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61  re code */.  cha
29c0: 72 20 2a 61 63 63 65 70 74 3b 20 20 20 20 20 20  r *accept;      
29d0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f        /* Code to
29e0: 20 65 78 65 63 75 74 65 20 77 68 65 6e 20 74 68   execute when th
29f0: 65 20 70 61 72 73 65 72 20 65 78 63 65 70 74 73  e parser excepts
2a00: 20 2a 2f 0a 20 20 69 6e 74 20 20 61 63 63 65 70   */.  int  accep
2a10: 74 6c 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  tln;           /
2a20: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f  * Line number fo
2a30: 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  r the start of a
2a40: 63 63 65 70 74 20 63 6f 64 65 20 2a 2f 0a 20 20  ccept code */.  
2a50: 63 68 61 72 20 2a 65 78 74 72 61 63 6f 64 65 3b  char *extracode;
2a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65           /* Code
2a70: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
2a80: 20 67 65 6e 65 72 61 74 65 64 20 66 69 6c 65 20   generated file 
2a90: 2a 2f 0a 20 20 69 6e 74 20 20 65 78 74 72 61 63  */.  int  extrac
2aa0: 6f 64 65 6c 6e 3b 20 20 20 20 20 20 20 20 2f 2a  odeln;        /*
2ab0: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72   Line number for
2ac0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2ad0: 65 20 65 78 74 72 61 20 63 6f 64 65 20 2a 2f 0a  e extra code */.
2ae0: 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 64 65 73    char *tokendes
2af0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  t;         /* Co
2b00: 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 74 6f  de to execute to
2b10: 20 64 65 73 74 72 6f 79 20 74 6f 6b 65 6e 20 64   destroy token d
2b20: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 20 74 6f  ata */.  int  to
2b30: 6b 65 6e 64 65 73 74 6c 6e 3b 20 20 20 20 20 20  kendestln;      
2b40: 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72    /* Line number
2b50: 20 66 6f 72 20 74 6f 6b 65 6e 20 64 65 73 74 72   for token destr
2b60: 6f 79 65 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63  oyer code */.  c
2b70: 68 61 72 20 2a 76 61 72 64 65 73 74 3b 20 20 20  har *vardest;   
2b80: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
2b90: 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20  for the default 
2ba0: 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 64 65 73  non-terminal des
2bb0: 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  tructor */.  int
2bc0: 20 20 76 61 72 64 65 73 74 6c 6e 3b 20 20 20 20    vardestln;    
2bd0: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
2be0: 6d 62 65 72 20 66 6f 72 20 64 65 66 61 75 6c 74  mber for default
2bf0: 20 6e 6f 6e 2d 74 65 72 6d 20 64 65 73 74 72 75   non-term destru
2c00: 63 74 6f 72 20 63 6f 64 65 2a 2f 0a 20 20 63 68  ctor code*/.  ch
2c10: 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20  ar *filename;   
2c20: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2c30: 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
2c40: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 75 74 6e   */.  char *outn
2c50: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
2c60: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 75  * Name of the cu
2c70: 72 72 65 6e 74 20 6f 75 74 70 75 74 20 66 69 6c  rrent output fil
2c80: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b  e */.  char *tok
2c90: 65 6e 70 72 65 66 69 78 3b 20 20 20 20 20 20 20  enprefix;       
2ca0: 2f 2a 20 41 20 70 72 65 66 69 78 20 61 64 64 65  /* A prefix adde
2cb0: 64 20 74 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65 73  d to token names
2cc0: 20 69 6e 20 74 68 65 20 2e 68 20 66 69 6c 65 20   in the .h file 
2cd0: 2a 2f 0a 20 20 69 6e 74 20 6e 63 6f 6e 66 6c 69  */.  int nconfli
2ce0: 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct;           /*
2cf0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 73 69   Number of parsi
2d00: 6e 67 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a  ng conflicts */.
2d10: 20 20 69 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b    int tablesize;
2d20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2d30: 7a 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 20  ze of the parse 
2d40: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20  tables */.  int 
2d50: 62 61 73 69 73 66 6c 61 67 3b 20 20 20 20 20 20  basisflag;      
2d60: 20 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 6f 6e       /* Print on
2d70: 6c 79 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75  ly basis configu
2d80: 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  rations */.  int
2d90: 20 68 61 73 5f 66 61 6c 6c 62 61 63 6b 3b 20 20   has_fallback;  
2da0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2db0: 20 61 6e 79 20 25 66 61 6c 6c 62 61 63 6b 20 69   any %fallback i
2dc0: 73 20 73 65 65 6e 20 69 6e 20 74 68 65 20 67 72  s seen in the gr
2dd0: 61 6d 6d 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  ammer */.  char 
2de0: 2a 61 72 67 76 30 3b 20 20 20 20 20 20 20 20 20  *argv0;         
2df0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2e00: 68 65 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 7d 3b  he program */.};
2e10: 0a 0a 23 64 65 66 69 6e 65 20 4d 65 6d 6f 72 79  ..#define Memory
2e20: 43 68 65 63 6b 28 58 29 20 69 66 28 28 58 29 3d  Check(X) if((X)=
2e30: 3d 30 29 7b 20 5c 0a 20 20 65 78 74 65 72 6e 20  =0){ \.  extern 
2e40: 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f  void memory_erro
2e50: 72 28 29 3b 20 5c 0a 20 20 6d 65 6d 6f 72 79 5f  r(); \.  memory_
2e60: 65 72 72 6f 72 28 29 3b 20 5c 0a 7d 0a 0a 2f 2a  error(); \.}../*
2e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
2e80: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74  From the file "t
2e90: 61 62 6c 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  able.h" ********
2ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
2ec0: 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69   All code in thi
2ed0: 73 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  s file has been 
2ee0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
2ef0: 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  nerated.** from 
2f00: 61 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20  a specification 
2f10: 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20  in the file.**  
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 22 74 61 62              "tab
2f30: 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20  le.q".** by the 
2f40: 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
2f50: 79 20 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20  y code building 
2f60: 70 72 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e  program "aagen".
2f70: 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20  .** Do not edit 
2f80: 74 68 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74  this file!  Inst
2f90: 65 61 64 2c 20 65 64 69 74 20 74 68 65 20 73 70  ead, edit the sp
2fa0: 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66  ecification.** f
2fb0: 69 6c 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20  ile, then rerun 
2fc0: 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  aagen..*/./*.** 
2fd0: 43 6f 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73  Code for process
2fe0: 69 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68  ing tables in th
2ff0: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
3000: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
3010: 20 52 6f 75 74 69 6e 65 73 20 66 6f 72 20 68 61   Routines for ha
3020: 6e 64 6c 69 6e 67 20 61 20 73 74 72 69 6e 67 73  ndling a strings
3030: 20 2a 2f 0a 0a 63 68 61 72 20 2a 53 74 72 73 61   */..char *Strsa
3040: 66 65 28 29 3b 0a 0a 76 6f 69 64 20 53 74 72 73  fe();..void Strs
3050: 61 66 65 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64  afe_init(/* void
3060: 20 2a 2f 29 3b 0a 69 6e 74 20 53 74 72 73 61 66   */);.int Strsaf
3070: 65 5f 69 6e 73 65 72 74 28 2f 2a 20 63 68 61 72  e_insert(/* char
3080: 20 2a 20 2a 2f 29 3b 0a 63 68 61 72 20 2a 53 74   * */);.char *St
3090: 72 73 61 66 65 5f 66 69 6e 64 28 2f 2a 20 63 68  rsafe_find(/* ch
30a0: 61 72 20 2a 20 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f  ar * */);../* Ro
30b0: 75 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c  utines for handl
30c0: 69 6e 67 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74  ing symbols of t
30d0: 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 0a 73  he grammar */..s
30e0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
30f0: 6d 62 6f 6c 5f 6e 65 77 28 29 3b 0a 69 6e 74 20  mbol_new();.int 
3100: 53 79 6d 62 6f 6c 63 6d 70 70 28 2f 2a 20 73 74  Symbolcmpp(/* st
3110: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 2c 20  ruct symbol **, 
3120: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
3130: 20 2a 2f 29 3b 0a 76 6f 69 64 20 53 79 6d 62 6f   */);.void Symbo
3140: 6c 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a  l_init(/* void *
3150: 2f 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69  /);.int Symbol_i
3160: 6e 73 65 72 74 28 2f 2a 20 73 74 72 75 63 74 20  nsert(/* struct 
3170: 73 79 6d 62 6f 6c 20 2a 2c 20 63 68 61 72 20 2a  symbol *, char *
3180: 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 79 6d   */);.struct sym
3190: 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64  bol *Symbol_find
31a0: 28 2f 2a 20 63 68 61 72 20 2a 20 2a 2f 29 3b 0a  (/* char * */);.
31b0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
31c0: 79 6d 62 6f 6c 5f 4e 74 68 28 2f 2a 20 69 6e 74  ymbol_Nth(/* int
31d0: 20 2a 2f 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c   */);.int Symbol
31e0: 5f 63 6f 75 6e 74 28 2f 2a 20 20 2a 2f 29 3b 0a  _count(/*  */);.
31f0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
3200: 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 2f  Symbol_arrayof(/
3210: 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74  *  */);../* Rout
3220: 69 6e 65 73 20 74 6f 20 6d 61 6e 61 67 65 20 74  ines to manage t
3230: 68 65 20 73 74 61 74 65 20 74 61 62 6c 65 20 2a  he state table *
3240: 2f 0a 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70  /..int Configcmp
3250: 28 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e 66 69  (/* struct confi
3260: 67 20 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e 66  g *, struct conf
3270: 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74  ig * */);.struct
3280: 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e 65   state *State_ne
3290: 77 28 29 3b 0a 76 6f 69 64 20 53 74 61 74 65 5f  w();.void State_
32a0: 69 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29  init(/* void */)
32b0: 3b 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65  ;.int State_inse
32c0: 72 74 28 2f 2a 20 73 74 72 75 63 74 20 73 74 61  rt(/* struct sta
32d0: 74 65 20 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e  te *, struct con
32e0: 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63  fig * */);.struc
32f0: 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 66  t state *State_f
3300: 69 6e 64 28 2f 2a 20 73 74 72 75 63 74 20 63 6f  ind(/* struct co
3310: 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75  nfig * */);.stru
3320: 63 74 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65  ct state **State
3330: 5f 61 72 72 61 79 6f 66 28 2f 2a 20 20 2a 2f 29  _arrayof(/*  */)
3340: 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 75  ;../* Routines u
3350: 73 65 64 20 66 6f 72 20 65 66 66 69 63 69 65 6e  sed for efficien
3360: 63 79 20 69 6e 20 43 6f 6e 66 69 67 6c 69 73 74  cy in Configlist
3370: 5f 61 64 64 20 2a 2f 0a 0a 76 6f 69 64 20 43 6f  _add */..void Co
3380: 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 2f  nfigtable_init(/
3390: 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e 74 20  * void */);.int 
33a0: 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65  Configtable_inse
33b0: 72 74 28 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e  rt(/* struct con
33c0: 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63  fig * */);.struc
33d0: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
33e0: 74 61 62 6c 65 5f 66 69 6e 64 28 2f 2a 20 73 74  table_find(/* st
33f0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f  ruct config * */
3400: 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  );.void Configta
3410: 62 6c 65 5f 63 6c 65 61 72 28 2f 2a 20 69 6e 74  ble_clear(/* int
3420: 28 2a 29 28 73 74 72 75 63 74 20 63 6f 6e 66 69  (*)(struct confi
3430: 67 20 2a 29 20 2a 2f 29 3b 0a 2f 2a 2a 2a 2a 2a  g *) */);./*****
3440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
3450: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 61 63 74  om the file "act
3460: 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion.c" *********
3470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3480: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f  ******/./*.** Ro
3490: 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73 69 6e  utines processin
34a0: 67 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 73  g parser actions
34b0: 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
34c0: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
34d0: 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  */../* Allocate 
34e0: 61 20 6e 65 77 20 70 61 72 73 65 72 20 61 63 74  a new parser act
34f0: 69 6f 6e 20 2a 2f 0a 73 74 72 75 63 74 20 61 63  ion */.struct ac
3500: 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65 77  tion *Action_new
3510: 28 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  (){.  static str
3520: 75 63 74 20 61 63 74 69 6f 6e 20 2a 66 72 65 65  uct action *free
3530: 6c 69 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75  list = 0;.  stru
3540: 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 3b 0a  ct action *new;.
3550: 0a 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d  .  if( freelist=
3560: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
3570: 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 31  .    int amt = 1
3580: 30 30 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74  00;.    freelist
3590: 20 3d 20 28 73 74 72 75 63 74 20 61 63 74 69 6f   = (struct actio
35a0: 6e 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  n *)malloc( size
35b0: 6f 66 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e  of(struct action
35c0: 29 2a 61 6d 74 20 29 3b 0a 20 20 20 20 69 66 28  )*amt );.    if(
35d0: 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a   freelist==0 ){.
35e0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
35f0: 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20  derr,"Unable to 
3600: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  allocate memory 
3610: 66 6f 72 20 61 20 6e 65 77 20 70 61 72 73 65 72  for a new parser
3620: 20 61 63 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20   action.");.    
3630: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d    exit(1);.    }
3640: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3650: 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65  amt-1; i++) free
3660: 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26  list[i].next = &
3670: 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20  freelist[i+1];. 
3680: 20 20 20 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d     freelist[amt-
3690: 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  1].next = 0;.  }
36a0: 0a 20 20 6e 65 77 20 3d 20 66 72 65 65 6c 69 73  .  new = freelis
36b0: 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20  t;.  freelist = 
36c0: 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a  freelist->next;.
36d0: 20 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a    return new;.}.
36e0: 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  ./* Compare two 
36f0: 61 63 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  actions */.stati
3700: 63 20 69 6e 74 20 61 63 74 69 6f 6e 63 6d 70 28  c int actioncmp(
3710: 61 70 31 2c 61 70 32 29 0a 73 74 72 75 63 74 20  ap1,ap2).struct 
3720: 61 63 74 69 6f 6e 20 2a 61 70 31 3b 0a 73 74 72  action *ap1;.str
3730: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 32 3b  uct action *ap2;
3740: 0a 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  .{.  int rc;.  r
3750: 63 20 3d 20 61 70 31 2d 3e 73 70 2d 3e 69 6e 64  c = ap1->sp->ind
3760: 65 78 20 2d 20 61 70 32 2d 3e 73 70 2d 3e 69 6e  ex - ap2->sp->in
3770: 64 65 78 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  dex;.  if( rc==0
3780: 20 29 20 72 63 20 3d 20 28 69 6e 74 29 61 70 31   ) rc = (int)ap1
3790: 2d 3e 74 79 70 65 20 2d 20 28 69 6e 74 29 61 70  ->type - (int)ap
37a0: 32 2d 3e 74 79 70 65 3b 0a 20 20 69 66 28 20 72  2->type;.  if( r
37b0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  c==0 ){.    asse
37c0: 72 74 28 20 61 70 31 2d 3e 74 79 70 65 3d 3d 52  rt( ap1->type==R
37d0: 45 44 55 43 45 20 7c 7c 20 61 70 31 2d 3e 74 79  EDUCE || ap1->ty
37e0: 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20  pe==RD_RESOLVED 
37f0: 7c 7c 20 61 70 31 2d 3e 74 79 70 65 3d 3d 43 4f  || ap1->type==CO
3800: 4e 46 4c 49 43 54 29 3b 0a 20 20 20 20 61 73 73  NFLICT);.    ass
3810: 65 72 74 28 20 61 70 32 2d 3e 74 79 70 65 3d 3d  ert( ap2->type==
3820: 52 45 44 55 43 45 20 7c 7c 20 61 70 32 2d 3e 74  REDUCE || ap2->t
3830: 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44  ype==RD_RESOLVED
3840: 20 7c 7c 20 61 70 32 2d 3e 74 79 70 65 3d 3d 43   || ap2->type==C
3850: 4f 4e 46 4c 49 43 54 29 3b 0a 20 20 20 20 72 63  ONFLICT);.    rc
3860: 20 3d 20 61 70 31 2d 3e 78 2e 72 70 2d 3e 69 6e   = ap1->x.rp->in
3870: 64 65 78 20 2d 20 61 70 32 2d 3e 78 2e 72 70 2d  dex - ap2->x.rp-
3880: 3e 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 72 65  >index;.  }.  re
3890: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 53  turn rc;.}../* S
38a0: 6f 72 74 20 70 61 72 73 65 72 20 61 63 74 69 6f  ort parser actio
38b0: 6e 73 20 2a 2f 0a 73 74 72 75 63 74 20 61 63 74  ns */.struct act
38c0: 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74  ion *Action_sort
38d0: 28 61 70 29 0a 73 74 72 75 63 74 20 61 63 74 69  (ap).struct acti
38e0: 6f 6e 20 2a 61 70 3b 0a 7b 0a 20 20 61 70 20 3d  on *ap;.{.  ap =
38f0: 20 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20   (struct action 
3900: 2a 29 6d 73 6f 72 74 28 61 70 2c 26 61 70 2d 3e  *)msort(ap,&ap->
3910: 6e 65 78 74 2c 61 63 74 69 6f 6e 63 6d 70 29 3b  next,actioncmp);
3920: 0a 20 20 72 65 74 75 72 6e 20 61 70 3b 0a 7d 0a  .  return ap;.}.
3930: 0a 76 6f 69 64 20 41 63 74 69 6f 6e 5f 61 64 64  .void Action_add
3940: 28 61 70 70 2c 74 79 70 65 2c 73 70 2c 61 72 67  (app,type,sp,arg
3950: 29 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  ).struct action 
3960: 2a 2a 61 70 70 3b 0a 65 6e 75 6d 20 65 5f 61 63  **app;.enum e_ac
3970: 74 69 6f 6e 20 74 79 70 65 3b 0a 73 74 72 75 63  tion type;.struc
3980: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 63 68  t symbol *sp;.ch
3990: 61 72 20 2a 61 72 67 3b 0a 7b 0a 20 20 73 74 72  ar *arg;.{.  str
39a0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 3b  uct action *new;
39b0: 0a 20 20 6e 65 77 20 3d 20 41 63 74 69 6f 6e 5f  .  new = Action_
39c0: 6e 65 77 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e 65  new();.  new->ne
39d0: 78 74 20 3d 20 2a 61 70 70 3b 0a 20 20 2a 61 70  xt = *app;.  *ap
39e0: 70 20 3d 20 6e 65 77 3b 0a 20 20 6e 65 77 2d 3e  p = new;.  new->
39f0: 74 79 70 65 20 3d 20 74 79 70 65 3b 0a 20 20 6e  type = type;.  n
3a00: 65 77 2d 3e 73 70 20 3d 20 73 70 3b 0a 20 20 69  ew->sp = sp;.  i
3a10: 66 28 20 74 79 70 65 3d 3d 53 48 49 46 54 20 29  f( type==SHIFT )
3a20: 7b 0a 20 20 20 20 6e 65 77 2d 3e 78 2e 73 74 70  {.    new->x.stp
3a30: 20 3d 20 28 73 74 72 75 63 74 20 73 74 61 74 65   = (struct state
3a40: 20 2a 29 61 72 67 3b 0a 20 20 7d 65 6c 73 65 7b   *)arg;.  }else{
3a50: 0a 20 20 20 20 6e 65 77 2d 3e 78 2e 72 70 20 3d  .    new->x.rp =
3a60: 20 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 29   (struct rule *)
3a70: 61 72 67 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a  arg;.  }.}./****
3a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a90: 2a 2a 20 4e 65 77 20 63 6f 64 65 20 74 6f 20 69  ** New code to i
3aa0: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 22 61 63  mplement the "ac
3ab0: 74 74 61 62 22 20 6d 6f 64 75 6c 65 20 2a 2a 2a  ttab" module ***
3ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
3ad0: 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 6d 70 6c  This module impl
3ae0: 65 6d 65 6e 74 73 20 72 6f 75 74 69 6e 65 73 20  ements routines 
3af0: 75 73 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  use to construct
3b00: 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d   the yy_action[]
3b10: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a   table..*/../*.*
3b20: 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66 20 74  * The state of t
3b30: 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62  he yy_action tab
3b40: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
3b50: 63 74 69 6f 6e 20 69 73 20 61 6e 20 69 6e 73 74  ction is an inst
3b60: 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66  ance of.** the f
3b70: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
3b80: 72 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  re.*/.typedef st
3b90: 72 75 63 74 20 61 63 74 74 61 62 20 61 63 74 74  ruct acttab actt
3ba0: 61 62 3b 0a 73 74 72 75 63 74 20 61 63 74 74 61  ab;.struct actta
3bb0: 62 20 7b 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f  b {.  int nActio
3bc0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3bd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3be0: 75 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 41  used slots in aA
3bf0: 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ction[] */.  int
3c00: 20 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20 20   nActionAlloc;  
3c10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f            /* Slo
3c20: 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ts allocated for
3c30: 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20   aAction[] */.  
3c40: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 69 6e 74  struct {.    int
3c50: 20 6c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20   lookahead;     
3c60: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
3c70: 20 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61   of the lookahea
3c80: 64 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 69  d token */.    i
3c90: 6e 74 20 61 63 74 69 6f 6e 3b 20 20 20 20 20 20  nt action;      
3ca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 74            /* Act
3cb0: 69 6f 6e 20 74 6f 20 74 61 6b 65 20 6f 6e 20 74  ion to take on t
3cc0: 68 65 20 67 69 76 65 6e 20 6c 6f 6f 6b 61 68 65  he given lookahe
3cd0: 61 64 20 2a 2f 0a 20 20 7d 20 2a 61 41 63 74 69  ad */.  } *aActi
3ce0: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
3cf0: 20 20 20 20 20 2f 2a 20 54 68 65 20 79 79 5f 61       /* The yy_a
3d00: 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 75 6e  ction[] table un
3d10: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
3d20: 20 2a 2f 0a 20 20 20 20 2a 61 4c 6f 6f 6b 61 68   */.    *aLookah
3d30: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
3d40: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e     /* A single n
3d50: 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  ew transaction s
3d60: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e 4c 6f  et */.  int mnLo
3d70: 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20  okahead;        
3d80: 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20       /* Minimum 
3d90: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f  aLookahead[].loo
3da0: 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  kahead */.  int 
3db0: 6d 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  mnAction;       
3dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69           /* Acti
3dd0: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
3de0: 74 68 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2a  th mnLookahead *
3df0: 2f 0a 20 20 69 6e 74 20 6d 78 4c 6f 6f 6b 61 68  /.  int mxLookah
3e00: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
3e10: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 4c 6f 6f   /* Maximum aLoo
3e20: 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65  kahead[].lookahe
3e30: 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  ad */.  int nLoo
3e40: 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20  kahead;         
3e50: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 73 6c 6f       /* Used slo
3e60: 74 73 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64  ts in aLookahead
3e70: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  [] */.  int nLoo
3e80: 6b 61 68 65 61 64 41 6c 6c 6f 63 3b 20 20 20 20  kaheadAlloc;    
3e90: 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c       /* Slots al
3ea0: 6c 6f 63 61 74 65 64 20 69 6e 20 61 4c 6f 6f 6b  located in aLook
3eb0: 61 68 65 61 64 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f  ahead[] */.};../
3ec0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
3ed0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3ee0: 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20  n the yy_action 
3ef0: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
3f00: 20 61 63 74 74 61 62 5f 73 69 7a 65 28 58 29 20   acttab_size(X) 
3f10: 28 28 58 29 2d 3e 6e 41 63 74 69 6f 6e 29 0a 0a  ((X)->nAction)..
3f20: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 66 6f 72  /* The value for
3f30: 20 74 68 65 20 4e 2d 74 68 20 65 6e 74 72 79 20   the N-th entry 
3f40: 69 6e 20 79 79 5f 61 63 74 69 6f 6e 20 2a 2f 0a  in yy_action */.
3f50: 23 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f 79  #define acttab_y
3f60: 79 61 63 74 69 6f 6e 28 58 2c 4e 29 20 20 28 28  yaction(X,N)  ((
3f70: 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 61  X)->aAction[N].a
3f80: 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76  ction)../* The v
3f90: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 4e 2d 74  alue for the N-t
3fa0: 68 20 65 6e 74 72 79 20 69 6e 20 79 79 5f 6c 6f  h entry in yy_lo
3fb0: 6f 6b 61 68 65 61 64 20 2a 2f 0a 23 64 65 66 69  okahead */.#defi
3fc0: 6e 65 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b  ne acttab_yylook
3fd0: 61 68 65 61 64 28 58 2c 4e 29 20 20 28 28 58 29  ahead(X,N)  ((X)
3fe0: 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 6c 6f 6f  ->aAction[N].loo
3ff0: 6b 61 68 65 61 64 29 0a 0a 2f 2a 20 46 72 65 65  kahead)../* Free
4000: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
4010: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
4020: 67 69 76 65 6e 20 61 63 74 74 61 62 20 2a 2f 0a  given acttab */.
4030: 76 6f 69 64 20 61 63 74 74 61 62 5f 66 72 65 65  void acttab_free
4040: 28 61 63 74 74 61 62 20 2a 70 29 7b 0a 20 20 66  (acttab *p){.  f
4050: 72 65 65 28 20 70 2d 3e 61 41 63 74 69 6f 6e 20  ree( p->aAction 
4060: 29 3b 0a 20 20 66 72 65 65 28 20 70 2d 3e 61 4c  );.  free( p->aL
4070: 6f 6f 6b 61 68 65 61 64 20 29 3b 0a 20 20 66 72  ookahead );.  fr
4080: 65 65 28 20 70 20 29 3b 0a 7d 0a 0a 2f 2a 20 41  ee( p );.}../* A
4090: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 63  llocate a new ac
40a0: 74 74 61 62 20 73 74 72 75 63 74 75 72 65 20 2a  ttab structure *
40b0: 2f 0a 61 63 74 74 61 62 20 2a 61 63 74 74 61 62  /.acttab *acttab
40c0: 5f 61 6c 6c 6f 63 28 76 6f 69 64 29 7b 0a 20 20  _alloc(void){.  
40d0: 61 63 74 74 61 62 20 2a 70 20 3d 20 6d 61 6c 6c  acttab *p = mall
40e0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  oc( sizeof(*p) )
40f0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
4100: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
4110: 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c  rr,"Unable to al
4120: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
4130: 72 20 61 20 6e 65 77 20 61 63 74 74 61 62 2e 22  r a new acttab."
4140: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
4150: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20    }.  memset(p, 
4160: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
4170: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
4180: 2a 20 41 64 64 20 61 20 6e 65 77 20 61 63 74 69  * Add a new acti
4190: 6f 6e 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  on to the curren
41a0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  t transaction se
41b0: 74 0a 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61 62  t.*/.void acttab
41c0: 5f 61 63 74 69 6f 6e 28 61 63 74 74 61 62 20 2a  _action(acttab *
41d0: 70 2c 20 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64  p, int lookahead
41e0: 2c 20 69 6e 74 20 61 63 74 69 6f 6e 29 7b 0a 20  , int action){. 
41f0: 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65   if( p->nLookahe
4200: 61 64 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  ad>=p->nLookahea
4210: 64 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d  dAlloc ){.    p-
4220: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63  >nLookaheadAlloc
4230: 20 2b 3d 20 32 35 3b 0a 20 20 20 20 70 2d 3e 61   += 25;.    p->a
4240: 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 72 65 61 6c  Lookahead = real
4250: 6c 6f 63 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65  loc( p->aLookahe
4260: 61 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ad,.            
4270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4280: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 6f 6f 6b   sizeof(p->aLook
4290: 61 68 65 61 64 5b 30 5d 29 2a 70 2d 3e 6e 4c 6f  ahead[0])*p->nLo
42a0: 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 29 3b 0a  okaheadAlloc );.
42b0: 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b      if( p->aLook
42c0: 61 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ahead==0 ){.    
42d0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
42e0: 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c  ,"malloc failed\
42f0: 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  n");.      exit(
4300: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
4310: 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  if( p->nLookahea
4320: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6d  d==0 ){.    p->m
4330: 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f  xLookahead = loo
4340: 6b 61 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d  kahead;.    p->m
4350: 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f  nLookahead = loo
4360: 6b 61 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d  kahead;.    p->m
4370: 6e 41 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e  nAction = action
4380: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
4390: 66 28 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61  f( p->mxLookahea
43a0: 64 3c 6c 6f 6f 6b 61 68 65 61 64 20 29 20 70 2d  d<lookahead ) p-
43b0: 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c  >mxLookahead = l
43c0: 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 69 66  ookahead;.    if
43d0: 28 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  ( p->mnLookahead
43e0: 3e 6c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20  >lookahead ){.  
43f0: 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65      p->mnLookahe
4400: 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a  ad = lookahead;.
4410: 20 20 20 20 20 20 70 2d 3e 6d 6e 41 63 74 69 6f        p->mnActio
4420: 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20  n = action;.    
4430: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c 6f 6f 6b  }.  }.  p->aLook
4440: 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68  ahead[p->nLookah
4450: 65 61 64 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d  ead].lookahead =
4460: 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 70 2d   lookahead;.  p-
4470: 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e  >aLookahead[p->n
4480: 4c 6f 6f 6b 61 68 65 61 64 5d 2e 61 63 74 69 6f  Lookahead].actio
4490: 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 70 2d  n = action;.  p-
44a0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 2b 2b 3b 0a 7d  >nLookahead++;.}
44b0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20  ../*.** Add the 
44c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20  transaction set 
44d0: 62 75 69 6c 74 20 75 70 20 77 69 74 68 20 70 72  built up with pr
44e0: 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 61 63 74  ior calls to act
44f0: 74 61 62 5f 61 63 74 69 6f 6e 28 29 0a 2a 2a 20  tab_action().** 
4500: 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
4510: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20   action table.  
4520: 54 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 74  Then reset the t
4530: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 62  ransaction set b
4540: 61 63 6b 0a 2a 2a 20 74 6f 20 61 6e 20 65 6d 70  ack.** to an emp
4550: 74 79 20 73 65 74 20 69 6e 20 70 72 65 70 61 72  ty set in prepar
4560: 61 74 69 6f 6e 20 66 6f 72 20 61 20 6e 65 77 20  ation for a new 
4570: 72 6f 75 6e 64 20 6f 66 20 61 63 74 74 61 62 5f  round of acttab_
4580: 61 63 74 69 6f 6e 28 29 20 63 61 6c 6c 73 2e 0a  action() calls..
4590: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
45a0: 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65   offset into the
45b0: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66   action table of
45c0: 20 74 68 65 20 6e 65 77 20 74 72 61 6e 73 61 63   the new transac
45d0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 61 63 74  tion..*/.int act
45e0: 74 61 62 5f 69 6e 73 65 72 74 28 61 63 74 74 61  tab_insert(actta
45f0: 62 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  b *p){.  int i, 
4600: 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 61 73 73 65 72  j, k, n;.  asser
4610: 74 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  t( p->nLookahead
4620: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  >0 );..  /* Make
4630: 20 73 75 72 65 20 77 65 20 68 61 76 65 20 65 6e   sure we have en
4640: 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 68 6f  ough space to ho
4650: 6c 64 20 74 68 65 20 65 78 70 61 6e 64 65 64 20  ld the expanded 
4660: 61 63 74 69 6f 6e 20 74 61 62 6c 65 0a 20 20 2a  action table.  *
4670: 2a 20 69 6e 20 74 68 65 20 77 6f 72 73 74 20 63  * in the worst c
4680: 61 73 65 2e 20 20 54 68 65 20 77 6f 72 73 74 20  ase.  The worst 
4690: 63 61 73 65 20 6f 63 63 75 72 73 20 69 66 20 74  case occurs if t
46a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
46b0: 65 74 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  et.  ** must be 
46c0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
46d0: 63 75 72 72 65 6e 74 20 61 63 74 69 6f 6e 20 74  current action t
46e0: 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20  able.  */.  n = 
46f0: 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 2b  p->mxLookahead +
4700: 20 31 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 41 63   1;.  if( p->nAc
4710: 74 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70 2d 3e 6e  tion + n >= p->n
4720: 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 29 7b 0a 20  ActionAlloc ){. 
4730: 20 20 20 69 6e 74 20 6f 6c 64 41 6c 6c 6f 63 20     int oldAlloc 
4740: 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f  = p->nActionAllo
4750: 63 3b 0a 20 20 20 20 70 2d 3e 6e 41 63 74 69 6f  c;.    p->nActio
4760: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63 74  nAlloc = p->nAct
4770: 69 6f 6e 20 2b 20 6e 20 2b 20 70 2d 3e 6e 41 63  ion + n + p->nAc
4780: 74 69 6f 6e 41 6c 6c 6f 63 20 2b 20 32 30 3b 0a  tionAlloc + 20;.
4790: 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 20 3d      p->aAction =
47a0: 20 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 41 63   realloc( p->aAc
47b0: 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  tion,.          
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47d0: 73 69 7a 65 6f 66 28 70 2d 3e 61 41 63 74 69 6f  sizeof(p->aActio
47e0: 6e 5b 30 5d 29 2a 70 2d 3e 6e 41 63 74 69 6f 6e  n[0])*p->nAction
47f0: 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20  Alloc);.    if( 
4800: 70 2d 3e 61 41 63 74 69 6f 6e 3d 3d 30 20 29 7b  p->aAction==0 ){
4810: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
4820: 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61  tderr,"malloc fa
4830: 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20  iled\n");.      
4840: 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20  exit(1);.    }. 
4850: 20 20 20 66 6f 72 28 69 3d 6f 6c 64 41 6c 6c 6f     for(i=oldAllo
4860: 63 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41  c; i<p->nActionA
4870: 6c 6c 6f 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lloc; i++){.    
4880: 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e    p->aAction[i].
4890: 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 2d 31 3b 0a  lookahead = -1;.
48a0: 20 20 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e        p->aAction
48b0: 5b 69 5d 2e 61 63 74 69 6f 6e 20 3d 20 2d 31 3b  [i].action = -1;
48c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
48d0: 20 53 63 61 6e 20 74 68 65 20 65 78 69 73 74 69   Scan the existi
48e0: 6e 67 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  ng action table 
48f0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 6e 20 6f  looking for an o
4900: 66 66 73 65 74 20 77 68 65 72 65 20 77 65 20 63  ffset where we c
4910: 61 6e 0a 20 20 2a 2a 20 69 6e 73 65 72 74 20 74  an.  ** insert t
4920: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
4930: 61 63 74 69 6f 6e 20 73 65 74 2e 20 20 46 61 6c  action set.  Fal
4940: 6c 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  l out of the loo
4950: 70 20 77 68 65 6e 20 74 68 61 74 0a 20 20 2a 2a  p when that.  **
4960: 20 6f 66 66 73 65 74 20 69 73 20 66 6f 75 6e 64   offset is found
4970: 2e 20 20 49 6e 20 74 68 65 20 77 6f 72 73 74 20  .  In the worst 
4980: 63 61 73 65 2c 20 77 65 20 66 61 6c 6c 20 6f 75  case, we fall ou
4990: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 68  t of the loop wh
49a0: 65 6e 0a 20 20 2a 2a 20 69 20 72 65 61 63 68 65  en.  ** i reache
49b0: 73 20 70 2d 3e 6e 41 63 74 69 6f 6e 2c 20 77 68  s p->nAction, wh
49c0: 69 63 68 20 6d 65 61 6e 73 20 77 65 20 61 70 70  ich means we app
49d0: 65 6e 64 20 74 68 65 20 6e 65 77 20 74 72 61 6e  end the new tran
49e0: 73 61 63 74 69 6f 6e 20 73 65 74 2e 0a 20 20 2a  saction set..  *
49f0: 2a 0a 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20  *.  ** i is the 
4a00: 69 6e 64 65 78 20 69 6e 20 70 2d 3e 61 41 63 74  index in p->aAct
4a10: 69 6f 6e 5b 5d 20 77 68 65 72 65 20 70 2d 3e 6d  ion[] where p->m
4a20: 6e 4c 6f 6f 6b 61 68 65 61 64 20 69 73 20 69 6e  nLookahead is in
4a30: 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 66  serted..  */.  f
4a40: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 41 63  or(i=0; i<p->nAc
4a50: 74 69 6f 6e 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68  tion+p->mnLookah
4a60: 65 61 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ead; i++){.    i
4a70: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d  f( p->aAction[i]
4a80: 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29 7b 0a  .lookahead<0 ){.
4a90: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
4aa0: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20  <p->nLookahead; 
4ab0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20  j++){.        k 
4ac0: 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  = p->aLookahead[
4ad0: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70  j].lookahead - p
4ae0: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20  ->mnLookahead + 
4af0: 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b  i;.        if( k
4b00: 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  <0 ) break;.    
4b10: 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69      if( p->aActi
4b20: 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3e  on[k].lookahead>
4b30: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
4b40: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3c    }.      if( j<
4b50: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20  p->nLookahead ) 
4b60: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
4b70: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41  for(j=0; j<p->nA
4b80: 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ction; j++){.   
4b90: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74       if( p->aAct
4ba0: 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[j].lookahead
4bb0: 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  ==j+p->mnLookahe
4bc0: 61 64 2d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20  ad-i ) break;.  
4bd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
4be0: 6a 3d 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 7b  j==p->nAction ){
4bf0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20  .        break; 
4c00: 20 2f 2a 20 46 69 74 73 20 69 6e 20 65 6d 70 74   /* Fits in empt
4c10: 79 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 20 20 20  y slots */.     
4c20: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
4c30: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c   p->aAction[i].l
4c40: 6f 6f 6b 61 68 65 61 64 3d 3d 70 2d 3e 6d 6e 4c  ookahead==p->mnL
4c50: 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20  ookahead ){.    
4c60: 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e    if( p->aAction
4c70: 5b 69 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 6d  [i].action!=p->m
4c80: 6e 41 63 74 69 6f 6e 20 29 20 63 6f 6e 74 69 6e  nAction ) contin
4c90: 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ue;.      for(j=
4ca0: 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  0; j<p->nLookahe
4cb0: 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ad; j++){.      
4cc0: 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68    k = p->aLookah
4cd0: 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ead[j].lookahead
4ce0: 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61   - p->mnLookahea
4cf0: 64 20 2b 20 69 3b 0a 20 20 20 20 20 20 20 20 69  d + i;.        i
4d00: 66 28 20 6b 3c 30 20 7c 7c 20 6b 3e 3d 70 2d 3e  f( k<0 || k>=p->
4d10: 6e 41 63 74 69 6f 6e 20 29 20 62 72 65 61 6b 3b  nAction ) break;
4d20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
4d30: 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f  aLookahead[j].lo
4d40: 6f 6b 61 68 65 61 64 21 3d 70 2d 3e 61 41 63 74  okahead!=p->aAct
4d50: 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[k].lookahead
4d60: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
4d70: 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68    if( p->aLookah
4d80: 65 61 64 5b 6a 5d 2e 61 63 74 69 6f 6e 21 3d 70  ead[j].action!=p
4d90: 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 61 63 74  ->aAction[k].act
4da0: 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ion ) break;.   
4db0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
4dc0: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  <p->nLookahead )
4dd0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
4de0: 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f   n = 0;.      fo
4df0: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74  r(j=0; j<p->nAct
4e00: 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ion; j++){.     
4e10: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
4e20: 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30  n[j].lookahead<0
4e30: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
4e40: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74       if( p->aAct
4e50: 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[j].lookahead
4e60: 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  ==j+p->mnLookahe
4e70: 61 64 2d 69 20 29 20 6e 2b 2b 3b 0a 20 20 20 20  ad-i ) n++;.    
4e80: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3d    }.      if( n=
4e90: 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  =p->nLookahead )
4ea0: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
4eb0: 20 20 2f 2a 20 53 61 6d 65 20 61 73 20 61 20 70    /* Same as a p
4ec0: 72 69 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  rior transaction
4ed0: 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a   set */.      }.
4ee0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 49      }.  }.  /* I
4ef0: 6e 73 65 72 74 20 74 72 61 6e 73 61 63 74 69 6f  nsert transactio
4f00: 6e 20 73 65 74 20 61 74 20 69 6e 64 65 78 20 69  n set at index i
4f10: 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  . */.  for(j=0; 
4f20: 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b  j<p->nLookahead;
4f30: 20 6a 2b 2b 29 7b 0a 20 20 20 20 6b 20 3d 20 70   j++){.    k = p
4f40: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e  ->aLookahead[j].
4f50: 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d  lookahead - p->m
4f60: 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a  nLookahead + i;.
4f70: 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b      p->aAction[k
4f80: 5d 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  ] = p->aLookahea
4f90: 64 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 6b 3e  d[j];.    if( k>
4fa0: 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20 70 2d  =p->nAction ) p-
4fb0: 3e 6e 41 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b 0a  >nAction = k+1;.
4fc0: 20 20 7d 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68    }.  p->nLookah
4fd0: 65 61 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 52  ead = 0;..  /* R
4fe0: 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74  eturn the offset
4ff0: 20 74 68 61 74 20 69 73 20 61 64 64 65 64 20 74   that is added t
5000: 6f 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20  o the lookahead 
5010: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
5020: 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69  the.  ** index i
5030: 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 6f 66  nto yy_action of
5040: 20 74 68 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20   the action */. 
5050: 20 72 65 74 75 72 6e 20 69 20 2d 20 70 2d 3e 6d   return i - p->m
5060: 6e 4c 6f 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a 2f  nLookahead;.}../
5070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5080: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
5090: 66 69 6c 65 20 22 61 73 73 65 72 74 2e 63 22 20  file "assert.c" 
50a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
50b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
50c0: 0a 2a 2a 20 41 20 6d 6f 72 65 20 65 66 66 69 63  .** A more effic
50d0: 69 65 6e 74 20 77 61 79 20 6f 66 20 68 61 6e 64  ient way of hand
50e0: 6c 69 6e 67 20 61 73 73 65 72 74 69 6f 6e 73 2e  ling assertions.
50f0: 0a 2a 2f 0a 76 6f 69 64 20 6d 79 61 73 73 65 72  .*/.void myasser
5100: 74 28 66 69 6c 65 2c 6c 69 6e 65 29 0a 63 68 61  t(file,line).cha
5110: 72 20 2a 66 69 6c 65 3b 0a 69 6e 74 20 6c 69 6e  r *file;.int lin
5120: 65 3b 0a 7b 0a 20 20 66 70 72 69 6e 74 66 28 73  e;.{.  fprintf(s
5130: 74 64 65 72 72 2c 22 41 73 73 65 72 74 69 6f 6e  tderr,"Assertion
5140: 20 66 61 69 6c 65 64 20 6f 6e 20 6c 69 6e 65 20   failed on line 
5150: 25 64 20 6f 66 20 66 69 6c 65 20 5c 22 25 73 5c  %d of file \"%s\
5160: 22 5c 6e 22 2c 6c 69 6e 65 2c 66 69 6c 65 29 3b  "\n",line,file);
5170: 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 2f 2a  .  exit(1);.}./*
5180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5190: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
51a0: 69 6c 65 20 22 62 75 69 6c 64 2e 63 22 20 2a 2a  ile "build.c" **
51b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
51d0: 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 63  ** Routines to c
51e0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 65 20  onstruction the 
51f0: 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63  finite state mac
5200: 68 69 6e 65 20 66 6f 72 20 74 68 65 20 4c 45 4d  hine for the LEM
5210: 4f 4e 0a 2a 2a 20 70 61 72 73 65 72 20 67 65 6e  ON.** parser gen
5220: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46  erator..*/../* F
5230: 69 6e 64 20 61 20 70 72 65 63 65 64 65 6e 63 65  ind a precedence
5240: 20 73 79 6d 62 6f 6c 20 6f 66 20 65 76 65 72 79   symbol of every
5250: 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 72 61   rule in the gra
5260: 6d 6d 61 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 6f  mmar..** .** Tho
5270: 73 65 20 72 75 6c 65 73 20 77 68 69 63 68 20 68  se rules which h
5280: 61 76 65 20 61 20 70 72 65 63 65 64 65 6e 63 65  ave a precedence
5290: 20 73 79 6d 62 6f 6c 20 63 6f 64 65 64 20 69 6e   symbol coded in
52a0: 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 67 72   the input.** gr
52b0: 61 6d 6d 61 72 20 75 73 69 6e 67 20 74 68 65 20  ammar using the 
52c0: 22 5b 73 79 6d 62 6f 6c 5d 22 20 63 6f 6e 73 74  "[symbol]" const
52d0: 72 75 63 74 20 77 69 6c 6c 20 61 6c 72 65 61 64  ruct will alread
52e0: 79 20 68 61 76 65 20 74 68 65 0a 2a 2a 20 72 70  y have the.** rp
52f0: 2d 3e 70 72 65 63 73 79 6d 20 66 69 65 6c 64 20  ->precsym field 
5300: 66 69 6c 6c 65 64 2e 20 20 4f 74 68 65 72 20 72  filled.  Other r
5310: 75 6c 65 73 20 74 61 6b 65 20 61 73 20 74 68 65  ules take as the
5320: 69 72 20 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a  ir precedence.**
5330: 20 73 79 6d 62 6f 6c 20 74 68 65 20 66 69 72 73   symbol the firs
5340: 74 20 52 48 53 20 73 79 6d 62 6f 6c 20 77 69 74  t RHS symbol wit
5350: 68 20 61 20 64 65 66 69 6e 65 64 20 70 72 65 63  h a defined prec
5360: 65 64 65 6e 63 65 2e 20 20 49 66 20 74 68 65 72  edence.  If ther
5370: 65 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 52 48 53  e.** are not RHS
5380: 20 73 79 6d 62 6f 6c 73 20 77 69 74 68 20 61 20   symbols with a 
5390: 64 65 66 69 6e 65 64 20 70 72 65 63 65 64 65 6e  defined preceden
53a0: 63 65 2c 20 74 68 65 20 70 72 65 63 65 64 65 6e  ce, the preceden
53b0: 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 66 69 65  ce.** symbol fie
53c0: 6c 64 20 69 73 20 6c 65 66 74 20 62 6c 61 6e 6b  ld is left blank
53d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75  ..*/.void FindRu
53e0: 6c 65 50 72 65 63 65 64 65 6e 63 65 73 28 78 70  lePrecedences(xp
53f0: 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
5400: 78 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 72  xp;.{.  struct r
5410: 75 6c 65 20 2a 72 70 3b 0a 20 20 66 6f 72 28 72  ule *rp;.  for(r
5420: 70 3d 78 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  p=xp->rule; rp; 
5430: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
5440: 20 20 69 66 28 20 72 70 2d 3e 70 72 65 63 73 79    if( rp->precsy
5450: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  m==0 ){.      in
5460: 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
5470: 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
5480: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
5490: 28 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 70 72  ( rp->rhs[i]->pr
54a0: 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ec>=0 ){.       
54b0: 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d     rp->precsym =
54c0: 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
54d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d         break;..}
54e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
54f0: 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a   }.  return;.}..
5500: 2f 2a 20 46 69 6e 64 20 61 6c 6c 20 6e 6f 6e 74  /* Find all nont
5510: 65 72 6d 69 6e 61 6c 73 20 77 68 69 63 68 20 77  erminals which w
5520: 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 74 68 65  ill generate the
5530: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a   empty string..*
5540: 2a 20 54 68 65 6e 20 67 6f 20 62 61 63 6b 20 61  * Then go back a
5550: 6e 64 20 63 6f 6d 70 75 74 65 20 74 68 65 20 66  nd compute the f
5560: 69 72 73 74 20 73 65 74 73 20 6f 66 20 65 76 65  irst sets of eve
5570: 72 79 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a  ry nonterminal..
5580: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 73 65 74  ** The first set
5590: 20 69 73 20 74 68 65 20 73 65 74 20 6f 66 20 61   is the set of a
55a0: 6c 6c 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62  ll terminal symb
55b0: 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20 62 65  ols which can be
55c0: 67 69 6e 0a 2a 2a 20 61 20 73 74 72 69 6e 67 20  gin.** a string 
55d0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 61  generated by tha
55e0: 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a  t nonterminal..*
55f0: 2f 0a 76 6f 69 64 20 46 69 6e 64 46 69 72 73 74  /.void FindFirst
5600: 53 65 74 73 28 6c 65 6d 70 29 0a 73 74 72 75 63  Sets(lemp).struc
5610: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
5620: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
5630: 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69  ct rule *rp;.  i
5640: 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 0a 20 20  nt progress;..  
5650: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
5660: 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
5670: 20 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c      lemp->symbol
5680: 73 5b 69 5d 2d 3e 6c 61 6d 62 64 61 20 3d 20 42  s[i]->lambda = B
5690: 5f 46 41 4c 53 45 3b 0a 20 20 7d 0a 20 20 66 6f  _FALSE;.  }.  fo
56a0: 72 28 69 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  r(i=lemp->ntermi
56b0: 6e 61 6c 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  nal; i<lemp->nsy
56c0: 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
56d0: 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
56e0: 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 53 65 74  ->firstset = Set
56f0: 4e 65 77 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  New();.  }..  /*
5700: 20 46 69 72 73 74 20 63 6f 6d 70 75 74 65 20 61   First compute a
5710: 6c 6c 20 6c 61 6d 62 64 61 73 20 2a 2f 0a 20 20  ll lambdas */.  
5720: 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73  do{.    progress
5730: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 72 70   = 0;.    for(rp
5740: 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
5750: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
5760: 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73       if( rp->lhs
5770: 2d 3e 6c 61 6d 62 64 61 20 29 20 63 6f 6e 74 69  ->lambda ) conti
5780: 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  nue;.      for(i
5790: 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
57a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 69  i++){.         i
57b0: 66 28 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6c  f( rp->rhs[i]->l
57c0: 61 6d 62 64 61 3d 3d 42 5f 46 41 4c 53 45 20 29  ambda==B_FALSE )
57d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
57e0: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d        if( i==rp-
57f0: 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  >nrhs ){.       
5800: 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61   rp->lhs->lambda
5810: 20 3d 20 42 5f 54 52 55 45 3b 0a 20 20 20 20 20   = B_TRUE;.     
5820: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
5830: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5840: 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73   }while( progres
5850: 73 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63  s );..  /* Now c
5860: 6f 6d 70 75 74 65 20 61 6c 6c 20 66 69 72 73 74  ompute all first
5870: 20 73 65 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20   sets */.  do{. 
5880: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
5890: 20 2a 73 31 2c 20 2a 73 32 3b 0a 20 20 20 20 70   *s1, *s2;.    p
58a0: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
58b0: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
58c0: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
58d0: 65 78 74 29 7b 0a 20 20 20 20 20 20 73 31 20 3d  ext){.      s1 =
58e0: 20 72 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20   rp->lhs;.      
58f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
5900: 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
5910: 20 20 20 73 32 20 3d 20 72 70 2d 3e 72 68 73 5b     s2 = rp->rhs[
5920: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
5930: 73 32 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  s2->type==TERMIN
5940: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
5950: 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41  progress += SetA
5960: 64 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c  dd(s1->firstset,
5970: 73 32 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  s2->index);.    
5980: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 65        break;..}e
5990: 6c 73 65 20 69 66 28 20 73 31 3d 3d 73 32 20 29  lse if( s1==s2 )
59a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
59b0: 73 31 2d 3e 6c 61 6d 62 64 61 3d 3d 42 5f 46 41  s1->lambda==B_FA
59c0: 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 09 7d 65  LSE ) break;..}e
59d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
59e0: 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 55 6e  rogress += SetUn
59f0: 69 6f 6e 28 73 31 2d 3e 66 69 72 73 74 73 65 74  ion(s1->firstset
5a00: 2c 73 32 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a  ,s2->firstset);.
5a10: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 32            if( s2
5a20: 2d 3e 6c 61 6d 62 64 61 3d 3d 42 5f 46 41 4c 53  ->lambda==B_FALS
5a30: 45 20 29 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20  E ) break;..}.  
5a40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77      }.    }.  }w
5a50: 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29  hile( progress )
5a60: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
5a70: 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52  * Compute all LR
5a80: 28 30 29 20 73 74 61 74 65 73 20 66 6f 72 20 74  (0) states for t
5a90: 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 4c 69 6e  he grammar.  Lin
5aa0: 6b 73 0a 2a 2a 20 61 72 65 20 61 64 64 65 64 20  ks.** are added 
5ab0: 74 6f 20 62 65 74 77 65 65 6e 20 73 6f 6d 65 20  to between some 
5ac0: 73 74 61 74 65 73 20 73 6f 20 74 68 61 74 20 74  states so that t
5ad0: 68 65 20 4c 52 28 31 29 20 66 6f 6c 6c 6f 77 20  he LR(1) follow 
5ae0: 73 65 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  sets.** can be c
5af0: 6f 6d 70 75 74 65 64 20 6c 61 74 65 72 2e 0a 2a  omputed later..*
5b00: 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75 63 74  /.PRIVATE struct
5b10: 20 73 74 61 74 65 20 2a 67 65 74 73 74 61 74 65   state *getstate
5b20: 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  (/* struct lemon
5b30: 20 2a 20 2a 2f 29 3b 20 20 2f 2a 20 66 6f 72 77   * */);  /* forw
5b40: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
5b50: 0a 76 6f 69 64 20 46 69 6e 64 53 74 61 74 65 73  .void FindStates
5b60: 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65  (lemp).struct le
5b70: 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73  mon *lemp;.{.  s
5b80: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
5b90: 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
5ba0: 2a 72 70 3b 0a 0a 20 20 43 6f 6e 66 69 67 6c 69  *rp;..  Configli
5bb0: 73 74 5f 69 6e 69 74 28 29 3b 0a 0a 20 20 2f 2a  st_init();..  /*
5bc0: 20 46 69 6e 64 20 74 68 65 20 73 74 61 72 74 20   Find the start 
5bd0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69 66 28 20  symbol */.  if( 
5be0: 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20  lemp->start ){. 
5bf0: 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66     sp = Symbol_f
5c00: 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29  ind(lemp->start)
5c10: 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20  ;.    if( sp==0 
5c20: 29 7b 0a 20 20 20 20 20 20 45 72 72 6f 72 4d 73  ){.      ErrorMs
5c30: 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  g(lemp->filename
5c40: 2c 30 2c 0a 22 54 68 65 20 73 70 65 63 69 66 69  ,0,."The specifi
5c50: 65 64 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  ed start symbol 
5c60: 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 5c 0a  \"%s\" is not \.
5c70: 69 6e 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  in a nonterminal
5c80: 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2e   of the grammar.
5c90: 20 20 5c 22 25 73 5c 22 20 77 69 6c 6c 20 62 65    \"%s\" will be
5ca0: 20 75 73 65 64 20 61 73 20 74 68 65 20 73 74 61   used as the sta
5cb0: 72 74 20 5c 0a 73 79 6d 62 6f 6c 20 69 6e 73 74  rt \.symbol inst
5cc0: 65 61 64 2e 22 2c 6c 65 6d 70 2d 3e 73 74 61 72  ead.",lemp->star
5cd0: 74 2c 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68  t,lemp->rule->lh
5ce0: 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  s->name);.      
5cf0: 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
5d00: 3b 0a 20 20 20 20 20 20 73 70 20 3d 20 6c 65 6d  ;.      sp = lem
5d10: 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20  p->rule->lhs;.  
5d20: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
5d30: 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65   sp = lemp->rule
5d40: 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ->lhs;.  }..  /*
5d50: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   Make sure the s
5d60: 74 61 72 74 20 73 79 6d 62 6f 6c 20 64 6f 65 73  tart symbol does
5d70: 6e 27 74 20 6f 63 63 75 72 20 6f 6e 20 74 68 65  n't occur on the
5d80: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
5d90: 20 6f 66 0a 20 20 2a 2a 20 61 6e 79 20 72 75 6c   of.  ** any rul
5da0: 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  e.  Report an er
5db0: 72 6f 72 20 69 66 20 69 74 20 64 6f 65 73 2e 20  ror if it does. 
5dc0: 20 28 59 41 43 43 20 77 6f 75 6c 64 20 67 65 6e   (YACC would gen
5dd0: 65 72 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a  erate a new.  **
5de0: 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 69 6e   start symbol in
5df0: 20 74 68 69 73 20 63 61 73 65 2e 29 20 2a 2f 0a   this case.) */.
5e00: 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
5e10: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
5e20: 6e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69  next){.    int i
5e30: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
5e40: 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
5e50: 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 72  .      if( rp->r
5e60: 68 73 5b 69 5d 3d 3d 73 70 20 29 7b 0a 20 20 20  hs[i]==sp ){.   
5e70: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
5e80: 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a  mp->filename,0,.
5e90: 22 54 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f  "The start symbo
5ea0: 6c 20 5c 22 25 73 5c 22 20 6f 63 63 75 72 73 20  l \"%s\" occurs 
5eb0: 6f 6e 20 74 68 65 20 5c 0a 72 69 67 68 74 2d 68  on the \.right-h
5ec0: 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 72 75  and side of a ru
5ed0: 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 72 65  le. This will re
5ee0: 73 75 6c 74 20 69 6e 20 61 20 70 61 72 73 65 72  sult in a parser
5ef0: 20 77 68 69 63 68 20 5c 0a 64 6f 65 73 20 6e 6f   which \.does no
5f00: 74 20 77 6f 72 6b 20 70 72 6f 70 65 72 6c 79 2e  t work properly.
5f10: 22 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  ",sp->name);.   
5f20: 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72       lemp->error
5f30: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  cnt++;.      }. 
5f40: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
5f50: 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75  he basis configu
5f60: 72 61 74 69 6f 6e 20 73 65 74 20 66 6f 72 20 74  ration set for t
5f70: 68 65 20 66 69 72 73 74 20 73 74 61 74 65 0a 20  he first state. 
5f80: 20 2a 2a 20 69 73 20 61 6c 6c 20 72 75 6c 65 73   ** is all rules
5f90: 20 77 68 69 63 68 20 68 61 76 65 20 74 68 65 20   which have the 
5fa0: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 61 73 20  start symbol as 
5fb0: 74 68 65 69 72 0a 20 20 2a 2a 20 6c 65 66 74 2d  their.  ** left-
5fc0: 68 61 6e 64 20 73 69 64 65 20 2a 2f 0a 20 20 66  hand side */.  f
5fd0: 6f 72 28 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20  or(rp=sp->rule; 
5fe0: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 6c  rp; rp=rp->nextl
5ff0: 68 73 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  hs){.    struct 
6000: 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 70 3b 0a  config *newcfp;.
6010: 20 20 20 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e      newcfp = Con
6020: 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73  figlist_addbasis
6030: 28 72 70 2c 30 29 3b 0a 20 20 20 20 53 65 74 41  (rp,0);.    SetA
6040: 64 64 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 30  dd(newcfp->fws,0
6050: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
6060: 70 75 74 65 20 74 68 65 20 66 69 72 73 74 20 73  pute the first s
6070: 74 61 74 65 2e 20 20 41 6c 6c 20 6f 74 68 65 72  tate.  All other
6080: 20 73 74 61 74 65 73 20 77 69 6c 6c 20 62 65 0a   states will be.
6090: 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 61 75    ** computed au
60a0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 75 72 69  tomatically duri
60b0: 6e 67 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  ng the computati
60c0: 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  on of the first 
60d0: 6f 6e 65 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65  one..  ** The re
60e0: 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 74  turned pointer t
60f0: 6f 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74  o the first stat
6100: 65 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 2a  e is not used. *
6110: 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 73 74 61  /.  (void)getsta
6120: 74 65 28 6c 65 6d 70 29 3b 0a 20 20 72 65 74 75  te(lemp);.  retu
6130: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  rn;.}../* Return
6140: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
6150: 73 74 61 74 65 20 77 68 69 63 68 20 69 73 20 64  state which is d
6160: 65 73 63 72 69 62 65 64 20 62 79 20 74 68 65 20  escribed by the 
6170: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 2a 2a  configuration.**
6180: 20 6c 69 73 74 20 77 68 69 63 68 20 68 61 73 20   list which has 
6190: 62 65 65 6e 20 62 75 69 6c 74 20 66 72 6f 6d 20  been built from 
61a0: 63 61 6c 6c 73 20 74 6f 20 43 6f 6e 66 69 67 6c  calls to Configl
61b0: 69 73 74 5f 61 64 64 2e 0a 2a 2f 0a 50 52 49 56  ist_add..*/.PRIV
61c0: 41 54 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68  ATE void buildsh
61d0: 69 66 74 73 28 2f 2a 20 73 74 72 75 63 74 20 6c  ifts(/* struct l
61e0: 65 6d 6f 6e 20 2a 2c 20 73 74 72 75 63 74 20 73  emon *, struct s
61f0: 74 61 74 65 20 2a 20 2a 2f 29 3b 20 2f 2a 20 46  tate * */); /* F
6200: 6f 72 77 64 20 72 65 66 20 2a 2f 0a 50 52 49 56  orwd ref */.PRIV
6210: 41 54 45 20 73 74 72 75 63 74 20 73 74 61 74 65  ATE struct state
6220: 20 2a 67 65 74 73 74 61 74 65 28 6c 65 6d 70 29   *getstate(lemp)
6230: 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
6240: 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  emp;.{.  struct 
6250: 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 62 70  config *cfp, *bp
6260: 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
6270: 20 2a 73 74 70 3b 0a 0a 20 20 2f 2a 20 45 78 74   *stp;..  /* Ext
6280: 72 61 63 74 20 74 68 65 20 73 6f 72 74 65 64 20  ract the sorted 
6290: 62 61 73 69 73 20 6f 66 20 74 68 65 20 6e 65 77  basis of the new
62a0: 20 73 74 61 74 65 2e 20 20 54 68 65 20 62 61 73   state.  The bas
62b0: 69 73 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74  is was construct
62c0: 65 64 0a 20 20 2a 2a 20 62 79 20 70 72 69 6f 72  ed.  ** by prior
62d0: 20 63 61 6c 6c 73 20 74 6f 20 22 43 6f 6e 66 69   calls to "Confi
62e0: 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 29  glist_addbasis()
62f0: 22 2e 20 2a 2f 0a 20 20 43 6f 6e 66 69 67 6c 69  ". */.  Configli
6300: 73 74 5f 73 6f 72 74 62 61 73 69 73 28 29 3b 0a  st_sortbasis();.
6310: 20 20 62 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73    bp = Configlis
6320: 74 5f 62 61 73 69 73 28 29 3b 0a 0a 20 20 2f 2a  t_basis();..  /*
6330: 20 47 65 74 20 61 20 73 74 61 74 65 20 77 69 74   Get a state wit
6340: 68 20 74 68 65 20 73 61 6d 65 20 62 61 73 69 73  h the same basis
6350: 20 2a 2f 0a 20 20 73 74 70 20 3d 20 53 74 61 74   */.  stp = Stat
6360: 65 5f 66 69 6e 64 28 62 70 29 3b 0a 20 20 69 66  e_find(bp);.  if
6370: 28 20 73 74 70 20 29 7b 0a 20 20 20 20 2f 2a 20  ( stp ){.    /* 
6380: 41 20 73 74 61 74 65 20 77 69 74 68 20 74 68 65  A state with the
6390: 20 73 61 6d 65 20 62 61 73 69 73 20 61 6c 72 65   same basis alre
63a0: 61 64 79 20 65 78 69 73 74 73 21 20 20 43 6f 70  ady exists!  Cop
63b0: 79 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77  y all the follow
63c0: 2d 73 65 74 0a 20 20 20 20 2a 2a 20 70 72 6f 70  -set.    ** prop
63d0: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 66 72  agation links fr
63e0: 6f 6d 20 74 68 65 20 73 74 61 74 65 20 75 6e 64  om the state und
63f0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
6400: 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
6410: 70 72 65 65 78 69 73 74 69 6e 67 20 73 74 61 74  preexisting stat
6420: 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  e, then return a
6430: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
6440: 70 72 65 65 78 69 73 74 69 6e 67 20 73 74 61 74  preexisting stat
6450: 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  e */.    struct 
6460: 63 6f 6e 66 69 67 20 2a 78 2c 20 2a 79 3b 0a 20  config *x, *y;. 
6470: 20 20 20 66 6f 72 28 78 3d 62 70 2c 20 79 3d 73     for(x=bp, y=s
6480: 74 70 2d 3e 62 70 3b 20 78 20 26 26 20 79 3b 20  tp->bp; x && y; 
6490: 78 3d 78 2d 3e 62 70 2c 20 79 3d 79 2d 3e 62 70  x=x->bp, y=y->bp
64a0: 29 7b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 63  ){.      Plink_c
64b0: 6f 70 79 28 26 79 2d 3e 62 70 6c 70 2c 78 2d 3e  opy(&y->bplp,x->
64c0: 62 70 6c 70 29 3b 0a 20 20 20 20 20 20 50 6c 69  bplp);.      Pli
64d0: 6e 6b 5f 64 65 6c 65 74 65 28 78 2d 3e 66 70 6c  nk_delete(x->fpl
64e0: 70 29 3b 0a 20 20 20 20 20 20 78 2d 3e 66 70 6c  p);.      x->fpl
64f0: 70 20 3d 20 78 2d 3e 62 70 6c 70 20 3d 20 30 3b  p = x->bplp = 0;
6500: 0a 20 20 20 20 7d 0a 20 20 20 20 63 66 70 20 3d  .    }.    cfp =
6510: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75   Configlist_retu
6520: 72 6e 28 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67  rn();.    Config
6530: 6c 69 73 74 5f 65 61 74 28 63 66 70 29 3b 0a 20  list_eat(cfp);. 
6540: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
6550: 68 69 73 20 72 65 61 6c 6c 79 20 69 73 20 61 20  his really is a 
6560: 6e 65 77 20 73 74 61 74 65 2e 20 20 43 6f 6e 73  new state.  Cons
6570: 74 72 75 63 74 20 61 6c 6c 20 74 68 65 20 64 65  truct all the de
6580: 74 61 69 6c 73 20 2a 2f 0a 20 20 20 20 43 6f 6e  tails */.    Con
6590: 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28  figlist_closure(
65a0: 6c 65 6d 70 29 3b 20 20 20 20 2f 2a 20 43 6f 6d  lemp);    /* Com
65b0: 70 75 74 65 20 74 68 65 20 63 6f 6e 66 69 67 75  pute the configu
65c0: 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a  ration closure *
65d0: 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74  /.    Configlist
65e0: 5f 73 6f 72 74 28 29 3b 20 20 20 20 20 20 20 20  _sort();        
65f0: 20 20 20 2f 2a 20 53 6f 72 74 20 74 68 65 20 63     /* Sort the c
6600: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f  onfiguration clo
6610: 73 75 72 65 20 2a 2f 0a 20 20 20 20 63 66 70 20  sure */.    cfp 
6620: 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74  = Configlist_ret
6630: 75 72 6e 28 29 3b 20 20 20 2f 2a 20 47 65 74 20  urn();   /* Get 
6640: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
6650: 20 63 6f 6e 66 69 67 20 6c 69 73 74 20 2a 2f 0a   config list */.
6660: 20 20 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f      stp = State_
6670: 6e 65 77 28 29 3b 20 20 20 20 20 20 20 20 20 20  new();          
6680: 20 2f 2a 20 41 20 6e 65 77 20 73 74 61 74 65 20   /* A new state 
6690: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
66a0: 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73 74 70   MemoryCheck(stp
66b0: 29 3b 0a 20 20 20 20 73 74 70 2d 3e 62 70 20 3d  );.    stp->bp =
66c0: 20 62 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   bp;            
66d0: 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20      /* Remember 
66e0: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
66f0: 6e 20 62 61 73 69 73 20 2a 2f 0a 20 20 20 20 73  n basis */.    s
6700: 74 70 2d 3e 63 66 70 20 3d 20 63 66 70 3b 20 20  tp->cfp = cfp;  
6710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
6720: 65 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6e 66  emember the conf
6730: 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72  iguration closur
6740: 65 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 69 6e  e */.    stp->in
6750: 64 65 78 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  dex = lemp->nsta
6760: 74 65 2b 2b 3b 20 2f 2a 20 45 76 65 72 79 20 73  te++; /* Every s
6770: 74 61 74 65 20 67 65 74 73 20 61 20 73 65 71 75  tate gets a sequ
6780: 65 6e 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ence number */. 
6790: 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 30 3b 20     stp->ap = 0; 
67a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67b0: 2f 2a 20 4e 6f 20 61 63 74 69 6f 6e 73 2c 20 79  /* No actions, y
67c0: 65 74 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65  et. */.    State
67d0: 5f 69 6e 73 65 72 74 28 73 74 70 2c 73 74 70 2d  _insert(stp,stp-
67e0: 3e 62 70 29 3b 20 20 20 2f 2a 20 41 64 64 20 74  >bp);   /* Add t
67f0: 6f 20 74 68 65 20 73 74 61 74 65 20 74 61 62 6c  o the state tabl
6800: 65 20 2a 2f 0a 20 20 20 20 62 75 69 6c 64 73 68  e */.    buildsh
6810: 69 66 74 73 28 6c 65 6d 70 2c 73 74 70 29 3b 20  ifts(lemp,stp); 
6820: 20 20 20 20 20 20 2f 2a 20 52 65 63 75 72 73 69        /* Recursi
6830: 76 65 6c 79 20 63 6f 6d 70 75 74 65 20 73 75 63  vely compute suc
6840: 63 65 73 73 6f 72 20 73 74 61 74 65 73 20 2a 2f  cessor states */
6850: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 74  .  }.  return st
6860: 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75  p;.}../* Constru
6870: 63 74 20 61 6c 6c 20 73 75 63 63 65 73 73 6f 72  ct all successor
6880: 20 73 74 61 74 65 73 20 74 6f 20 74 68 65 20 67   states to the g
6890: 69 76 65 6e 20 73 74 61 74 65 2e 20 20 41 20 22  iven state.  A "
68a0: 73 75 63 63 65 73 73 6f 72 22 0a 2a 2a 20 73 74  successor".** st
68b0: 61 74 65 20 69 73 20 61 6e 79 20 73 74 61 74 65  ate is any state
68c0: 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 72 65   which can be re
68d0: 61 63 68 65 64 20 62 79 20 61 20 73 68 69 66 74  ached by a shift
68e0: 20 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56   action..*/.PRIV
68f0: 41 54 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68  ATE void buildsh
6900: 69 66 74 73 28 6c 65 6d 70 2c 73 74 70 29 0a 73  ifts(lemp,stp).s
6910: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
6920: 70 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  p;.struct state 
6930: 2a 73 74 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  *stp;     /* The
6940: 20 73 74 61 74 65 20 66 72 6f 6d 20 77 68 69 63   state from whic
6950: 68 20 73 75 63 63 65 73 73 6f 72 73 20 61 72 65  h successors are
6960: 20 63 6f 6d 70 75 74 65 64 20 2a 2f 0a 7b 0a 20   computed */.{. 
6970: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
6980: 63 66 70 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  cfp;  /* For loo
6990: 70 69 6e 67 20 74 68 72 75 20 74 68 65 20 63 6f  ping thru the co
69a0: 6e 66 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20  nfig closure of 
69b0: 22 73 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63  "stp" */.  struc
69c0: 74 20 63 6f 6e 66 69 67 20 2a 62 63 66 70 3b 20  t config *bcfp; 
69d0: 2f 2a 20 46 6f 72 20 74 68 65 20 69 6e 6e 65 72  /* For the inner
69e0: 20 6c 6f 6f 70 20 6f 6e 20 63 6f 6e 66 69 67 20   loop on config 
69f0: 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22  closure of "stp"
6a00: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   */.  struct con
6a10: 66 69 67 20 2a 6e 65 77 3b 20 20 2f 2a 20 2a 2f  fig *new;  /* */
6a20: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
6a30: 20 2a 73 70 3b 20 20 20 2f 2a 20 53 79 6d 62 6f   *sp;   /* Symbo
6a40: 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  l following the 
6a50: 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61  dot in configura
6a60: 74 69 6f 6e 20 22 63 66 70 22 20 2a 2f 0a 20 20  tion "cfp" */.  
6a70: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62  struct symbol *b
6a80: 73 70 3b 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66  sp;  /* Symbol f
6a90: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f 74  ollowing the dot
6aa0: 20 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f   in configuratio
6ab0: 6e 20 22 62 63 66 70 22 20 2a 2f 0a 20 20 73 74  n "bcfp" */.  st
6ac0: 72 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77 73  ruct state *news
6ad0: 74 70 3b 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72  tp; /* A pointer
6ae0: 20 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72 20   to a successor 
6af0: 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45  state */..  /* E
6b00: 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ach configuratio
6b10: 6e 20 62 65 63 6f 6d 65 73 20 63 6f 6d 70 6c 65  n becomes comple
6b20: 74 65 20 61 66 74 65 72 20 69 74 20 63 6f 6e 74  te after it cont
6b30: 69 62 75 74 65 73 20 74 6f 20 61 20 73 75 63 63  ibutes to a succ
6b40: 65 73 73 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65  essor.  ** state
6b50: 2e 20 20 49 6e 69 74 69 61 6c 6c 79 2c 20 61 6c  .  Initially, al
6b60: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  l configurations
6b70: 20 61 72 65 20 69 6e 63 6f 6d 70 6c 65 74 65 20   are incomplete 
6b80: 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70  */.  for(cfp=stp
6b90: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
6ba0: 63 66 70 2d 3e 6e 65 78 74 29 20 63 66 70 2d 3e  cfp->next) cfp->
6bb0: 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c  status = INCOMPL
6bc0: 45 54 45 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  ETE;..  /* Loop 
6bd0: 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6e 66  through all conf
6be0: 69 67 75 72 61 74 69 6f 6e 73 20 6f 66 20 74 68  igurations of th
6bf0: 65 20 73 74 61 74 65 20 22 73 74 70 22 20 2a 2f  e state "stp" */
6c00: 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e  .  for(cfp=stp->
6c10: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
6c20: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66  p->next){.    if
6c30: 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43  ( cfp->status==C
6c40: 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e  OMPLETE ) contin
6c50: 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64  ue;    /* Alread
6c60: 79 20 75 73 65 64 20 62 79 20 69 6e 6e 65 72 20  y used by inner 
6c70: 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20  loop */.    if( 
6c80: 63 66 70 2d 3e 64 6f 74 3e 3d 63 66 70 2d 3e 72  cfp->dot>=cfp->r
6c90: 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e  p->nrhs ) contin
6ca0: 75 65 3b 20 20 2f 2a 20 43 61 6e 27 74 20 73 68  ue;  /* Can't sh
6cb0: 69 66 74 20 74 68 69 73 20 63 6f 6e 66 69 67 20  ift this config 
6cc0: 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73  */.    Configlis
6cd0: 74 5f 72 65 73 65 74 28 29 3b 20 20 20 20 20 20  t_reset();      
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cf0: 2f 2a 20 52 65 73 65 74 20 74 68 65 20 6e 65 77  /* Reset the new
6d00: 20 63 6f 6e 66 69 67 20 73 65 74 20 2a 2f 0a 20   config set */. 
6d10: 20 20 20 73 70 20 3d 20 63 66 70 2d 3e 72 70 2d     sp = cfp->rp-
6d20: 3e 72 68 73 5b 63 66 70 2d 3e 64 6f 74 5d 3b 20  >rhs[cfp->dot]; 
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
6d40: 79 6d 62 6f 6c 20 61 66 74 65 72 20 74 68 65 20  ymbol after the 
6d50: 64 6f 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  dot */..    /* F
6d60: 6f 72 20 65 76 65 72 79 20 63 6f 6e 66 69 67 75  or every configu
6d70: 72 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74  ration in the st
6d80: 61 74 65 20 22 73 74 70 22 20 77 68 69 63 68 20  ate "stp" which 
6d90: 68 61 73 20 74 68 65 20 73 79 6d 62 6f 6c 20 22  has the symbol "
6da0: 73 70 22 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  sp".    ** follo
6db0: 77 69 6e 67 20 69 74 73 20 64 6f 74 2c 20 61 64  wing its dot, ad
6dc0: 64 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 66 69  d the same confi
6dd0: 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  guration to the 
6de0: 62 61 73 69 73 20 73 65 74 20 75 6e 64 65 72 0a  basis set under.
6df0: 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74      ** construct
6e00: 69 6f 6e 20 62 75 74 20 77 69 74 68 20 74 68 65  ion but with the
6e10: 20 64 6f 74 20 73 68 69 66 74 65 64 20 6f 6e 65   dot shifted one
6e20: 20 73 79 6d 62 6f 6c 20 74 6f 20 74 68 65 20 72   symbol to the r
6e30: 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  ight. */.    for
6e40: 28 62 63 66 70 3d 63 66 70 3b 20 62 63 66 70 3b  (bcfp=cfp; bcfp;
6e50: 20 62 63 66 70 3d 62 63 66 70 2d 3e 6e 65 78 74   bcfp=bcfp->next
6e60: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 63 66  ){.      if( bcf
6e70: 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c  p->status==COMPL
6e80: 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ETE ) continue; 
6e90: 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 75 73     /* Already us
6ea0: 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
6eb0: 62 63 66 70 2d 3e 64 6f 74 3e 3d 62 63 66 70 2d  bcfp->dot>=bcfp-
6ec0: 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74  >rp->nrhs ) cont
6ed0: 69 6e 75 65 3b 20 2f 2a 20 43 61 6e 27 74 20 73  inue; /* Can't s
6ee0: 68 69 66 74 20 74 68 69 73 20 6f 6e 65 20 2a 2f  hift this one */
6ef0: 0a 20 20 20 20 20 20 62 73 70 20 3d 20 62 63 66  .      bsp = bcf
6f00: 70 2d 3e 72 70 2d 3e 72 68 73 5b 62 63 66 70 2d  p->rp->rhs[bcfp-
6f10: 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20 20 20  >dot];          
6f20: 20 2f 2a 20 47 65 74 20 73 79 6d 62 6f 6c 20 61   /* Get symbol a
6f30: 66 74 65 72 20 64 6f 74 20 2a 2f 0a 20 20 20 20  fter dot */.    
6f40: 20 20 69 66 28 20 62 73 70 21 3d 73 70 20 29 20    if( bsp!=sp ) 
6f50: 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20 20 20  continue;       
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
6f70: 75 73 74 20 62 65 20 73 61 6d 65 20 61 73 20 66  ust be same as f
6f80: 6f 72 20 22 63 66 70 22 20 2a 2f 0a 20 20 20 20  or "cfp" */.    
6f90: 20 20 62 63 66 70 2d 3e 73 74 61 74 75 73 20 3d    bcfp->status =
6fa0: 20 43 4f 4d 50 4c 45 54 45 3b 20 20 20 20 20 20   COMPLETE;      
6fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
6fc0: 61 72 6b 20 74 68 69 73 20 63 6f 6e 66 69 67 20  ark this config 
6fd0: 61 73 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20  as used */.     
6fe0: 20 6e 65 77 20 3d 20 43 6f 6e 66 69 67 6c 69 73   new = Configlis
6ff0: 74 5f 61 64 64 62 61 73 69 73 28 62 63 66 70 2d  t_addbasis(bcfp-
7000: 3e 72 70 2c 62 63 66 70 2d 3e 64 6f 74 2b 31 29  >rp,bcfp->dot+1)
7010: 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 61 64  ;.      Plink_ad
7020: 64 28 26 6e 65 77 2d 3e 62 70 6c 70 2c 62 63 66  d(&new->bplp,bcf
7030: 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  p);.    }..    /
7040: 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20  * Get a pointer 
7050: 74 6f 20 74 68 65 20 73 74 61 74 65 20 64 65 73  to the state des
7060: 63 72 69 62 65 64 20 62 79 20 74 68 65 20 62 61  cribed by the ba
7070: 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  sis configuratio
7080: 6e 20 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f 6e  n set.    ** con
7090: 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 65 20  structed in the 
70a0: 70 72 65 63 65 64 69 6e 67 20 6c 6f 6f 70 20 2a  preceding loop *
70b0: 2f 0a 20 20 20 20 6e 65 77 73 74 70 20 3d 20 67  /.    newstp = g
70c0: 65 74 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 0a  etstate(lemp);..
70d0: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65      /* The state
70e0: 20 22 6e 65 77 73 74 70 22 20 69 73 20 72 65 61   "newstp" is rea
70f0: 63 68 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  ched from the st
7100: 61 74 65 20 22 73 74 70 22 20 62 79 20 61 20 73  ate "stp" by a s
7110: 68 69 66 74 20 61 63 74 69 6f 6e 0a 20 20 20 20  hift action.    
7120: 2a 2a 20 6f 6e 20 74 68 65 20 73 79 6d 62 6f 6c  ** on the symbol
7130: 20 22 73 70 22 20 2a 2f 0a 20 20 20 20 41 63 74   "sp" */.    Act
7140: 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61 70  ion_add(&stp->ap
7150: 2c 53 48 49 46 54 2c 73 70 2c 6e 65 77 73 74 70  ,SHIFT,sp,newstp
7160: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
7170: 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 70 72  Construct the pr
7180: 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a  opagation links.
7190: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b  */.void FindLink
71a0: 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  s(lemp).struct l
71b0: 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
71c0: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
71d0: 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6f 74  config *cfp, *ot
71e0: 68 65 72 3b 0a 20 20 73 74 72 75 63 74 20 73 74  her;.  struct st
71f0: 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
7200: 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 0a  ct plink *plp;..
7210: 20 20 2f 2a 20 48 6f 75 73 65 6b 65 65 70 69 6e    /* Housekeepin
7220: 67 20 64 65 74 61 69 6c 3a 0a 20 20 2a 2a 20 41  g detail:.  ** A
7230: 64 64 20 74 6f 20 65 76 65 72 79 20 70 72 6f 70  dd to every prop
7240: 61 67 61 74 65 20 6c 69 6e 6b 20 61 20 70 6f 69  agate link a poi
7250: 6e 74 65 72 20 62 61 63 6b 20 74 6f 20 74 68 65  nter back to the
7260: 20 73 74 61 74 65 20 74 6f 0a 20 20 2a 2a 20 77   state to.  ** w
7270: 68 69 63 68 20 74 68 65 20 6c 69 6e 6b 20 69 73  hich the link is
7280: 20 61 74 74 61 63 68 65 64 2e 20 2a 2f 0a 20 20   attached. */.  
7290: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
72a0: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
72b0: 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
72c0: 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f  orted[i];.    fo
72d0: 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20  r(cfp=stp->cfp; 
72e0: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
72f0: 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e  xt){.      cfp->
7300: 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 7d  stp = stp;.    }
7310: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  .  }..  /* Conve
7320: 72 74 20 61 6c 6c 20 62 61 63 6b 6c 69 6e 6b 73  rt all backlinks
7330: 20 69 6e 74 6f 20 66 6f 72 77 61 72 64 20 6c 69   into forward li
7340: 6e 6b 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66  nks.  Only the f
7350: 6f 72 77 61 72 64 0a 20 20 2a 2a 20 6c 69 6e 6b  orward.  ** link
7360: 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  s are used in th
7370: 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 6f 6d  e follow-set com
7380: 70 75 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66  putation. */.  f
7390: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
73a0: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
73b0: 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
73c0: 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  rted[i];.    for
73d0: 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63  (cfp=stp->cfp; c
73e0: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
73f0: 74 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 6c  t){.      for(pl
7400: 70 3d 63 66 70 2d 3e 62 70 6c 70 3b 20 70 6c 70  p=cfp->bplp; plp
7410: 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29  ; plp=plp->next)
7420: 7b 0a 20 20 20 20 20 20 20 20 6f 74 68 65 72 20  {.        other 
7430: 3d 20 70 6c 70 2d 3e 63 66 70 3b 0a 20 20 20 20  = plp->cfp;.    
7440: 20 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6f      Plink_add(&o
7450: 74 68 65 72 2d 3e 66 70 6c 70 2c 63 66 70 29 3b  ther->fplp,cfp);
7460: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7470: 20 7d 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65   }.}../* Compute
7480: 20 61 6c 6c 20 66 6f 6c 6c 6f 77 73 65 74 73 2e   all followsets.
7490: 0a 2a 2a 0a 2a 2a 20 41 20 66 6f 6c 6c 6f 77 73  .**.** A follows
74a0: 65 74 20 69 73 20 74 68 65 20 73 65 74 20 6f 66  et is the set of
74b0: 20 61 6c 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69   all symbols whi
74c0: 63 68 20 63 61 6e 20 63 6f 6d 65 20 69 6d 6d 65  ch can come imme
74d0: 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72  diately.** after
74e0: 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
74f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46 6f  ..*/.void FindFo
7500: 6c 6c 6f 77 53 65 74 73 28 6c 65 6d 70 29 0a 73  llowSets(lemp).s
7510: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
7520: 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p;.{.  int i;.  
7530: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
7540: 66 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  fp;.  struct pli
7550: 6e 6b 20 2a 70 6c 70 3b 0a 20 20 69 6e 74 20 70  nk *plp;.  int p
7560: 72 6f 67 72 65 73 73 3b 0a 20 20 69 6e 74 20 63  rogress;.  int c
7570: 68 61 6e 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d  hange;..  for(i=
7580: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
7590: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  e; i++){.    for
75a0: 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65  (cfp=lemp->sorte
75b0: 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b 20  d[i]->cfp; cfp; 
75c0: 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a  cfp=cfp->next){.
75d0: 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61 74 75        cfp->statu
75e0: 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a  s = INCOMPLETE;.
75f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 64      }.  }.  .  d
7600: 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20  o{.    progress 
7610: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
7620: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
7630: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; i++){.      fo
7640: 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74  r(cfp=lemp->sort
7650: 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b  ed[i]->cfp; cfp;
7660: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b   cfp=cfp->next){
7670: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 66 70  .        if( cfp
7680: 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45  ->status==COMPLE
7690: 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  TE ) continue;. 
76a0: 20 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d 63         for(plp=c
76b0: 66 70 2d 3e 66 70 6c 70 3b 20 70 6c 70 3b 20 70  fp->fplp; plp; p
76c0: 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20  lp=plp->next){. 
76d0: 20 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 20           change 
76e0: 3d 20 53 65 74 55 6e 69 6f 6e 28 70 6c 70 2d 3e  = SetUnion(plp->
76f0: 63 66 70 2d 3e 66 77 73 2c 63 66 70 2d 3e 66 77  cfp->fws,cfp->fw
7700: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
7710: 28 20 63 68 61 6e 67 65 20 29 7b 0a 20 20 20 20  ( change ){.    
7720: 20 20 20 20 20 20 20 20 70 6c 70 2d 3e 63 66 70          plp->cfp
7730: 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d  ->status = INCOM
7740: 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20 20  PLETE;.         
7750: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
7760: 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 20  ..  }..}.       
7770: 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 43   cfp->status = C
7780: 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d  OMPLETE;.      }
7790: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
77a0: 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 7d 0a 0a   progress );.}..
77b0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
77c0: 76 65 5f 63 6f 6e 66 6c 69 63 74 28 29 3b 0a 0a  ve_conflict();..
77d0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 72  /* Compute the r
77e0: 65 64 75 63 65 20 61 63 74 69 6f 6e 73 2c 20 61  educe actions, a
77f0: 6e 64 20 72 65 73 6f 6c 76 65 20 63 6f 6e 66 6c  nd resolve confl
7800: 69 63 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69  icts..*/.void Fi
7810: 6e 64 41 63 74 69 6f 6e 73 28 6c 65 6d 70 29 0a  ndActions(lemp).
7820: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
7830: 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 6a 3b  mp;.{.  int i,j;
7840: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
7850: 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20   *cfp;.  struct 
7860: 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
7870: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
7880: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
7890: 72 70 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c  rp;..  /* Add al
78a0: 6c 20 6f 66 20 74 68 65 20 72 65 64 75 63 65 20  l of the reduce 
78b0: 61 63 74 69 6f 6e 73 20 0a 20 20 2a 2a 20 41 20  actions .  ** A 
78c0: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 69 73  reduce action is
78d0: 20 61 64 64 65 64 20 66 6f 72 20 65 61 63 68 20   added for each 
78e0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 66  element of the f
78f0: 6f 6c 6c 6f 77 73 65 74 20 6f 66 0a 20 20 2a 2a  ollowset of.  **
7900: 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
7910: 20 77 68 69 63 68 20 68 61 73 20 69 74 73 20 64   which has its d
7920: 6f 74 20 61 74 20 74 68 65 20 65 78 74 72 65 6d  ot at the extrem
7930: 65 20 72 69 67 68 74 2e 0a 20 20 2a 2f 0a 20 20  e right..  */.  
7940: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
7950: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 20 20  >nstate; i++){  
7960: 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
7970: 6c 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 20 20  l states */.    
7980: 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
7990: 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63  ed[i];.    for(c
79a0: 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70  fp=stp->cfp; cfp
79b0: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
79c0: 7b 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  {  /* Loop over 
79d0: 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  all configuratio
79e0: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ns */.      if( 
79f0: 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 3d 3d 63  cfp->rp->nrhs==c
7a00: 66 70 2d 3e 64 6f 74 20 29 7b 20 20 20 20 20 20  fp->dot ){      
7a10: 20 20 2f 2a 20 49 73 20 64 6f 74 20 61 74 20 65    /* Is dot at e
7a20: 78 74 72 65 6d 65 20 72 69 67 68 74 3f 20 2a 2f  xtreme right? */
7a30: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
7a40: 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; j<lemp->ntermi
7a50: 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nal; j++){.     
7a60: 20 20 20 20 20 69 66 28 20 53 65 74 46 69 6e 64       if( SetFind
7a70: 28 63 66 70 2d 3e 66 77 73 2c 6a 29 20 29 7b 0a  (cfp->fws,j) ){.
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
7a90: 64 64 20 61 20 72 65 64 75 63 65 20 61 63 74 69  dd a reduce acti
7aa0: 6f 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  on to the state 
7ab0: 22 73 74 70 22 20 77 68 69 63 68 20 77 69 6c 6c  "stp" which will
7ac0: 20 72 65 64 75 63 65 20 62 79 20 74 68 65 0a 20   reduce by the. 
7ad0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 75             ** ru
7ae0: 6c 65 20 22 63 66 70 2d 3e 72 70 22 20 69 66 20  le "cfp->rp" if 
7af0: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 73 79  the lookahead sy
7b00: 6d 62 6f 6c 20 69 73 20 22 6c 65 6d 70 2d 3e 73  mbol is "lemp->s
7b10: 79 6d 62 6f 6c 73 5b 6a 5d 22 20 2a 2f 0a 20 20  ymbols[j]" */.  
7b20: 20 20 20 20 20 20 20 20 20 20 41 63 74 69 6f 6e            Action
7b30: 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 52 45  _add(&stp->ap,RE
7b40: 44 55 43 45 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  DUCE,lemp->symbo
7b50: 6c 73 5b 6a 5d 2c 63 66 70 2d 3e 72 70 29 3b 0a  ls[j],cfp->rp);.
7b60: 20 20 20 20 20 20 20 20 20 20 7d 0a 09 7d 0a 20            }..}. 
7b70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7b80: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 61  ..  /* Add the a
7b90: 63 63 65 70 74 69 6e 67 20 74 6f 6b 65 6e 20 2a  ccepting token *
7ba0: 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74  /.  if( lemp->st
7bb0: 61 72 74 20 29 7b 0a 20 20 20 20 73 70 20 3d 20  art ){.    sp = 
7bc0: 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70  Symbol_find(lemp
7bd0: 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 69 66  ->start);.    if
7be0: 28 20 73 70 3d 3d 30 20 29 20 73 70 20 3d 20 6c  ( sp==0 ) sp = l
7bf0: 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a  emp->rule->lhs;.
7c00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 20    }else{.    sp 
7c10: 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68  = lemp->rule->lh
7c20: 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 64 64 20  s;.  }.  /* Add 
7c30: 74 6f 20 74 68 65 20 66 69 72 73 74 20 73 74 61  to the first sta
7c40: 74 65 20 28 77 68 69 63 68 20 69 73 20 61 6c 77  te (which is alw
7c50: 61 79 73 20 74 68 65 20 73 74 61 72 74 69 6e 67  ays the starting
7c60: 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 20 20   state of the.  
7c70: 2a 2a 20 66 69 6e 69 74 65 20 73 74 61 74 65 20  ** finite state 
7c80: 6d 61 63 68 69 6e 65 29 20 61 6e 20 61 63 74 69  machine) an acti
7c90: 6f 6e 20 74 6f 20 41 43 43 45 50 54 20 69 66 20  on to ACCEPT if 
7ca0: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 73  the lookahead is
7cb0: 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20   the.  ** start 
7cc0: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 20 20 2a 2f  nonterminal.  */
7cd0: 0a 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 6c  .  Action_add(&l
7ce0: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d 2d 3e  emp->sorted[0]->
7cf0: 61 70 2c 41 43 43 45 50 54 2c 73 70 2c 30 29 3b  ap,ACCEPT,sp,0);
7d00: 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 63  ..  /* Resolve c
7d10: 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20 66 6f  onflicts */.  fo
7d20: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
7d30: 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
7d40: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
7d50: 61 70 2c 20 2a 6e 61 70 3b 0a 20 20 20 20 73 74  ap, *nap;.    st
7d60: 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
7d70: 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
7d80: 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
7d90: 61 73 73 65 72 74 28 20 73 74 70 2d 3e 61 70 20  assert( stp->ap 
7da0: 29 3b 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d  );.    stp->ap =
7db0: 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70   Action_sort(stp
7dc0: 2d 3e 61 70 29 3b 0a 20 20 20 20 66 6f 72 28 61  ->ap);.    for(a
7dd0: 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 20 26 26  p=stp->ap; ap &&
7de0: 20 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3d 61 70   ap->next; ap=ap
7df0: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66  ->next){.      f
7e00: 6f 72 28 6e 61 70 3d 61 70 2d 3e 6e 65 78 74 3b  or(nap=ap->next;
7e10: 20 6e 61 70 20 26 26 20 6e 61 70 2d 3e 73 70 3d   nap && nap->sp=
7e20: 3d 61 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e 61 70  =ap->sp; nap=nap
7e30: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
7e40: 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 61 63 74    /* The two act
7e50: 69 6f 6e 73 20 22 61 70 22 20 61 6e 64 20 22 6e  ions "ap" and "n
7e60: 61 70 22 20 68 61 76 65 20 74 68 65 20 73 61 6d  ap" have the sam
7e70: 65 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20  e lookahead..   
7e80: 20 20 20 20 20 20 2a 2a 20 46 69 67 75 72 65 20        ** Figure 
7e90: 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 73 68  out which one sh
7ea0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 2a 2f 0a  ould be used */.
7eb0: 20 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 6e           lemp->n
7ec0: 63 6f 6e 66 6c 69 63 74 20 2b 3d 20 72 65 73 6f  conflict += reso
7ed0: 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70 2c  lve_conflict(ap,
7ee0: 6e 61 70 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  nap,lemp->errsym
7ef0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7f00: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72  .  }..  /* Repor
7f10: 74 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 65  t an error for e
7f20: 61 63 68 20 72 75 6c 65 20 74 68 61 74 20 63 61  ach rule that ca
7f30: 6e 20 6e 65 76 65 72 20 62 65 20 72 65 64 75 63  n never be reduc
7f40: 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d  ed. */.  for(rp=
7f50: 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
7f60: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 20 72 70 2d  rp=rp->next) rp-
7f70: 3e 63 61 6e 52 65 64 75 63 65 20 3d 20 42 5f 46  >canReduce = B_F
7f80: 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ALSE;.  for(i=0;
7f90: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
7fa0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
7fb0: 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20  t action *ap;.  
7fc0: 20 20 66 6f 72 28 61 70 3d 6c 65 6d 70 2d 3e 73    for(ap=lemp->s
7fd0: 6f 72 74 65 64 5b 69 5d 2d 3e 61 70 3b 20 61 70  orted[i]->ap; ap
7fe0: 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
7ff0: 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
8000: 70 65 3d 3d 52 45 44 55 43 45 20 29 20 61 70 2d  pe==REDUCE ) ap-
8010: 3e 78 2e 72 70 2d 3e 63 61 6e 52 65 64 75 63 65  >x.rp->canReduce
8020: 20 3d 20 42 5f 54 52 55 45 3b 0a 20 20 20 20 7d   = B_TRUE;.    }
8030: 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65  .  }.  for(rp=le
8040: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
8050: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
8060: 69 66 28 20 72 70 2d 3e 63 61 6e 52 65 64 75 63  if( rp->canReduc
8070: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
8080: 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
8090: 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75  >filename,rp->ru
80a0: 6c 65 6c 69 6e 65 2c 22 54 68 69 73 20 72 75 6c  leline,"This rul
80b0: 65 20 63 61 6e 20 6e 6f 74 20 62 65 20 72 65 64  e can not be red
80c0: 75 63 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c  uced.\n");.    l
80d0: 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
80e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c  .  }.}../* Resol
80f0: 76 65 20 61 20 63 6f 6e 66 6c 69 63 74 20 62 65  ve a conflict be
8100: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
8110: 76 65 6e 20 61 63 74 69 6f 6e 73 2e 20 20 49 66  ven actions.  If
8120: 20 74 68 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74   the.** conflict
8130: 20 63 61 6e 27 74 20 62 65 20 72 65 73 6f 6c 76   can't be resolv
8140: 65 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  e, return non-ze
8150: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e  ro..**.** NO LON
8160: 47 45 52 20 54 52 55 45 3a 0a 2a 2a 20 20 20 54  GER TRUE:.**   T
8170: 6f 20 72 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66  o resolve a conf
8180: 6c 69 63 74 2c 20 66 69 72 73 74 20 6c 6f 6f 6b  lict, first look
8190: 20 74 6f 20 73 65 65 20 69 66 20 65 69 74 68 65   to see if eithe
81a0: 72 20 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 69 73  r action.**   is
81b0: 20 6f 6e 20 61 6e 20 65 72 72 6f 72 20 72 75 6c   on an error rul
81c0: 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  e.  In that case
81d0: 2c 20 74 61 6b 65 20 74 68 65 20 61 63 74 69 6f  , take the actio
81e0: 6e 20 77 68 69 63 68 0a 2a 2a 20 20 20 69 73 20  n which.**   is 
81f0: 6e 6f 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  not associated w
8200: 69 74 68 20 74 68 65 20 65 72 72 6f 72 20 72 75  ith the error ru
8210: 6c 65 2e 20 20 49 66 20 6e 65 69 74 68 65 72 20  le.  If neither 
8220: 6f 72 20 62 6f 74 68 0a 2a 2a 20 20 20 61 63 74  or both.**   act
8230: 69 6f 6e 73 20 61 72 65 20 61 73 73 6f 63 69 61  ions are associa
8240: 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ted with an erro
8250: 72 20 72 75 6c 65 2c 20 74 68 65 6e 20 74 72 79  r rule, then try
8260: 20 74 6f 0a 2a 2a 20 20 20 75 73 65 20 70 72 65   to.**   use pre
8270: 63 65 64 65 6e 63 65 20 74 6f 20 72 65 73 6f 6c  cedence to resol
8280: 76 65 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2e  ve the conflict.
8290: 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
82a0: 20 61 63 74 69 6f 6e 20 69 73 20 61 20 53 48 49   action is a SHI
82b0: 46 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  FT, then it must
82c0: 20 62 65 20 61 70 78 2e 20 20 54 68 69 73 0a 2a   be apx.  This.*
82d0: 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 6e 27 74  * function won't
82e0: 20 77 6f 72 6b 20 69 66 20 61 70 78 2d 3e 74 79   work if apx->ty
82f0: 70 65 3d 3d 52 45 44 55 43 45 20 61 6e 64 20 61  pe==REDUCE and a
8300: 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 2e  py->type==SHIFT.
8310: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
8320: 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28  esolve_conflict(
8330: 61 70 78 2c 61 70 79 2c 65 72 72 73 79 6d 29 0a  apx,apy,errsym).
8340: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
8350: 70 78 3b 0a 73 74 72 75 63 74 20 61 63 74 69 6f  px;.struct actio
8360: 6e 20 2a 61 70 79 3b 0a 73 74 72 75 63 74 20 73  n *apy;.struct s
8370: 79 6d 62 6f 6c 20 2a 65 72 72 73 79 6d 3b 20 20  ymbol *errsym;  
8380: 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 73 79   /* The error sy
8390: 6d 62 6f 6c 20 28 69 66 20 64 65 66 69 6e 65 64  mbol (if defined
83a0: 2e 20 20 4e 55 4c 4c 20 6f 74 68 65 72 77 69 73  .  NULL otherwis
83b0: 65 29 20 2a 2f 0a 7b 0a 20 20 73 74 72 75 63 74  e) */.{.  struct
83c0: 20 73 79 6d 62 6f 6c 20 2a 73 70 78 2c 20 2a 73   symbol *spx, *s
83d0: 70 79 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74  py;.  int errcnt
83e0: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
83f0: 61 70 78 2d 3e 73 70 3d 3d 61 70 79 2d 3e 73 70  apx->sp==apy->sp
8400: 20 29 3b 20 20 2f 2a 20 4f 74 68 65 72 77 69 73   );  /* Otherwis
8410: 65 20 74 68 65 72 65 20 77 6f 75 6c 64 20 62 65  e there would be
8420: 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a   no conflict */.
8430: 20 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d    if( apx->type=
8440: 3d 53 48 49 46 54 20 26 26 20 61 70 79 2d 3e 74  =SHIFT && apy->t
8450: 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20  ype==REDUCE ){. 
8460: 20 20 20 73 70 78 20 3d 20 61 70 78 2d 3e 73 70     spx = apx->sp
8470: 3b 0a 20 20 20 20 73 70 79 20 3d 20 61 70 79 2d  ;.    spy = apy-
8480: 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a  >x.rp->precsym;.
8490: 20 20 20 20 69 66 28 20 73 70 79 3d 3d 30 20 7c      if( spy==0 |
84a0: 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c  | spx->prec<0 ||
84b0: 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 29 7b 0a   spy->prec<0 ){.
84c0: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 65 6e 6f        /* Not eno
84d0: 75 67 68 20 70 72 65 63 65 64 65 6e 63 65 20 69  ugh precedence i
84e0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20  nformation. */. 
84f0: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d       apy->type =
8500: 20 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20   CONFLICT;.     
8510: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d   errcnt++;.    }
8520: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
8530: 65 63 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b 20  ec>spy->prec ){ 
8540: 20 20 20 2f 2a 20 4c 6f 77 65 72 20 70 72 65 63     /* Lower prec
8550: 65 64 65 6e 63 65 20 77 69 6e 73 20 2a 2f 0a 20  edence wins */. 
8560: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d       apy->type =
8570: 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   RD_RESOLVED;.  
8580: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d    }else if( spx-
8590: 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72 65 63 20  >prec<spy->prec 
85a0: 29 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79  ){.      apx->ty
85b0: 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44  pe = SH_RESOLVED
85c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
85d0: 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e  spx->prec==spy->
85e0: 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73  prec && spx->ass
85f0: 6f 63 3d 3d 52 49 47 48 54 20 29 7b 20 2f 2a 20  oc==RIGHT ){ /* 
8600: 55 73 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  Use operator */.
8610: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20        apy->type 
8620: 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 20 20  = RD_RESOLVED;  
8630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 73             /* as
8650: 73 6f 63 69 61 74 69 76 69 74 79 20 2a 2f 0a 20  sociativity */. 
8660: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78     }else if( spx
8670: 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65  ->prec==spy->pre
8680: 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d  c && spx->assoc=
8690: 3d 4c 45 46 54 20 29 7b 20 20 2f 2a 20 74 6f 20  =LEFT ){  /* to 
86a0: 62 72 65 61 6b 20 74 69 65 20 2a 2f 0a 20 20 20  break tie */.   
86b0: 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 53     apx->type = S
86c0: 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20  H_RESOLVED;.    
86d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
86e0: 65 72 74 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d  ert( spx->prec==
86f0: 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78  spy->prec && spx
8700: 2d 3e 61 73 73 6f 63 3d 3d 4e 4f 4e 45 20 29 3b  ->assoc==NONE );
8710: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
8720: 20 3d 20 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20   = CONFLICT;.   
8730: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
8740: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61   }.  }else if( a
8750: 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45  px->type==REDUCE
8760: 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52   && apy->type==R
8770: 45 44 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78  EDUCE ){.    spx
8780: 20 3d 20 61 70 78 2d 3e 78 2e 72 70 2d 3e 70 72   = apx->x.rp->pr
8790: 65 63 73 79 6d 3b 0a 20 20 20 20 73 70 79 20 3d  ecsym;.    spy =
87a0: 20 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63   apy->x.rp->prec
87b0: 73 79 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 78  sym;.    if( spx
87c0: 3d 3d 30 20 7c 7c 20 73 70 79 3d 3d 30 20 7c 7c  ==0 || spy==0 ||
87d0: 20 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 0a   spx->prec<0 ||.
87e0: 20 20 20 20 73 70 79 2d 3e 70 72 65 63 3c 30 20      spy->prec<0 
87f0: 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70  || spx->prec==sp
8800: 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20  y->prec ){.     
8810: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 43 4f 4e   apy->type = CON
8820: 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72  FLICT;.      err
8830: 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  cnt++;.    }else
8840: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73   if( spx->prec>s
8850: 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20  py->prec ){.    
8860: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44    apy->type = RD
8870: 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d  _RESOLVED;.    }
8880: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
8890: 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a  ec<spy->prec ){.
88a0: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20        apx->type 
88b0: 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20  = RD_RESOLVED;. 
88c0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
88d0: 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20    assert( .     
88e0: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 5f 52   apx->type==SH_R
88f0: 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20  ESOLVED ||.     
8900: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 44 5f 52   apx->type==RD_R
8910: 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20  ESOLVED ||.     
8920: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46   apx->type==CONF
8930: 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70  LICT ||.      ap
8940: 79 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f  y->type==SH_RESO
8950: 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70  LVED ||.      ap
8960: 79 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f  y->type==RD_RESO
8970: 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70  LVED ||.      ap
8980: 79 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46 4c 49 43  y->type==CONFLIC
8990: 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 2f 2a 20  T.    );.    /* 
89a0: 54 68 65 20 52 45 44 55 43 45 2f 53 48 49 46 54  The REDUCE/SHIFT
89b0: 20 63 61 73 65 20 63 61 6e 6e 6f 74 20 68 61 70   case cannot hap
89c0: 70 65 6e 20 62 65 63 61 75 73 65 20 53 48 49 46  pen because SHIF
89d0: 54 73 20 63 6f 6d 65 20 62 65 66 6f 72 65 0a 20  Ts come before. 
89e0: 20 20 20 2a 2a 20 52 45 44 55 43 45 73 20 6f 6e     ** REDUCEs on
89f0: 20 74 68 65 20 6c 69 73 74 2e 20 20 49 66 20 77   the list.  If w
8a00: 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
8a10: 6e 74 20 69 74 20 6d 75 73 74 20 62 65 20 62 65  nt it must be be
8a20: 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65  cause.    ** the
8a30: 20 70 61 72 73 65 72 20 63 6f 6e 66 6c 69 63 74   parser conflict
8a40: 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
8a50: 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20  n resolved. */. 
8a60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63   }.  return errc
8a70: 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  nt;.}./*********
8a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
8a90: 6d 20 74 68 65 20 66 69 6c 65 20 22 63 6f 6e 66  m the file "conf
8aa0: 69 67 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  iglist.c" ******
8ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ac0: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  ***/./*.** Routi
8ad0: 6e 65 73 20 74 6f 20 70 72 6f 63 65 73 73 69 6e  nes to processin
8ae0: 67 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  g a configuratio
8af0: 6e 20 6c 69 73 74 20 61 6e 64 20 62 75 69 6c 64  n list and build
8b00: 69 6e 67 20 61 20 73 74 61 74 65 0a 2a 2a 20 69  ing a state.** i
8b10: 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
8b20: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
8b30: 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
8b40: 63 6f 6e 66 69 67 20 2a 66 72 65 65 6c 69 73 74  config *freelist
8b50: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c 69   = 0;      /* Li
8b60: 73 74 20 6f 66 20 66 72 65 65 20 63 6f 6e 66 69  st of free confi
8b70: 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  gurations */.sta
8b80: 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69  tic struct confi
8b90: 67 20 2a 63 75 72 72 65 6e 74 20 3d 20 30 3b 20  g *current = 0; 
8ba0: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
8bb0: 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72  list of configur
8bc0: 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63  ations */.static
8bd0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
8be0: 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b  *currentend = 0;
8bf0: 20 20 20 2f 2a 20 4c 61 73 74 20 6f 6e 20 6c 69     /* Last on li
8c00: 73 74 20 6f 66 20 63 6f 6e 66 69 67 73 20 2a 2f  st of configs */
8c10: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
8c20: 6f 6e 66 69 67 20 2a 62 61 73 69 73 20 3d 20 30  onfig *basis = 0
8c30: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70  ;         /* Top
8c40: 20 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69   of list of basi
8c50: 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61  s configs */.sta
8c60: 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69  tic struct confi
8c70: 67 20 2a 2a 62 61 73 69 73 65 6e 64 20 3d 20 30  g **basisend = 0
8c80: 3b 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20  ;     /* End of 
8c90: 6c 69 73 74 20 6f 66 20 62 61 73 69 73 20 63 6f  list of basis co
8ca0: 6e 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52 65 74  nfigs */../* Ret
8cb0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
8cc0: 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61   a new configura
8cd0: 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20  tion */.PRIVATE 
8ce0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
8cf0: 65 77 63 6f 6e 66 69 67 28 29 7b 0a 20 20 73 74  ewconfig(){.  st
8d00: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77  ruct config *new
8d10: 3b 0a 20 20 69 66 28 20 66 72 65 65 6c 69 73 74  ;.  if( freelist
8d20: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
8d30: 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20  ;.    int amt = 
8d40: 33 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20  3;.    freelist 
8d50: 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  = (struct config
8d60: 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f   *)malloc( sizeo
8d70: 66 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 29  f(struct config)
8d80: 2a 61 6d 74 20 29 3b 0a 20 20 20 20 69 66 28 20  *amt );.    if( 
8d90: 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20  freelist==0 ){. 
8da0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
8db0: 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61  err,"Unable to a
8dc0: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
8dd0: 6f 72 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75  or a new configu
8de0: 72 61 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20  ration.");.     
8df0: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
8e00: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
8e10: 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c  mt-1; i++) freel
8e20: 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66  ist[i].next = &f
8e30: 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20  reelist[i+1];.  
8e40: 20 20 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31    freelist[amt-1
8e50: 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a  ].next = 0;.  }.
8e60: 20 20 6e 65 77 20 3d 20 66 72 65 65 6c 69 73 74    new = freelist
8e70: 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20 66  ;.  freelist = f
8e80: 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20  reelist->next;. 
8e90: 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a   return new;.}..
8ea0: 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67 75 72 61  /* The configura
8eb0: 74 69 6f 6e 20 22 6f 6c 64 22 20 69 73 20 6e 6f  tion "old" is no
8ec0: 20 6c 6f 6e 67 65 72 20 75 73 65 64 20 2a 2f 0a   longer used */.
8ed0: 50 52 49 56 41 54 45 20 76 6f 69 64 20 64 65 6c  PRIVATE void del
8ee0: 65 74 65 63 6f 6e 66 69 67 28 6f 6c 64 29 0a 73  eteconfig(old).s
8ef0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c  truct config *ol
8f00: 64 3b 0a 7b 0a 20 20 6f 6c 64 2d 3e 6e 65 78 74  d;.{.  old->next
8f10: 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66   = freelist;.  f
8f20: 72 65 65 6c 69 73 74 20 3d 20 6f 6c 64 3b 0a 7d  reelist = old;.}
8f30: 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64  ../* Initialized
8f40: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
8f50: 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65 72 20  on list builder 
8f60: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
8f70: 73 74 5f 69 6e 69 74 28 29 7b 0a 20 20 63 75 72  st_init(){.  cur
8f80: 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72  rent = 0;.  curr
8f90: 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65 6e  entend = &curren
8fa0: 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a  t;.  basis = 0;.
8fb0: 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62 61    basisend = &ba
8fc0: 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62  sis;.  Configtab
8fd0: 6c 65 5f 69 6e 69 74 28 29 3b 0a 20 20 72 65 74  le_init();.  ret
8fe0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69  urn;.}../* Initi
8ff0: 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69  alized the confi
9000: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75  guration list bu
9010: 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f  ilder */.void Co
9020: 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28 29  nfiglist_reset()
9030: 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b  {.  current = 0;
9040: 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20  .  currentend = 
9050: 26 63 75 72 72 65 6e 74 3b 0a 20 20 62 61 73 69  &current;.  basi
9060: 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e  s = 0;.  basisen
9070: 64 20 3d 20 26 62 61 73 69 73 3b 0a 20 20 43 6f  d = &basis;.  Co
9080: 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28  nfigtable_clear(
9090: 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  0);.  return;.}.
90a0: 0a 2f 2a 20 41 64 64 20 61 6e 6f 74 68 65 72 20  ./* Add another 
90b0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f  configuration to
90c0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
90d0: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63  on list */.struc
90e0: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
90f0: 6c 69 73 74 5f 61 64 64 28 72 70 2c 64 6f 74 29  list_add(rp,dot)
9100: 0a 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70  .struct rule *rp
9110: 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65  ;    /* The rule
9120: 20 2a 2f 0a 69 6e 74 20 64 6f 74 3b 20 20 20 20   */.int dot;    
9130: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
9140: 20 69 6e 74 6f 20 74 68 65 20 52 48 53 20 6f 66   into the RHS of
9150: 20 74 68 65 20 72 75 6c 65 20 77 68 65 72 65 20   the rule where 
9160: 74 68 65 20 64 6f 74 20 67 6f 65 73 20 2a 2f 0a  the dot goes */.
9170: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
9180: 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a  g *cfp, model;..
9190: 20 20 61 73 73 65 72 74 28 20 63 75 72 72 65 6e    assert( curren
91a0: 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64  tend!=0 );.  mod
91b0: 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f  el.rp = rp;.  mo
91c0: 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20  del.dot = dot;. 
91d0: 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 74 61 62   cfp = Configtab
91e0: 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b  le_find(&model);
91f0: 0a 20 20 69 66 28 20 63 66 70 3d 3d 30 20 29 7b  .  if( cfp==0 ){
9200: 0a 20 20 20 20 63 66 70 20 3d 20 6e 65 77 63 6f  .    cfp = newco
9210: 6e 66 69 67 28 29 3b 0a 20 20 20 20 63 66 70 2d  nfig();.    cfp-
9220: 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20 20 63 66  >rp = rp;.    cf
9230: 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20  p->dot = dot;.  
9240: 20 20 63 66 70 2d 3e 66 77 73 20 3d 20 53 65 74    cfp->fws = Set
9250: 4e 65 77 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e  New();.    cfp->
9260: 73 74 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70  stp = 0;.    cfp
9270: 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70  ->fplp = cfp->bp
9280: 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d  lp = 0;.    cfp-
9290: 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 63  >next = 0;.    c
92a0: 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20  fp->bp = 0;.    
92b0: 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 63 66  *currentend = cf
92c0: 70 3b 0a 20 20 20 20 63 75 72 72 65 6e 74 65 6e  p;.    currenten
92d0: 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a  d = &cfp->next;.
92e0: 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f      Configtable_
92f0: 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20 20 7d  insert(cfp);.  }
9300: 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d  .  return cfp;.}
9310: 0a 0a 2f 2a 20 41 64 64 20 61 20 62 61 73 69 73  ../* Add a basis
9320: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74   configuration t
9330: 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  o the configurat
9340: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75  ion list */.stru
9350: 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
9360: 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 72  glist_addbasis(r
9370: 70 2c 64 6f 74 29 0a 73 74 72 75 63 74 20 72 75  p,dot).struct ru
9380: 6c 65 20 2a 72 70 3b 0a 69 6e 74 20 64 6f 74 3b  le *rp;.int dot;
9390: 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .{.  struct conf
93a0: 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a  ig *cfp, model;.
93b0: 0a 20 20 61 73 73 65 72 74 28 20 62 61 73 69 73  .  assert( basis
93c0: 65 6e 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  end!=0 );.  asse
93d0: 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d  rt( currentend!=
93e0: 30 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20  0 );.  model.rp 
93f0: 3d 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f  = rp;.  model.do
9400: 74 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d  t = dot;.  cfp =
9410: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e   Configtable_fin
9420: 64 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28  d(&model);.  if(
9430: 20 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63   cfp==0 ){.    c
9440: 66 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29  fp = newconfig()
9450: 3b 0a 20 20 20 20 63 66 70 2d 3e 72 70 20 3d 20  ;.    cfp->rp = 
9460: 72 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74  rp;.    cfp->dot
9470: 20 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d   = dot;.    cfp-
9480: 3e 66 77 73 20 3d 20 53 65 74 4e 65 77 28 29 3b  >fws = SetNew();
9490: 0a 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20  .    cfp->stp = 
94a0: 30 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c 70  0;.    cfp->fplp
94b0: 20 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30   = cfp->bplp = 0
94c0: 3b 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78 74 20  ;.    cfp->next 
94d0: 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70  = 0;.    cfp->bp
94e0: 20 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72 72 65   = 0;.    *curre
94f0: 6e 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20  ntend = cfp;.   
9500: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63   currentend = &c
9510: 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 2a 62  fp->next;.    *b
9520: 61 73 69 73 65 6e 64 20 3d 20 63 66 70 3b 0a 20  asisend = cfp;. 
9530: 20 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26 63     basisend = &c
9540: 66 70 2d 3e 62 70 3b 0a 20 20 20 20 43 6f 6e 66  fp->bp;.    Conf
9550: 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 63  igtable_insert(c
9560: 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  fp);.  }.  retur
9570: 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d  n cfp;.}../* Com
9580: 70 75 74 65 20 74 68 65 20 63 6c 6f 73 75 72 65  pute the closure
9590: 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72   of the configur
95a0: 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f  ation list */.vo
95b0: 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c  id Configlist_cl
95c0: 6f 73 75 72 65 28 6c 65 6d 70 29 0a 73 74 72 75  osure(lemp).stru
95d0: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
95e0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
95f0: 67 20 2a 63 66 70 2c 20 2a 6e 65 77 63 66 70 3b  g *cfp, *newcfp;
9600: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
9610: 72 70 2c 20 2a 6e 65 77 72 70 3b 0a 20 20 73 74  rp, *newrp;.  st
9620: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c  ruct symbol *sp,
9630: 20 2a 78 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20   *xsp;.  int i, 
9640: 64 6f 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  dot;..  assert( 
9650: 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b  currentend!=0 );
9660: 0a 20 20 66 6f 72 28 63 66 70 3d 63 75 72 72 65  .  for(cfp=curre
9670: 6e 74 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  nt; cfp; cfp=cfp
9680: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 72 70 20  ->next){.    rp 
9690: 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20 20 20 64  = cfp->rp;.    d
96a0: 6f 74 20 3d 20 63 66 70 2d 3e 64 6f 74 3b 0a 20  ot = cfp->dot;. 
96b0: 20 20 20 69 66 28 20 64 6f 74 3e 3d 72 70 2d 3e     if( dot>=rp->
96c0: 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b  nrhs ) continue;
96d0: 0a 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68  .    sp = rp->rh
96e0: 73 5b 64 6f 74 5d 3b 0a 20 20 20 20 69 66 28 20  s[dot];.    if( 
96f0: 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52  sp->type==NONTER
9700: 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  MINAL ){.      i
9710: 66 28 20 73 70 2d 3e 72 75 6c 65 3d 3d 30 20 26  f( sp->rule==0 &
9720: 26 20 73 70 21 3d 6c 65 6d 70 2d 3e 65 72 72 73  & sp!=lemp->errs
9730: 79 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ym ){.        Er
9740: 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
9750: 65 6e 61 6d 65 2c 72 70 2d 3e 6c 69 6e 65 2c 22  ename,rp->line,"
9760: 4e 6f 6e 74 65 72 6d 69 6e 61 6c 20 5c 22 25 73  Nonterminal \"%s
9770: 5c 22 20 68 61 73 20 6e 6f 20 72 75 6c 65 73 2e  \" has no rules.
9780: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d  ",.          sp-
9790: 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
97a0: 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
97b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
97c0: 66 6f 72 28 6e 65 77 72 70 3d 73 70 2d 3e 72 75  for(newrp=sp->ru
97d0: 6c 65 3b 20 6e 65 77 72 70 3b 20 6e 65 77 72 70  le; newrp; newrp
97e0: 3d 6e 65 77 72 70 2d 3e 6e 65 78 74 6c 68 73 29  =newrp->nextlhs)
97f0: 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 63 66 70  {.        newcfp
9800: 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64   = Configlist_ad
9810: 64 28 6e 65 77 72 70 2c 30 29 3b 0a 20 20 20 20  d(newrp,0);.    
9820: 20 20 20 20 66 6f 72 28 69 3d 64 6f 74 2b 31 3b      for(i=dot+1;
9830: 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
9840: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 73 70  ){.          xsp
9850: 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
9860: 20 20 20 20 20 20 20 20 20 69 66 28 20 78 73 70           if( xsp
9870: 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
9880: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9890: 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66  SetAdd(newcfp->f
98a0: 77 73 2c 78 73 70 2d 3e 69 6e 64 65 78 29 3b 0a  ws,xsp->index);.
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
98c0: 6b 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a 20 20 20  k;..  }else{.   
98d0: 20 20 20 20 20 20 20 20 20 53 65 74 55 6e 69 6f           SetUnio
98e0: 6e 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78 73  n(newcfp->fws,xs
98f0: 70 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20  p->firstset);.  
9900: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 73            if( xs
9910: 70 2d 3e 6c 61 6d 62 64 61 3d 3d 42 5f 46 41 4c  p->lambda==B_FAL
9920: 53 45 20 29 20 62 72 65 61 6b 3b 0a 09 20 20 7d  SE ) break;..  }
9930: 0a 09 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ..}.        if( 
9940: 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 50 6c  i==rp->nrhs ) Pl
9950: 69 6e 6b 5f 61 64 64 28 26 63 66 70 2d 3e 66 70  ink_add(&cfp->fp
9960: 6c 70 2c 6e 65 77 63 66 70 29 3b 0a 20 20 20 20  lp,newcfp);.    
9970: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9980: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f  return;.}../* So
9990: 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  rt the configura
99a0: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69  tion list */.voi
99b0: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72  d Configlist_sor
99c0: 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d  t(){.  current =
99d0: 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20   (struct config 
99e0: 2a 29 6d 73 6f 72 74 28 63 75 72 72 65 6e 74 2c  *)msort(current,
99f0: 26 28 63 75 72 72 65 6e 74 2d 3e 6e 65 78 74 29  &(current->next)
9a00: 2c 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20 63  ,Configcmp);.  c
9a10: 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20  urrentend = 0;. 
9a20: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53   return;.}../* S
9a30: 6f 72 74 20 74 68 65 20 62 61 73 69 73 20 63 6f  ort the basis co
9a40: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
9a50: 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c   */.void Configl
9a60: 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28 29 7b  ist_sortbasis(){
9a70: 0a 20 20 62 61 73 69 73 20 3d 20 28 73 74 72 75  .  basis = (stru
9a80: 63 74 20 63 6f 6e 66 69 67 20 2a 29 6d 73 6f 72  ct config *)msor
9a90: 74 28 63 75 72 72 65 6e 74 2c 26 28 63 75 72 72  t(current,&(curr
9aa0: 65 6e 74 2d 3e 62 70 29 2c 43 6f 6e 66 69 67 63  ent->bp),Configc
9ab0: 6d 70 29 3b 0a 20 20 62 61 73 69 73 65 6e 64 20  mp);.  basisend 
9ac0: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  = 0;.  return;.}
9ad0: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
9ae0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
9af0: 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75  d of the configu
9b00: 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a  ration list and.
9b10: 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c 69 73  ** reset the lis
9b20: 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  t */.struct conf
9b30: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72  ig *Configlist_r
9b40: 65 74 75 72 6e 28 29 7b 0a 20 20 73 74 72 75 63  eturn(){.  struc
9b50: 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20  t config *old;. 
9b60: 20 6f 6c 64 20 3d 20 63 75 72 72 65 6e 74 3b 0a   old = current;.
9b70: 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20    current = 0;. 
9b80: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b   currentend = 0;
9b90: 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d  .  return old;.}
9ba0: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
9bb0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
9bc0: 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75  d of the configu
9bd0: 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a  ration list and.
9be0: 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c 69 73  ** reset the lis
9bf0: 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  t */.struct conf
9c00: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 62  ig *Configlist_b
9c10: 61 73 69 73 28 29 7b 0a 20 20 73 74 72 75 63 74  asis(){.  struct
9c20: 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20   config *old;.  
9c30: 6f 6c 64 20 3d 20 62 61 73 69 73 3b 0a 20 20 62  old = basis;.  b
9c40: 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69  asis = 0;.  basi
9c50: 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  send = 0;.  retu
9c60: 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 46 72  rn old;.}../* Fr
9c70: 65 65 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20  ee all elements 
9c80: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 6f 6e  of the given con
9c90: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
9ca0: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
9cb0: 73 74 5f 65 61 74 28 63 66 70 29 0a 73 74 72 75  st_eat(cfp).stru
9cc0: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a  ct config *cfp;.
9cd0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
9ce0: 67 20 2a 6e 65 78 74 63 66 70 3b 0a 20 20 66 6f  g *nextcfp;.  fo
9cf0: 72 28 3b 20 63 66 70 3b 20 63 66 70 3d 6e 65 78  r(; cfp; cfp=nex
9d00: 74 63 66 70 29 7b 0a 20 20 20 20 6e 65 78 74 63  tcfp){.    nextc
9d10: 66 70 20 3d 20 63 66 70 2d 3e 6e 65 78 74 3b 0a  fp = cfp->next;.
9d20: 20 20 20 20 61 73 73 65 72 74 28 20 63 66 70 2d      assert( cfp-
9d30: 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20  >fplp==0 );.    
9d40: 61 73 73 65 72 74 28 20 63 66 70 2d 3e 62 70 6c  assert( cfp->bpl
9d50: 70 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  p==0 );.    if( 
9d60: 63 66 70 2d 3e 66 77 73 20 29 20 53 65 74 46 72  cfp->fws ) SetFr
9d70: 65 65 28 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20  ee(cfp->fws);.  
9d80: 20 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 63    deleteconfig(c
9d90: 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  fp);.  }.  retur
9da0: 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n;.}./**********
9db0: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
9dc0: 20 66 69 6c 65 20 22 65 72 72 6f 72 2e 63 22 20   file "error.c" 
9dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9df0: 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f  */./*.** Code fo
9e00: 72 20 70 72 69 6e 74 69 6e 67 20 65 72 72 6f 72  r printing error
9e10: 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 0a 2f 2a   message..*/../*
9e20: 20 46 69 6e 64 20 61 20 67 6f 6f 64 20 70 6c 61   Find a good pla
9e30: 63 65 20 74 6f 20 62 72 65 61 6b 20 22 6d 73 67  ce to break "msg
9e40: 22 20 73 6f 20 74 68 61 74 20 69 74 73 20 6c 65  " so that its le
9e50: 6e 67 74 68 20 69 73 20 61 74 20 6c 65 61 73 74  ngth is at least
9e60: 20 22 6d 69 6e 22 0a 2a 2a 20 62 75 74 20 6e 6f   "min".** but no
9e70: 20 6d 6f 72 65 20 74 68 61 6e 20 22 6d 61 78 22   more than "max"
9e80: 2e 20 20 4d 61 6b 65 20 74 68 65 20 70 6f 69 6e  .  Make the poin
9e90: 74 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 6d 61  t as close to ma
9ea0: 78 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  x as possible..*
9eb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
9ec0: 64 62 72 65 61 6b 28 6d 73 67 2c 6d 69 6e 2c 6d  dbreak(msg,min,m
9ed0: 61 78 29 0a 63 68 61 72 20 2a 6d 73 67 3b 0a 69  ax).char *msg;.i
9ee0: 6e 74 20 6d 69 6e 3b 0a 69 6e 74 20 6d 61 78 3b  nt min;.int max;
9ef0: 0a 7b 0a 20 20 69 6e 74 20 69 2c 73 70 6f 74 3b  .{.  int i,spot;
9f00: 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 66 6f 72  .  char c;.  for
9f10: 28 69 3d 73 70 6f 74 3d 6d 69 6e 3b 20 69 3c 3d  (i=spot=min; i<=
9f20: 6d 61 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  max; i++){.    c
9f30: 20 3d 20 6d 73 67 5b 69 5d 3b 0a 20 20 20 20 69   = msg[i];.    i
9f40: 66 28 20 63 3d 3d 27 5c 74 27 20 29 20 6d 73 67  f( c=='\t' ) msg
9f50: 5b 69 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 69  [i] = ' ';.    i
9f60: 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 20 6d 73  f( c=='\n' ){ ms
9f70: 67 5b 69 5d 20 3d 20 27 20 27 3b 20 73 70 6f 74  g[i] = ' '; spot
9f80: 20 3d 20 69 3b 20 62 72 65 61 6b 3b 20 7d 0a 20   = i; break; }. 
9f90: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 20 73     if( c==0 ){ s
9fa0: 70 6f 74 20 3d 20 69 3b 20 62 72 65 61 6b 3b 20  pot = i; break; 
9fb0: 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2d 27  }.    if( c=='-'
9fc0: 20 26 26 20 69 3c 6d 61 78 2d 31 20 29 20 73 70   && i<max-1 ) sp
9fd0: 6f 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 69 66  ot = i+1;.    if
9fe0: 28 20 63 3d 3d 27 20 27 20 29 20 73 70 6f 74 20  ( c==' ' ) spot 
9ff0: 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = i;.  }.  retur
a000: 6e 20 73 70 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n spot;.}../*.**
a010: 20 54 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   The error messa
a020: 67 65 20 69 73 20 73 70 6c 69 74 20 61 63 72 6f  ge is split acro
a030: 73 73 20 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 65  ss multiple line
a040: 73 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  s if necessary. 
a050: 20 54 68 65 0a 2a 2a 20 73 70 6c 69 74 73 20 6f   The.** splits o
a060: 63 63 75 72 20 61 74 20 61 20 73 70 61 63 65 2c  ccur at a space,
a070: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 73   if there is a s
a080: 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6e  pace available n
a090: 65 61 72 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f  ear the end.** o
a0a0: 66 20 74 68 65 20 6c 69 6e 65 2e 0a 2a 2f 0a 23  f the line..*/.#
a0b0: 64 65 66 69 6e 65 20 45 52 52 4d 53 47 53 49 5a  define ERRMSGSIZ
a0c0: 45 20 20 31 30 30 30 30 20 2f 2a 20 48 6f 70 65  E  10000 /* Hope
a0d0: 20 74 68 69 73 20 69 73 20 62 69 67 20 65 6e 6f   this is big eno
a0e0: 75 67 68 2e 20 20 4e 6f 20 77 61 79 20 74 6f 20  ugh.  No way to 
a0f0: 65 72 72 6f 72 20 63 68 65 63 6b 20 2a 2f 0a 23  error check */.#
a100: 64 65 66 69 6e 65 20 4c 49 4e 45 57 49 44 54 48  define LINEWIDTH
a110: 20 20 20 20 20 20 37 39 20 2f 2a 20 4d 61 78 20        79 /* Max 
a120: 77 69 64 74 68 20 6f 66 20 61 6e 79 20 6f 75 74  width of any out
a130: 70 75 74 20 6c 69 6e 65 20 2a 2f 0a 23 64 65 66  put line */.#def
a140: 69 6e 65 20 50 52 45 46 49 58 4c 49 4d 49 54 20  ine PREFIXLIMIT 
a150: 20 20 20 33 30 20 2f 2a 20 4d 61 78 20 77 69 64     30 /* Max wid
a160: 74 68 20 6f 66 20 74 68 65 20 70 72 65 66 69 78  th of the prefix
a170: 20 6f 6e 20 65 61 63 68 20 6c 69 6e 65 20 2a 2f   on each line */
a180: 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63  .void ErrorMsg(c
a190: 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e  onst char *filen
a1a0: 61 6d 65 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c  ame, int lineno,
a1b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f 72   const char *for
a1c0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61  mat, ...){.  cha
a1d0: 72 20 65 72 72 6d 73 67 5b 45 52 52 4d 53 47 53  r errmsg[ERRMSGS
a1e0: 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70 72 65  IZE];.  char pre
a1f0: 66 69 78 5b 50 52 45 46 49 58 4c 49 4d 49 54 2b  fix[PREFIXLIMIT+
a200: 31 30 5d 3b 0a 20 20 69 6e 74 20 65 72 72 6d 73  10];.  int errms
a210: 67 73 69 7a 65 3b 0a 20 20 69 6e 74 20 70 72 65  gsize;.  int pre
a220: 66 69 78 73 69 7a 65 3b 0a 20 20 69 6e 74 20 61  fixsize;.  int a
a230: 76 61 69 6c 61 62 6c 65 77 69 64 74 68 3b 0a 20  vailablewidth;. 
a240: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
a250: 6e 74 20 65 6e 64 2c 20 72 65 73 74 61 72 74 2c  nt end, restart,
a260: 20 62 61 73 65 3b 0a 0a 20 20 76 61 5f 73 74 61   base;..  va_sta
a270: 72 74 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a  rt(ap, format);.
a280: 20 20 2f 2a 20 50 72 65 70 61 72 65 20 61 20 70    /* Prepare a p
a290: 72 65 66 69 78 20 74 6f 20 62 65 20 70 72 65 70  refix to be prep
a2a0: 65 6e 64 65 64 20 74 6f 20 65 76 65 72 79 20 6f  ended to every o
a2b0: 75 74 70 75 74 20 6c 69 6e 65 20 2a 2f 0a 20 20  utput line */.  
a2c0: 69 66 28 20 6c 69 6e 65 6e 6f 3e 30 20 29 7b 0a  if( lineno>0 ){.
a2d0: 20 20 20 20 73 70 72 69 6e 74 66 28 70 72 65 66      sprintf(pref
a2e0: 69 78 2c 22 25 2e 2a 73 3a 25 64 3a 20 22 2c 50  ix,"%.*s:%d: ",P
a2f0: 52 45 46 49 58 4c 49 4d 49 54 2d 31 30 2c 66 69  REFIXLIMIT-10,fi
a300: 6c 65 6e 61 6d 65 2c 6c 69 6e 65 6e 6f 29 3b 0a  lename,lineno);.
a310: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 72    }else{.    spr
a320: 69 6e 74 66 28 70 72 65 66 69 78 2c 22 25 2e 2a  intf(prefix,"%.*
a330: 73 3a 20 22 2c 50 52 45 46 49 58 4c 49 4d 49 54  s: ",PREFIXLIMIT
a340: 2d 31 30 2c 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  -10,filename);. 
a350: 20 7d 0a 20 20 70 72 65 66 69 78 73 69 7a 65 20   }.  prefixsize 
a360: 3d 20 73 74 72 6c 65 6e 28 70 72 65 66 69 78 29  = strlen(prefix)
a370: 3b 0a 20 20 61 76 61 69 6c 61 62 6c 65 77 69 64  ;.  availablewid
a380: 74 68 20 3d 20 4c 49 4e 45 57 49 44 54 48 20 2d  th = LINEWIDTH -
a390: 20 70 72 65 66 69 78 73 69 7a 65 3b 0a 0a 20 20   prefixsize;..  
a3a0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
a3b0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f  error message */
a3c0: 0a 20 20 76 73 70 72 69 6e 74 66 28 65 72 72 6d  .  vsprintf(errm
a3d0: 73 67 2c 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20  sg,format,ap);. 
a3e0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 65   va_end(ap);.  e
a3f0: 72 72 6d 73 67 73 69 7a 65 20 3d 20 73 74 72 6c  rrmsgsize = strl
a400: 65 6e 28 65 72 72 6d 73 67 29 3b 0a 20 20 2f 2a  en(errmsg);.  /*
a410: 20 52 65 6d 6f 76 65 20 74 72 61 69 6c 69 6e 67   Remove trailing
a420: 20 27 5c 6e 27 73 20 66 72 6f 6d 20 74 68 65 20   '\n's from the 
a430: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 2a  error message. *
a440: 2f 0a 20 20 77 68 69 6c 65 28 20 65 72 72 6d 73  /.  while( errms
a450: 67 73 69 7a 65 3e 30 20 26 26 20 65 72 72 6d 73  gsize>0 && errms
a460: 67 5b 65 72 72 6d 73 67 73 69 7a 65 2d 31 5d 3d  g[errmsgsize-1]=
a470: 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 65 72  ='\n' ){.     er
a480: 72 6d 73 67 5b 2d 2d 65 72 72 6d 73 67 73 69 7a  rmsg[--errmsgsiz
a490: 65 5d 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  e] = 0;.  }..  /
a4a0: 2a 20 50 72 69 6e 74 20 74 68 65 20 65 72 72 6f  * Print the erro
a4b0: 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 62  r message */.  b
a4c0: 61 73 65 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  ase = 0;.  while
a4d0: 28 20 65 72 72 6d 73 67 5b 62 61 73 65 5d 21 3d  ( errmsg[base]!=
a4e0: 30 20 29 7b 0a 20 20 20 20 65 6e 64 20 3d 20 72  0 ){.    end = r
a4f0: 65 73 74 61 72 74 20 3d 20 66 69 6e 64 62 72 65  estart = findbre
a500: 61 6b 28 26 65 72 72 6d 73 67 5b 62 61 73 65 5d  ak(&errmsg[base]
a510: 2c 30 2c 61 76 61 69 6c 61 62 6c 65 77 69 64 74  ,0,availablewidt
a520: 68 29 3b 0a 20 20 20 20 72 65 73 74 61 72 74 20  h);.    restart 
a530: 2b 3d 20 62 61 73 65 3b 0a 20 20 20 20 77 68 69  += base;.    whi
a540: 6c 65 28 20 65 72 72 6d 73 67 5b 72 65 73 74 61  le( errmsg[resta
a550: 72 74 5d 3d 3d 27 20 27 20 29 20 72 65 73 74 61  rt]==' ' ) resta
a560: 72 74 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  rt++;.    fprint
a570: 66 28 73 74 64 6f 75 74 2c 22 25 73 25 2e 2a 73  f(stdout,"%s%.*s
a580: 5c 6e 22 2c 70 72 65 66 69 78 2c 65 6e 64 2c 26  \n",prefix,end,&
a590: 65 72 72 6d 73 67 5b 62 61 73 65 5d 29 3b 0a 20  errmsg[base]);. 
a5a0: 20 20 20 62 61 73 65 20 3d 20 72 65 73 74 61 72     base = restar
a5b0: 74 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  t;.  }.}./******
a5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
a5d0: 74 68 65 20 66 69 6c 65 20 22 6d 61 69 6e 2e 63  the file "main.c
a5e0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
a5f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a600: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61  ******/./*.** Ma
a610: 69 6e 20 70 72 6f 67 72 61 6d 20 66 69 6c 65 20  in program file 
a620: 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61  for the LEMON pa
a630: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
a640: 2a 2f 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 61 6e  */../* Report an
a650: 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63   out-of-memory c
a660: 6f 6e 64 69 74 69 6f 6e 20 61 6e 64 20 61 62 6f  ondition and abo
a670: 72 74 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  rt.  This functi
a680: 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20 6d 6f  on.** is used mo
a690: 73 74 6c 79 20 62 79 20 74 68 65 20 22 4d 65 6d  stly by the "Mem
a6a0: 6f 72 79 43 68 65 63 6b 22 20 6d 61 63 72 6f 20  oryCheck" macro 
a6b0: 69 6e 20 73 74 72 75 63 74 2e 68 0a 2a 2f 0a 76  in struct.h.*/.v
a6c0: 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72  oid memory_error
a6d0: 28 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  (){.  fprintf(st
a6e0: 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d  derr,"Out of mem
a6f0: 6f 72 79 2e 20 20 41 62 6f 72 74 69 6e 67 2e 2e  ory.  Aborting..
a700: 2e 5c 6e 22 29 3b 0a 20 20 65 78 69 74 28 31 29  .\n");.  exit(1)
a710: 3b 0a 7d 0a 0a 0a 2f 2a 20 54 68 65 20 6d 61 69  ;.}.../* The mai
a720: 6e 20 70 72 6f 67 72 61 6d 2e 20 20 50 61 72 73  n program.  Pars
a730: 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  e the command li
a740: 6e 65 20 61 6e 64 20 64 6f 20 69 74 2e 2e 2e 20  ne and do it... 
a750: 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28 61 72 67 63  */.int main(argc
a760: 2c 61 72 67 76 29 0a 69 6e 74 20 61 72 67 63 3b  ,argv).int argc;
a770: 0a 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a 7b 0a  .char **argv;.{.
a780: 20 20 73 74 61 74 69 63 20 69 6e 74 20 76 65 72    static int ver
a790: 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73 74 61 74  sion = 0;.  stat
a7a0: 69 63 20 69 6e 74 20 72 70 66 6c 61 67 20 3d 20  ic int rpflag = 
a7b0: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
a7c0: 62 61 73 69 73 66 6c 61 67 20 3d 20 30 3b 0a 20  basisflag = 0;. 
a7d0: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6d 70   static int comp
a7e0: 72 65 73 73 20 3d 20 30 3b 0a 20 20 73 74 61 74  ress = 0;.  stat
a7f0: 69 63 20 69 6e 74 20 71 75 69 65 74 20 3d 20 30  ic int quiet = 0
a800: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 73  ;.  static int s
a810: 74 61 74 69 73 74 69 63 73 20 3d 20 30 3b 0a 20  tatistics = 0;. 
a820: 20 73 74 61 74 69 63 20 69 6e 74 20 6d 68 66 6c   static int mhfl
a830: 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  ag = 0;.  static
a840: 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e   struct s_option
a850: 73 20 6f 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a  s options[] = {.
a860: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
a870: 62 22 2c 20 28 63 68 61 72 2a 29 26 62 61 73 69  b", (char*)&basi
a880: 73 66 6c 61 67 2c 20 22 50 72 69 6e 74 20 6f 6e  sflag, "Print on
a890: 6c 79 20 74 68 65 20 62 61 73 69 73 20 69 6e 20  ly the basis in 
a8a0: 72 65 70 6f 72 74 2e 22 7d 2c 0a 20 20 20 20 7b  report."},.    {
a8b0: 4f 50 54 5f 46 4c 41 47 2c 20 22 63 22 2c 20 28  OPT_FLAG, "c", (
a8c0: 63 68 61 72 2a 29 26 63 6f 6d 70 72 65 73 73 2c  char*)&compress,
a8d0: 20 22 44 6f 6e 27 74 20 63 6f 6d 70 72 65 73 73   "Don't compress
a8e0: 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
a8f0: 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  e."},.    {OPT_F
a900: 4c 41 47 2c 20 22 67 22 2c 20 28 63 68 61 72 2a  LAG, "g", (char*
a910: 29 26 72 70 66 6c 61 67 2c 20 22 50 72 69 6e 74  )&rpflag, "Print
a920: 20 67 72 61 6d 6d 61 72 20 77 69 74 68 6f 75 74   grammar without
a930: 20 61 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20   actions."},.   
a940: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 6d 22 2c   {OPT_FLAG, "m",
a950: 20 28 63 68 61 72 2a 29 26 6d 68 66 6c 61 67 2c   (char*)&mhflag,
a960: 20 22 4f 75 74 70 75 74 20 61 20 6d 61 6b 65 68   "Output a makeh
a970: 65 61 64 65 72 73 20 63 6f 6d 70 61 74 69 62 6c  eaders compatibl
a980: 65 20 66 69 6c 65 22 7d 2c 0a 20 20 20 20 7b 4f  e file"},.    {O
a990: 50 54 5f 46 4c 41 47 2c 20 22 71 22 2c 20 28 63  PT_FLAG, "q", (c
a9a0: 68 61 72 2a 29 26 71 75 69 65 74 2c 20 22 28 51  har*)&quiet, "(Q
a9b0: 75 69 65 74 29 20 44 6f 6e 27 74 20 70 72 69 6e  uiet) Don't prin
a9c0: 74 20 74 68 65 20 72 65 70 6f 72 74 20 66 69 6c  t the report fil
a9d0: 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  e."},.    {OPT_F
a9e0: 4c 41 47 2c 20 22 73 22 2c 20 28 63 68 61 72 2a  LAG, "s", (char*
a9f0: 29 26 73 74 61 74 69 73 74 69 63 73 2c 20 22 50  )&statistics, "P
aa00: 72 69 6e 74 20 70 61 72 73 65 72 20 73 74 61 74  rint parser stat
aa10: 73 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75  s to standard ou
aa20: 74 70 75 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  tput."},.    {OP
aa30: 54 5f 46 4c 41 47 2c 20 22 78 22 2c 20 28 63 68  T_FLAG, "x", (ch
aa40: 61 72 2a 29 26 76 65 72 73 69 6f 6e 2c 20 22 50  ar*)&version, "P
aa50: 72 69 6e 74 20 74 68 65 20 76 65 72 73 69 6f 6e  rint the version
aa60: 20 6e 75 6d 62 65 72 2e 22 7d 2c 0a 20 20 20 20   number."},.    
aa70: 7b 4f 50 54 5f 46 4c 41 47 2c 30 2c 30 2c 30 7d  {OPT_FLAG,0,0,0}
aa80: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
aa90: 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 6c 65   struct lemon le
aaa0: 6d 3b 0a 0a 20 20 4f 70 74 49 6e 69 74 28 61 72  m;..  OptInit(ar
aab0: 67 76 2c 6f 70 74 69 6f 6e 73 2c 73 74 64 65 72  gv,options,stder
aac0: 72 29 3b 0a 20 20 69 66 28 20 76 65 72 73 69 6f  r);.  if( versio
aad0: 6e 20 29 7b 0a 20 20 20 20 20 70 72 69 6e 74 66  n ){.     printf
aae0: 28 22 4c 65 6d 6f 6e 20 76 65 72 73 69 6f 6e 20  ("Lemon version 
aaf0: 31 2e 30 5c 6e 22 29 3b 0a 20 20 20 20 20 65 78  1.0\n");.     ex
ab00: 69 74 28 30 29 3b 20 0a 20 20 7d 0a 20 20 69 66  it(0); .  }.  if
ab10: 28 20 4f 70 74 4e 41 72 67 73 28 29 21 3d 31 20  ( OptNArgs()!=1 
ab20: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
ab30: 74 64 65 72 72 2c 22 45 78 61 63 74 6c 79 20 6f  tderr,"Exactly o
ab40: 6e 65 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 75  ne filename argu
ab50: 6d 65 6e 74 20 69 73 20 72 65 71 75 69 72 65 64  ment is required
ab60: 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  .\n");.    exit(
ab70: 31 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d 2e 65 72  1);.  }.  lem.er
ab80: 72 6f 72 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f  rorcnt = 0;..  /
ab90: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
aba0: 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 53 74   machine */.  St
abb0: 72 73 61 66 65 5f 69 6e 69 74 28 29 3b 0a 20 20  rsafe_init();.  
abc0: 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 29 3b 0a 20  Symbol_init();. 
abd0: 20 53 74 61 74 65 5f 69 6e 69 74 28 29 3b 0a 20   State_init();. 
abe0: 20 6c 65 6d 2e 61 72 67 76 30 20 3d 20 61 72 67   lem.argv0 = arg
abf0: 76 5b 30 5d 3b 0a 20 20 6c 65 6d 2e 66 69 6c 65  v[0];.  lem.file
ac00: 6e 61 6d 65 20 3d 20 4f 70 74 41 72 67 28 30 29  name = OptArg(0)
ac10: 3b 0a 20 20 6c 65 6d 2e 62 61 73 69 73 66 6c 61  ;.  lem.basisfla
ac20: 67 20 3d 20 62 61 73 69 73 66 6c 61 67 3b 0a 20  g = basisflag;. 
ac30: 20 6c 65 6d 2e 68 61 73 5f 66 61 6c 6c 62 61 63   lem.has_fallbac
ac40: 6b 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 6e 63 6f  k = 0;.  lem.nco
ac50: 6e 66 6c 69 63 74 20 3d 20 30 3b 0a 20 20 6c 65  nflict = 0;.  le
ac60: 6d 2e 6e 61 6d 65 20 3d 20 6c 65 6d 2e 69 6e 63  m.name = lem.inc
ac70: 6c 75 64 65 20 3d 20 6c 65 6d 2e 61 72 67 20 3d  lude = lem.arg =
ac80: 20 6c 65 6d 2e 74 6f 6b 65 6e 74 79 70 65 20 3d   lem.tokentype =
ac90: 20 6c 65 6d 2e 73 74 61 72 74 20 3d 20 30 3b 0a   lem.start = 0;.
aca0: 20 20 6c 65 6d 2e 76 61 72 74 79 70 65 20 3d 20    lem.vartype = 
acb0: 30 3b 0a 20 20 6c 65 6d 2e 73 74 61 63 6b 73 69  0;.  lem.stacksi
acc0: 7a 65 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 65 72  ze = 0;.  lem.er
acd0: 72 6f 72 20 3d 20 6c 65 6d 2e 6f 76 65 72 66 6c  ror = lem.overfl
ace0: 6f 77 20 3d 20 6c 65 6d 2e 66 61 69 6c 75 72 65  ow = lem.failure
acf0: 20 3d 20 6c 65 6d 2e 61 63 63 65 70 74 20 3d 20   = lem.accept = 
ad00: 6c 65 6d 2e 74 6f 6b 65 6e 64 65 73 74 20 3d 0a  lem.tokendest =.
ad10: 20 20 20 20 20 6c 65 6d 2e 74 6f 6b 65 6e 70 72       lem.tokenpr
ad20: 65 66 69 78 20 3d 20 6c 65 6d 2e 6f 75 74 6e 61  efix = lem.outna
ad30: 6d 65 20 3d 20 6c 65 6d 2e 65 78 74 72 61 63 6f  me = lem.extraco
ad40: 64 65 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 76 61  de = 0;.  lem.va
ad50: 72 64 65 73 74 20 3d 20 30 3b 0a 20 20 6c 65 6d  rdest = 0;.  lem
ad60: 2e 74 61 62 6c 65 73 69 7a 65 20 3d 20 30 3b 0a  .tablesize = 0;.
ad70: 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 24 22    Symbol_new("$"
ad80: 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d 20  );.  lem.errsym 
ad90: 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 65 72  = Symbol_new("er
ada0: 72 6f 72 22 29 3b 0a 0a 20 20 2f 2a 20 50 61 72  ror");..  /* Par
adb0: 73 65 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  se the input fil
adc0: 65 20 2a 2f 0a 20 20 50 61 72 73 65 28 26 6c 65  e */.  Parse(&le
add0: 6d 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 65 72  m);.  if( lem.er
ade0: 72 6f 72 63 6e 74 20 29 20 65 78 69 74 28 6c 65  rorcnt ) exit(le
adf0: 6d 2e 65 72 72 6f 72 63 6e 74 29 3b 0a 20 20 69  m.errorcnt);.  i
ae00: 66 28 20 6c 65 6d 2e 72 75 6c 65 3d 3d 30 20 29  f( lem.rule==0 )
ae10: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
ae20: 64 65 72 72 2c 22 45 6d 70 74 79 20 67 72 61 6d  derr,"Empty gram
ae30: 6d 61 72 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78  mar.\n");.    ex
ae40: 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  it(1);.  }..  /*
ae50: 20 43 6f 75 6e 74 20 61 6e 64 20 69 6e 64 65 78   Count and index
ae60: 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 6f 66 20   the symbols of 
ae70: 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20  the grammar */. 
ae80: 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 53   lem.nsymbol = S
ae90: 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b 0a 20  ymbol_count();. 
aea0: 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65   Symbol_new("{de
aeb0: 66 61 75 6c 74 7d 22 29 3b 0a 20 20 6c 65 6d 2e  fault}");.  lem.
aec0: 73 79 6d 62 6f 6c 73 20 3d 20 53 79 6d 62 6f 6c  symbols = Symbol
aed0: 5f 61 72 72 61 79 6f 66 28 29 3b 0a 20 20 66 6f  _arrayof();.  fo
aee0: 72 28 69 3d 30 3b 20 69 3c 3d 6c 65 6d 2e 6e 73  r(i=0; i<=lem.ns
aef0: 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e  ymbol; i++) lem.
af00: 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65  symbols[i]->inde
af10: 78 20 3d 20 69 3b 0a 20 20 71 73 6f 72 74 28 6c  x = i;.  qsort(l
af20: 65 6d 2e 73 79 6d 62 6f 6c 73 2c 6c 65 6d 2e 6e  em.symbols,lem.n
af30: 73 79 6d 62 6f 6c 2b 31 2c 73 69 7a 65 6f 66 28  symbol+1,sizeof(
af40: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2c  struct symbol*),
af50: 0a 20 20 20 20 20 20 20 20 28 69 6e 74 28 2a 29  .        (int(*)
af60: 28 29 29 53 79 6d 62 6f 6c 63 6d 70 70 29 3b 0a  ())Symbolcmpp);.
af70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6c 65    for(i=0; i<=le
af80: 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20  m.nsymbol; i++) 
af90: 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  lem.symbols[i]->
afa0: 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 66 6f 72  index = i;.  for
afb0: 28 69 3d 31 3b 20 69 73 75 70 70 65 72 28 6c 65  (i=1; isupper(le
afc0: 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61  m.symbols[i]->na
afd0: 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29 3b 0a 20 20  me[0]); i++);.  
afe0: 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 20 3d 20  lem.nterminal = 
aff0: 69 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  i;..  /* Generat
b000: 65 20 61 20 72 65 70 72 69 6e 74 20 6f 66 20 74  e a reprint of t
b010: 68 65 20 67 72 61 6d 6d 61 72 2c 20 69 66 20 72  he grammar, if r
b020: 65 71 75 65 73 74 65 64 20 6f 6e 20 74 68 65 20  equested on the 
b030: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a  command line */.
b040: 20 20 69 66 28 20 72 70 66 6c 61 67 20 29 7b 0a    if( rpflag ){.
b050: 20 20 20 20 52 65 70 72 69 6e 74 28 26 6c 65 6d      Reprint(&lem
b060: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b070: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
b080: 65 20 73 69 7a 65 20 66 6f 72 20 61 6c 6c 20 66  e size for all f
b090: 6f 6c 6c 6f 77 20 61 6e 64 20 66 69 72 73 74 20  ollow and first 
b0a0: 73 65 74 73 20 2a 2f 0a 20 20 20 20 53 65 74 53  sets */.    SetS
b0b0: 69 7a 65 28 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61  ize(lem.ntermina
b0c0: 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64  l);..    /* Find
b0d0: 20 74 68 65 20 70 72 65 63 65 64 65 6e 63 65 20   the precedence 
b0e0: 66 6f 72 20 65 76 65 72 79 20 70 72 6f 64 75 63  for every produc
b0f0: 74 69 6f 6e 20 72 75 6c 65 20 28 74 68 61 74 20  tion rule (that 
b100: 68 61 73 20 6f 6e 65 29 20 2a 2f 0a 20 20 20 20  has one) */.    
b110: 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e  FindRulePreceden
b120: 63 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  ces(&lem);..    
b130: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c  /* Compute the l
b140: 61 6d 62 64 61 2d 6e 6f 6e 74 65 72 6d 69 6e 61  ambda-nontermina
b150: 6c 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  ls and the first
b160: 2d 73 65 74 73 20 66 6f 72 20 65 76 65 72 79 0a  -sets for every.
b170: 20 20 20 20 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e      ** nontermin
b180: 61 6c 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46 69  al */.    FindFi
b190: 72 73 74 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a  rstSets(&lem);..
b1a0: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61      /* Compute a
b1b0: 6c 6c 20 4c 52 28 30 29 20 73 74 61 74 65 73 2e  ll LR(0) states.
b1c0: 20 20 41 6c 73 6f 20 72 65 63 6f 72 64 20 66 6f    Also record fo
b1d0: 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61  llow-set propaga
b1e0: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6c 69 6e 6b  tion.    ** link
b1f0: 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 6f  s so that the fo
b200: 6c 6c 6f 77 2d 73 65 74 20 63 61 6e 20 62 65 20  llow-set can be 
b210: 63 6f 6d 70 75 74 65 64 20 6c 61 74 65 72 20 2a  computed later *
b220: 2f 0a 20 20 20 20 6c 65 6d 2e 6e 73 74 61 74 65  /.    lem.nstate
b230: 20 3d 20 30 3b 0a 20 20 20 20 46 69 6e 64 53 74   = 0;.    FindSt
b240: 61 74 65 73 28 26 6c 65 6d 29 3b 0a 20 20 20 20  ates(&lem);.    
b250: 6c 65 6d 2e 73 6f 72 74 65 64 20 3d 20 53 74 61  lem.sorted = Sta
b260: 74 65 5f 61 72 72 61 79 6f 66 28 29 3b 0a 0a 20  te_arrayof();.. 
b270: 20 20 20 2f 2a 20 54 69 65 20 75 70 20 6c 6f 6f     /* Tie up loo
b280: 73 65 20 65 6e 64 73 20 6f 6e 20 74 68 65 20 70  se ends on the p
b290: 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73  ropagation links
b2a0: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 4c 69 6e 6b   */.    FindLink
b2b0: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
b2c0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66 6f 6c   Compute the fol
b2d0: 6c 6f 77 20 73 65 74 20 6f 66 20 65 76 65 72 79  low set of every
b2e0: 20 72 65 64 75 63 69 62 6c 65 20 63 6f 6e 66 69   reducible confi
b2f0: 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  guration */.    
b300: 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28 26  FindFollowSets(&
b310: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  lem);..    /* Co
b320: 6d 70 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e  mpute the action
b330: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 46   tables */.    F
b340: 69 6e 64 41 63 74 69 6f 6e 73 28 26 6c 65 6d 29  indActions(&lem)
b350: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65  ;..    /* Compre
b360: 73 73 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  ss the action ta
b370: 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  bles */.    if( 
b380: 63 6f 6d 70 72 65 73 73 3d 3d 30 20 29 20 43 6f  compress==0 ) Co
b390: 6d 70 72 65 73 73 54 61 62 6c 65 73 28 26 6c 65  mpressTables(&le
b3a0: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65  m);..    /* Gene
b3b0: 72 61 74 65 20 61 20 72 65 70 6f 72 74 20 6f 66  rate a report of
b3c0: 20 74 68 65 20 70 61 72 73 65 72 20 67 65 6e 65   the parser gene
b3d0: 72 61 74 65 64 2e 20 20 28 74 68 65 20 22 79 2e  rated.  (the "y.
b3e0: 6f 75 74 70 75 74 22 20 66 69 6c 65 29 20 2a 2f  output" file) */
b3f0: 0a 20 20 20 20 69 66 28 20 21 71 75 69 65 74 20  .    if( !quiet 
b400: 29 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28 26  ) ReportOutput(&
b410: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  lem);..    /* Ge
b420: 6e 65 72 61 74 65 20 74 68 65 20 73 6f 75 72 63  nerate the sourc
b430: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70  e code for the p
b440: 61 72 73 65 72 20 2a 2f 0a 20 20 20 20 52 65 70  arser */.    Rep
b450: 6f 72 74 54 61 62 6c 65 28 26 6c 65 6d 2c 20 6d  ortTable(&lem, m
b460: 68 66 6c 61 67 29 3b 0a 0a 20 20 20 20 2f 2a 20  hflag);..    /* 
b470: 50 72 6f 64 75 63 65 20 61 20 68 65 61 64 65 72  Produce a header
b480: 20 66 69 6c 65 20 66 6f 72 20 75 73 65 20 62 79   file for use by
b490: 20 74 68 65 20 73 63 61 6e 6e 65 72 2e 20 20 28   the scanner.  (
b4a0: 54 68 69 73 20 73 74 65 70 20 69 73 0a 20 20 20  This step is.   
b4b0: 20 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66 20 74   ** omitted if t
b4c0: 68 65 20 22 2d 6d 22 20 6f 70 74 69 6f 6e 20 69  he "-m" option i
b4d0: 73 20 75 73 65 64 20 62 65 63 61 75 73 65 20 6d  s used because m
b4e0: 61 6b 65 68 65 61 64 65 72 73 20 77 69 6c 6c 0a  akeheaders will.
b4f0: 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 20      ** generate 
b500: 74 68 65 20 66 69 6c 65 20 66 6f 72 20 75 73 2e  the file for us.
b510: 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 6d 68  ) */.    if( !mh
b520: 66 6c 61 67 20 29 20 52 65 70 6f 72 74 48 65 61  flag ) ReportHea
b530: 64 65 72 28 26 6c 65 6d 29 3b 0a 20 20 7d 0a 20  der(&lem);.  }. 
b540: 20 69 66 28 20 73 74 61 74 69 73 74 69 63 73 20   if( statistics 
b550: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50  ){.    printf("P
b560: 61 72 73 65 72 20 73 74 61 74 69 73 74 69 63 73  arser statistics
b570: 3a 20 25 64 20 74 65 72 6d 69 6e 61 6c 73 2c 20  : %d terminals, 
b580: 25 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2c  %d nonterminals,
b590: 20 25 64 20 72 75 6c 65 73 5c 6e 22 2c 0a 20 20   %d rules\n",.  
b5a0: 20 20 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61      lem.ntermina
b5b0: 6c 2c 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 2d  l, lem.nsymbol -
b5c0: 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2c 20   lem.nterminal, 
b5d0: 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20 20 20 20  lem.nrule);.    
b5e0: 70 72 69 6e 74 66 28 22 20 20 20 20 20 20 20 20  printf("        
b5f0: 20 20 20 20 20 20 20 20 20 20 20 25 64 20 73 74             %d st
b600: 61 74 65 73 2c 20 25 64 20 70 61 72 73 65 72 20  ates, %d parser 
b610: 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2c 20 25  table entries, %
b620: 64 20 63 6f 6e 66 6c 69 63 74 73 5c 6e 22 2c 0a  d conflicts\n",.
b630: 20 20 20 20 20 20 6c 65 6d 2e 6e 73 74 61 74 65        lem.nstate
b640: 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69 7a 65 2c  , lem.tablesize,
b650: 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b   lem.nconflict);
b660: 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 2e 6e  .  }.  if( lem.n
b670: 63 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20 20  conflict ){.    
b680: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
b690: 25 64 20 70 61 72 73 69 6e 67 20 63 6f 6e 66 6c  %d parsing confl
b6a0: 69 63 74 73 2e 5c 6e 22 2c 6c 65 6d 2e 6e 63 6f  icts.\n",lem.nco
b6b0: 6e 66 6c 69 63 74 29 3b 0a 20 20 7d 0a 20 20 65  nflict);.  }.  e
b6c0: 78 69 74 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74  xit(lem.errorcnt
b6d0: 20 2b 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74   + lem.nconflict
b6e0: 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.}./**********
b6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
b700: 74 68 65 20 66 69 6c 65 20 22 6d 73 6f 72 74 2e  the file "msort.
b710: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
b720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b730: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 20 67 65 6e 65  **/./*.** A gene
b740: 72 69 63 20 6d 65 72 67 65 2d 73 6f 72 74 20 70  ric merge-sort p
b750: 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 55 53  rogram..**.** US
b760: 41 47 45 3a 0a 2a 2a 20 4c 65 74 20 22 70 74 72  AGE:.** Let "ptr
b770: 22 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  " be a pointer t
b780: 6f 20 73 6f 6d 65 20 73 74 72 75 63 74 75 72 65  o some structure
b790: 20 77 68 69 63 68 20 69 73 20 61 74 20 74 68 65   which is at the
b7a0: 20 68 65 61 64 20 6f 66 0a 2a 2a 20 61 20 6e 75   head of.** a nu
b7b0: 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69  ll-terminated li
b7c0: 73 74 2e 20 20 54 68 65 6e 20 74 6f 20 73 6f 72  st.  Then to sor
b7d0: 74 20 74 68 65 20 6c 69 73 74 20 63 61 6c 6c 3a  t the list call:
b7e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 74 72 20 3d  .**.**     ptr =
b7f0: 20 6d 73 6f 72 74 28 70 74 72 2c 26 28 70 74 72   msort(ptr,&(ptr
b800: 2d 3e 6e 65 78 74 29 2c 63 6d 70 66 6e 63 29 3b  ->next),cmpfnc);
b810: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62  .**.** In the ab
b820: 6f 76 65 2c 20 22 63 6d 70 66 6e 63 22 20 69 73  ove, "cmpfnc" is
b830: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
b840: 66 75 6e 63 74 69 6f 6e 20 77 68 69 63 68 20 63  function which c
b850: 6f 6d 70 61 72 65 73 0a 2a 2a 20 74 77 6f 20 69  ompares.** two i
b860: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
b870: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65  structure and re
b880: 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65 72  turns an integer
b890: 2c 20 61 73 20 69 6e 0a 2a 2a 20 73 74 72 63 6d  , as in.** strcm
b8a0: 70 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 61  p.  The second a
b8b0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
b8c0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 6f 69 6e  nter to the poin
b8d0: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 65  ter to the.** se
b8e0: 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20  cond element of 
b8f0: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  the linked list.
b900: 20 20 54 68 69 73 20 61 64 64 72 65 73 73 20 69    This address i
b910: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  s used to comput
b920: 65 0a 2a 2a 20 74 68 65 20 6f 66 66 73 65 74 20  e.** the offset 
b930: 74 6f 20 74 68 65 20 22 6e 65 78 74 22 20 66 69  to the "next" fi
b940: 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65 20 73  eld within the s
b950: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6f  tructure.  The o
b960: 66 66 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20  ffset to.** the 
b970: 22 6e 65 78 74 22 20 66 69 65 6c 64 20 6d 75 73  "next" field mus
b980: 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 66 6f  t be constant fo
b990: 72 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73  r all structures
b9a0: 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a   in the list..**
b9b0: 0a 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e  .** The function
b9c0: 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20 70   returns a new p
b9d0: 6f 69 6e 74 65 72 20 77 68 69 63 68 20 69 73 20  ointer which is 
b9e0: 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 65 20  the head of the 
b9f0: 6c 69 73 74 0a 2a 2a 20 61 66 74 65 72 20 73 6f  list.** after so
ba00: 72 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 4c 47  rting..**.** ALG
ba10: 4f 52 49 54 48 4d 3a 0a 2a 2a 20 4d 65 72 67 65  ORITHM:.** Merge
ba20: 2d 73 6f 72 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  -sort..*/../*.**
ba30: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
ba40: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74  r to the next st
ba50: 72 75 63 74 75 72 65 20 69 6e 20 74 68 65 20 6c  ructure in the l
ba60: 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 23  inked list..*/.#
ba70: 64 65 66 69 6e 65 20 4e 45 58 54 28 41 29 20 28  define NEXT(A) (
ba80: 2a 28 63 68 61 72 2a 2a 29 28 28 28 75 6e 73 69  *(char**)(((unsi
ba90: 67 6e 65 64 20 6c 6f 6e 67 29 41 29 2b 6f 66 66  gned long)A)+off
baa0: 73 65 74 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70  set))../*.** Inp
bab0: 75 74 73 3a 0a 2a 2a 20 20 20 61 3a 20 20 20 20  uts:.**   a:    
bac0: 20 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c     A sorted, nul
bad0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e  l-terminated lin
bae0: 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20  ked list.  (May 
baf0: 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62  be null)..**   b
bb00: 3a 20 20 20 20 20 20 20 41 20 73 6f 72 74 65 64  :       A sorted
bb10: 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65  , null-terminate
bb20: 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20  d linked list.  
bb30: 28 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a  (May be null)..*
bb40: 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 41 20 70  *   cmp:     A p
bb50: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f  ointer to the co
bb60: 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
bb70: 6e 2e 0a 2a 2a 20 20 20 6f 66 66 73 65 74 3a 20  n..**   offset: 
bb80: 20 4f 66 66 73 65 74 20 69 6e 20 74 68 65 20 73   Offset in the s
bb90: 74 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20  tructure to the 
bba0: 22 6e 65 78 74 22 20 66 69 65 6c 64 2e 0a 2a 2a  "next" field..**
bbb0: 0a 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65  .** Return Value
bbc0: 3a 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72  :.**   A pointer
bbd0: 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
bbe0: 61 20 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f  a sorted list co
bbf0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65  ntaining the ele
bc00: 6d 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 62 6f  ments.**   of bo
bc10: 74 68 20 61 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a  th a and b..**.*
bc20: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
bc30: 2a 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22 20  **   The "next" 
bc40: 70 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65  pointers for ele
bc50: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6c 69 73  ments in the lis
bc60: 74 73 20 61 20 61 6e 64 20 62 20 61 72 65 0a 2a  ts a and b are.*
bc70: 2a 20 20 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  *   changed..*/.
bc80: 73 74 61 74 69 63 20 63 68 61 72 20 2a 6d 65 72  static char *mer
bc90: 67 65 28 61 2c 62 2c 63 6d 70 2c 6f 66 66 73 65  ge(a,b,cmp,offse
bca0: 74 29 0a 63 68 61 72 20 2a 61 3b 0a 63 68 61 72  t).char *a;.char
bcb0: 20 2a 62 3b 0a 69 6e 74 20 28 2a 63 6d 70 29 28   *b;.int (*cmp)(
bcc0: 29 3b 0a 69 6e 74 20 6f 66 66 73 65 74 3b 0a 7b  );.int offset;.{
bcd0: 0a 20 20 63 68 61 72 20 2a 70 74 72 2c 20 2a 68  .  char *ptr, *h
bce0: 65 61 64 3b 0a 0a 20 20 69 66 28 20 61 3d 3d 30  ead;..  if( a==0
bcf0: 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 62   ){.    head = b
bd00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 3d  ;.  }else if( b=
bd10: 3d 30 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d  =0 ){.    head =
bd20: 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   a;.  }else{.   
bd30: 20 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29   if( (*cmp)(a,b)
bd40: 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 20  <0 ){.      ptr 
bd50: 3d 20 61 3b 0a 20 20 20 20 20 20 61 20 3d 20 4e  = a;.      a = N
bd60: 45 58 54 28 61 29 3b 0a 20 20 20 20 7d 65 6c 73  EXT(a);.    }els
bd70: 65 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 62  e{.      ptr = b
bd80: 3b 0a 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54  ;.      b = NEXT
bd90: 28 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  (b);.    }.    h
bda0: 65 61 64 20 3d 20 70 74 72 3b 0a 20 20 20 20 77  ead = ptr;.    w
bdb0: 68 69 6c 65 28 20 61 20 26 26 20 62 20 29 7b 0a  hile( a && b ){.
bdc0: 20 20 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29        if( (*cmp)
bdd0: 28 61 2c 62 29 3c 30 20 29 7b 0a 20 20 20 20 20  (a,b)<0 ){.     
bde0: 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 61     NEXT(ptr) = a
bdf0: 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d 20  ;.        ptr = 
be00: 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20 4e  a;.        a = N
be10: 45 58 54 28 61 29 3b 0a 20 20 20 20 20 20 7d 65  EXT(a);.      }e
be20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4e 45 58  lse{.        NEX
be30: 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 20 20  T(ptr) = b;.    
be40: 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20      ptr = b;.   
be50: 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29       b = NEXT(b)
be60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
be70: 20 20 20 20 69 66 28 20 61 20 29 20 4e 45 58 54      if( a ) NEXT
be80: 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20 65  (ptr) = a;.    e
be90: 6c 73 65 20 20 20 20 4e 45 58 54 28 70 74 72 29  lse    NEXT(ptr)
bea0: 20 3d 20 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = b;.  }.  retu
beb0: 72 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn head;.}../*.*
bec0: 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 6c  * Inputs:.**   l
bed0: 69 73 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65  ist:      Pointe
bee0: 72 20 74 6f 20 61 20 73 69 6e 67 6c 79 2d 6c 69  r to a singly-li
bef0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 73 74 72  nked list of str
bf00: 75 63 74 75 72 65 73 2e 0a 2a 2a 20 20 20 6e 65  uctures..**   ne
bf10: 78 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72  xt:      Pointer
bf20: 20 74 6f 20 70 6f 69 6e 74 65 72 20 74 6f 20 74   to pointer to t
bf30: 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  he second elemen
bf40: 74 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a  t of the list..*
bf50: 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 20 20 41  *   cmp:       A
bf60: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
bf70: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  tion..**.** Retu
bf80: 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41  rn Value:.**   A
bf90: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
bfa0: 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65 64  head of a sorted
bfb0: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
bfc0: 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a   the elements.**
bfd0: 20 20 20 6f 72 67 69 6e 61 6c 6c 79 20 69 6e 20     orginally in 
bfe0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65  list..**.** Side
bff0: 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54   effects:.**   T
c000: 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65  he "next" pointe
c010: 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20  rs for elements 
c020: 69 6e 20 6c 69 73 74 20 61 72 65 20 63 68 61 6e  in list are chan
c030: 67 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ged..*/.#define 
c040: 4c 49 53 54 53 49 5a 45 20 33 30 0a 63 68 61 72  LISTSIZE 30.char
c050: 20 2a 6d 73 6f 72 74 28 6c 69 73 74 2c 6e 65 78   *msort(list,nex
c060: 74 2c 63 6d 70 29 0a 63 68 61 72 20 2a 6c 69 73  t,cmp).char *lis
c070: 74 3b 0a 63 68 61 72 20 2a 2a 6e 65 78 74 3b 0a  t;.char **next;.
c080: 69 6e 74 20 28 2a 63 6d 70 29 28 29 3b 0a 7b 0a  int (*cmp)();.{.
c090: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
c0a0: 6f 66 66 73 65 74 3b 0a 20 20 63 68 61 72 20 2a  offset;.  char *
c0b0: 65 70 3b 0a 20 20 63 68 61 72 20 2a 73 65 74 5b  ep;.  char *set[
c0c0: 4c 49 53 54 53 49 5a 45 5d 3b 0a 20 20 69 6e 74  LISTSIZE];.  int
c0d0: 20 69 3b 0a 20 20 6f 66 66 73 65 74 20 3d 20 28   i;.  offset = (
c0e0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 6e 65  unsigned long)ne
c0f0: 78 74 20 2d 20 28 75 6e 73 69 67 6e 65 64 20 6c  xt - (unsigned l
c100: 6f 6e 67 29 6c 69 73 74 3b 0a 20 20 66 6f 72 28  ong)list;.  for(
c110: 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 3b  i=0; i<LISTSIZE;
c120: 20 69 2b 2b 29 20 73 65 74 5b 69 5d 20 3d 20 30   i++) set[i] = 0
c130: 3b 0a 20 20 77 68 69 6c 65 28 20 6c 69 73 74 20  ;.  while( list 
c140: 29 7b 0a 20 20 20 20 65 70 20 3d 20 6c 69 73 74  ){.    ep = list
c150: 3b 0a 20 20 20 20 6c 69 73 74 20 3d 20 4e 45 58  ;.    list = NEX
c160: 54 28 6c 69 73 74 29 3b 0a 20 20 20 20 4e 45 58  T(list);.    NEX
c170: 54 28 65 70 29 20 3d 20 30 3b 0a 20 20 20 20 66  T(ep) = 0;.    f
c180: 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49  or(i=0; i<LISTSI
c190: 5a 45 2d 31 20 26 26 20 73 65 74 5b 69 5d 21 3d  ZE-1 && set[i]!=
c1a0: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 65  0; i++){.      e
c1b0: 70 20 3d 20 6d 65 72 67 65 28 65 70 2c 73 65 74  p = merge(ep,set
c1c0: 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73 65 74 29 3b  [i],cmp,offset);
c1d0: 0a 20 20 20 20 20 20 73 65 74 5b 69 5d 20 3d 20  .      set[i] = 
c1e0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  0;.    }.    set
c1f0: 5b 69 5d 20 3d 20 65 70 3b 0a 20 20 7d 0a 20 20  [i] = ep;.  }.  
c200: 65 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ep = 0;.  for(i=
c210: 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 3b 20 69  0; i<LISTSIZE; i
c220: 2b 2b 29 20 69 66 28 20 73 65 74 5b 69 5d 20 29  ++) if( set[i] )
c230: 20 65 70 20 3d 20 6d 65 72 67 65 28 65 70 2c 73   ep = merge(ep,s
c240: 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73 65 74  et[i],cmp,offset
c250: 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 70 3b 0a  );.  return ep;.
c260: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
c270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
c280: 20 74 68 65 20 66 69 6c 65 20 22 6f 70 74 69 6f   the file "optio
c290: 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n.c" ***********
c2a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
c2b0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 61  .static char **a
c2c0: 72 67 76 3b 0a 73 74 61 74 69 63 20 73 74 72 75  rgv;.static stru
c2d0: 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f 70  ct s_options *op
c2e0: 3b 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 65  ;.static FILE *e
c2f0: 72 72 73 74 72 65 61 6d 3b 0a 0a 23 64 65 66 69  rrstream;..#defi
c300: 6e 65 20 49 53 4f 50 54 28 58 29 20 28 28 58 29  ne ISOPT(X) ((X)
c310: 5b 30 5d 3d 3d 27 2d 27 7c 7c 28 58 29 5b 30 5d  [0]=='-'||(X)[0]
c320: 3d 3d 27 2b 27 7c 7c 73 74 72 63 68 72 28 28 58  =='+'||strchr((X
c330: 29 2c 27 3d 27 29 21 3d 30 29 0a 0a 2f 2a 0a 2a  ),'=')!=0)../*.*
c340: 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6d 6d  * Print the comm
c350: 61 6e 64 20 6c 69 6e 65 20 77 69 74 68 20 61 20  and line with a 
c360: 63 61 72 72 6f 74 20 70 6f 69 6e 74 69 6e 67 20  carrot pointing 
c370: 74 6f 20 74 68 65 20 6b 2d 74 68 20 63 68 61 72  to the k-th char
c380: 61 63 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  acter.** of the 
c390: 6e 2d 74 68 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73  n-th field..*/.s
c3a0: 74 61 74 69 63 20 76 6f 69 64 20 65 72 72 6c 69  tatic void errli
c3b0: 6e 65 28 6e 2c 6b 2c 65 72 72 29 0a 69 6e 74 20  ne(n,k,err).int 
c3c0: 6e 3b 0a 69 6e 74 20 6b 3b 0a 46 49 4c 45 20 2a  n;.int k;.FILE *
c3d0: 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 73 70 63  err;.{.  int spc
c3e0: 6e 74 2c 20 69 3b 0a 20 20 73 70 63 6e 74 20 3d  nt, i;.  spcnt =
c3f0: 20 30 3b 0a 20 20 69 66 28 20 61 72 67 76 5b 30   0;.  if( argv[0
c400: 5d 20 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c  ] ) fprintf(err,
c410: 22 25 73 22 2c 61 72 67 76 5b 30 5d 29 3b 0a 20  "%s",argv[0]);. 
c420: 20 73 70 63 6e 74 20 3d 20 73 74 72 6c 65 6e 28   spcnt = strlen(
c430: 61 72 67 76 5b 30 5d 29 20 2b 20 31 3b 0a 20 20  argv[0]) + 1;.  
c440: 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26 20  for(i=1; i<n && 
c450: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  argv[i]; i++){. 
c460: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
c470: 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20   %s",argv[i]);. 
c480: 20 20 20 73 70 63 6e 74 20 2b 3d 20 73 74 72 6c     spcnt += strl
c490: 65 6e 28 61 72 67 76 5b 69 5d 2b 31 29 3b 0a 20  en(argv[i]+1);. 
c4a0: 20 7d 0a 20 20 73 70 63 6e 74 20 2b 3d 20 6b 3b   }.  spcnt += k;
c4b0: 0a 20 20 66 6f 72 28 3b 20 61 72 67 76 5b 69 5d  .  for(; argv[i]
c4c0: 3b 20 69 2b 2b 29 20 66 70 72 69 6e 74 66 28 65  ; i++) fprintf(e
c4d0: 72 72 2c 22 20 25 73 22 2c 61 72 67 76 5b 69 5d  rr," %s",argv[i]
c4e0: 29 3b 0a 20 20 69 66 28 20 73 70 63 6e 74 3c 32  );.  if( spcnt<2
c4f0: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
c500: 28 65 72 72 2c 22 5c 6e 25 2a 73 5e 2d 2d 20 68  (err,"\n%*s^-- h
c510: 65 72 65 5c 6e 22 2c 73 70 63 6e 74 2c 22 22 29  ere\n",spcnt,"")
c520: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
c530: 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25 2a  printf(err,"\n%*
c540: 73 68 65 72 65 20 2d 2d 5e 5c 6e 22 2c 73 70 63  shere --^\n",spc
c550: 6e 74 2d 37 2c 22 22 29 3b 0a 20 20 7d 0a 7d 0a  nt-7,"");.  }.}.
c560: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
c570: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 4e  e index of the N
c580: 2d 74 68 20 6e 6f 6e 2d 73 77 69 74 63 68 20 61  -th non-switch a
c590: 72 67 75 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  rgument.  Return
c5a0: 20 2d 31 0a 2a 2a 20 69 66 20 4e 20 69 73 20 6f   -1.** if N is o
c5b0: 75 74 20 6f 66 20 72 61 6e 67 65 2e 0a 2a 2f 0a  ut of range..*/.
c5c0: 73 74 61 74 69 63 20 69 6e 74 20 61 72 67 69 6e  static int argin
c5d0: 64 65 78 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a  dex(n).int n;.{.
c5e0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 64    int i;.  int d
c5f0: 61 73 68 64 61 73 68 20 3d 20 30 3b 0a 20 20 69  ashdash = 0;.  i
c600: 66 28 20 61 72 67 76 21 3d 30 20 26 26 20 2a 61  f( argv!=0 && *a
c610: 72 67 76 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f  rgv!=0 ){.    fo
c620: 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20  r(i=1; argv[i]; 
c630: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
c640: 64 61 73 68 64 61 73 68 20 7c 7c 20 21 49 53 4f  dashdash || !ISO
c650: 50 54 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20  PT(argv[i]) ){. 
c660: 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20         if( n==0 
c670: 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20  ) return i;.    
c680: 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d      n--;.      }
c690: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
c6a0: 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d  p(argv[i],"--")=
c6b0: 3d 30 20 29 20 64 61 73 68 64 61 73 68 20 3d 20  =0 ) dashdash = 
c6c0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
c6d0: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 73 74 61  eturn -1;.}..sta
c6e0: 74 69 63 20 63 68 61 72 20 65 6d 73 67 5b 5d 20  tic char emsg[] 
c6f0: 3d 20 22 43 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  = "Command line 
c700: 73 79 6e 74 61 78 20 65 72 72 6f 72 3a 20 22 3b  syntax error: ";
c710: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20  ../*.** Process 
c720: 61 20 66 6c 61 67 20 63 6f 6d 6d 61 6e 64 20 6c  a flag command l
c730: 69 6e 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ine argument..*/
c740: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 6e 64  .static int hand
c750: 6c 65 66 6c 61 67 73 28 69 2c 65 72 72 29 0a 69  leflags(i,err).i
c760: 6e 74 20 69 3b 0a 46 49 4c 45 20 2a 65 72 72 3b  nt i;.FILE *err;
c770: 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20 69 6e  .{.  int v;.  in
c780: 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20  t errcnt = 0;.  
c790: 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30  int j;.  for(j=0
c7a0: 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a  ; op[j].label; j
c7b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
c7c0: 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b 31 5d 2c  cmp(&argv[i][1],
c7d0: 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d 3d 30 20  op[j].label)==0 
c7e0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 76  ) break;.  }.  v
c7f0: 20 3d 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27   = argv[i][0]=='
c800: 2d 27 20 3f 20 31 20 3a 20 30 3b 0a 20 20 69 66  -' ? 1 : 0;.  if
c810: 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30  ( op[j].label==0
c820: 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20   ){.    if( err 
c830: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
c840: 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69 6e 65  (err,"%sundefine
c850: 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73  d option.\n",ems
c860: 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e  g);.      errlin
c870: 65 28 69 2c 31 2c 65 72 72 29 3b 0a 20 20 20 20  e(i,1,err);.    
c880: 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a  }.    errcnt++;.
c890: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a    }else if( op[j
c8a0: 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 4c 41 47  ].type==OPT_FLAG
c8b0: 20 29 7b 0a 20 20 20 20 2a 28 28 69 6e 74 2a 29   ){.    *((int*)
c8c0: 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 76 3b 0a  op[j].arg) = v;.
c8d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a    }else if( op[j
c8e0: 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 46 4c 41  ].type==OPT_FFLA
c8f0: 47 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64  G ){.    (*(void
c900: 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67  (*)())(op[j].arg
c910: 29 29 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ))(v);.  }else{.
c920: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
c930: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
c940: 2c 22 25 73 6d 69 73 73 69 6e 67 20 61 72 67 75  ,"%smissing argu
c950: 6d 65 6e 74 20 6f 6e 20 73 77 69 74 63 68 2e 5c  ment on switch.\
c960: 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20  n",emsg);.      
c970: 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29  errline(i,1,err)
c980: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63  ;.    }.    errc
c990: 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nt++;.  }.  retu
c9a0: 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a  rn errcnt;.}../*
c9b0: 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 63 6f  .** Process a co
c9c0: 6d 6d 61 6e 64 20 6c 69 6e 65 20 73 77 69 74 63  mmand line switc
c9d0: 68 20 77 68 69 63 68 20 68 61 73 20 61 6e 20 61  h which has an a
c9e0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
c9f0: 69 63 20 69 6e 74 20 68 61 6e 64 6c 65 73 77 69  ic int handleswi
ca00: 74 63 68 28 69 2c 65 72 72 29 0a 69 6e 74 20 69  tch(i,err).int i
ca10: 3b 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20  ;.FILE *err;.{. 
ca20: 20 69 6e 74 20 6c 76 20 3d 20 30 3b 0a 20 20 64   int lv = 0;.  d
ca30: 6f 75 62 6c 65 20 64 76 20 3d 20 30 2e 30 3b 0a  ouble dv = 0.0;.
ca40: 20 20 63 68 61 72 20 2a 73 76 20 3d 20 30 2c 20    char *sv = 0, 
ca50: 2a 65 6e 64 3b 0a 20 20 63 68 61 72 20 2a 63 70  *end;.  char *cp
ca60: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74  ;.  int j;.  int
ca70: 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 63   errcnt = 0;.  c
ca80: 70 20 3d 20 73 74 72 63 68 72 28 61 72 67 76 5b  p = strchr(argv[
ca90: 69 5d 2c 27 3d 27 29 3b 0a 20 20 2a 63 70 20 3d  i],'=');.  *cp =
caa0: 20 30 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f   0;.  for(j=0; o
cab0: 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29  p[j].label; j++)
cac0: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
cad0: 28 61 72 67 76 5b 69 5d 2c 6f 70 5b 6a 5d 2e 6c  (argv[i],op[j].l
cae0: 61 62 65 6c 29 3d 3d 30 20 29 20 62 72 65 61 6b  abel)==0 ) break
caf0: 3b 0a 20 20 7d 0a 20 20 2a 63 70 20 3d 20 27 3d  ;.  }.  *cp = '=
cb00: 27 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c  ';.  if( op[j].l
cb10: 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  abel==0 ){.    i
cb20: 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
cb30: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 75  fprintf(err,"%su
cb40: 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e  ndefined option.
cb50: 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20  \n",emsg);.     
cb60: 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72   errline(i,0,err
cb70: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72  );.    }.    err
cb80: 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  cnt++;.  }else{.
cb90: 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 73 77      cp++;.    sw
cba0: 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70 65  itch( op[j].type
cbb0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
cbc0: 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63  PT_FLAG:.      c
cbd0: 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20  ase OPT_FFLAG:. 
cbe0: 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29         if( err )
cbf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
cc00: 6e 74 66 28 65 72 72 2c 22 25 73 6f 70 74 69 6f  ntf(err,"%soptio
cc10: 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72  n requires an ar
cc20: 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29  gument.\n",emsg)
cc30: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 6c  ;.          errl
cc40: 69 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20  ine(i,0,err);.  
cc50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cc60: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  errcnt++;.      
cc70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
cc80: 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20  ase OPT_DBL:.   
cc90: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c     case OPT_FDBL
cca0: 3a 0a 20 20 20 20 20 20 20 20 64 76 20 3d 20 73  :.        dv = s
ccb0: 74 72 74 6f 64 28 63 70 2c 26 65 6e 64 29 3b 0a  trtod(cp,&end);.
ccc0: 20 20 20 20 20 20 20 20 69 66 28 20 2a 65 6e 64          if( *end
ccd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
cce0: 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20  ( err ){.       
ccf0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
cd00: 2c 22 25 73 69 6c 6c 65 67 61 6c 20 63 68 61 72  ,"%sillegal char
cd10: 61 63 74 65 72 20 69 6e 20 66 6c 6f 61 74 69 6e  acter in floatin
cd20: 67 2d 70 6f 69 6e 74 20 61 72 67 75 6d 65 6e 74  g-point argument
cd30: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
cd40: 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28          errline(
cd50: 69 2c 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  i,((unsigned lon
cd60: 67 29 65 6e 64 29 2d 28 75 6e 73 69 67 6e 65 64  g)end)-(unsigned
cd70: 20 6c 6f 6e 67 29 61 72 67 76 5b 69 5d 2c 65 72   long)argv[i],er
cd80: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
cd90: 20 20 20 20 20 20 20 20 20 20 65 72 72 63 6e 74            errcnt
cda0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
cdb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cdc0: 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a     case OPT_INT:
cdd0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
cde0: 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c 76  FINT:.        lv
cdf0: 20 3d 20 73 74 72 74 6f 6c 28 63 70 2c 26 65 6e   = strtol(cp,&en
ce00: 64 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  d,0);.        if
ce10: 28 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20  ( *end ){.      
ce20: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
ce30: 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
ce40: 74 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61  tf(err,"%sillega
ce50: 6c 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 69  l character in i
ce60: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e  nteger argument.
ce70: 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20  \n",emsg);.     
ce80: 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69         errline(i
ce90: 2c 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ,((unsigned long
cea0: 29 65 6e 64 29 2d 28 75 6e 73 69 67 6e 65 64 20  )end)-(unsigned 
ceb0: 6c 6f 6e 67 29 61 72 67 76 5b 69 5d 2c 65 72 72  long)argv[i],err
cec0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
ced0: 20 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b           errcnt+
cee0: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
cef0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cf00: 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a    case OPT_STR:.
cf10: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
cf20: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 73 76 20  STR:.        sv 
cf30: 3d 20 63 70 3b 0a 20 20 20 20 20 20 20 20 62 72  = cp;.        br
cf40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  eak;.    }.    s
cf50: 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70  witch( op[j].typ
cf60: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
cf70: 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20  OPT_FLAG:.      
cf80: 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a  case OPT_FFLAG:.
cf90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
cfa0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42       case OPT_DB
cfb0: 4c 3a 0a 20 20 20 20 20 20 20 20 2a 28 64 6f 75  L:.        *(dou
cfc0: 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  ble*)(op[j].arg)
cfd0: 20 3d 20 64 76 3b 0a 20 20 20 20 20 20 20 20 62   = dv;.        b
cfe0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
cff0: 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20   OPT_FDBL:.     
d000: 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 29 29     (*(void(*)())
d010: 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 64 76 29  (op[j].arg))(dv)
d020: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
d030: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
d040: 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 2a 28 69  INT:.        *(i
d050: 6e 74 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20  nt*)(op[j].arg) 
d060: 3d 20 6c 76 3b 0a 20 20 20 20 20 20 20 20 62 72  = lv;.        br
d070: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
d080: 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20  OPT_FINT:.      
d090: 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 29 29 28    (*(void(*)())(
d0a0: 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 28 69 6e 74  op[j].arg))((int
d0b0: 29 6c 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )lv);.        br
d0c0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
d0d0: 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 20  OPT_STR:.       
d0e0: 20 2a 28 63 68 61 72 2a 2a 29 28 6f 70 5b 6a 5d   *(char**)(op[j]
d0f0: 2e 61 72 67 29 20 3d 20 73 76 3b 0a 20 20 20 20  .arg) = sv;.    
d100: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d110: 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a   case OPT_FSTR:.
d120: 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28          (*(void(
d130: 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  *)())(op[j].arg)
d140: 29 28 73 76 29 3b 0a 20 20 20 20 20 20 20 20 62  )(sv);.        b
d150: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
d160: 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b    return errcnt;
d170: 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e 69 74 28  .}..int OptInit(
d180: 61 2c 6f 2c 65 72 72 29 0a 63 68 61 72 20 2a 2a  a,o,err).char **
d190: 61 3b 0a 73 74 72 75 63 74 20 73 5f 6f 70 74 69  a;.struct s_opti
d1a0: 6f 6e 73 20 2a 6f 3b 0a 46 49 4c 45 20 2a 65 72  ons *o;.FILE *er
d1b0: 72 3b 0a 7b 0a 20 20 69 6e 74 20 65 72 72 63 6e  r;.{.  int errcn
d1c0: 74 20 3d 20 30 3b 0a 20 20 61 72 67 76 20 3d 20  t = 0;.  argv = 
d1d0: 61 3b 0a 20 20 6f 70 20 3d 20 6f 3b 0a 20 20 65  a;.  op = o;.  e
d1e0: 72 72 73 74 72 65 61 6d 20 3d 20 65 72 72 3b 0a  rrstream = err;.
d1f0: 20 20 69 66 28 20 61 72 67 76 20 26 26 20 2a 61    if( argv && *a
d200: 72 67 76 20 26 26 20 6f 70 20 29 7b 0a 20 20 20  rgv && op ){.   
d210: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
d220: 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b  i=1; argv[i]; i+
d230: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 72  +){.      if( ar
d240: 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2b 27 20 7c 7c  gv[i][0]=='+' ||
d250: 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27   argv[i][0]=='-'
d260: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 63   ){.        errc
d270: 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 66 6c 61 67  nt += handleflag
d280: 73 28 69 2c 65 72 72 29 3b 0a 20 20 20 20 20 20  s(i,err);.      
d290: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 68 72  }else if( strchr
d2a0: 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 20 29 7b  (argv[i],'=') ){
d2b0: 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 20  .        errcnt 
d2c0: 2b 3d 20 68 61 6e 64 6c 65 73 77 69 74 63 68 28  += handleswitch(
d2d0: 69 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 7d 0a  i,err);.      }.
d2e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
d2f0: 65 72 72 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20  errcnt>0 ){.    
d300: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 56 61 6c  fprintf(err,"Val
d310: 69 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  id command line 
d320: 6f 70 74 69 6f 6e 73 20 66 6f 72 20 5c 22 25 73  options for \"%s
d330: 5c 22 20 61 72 65 3a 5c 6e 22 2c 2a 61 29 3b 0a  \" are:\n",*a);.
d340: 20 20 20 20 4f 70 74 50 72 69 6e 74 28 29 3b 0a      OptPrint();.
d350: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
d360: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
d370: 69 6e 74 20 4f 70 74 4e 41 72 67 73 28 29 7b 0a  int OptNArgs(){.
d380: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
d390: 20 69 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20   int dashdash = 
d3a0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  0;.  int i;.  if
d3b0: 28 20 61 72 67 76 21 3d 30 20 26 26 20 61 72 67  ( argv!=0 && arg
d3c0: 76 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20 20 66  v[0]!=0 ){.    f
d3d0: 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b  or(i=1; argv[i];
d3e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
d3f0: 20 64 61 73 68 64 61 73 68 20 7c 7c 20 21 49 53   dashdash || !IS
d400: 4f 50 54 28 61 72 67 76 5b 69 5d 29 20 29 20 63  OPT(argv[i]) ) c
d410: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
d420: 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22  strcmp(argv[i],"
d430: 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61  --")==0 ) dashda
d440: 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  sh = 1;.    }.  
d450: 7d 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 3b 0a  }.  return cnt;.
d460: 7d 0a 0a 63 68 61 72 20 2a 4f 70 74 41 72 67 28  }..char *OptArg(
d470: 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 69 6e  n).int n;.{.  in
d480: 74 20 69 3b 0a 20 20 69 20 3d 20 61 72 67 69 6e  t i;.  i = argin
d490: 64 65 78 28 6e 29 3b 0a 20 20 72 65 74 75 72 6e  dex(n);.  return
d4a0: 20 69 3e 3d 30 20 3f 20 61 72 67 76 5b 69 5d 20   i>=0 ? argv[i] 
d4b0: 3a 20 30 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74  : 0;.}..void Opt
d4c0: 45 72 72 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a  Err(n).int n;.{.
d4d0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61    int i;.  i = a
d4e0: 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 69 66  rgindex(n);.  if
d4f0: 28 20 69 3e 3d 30 20 29 20 65 72 72 6c 69 6e 65  ( i>=0 ) errline
d500: 28 69 2c 30 2c 65 72 72 73 74 72 65 61 6d 29 3b  (i,0,errstream);
d510: 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 50 72 69 6e  .}..void OptPrin
d520: 74 28 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  t(){.  int i;.  
d530: 69 6e 74 20 6d 61 78 2c 20 6c 65 6e 3b 0a 20 20  int max, len;.  
d540: 6d 61 78 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  max = 0;.  for(i
d550: 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b  =0; op[i].label;
d560: 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6e 20 3d   i++){.    len =
d570: 20 73 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61   strlen(op[i].la
d580: 62 65 6c 29 20 2b 20 31 3b 0a 20 20 20 20 73 77  bel) + 1;.    sw
d590: 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70 65  itch( op[i].type
d5a0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
d5b0: 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63  PT_FLAG:.      c
d5c0: 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20  ase OPT_FFLAG:. 
d5d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d5e0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54      case OPT_INT
d5f0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
d600: 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c  _FINT:.        l
d610: 65 6e 20 2b 3d 20 39 3b 20 20 20 20 20 20 20 2f  en += 9;       /
d620: 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 69 6e  * length of "<in
d630: 74 65 67 65 72 3e 22 20 2a 2f 0a 20 20 20 20 20  teger>" */.     
d640: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d650: 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20  case OPT_DBL:.  
d660: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42      case OPT_FDB
d670: 4c 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b  L:.        len +
d680: 3d 20 36 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65  = 6;       /* le
d690: 6e 67 74 68 20 6f 66 20 22 3c 72 65 61 6c 3e 22  ngth of "<real>"
d6a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
d6b0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
d6c0: 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73  T_STR:.      cas
d6d0: 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20  e OPT_FSTR:.    
d6e0: 20 20 20 20 6c 65 6e 20 2b 3d 20 38 3b 20 20 20      len += 8;   
d6f0: 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66      /* length of
d700: 20 22 3c 73 74 72 69 6e 67 3e 22 20 2a 2f 0a 20   "<string>" */. 
d710: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d720: 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e    }.    if( len>
d730: 6d 61 78 20 29 20 6d 61 78 20 3d 20 6c 65 6e 3b  max ) max = len;
d740: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
d750: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b  op[i].label; i++
d760: 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  ){.    switch( o
d770: 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20  p[i].type ){.   
d780: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47     case OPT_FLAG
d790: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
d7a0: 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20  _FFLAG:.        
d7b0: 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61  fprintf(errstrea
d7c0: 6d 2c 22 20 20 2d 25 2d 2a 73 20 20 25 73 5c 6e  m,"  -%-*s  %s\n
d7d0: 22 2c 6d 61 78 2c 6f 70 5b 69 5d 2e 6c 61 62 65  ",max,op[i].labe
d7e0: 6c 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29  l,op[i].message)
d7f0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
d800: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
d810: 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20  INT:.      case 
d820: 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20  OPT_FINT:.      
d830: 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72    fprintf(errstr
d840: 65 61 6d 2c 22 20 20 25 73 3d 3c 69 6e 74 65 67  eam,"  %s=<integ
d850: 65 72 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70  er>%*s  %s\n",op
d860: 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20  [i].label,.     
d870: 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 73       (int)(max-s
d880: 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65  trlen(op[i].labe
d890: 6c 29 2d 39 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d  l)-9),"",op[i].m
d8a0: 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20  essage);.       
d8b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
d8c0: 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20  se OPT_DBL:.    
d8d0: 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a    case OPT_FDBL:
d8e0: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
d8f0: 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 25 73  (errstream,"  %s
d900: 3d 3c 72 65 61 6c 3e 25 2a 73 20 20 25 73 5c 6e  =<real>%*s  %s\n
d910: 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20  ",op[i].label,. 
d920: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d           (int)(m
d930: 61 78 2d 73 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e  ax-strlen(op[i].
d940: 6c 61 62 65 6c 29 2d 36 29 2c 22 22 2c 6f 70 5b  label)-6),"",op[
d950: 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20  i].message);.   
d960: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d970: 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a    case OPT_STR:.
d980: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
d990: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 66 70 72  STR:.        fpr
d9a0: 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22  intf(errstream,"
d9b0: 20 20 25 73 3d 3c 73 74 72 69 6e 67 3e 25 2a 73    %s=<string>%*s
d9c0: 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61    %s\n",op[i].la
d9d0: 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28  bel,.          (
d9e0: 69 6e 74 29 28 6d 61 78 2d 73 74 72 6c 65 6e 28  int)(max-strlen(
d9f0: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 38 29 2c  op[i].label)-8),
da00: 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65  "",op[i].message
da10: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
da20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
da30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
da40: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
da50: 66 69 6c 65 20 22 70 61 72 73 65 2e 63 22 20 2a  file "parse.c" *
da60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
da70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
da80: 2a 2a 20 49 6e 70 75 74 20 66 69 6c 65 20 70 61  ** Input file pa
da90: 72 73 65 72 20 66 6f 72 20 74 68 65 20 4c 45 4d  rser for the LEM
daa0: 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
dab0: 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 54 68 65 20  tor..*/../* The 
dac0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 72  state of the par
dad0: 73 65 72 20 2a 2f 0a 73 74 72 75 63 74 20 70 73  ser */.struct ps
dae0: 74 61 74 65 20 7b 0a 20 20 63 68 61 72 20 2a 66  tate {.  char *f
daf0: 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 2f  ilename;       /
db00: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
db10: 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  put file */.  in
db20: 74 20 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 20 20  t tokenlineno;  
db30: 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65      /* Linenumbe
db40: 72 20 61 74 20 77 68 69 63 68 20 63 75 72 72 65  r at which curre
db50: 6e 74 20 74 6f 6b 65 6e 20 73 74 61 72 74 73 20  nt token starts 
db60: 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f 72 63 6e  */.  int errorcn
db70: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  t;         /* Nu
db80: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73  mber of errors s
db90: 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68 61 72 20  o far */.  char 
dba0: 2a 74 6f 6b 65 6e 73 74 61 72 74 3b 20 20 20 20  *tokenstart;    
dbb0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 63 75 72 72   /* Text of curr
dbc0: 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73  ent token */.  s
dbd0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 67 70 3b  truct lemon *gp;
dbe0: 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73       /* Global s
dbf0: 74 61 74 65 20 76 65 63 74 6f 72 20 2a 2f 0a 20  tate vector */. 
dc00: 20 65 6e 75 6d 20 65 5f 73 74 61 74 65 20 7b 0a   enum e_state {.
dc10: 20 20 20 20 49 4e 49 54 49 41 4c 49 5a 45 2c 0a      INITIALIZE,.
dc20: 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f      WAITING_FOR_
dc30: 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 2c 0a 20 20  DECL_OR_RULE,.  
dc40: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45    WAITING_FOR_DE
dc50: 43 4c 5f 4b 45 59 57 4f 52 44 2c 0a 20 20 20 20  CL_KEYWORD,.    
dc60: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
dc70: 5f 41 52 47 2c 0a 20 20 20 20 57 41 49 54 49 4e  _ARG,.    WAITIN
dc80: 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45  G_FOR_PRECEDENCE
dc90: 5f 53 59 4d 42 4f 4c 2c 0a 20 20 20 20 57 41 49  _SYMBOL,.    WAI
dca0: 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 2c 0a  TING_FOR_ARROW,.
dcb0: 20 20 20 20 49 4e 5f 52 48 53 2c 0a 20 20 20 20      IN_RHS,.    
dcc0: 4c 48 53 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 20  LHS_ALIAS_1,.   
dcd0: 20 4c 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20 20   LHS_ALIAS_2,.  
dce0: 20 20 4c 48 53 5f 41 4c 49 41 53 5f 33 2c 0a 20    LHS_ALIAS_3,. 
dcf0: 20 20 20 52 48 53 5f 41 4c 49 41 53 5f 31 2c 0a     RHS_ALIAS_1,.
dd00: 20 20 20 20 52 48 53 5f 41 4c 49 41 53 5f 32 2c      RHS_ALIAS_2,
dd10: 0a 20 20 20 20 50 52 45 43 45 44 45 4e 43 45 5f  .    PRECEDENCE_
dd20: 4d 41 52 4b 5f 31 2c 0a 20 20 20 20 50 52 45 43  MARK_1,.    PREC
dd30: 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 2c 0a 20  EDENCE_MARK_2,. 
dd40: 20 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f     RESYNC_AFTER_
dd50: 52 55 4c 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20  RULE_ERROR,.    
dd60: 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
dd70: 4c 5f 45 52 52 4f 52 2c 0a 20 20 20 20 57 41 49  L_ERROR,.    WAI
dd80: 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43  TING_FOR_DESTRUC
dd90: 54 4f 52 5f 53 59 4d 42 4f 4c 2c 0a 20 20 20 20  TOR_SYMBOL,.    
dda0: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41  WAITING_FOR_DATA
ddb0: 54 59 50 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 20  TYPE_SYMBOL,.   
ddc0: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c   WAITING_FOR_FAL
ddd0: 4c 42 41 43 4b 5f 49 44 0a 20 20 7d 20 73 74 61  LBACK_ID.  } sta
dde0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
ddf0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61        /* The sta
de00: 74 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  te of the parser
de10: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
de20: 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 20  bol *fallback;  
de30: 20 2f 2a 20 54 68 65 20 66 61 6c 6c 62 61 63 6b   /* The fallback
de40: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75   token */.  stru
de50: 63 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20  ct symbol *lhs; 
de60: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68         /* Left-h
de70: 61 6e 64 20 73 69 64 65 20 6f 66 20 63 75 72 72  and side of curr
de80: 65 6e 74 20 72 75 6c 65 20 2a 2f 0a 20 20 63 68  ent rule */.  ch
de90: 61 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20  ar *lhsalias;   
dea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 69 61           /* Alia
deb0: 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20 2a 2f  s for the LHS */
dec0: 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20 20 20 20  .  int nrhs;    
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dee0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 69 67 68 74   Number of right
def0: 2d 68 61 6e 64 20 73 69 64 65 20 73 79 6d 62 6f  -hand side symbo
df00: 6c 73 20 73 65 65 6e 20 2a 2f 0a 20 20 73 74 72  ls seen */.  str
df10: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 72 68 73 5b  uct symbol *rhs[
df20: 4d 41 58 52 48 53 5d 3b 20 20 2f 2a 20 52 48 53  MAXRHS];  /* RHS
df30: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 68   symbols */.  ch
df40: 61 72 20 2a 61 6c 69 61 73 5b 4d 41 58 52 48 53  ar *alias[MAXRHS
df50: 5d 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 69 61  ];       /* Alia
df60: 73 65 73 20 66 6f 72 20 65 61 63 68 20 52 48 53  ses for each RHS
df70: 20 73 79 6d 62 6f 6c 20 28 6f 72 20 4e 55 4c 4c   symbol (or NULL
df80: 29 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  ) */.  struct ru
df90: 6c 65 20 2a 70 72 65 76 72 75 6c 65 3b 20 20 20  le *prevrule;   
dfa0: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 75    /* Previous ru
dfb0: 6c 65 20 70 61 72 73 65 64 20 2a 2f 0a 20 20 63  le parsed */.  c
dfc0: 68 61 72 20 2a 64 65 63 6c 6b 65 79 77 6f 72 64  har *declkeyword
dfd0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79  ;         /* Key
dfe0: 77 6f 72 64 20 6f 66 20 61 20 64 65 63 6c 61 72  word of a declar
dff0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20  ation */.  char 
e000: 2a 2a 64 65 63 6c 61 72 67 73 6c 6f 74 3b 20 20  **declargslot;  
e010: 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
e020: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 61  he declaration a
e030: 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62  rgument should b
e040: 65 20 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  e put */.  int *
e050: 64 65 63 6c 6c 6e 73 6c 6f 74 3b 20 20 20 20 20  decllnslot;     
e060: 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
e070: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6c  he declaration l
e080: 69 6e 65 6e 75 6d 62 65 72 20 69 73 20 70 75 74  inenumber is put
e090: 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73   */.  enum e_ass
e0a0: 6f 63 20 64 65 63 6c 61 73 73 6f 63 3b 20 20 20  oc declassoc;   
e0b0: 20 2f 2a 20 41 73 73 69 67 6e 20 74 68 69 73 20   /* Assign this 
e0c0: 61 73 73 6f 63 69 61 74 69 6f 6e 20 74 6f 20 64  association to d
e0d0: 65 63 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ecl arguments */
e0e0: 0a 20 20 69 6e 74 20 70 72 65 63 63 6f 75 6e 74  .  int preccount
e0f0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er;           /*
e100: 20 41 73 73 69 67 6e 20 74 68 69 73 20 70 72 65   Assign this pre
e110: 63 65 64 65 6e 63 65 20 74 6f 20 64 65 63 6c 20  cedence to decl 
e120: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73  arguments */.  s
e130: 74 72 75 63 74 20 72 75 6c 65 20 2a 66 69 72 73  truct rule *firs
e140: 74 72 75 6c 65 3b 20 20 20 20 2f 2a 20 50 6f 69  trule;    /* Poi
e150: 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 72 75  nter to first ru
e160: 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61  le in the gramma
e170: 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  r */.  struct ru
e180: 6c 65 20 2a 6c 61 73 74 72 75 6c 65 3b 20 20 20  le *lastrule;   
e190: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
e1a0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
e1b0: 79 20 70 61 72 73 65 64 20 72 75 6c 65 20 2a 2f  y parsed rule */
e1c0: 0a 7d 3b 0a 0a 2f 2a 20 50 61 72 73 65 20 61 20  .};../* Parse a 
e1d0: 73 69 6e 67 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a  single token */.
e1e0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 72 73  static void pars
e1f0: 65 6f 6e 65 74 6f 6b 65 6e 28 70 73 70 29 0a 73  eonetoken(psp).s
e200: 74 72 75 63 74 20 70 73 74 61 74 65 20 2a 70 73  truct pstate *ps
e210: 70 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 78 3b 0a  p;.{.  char *x;.
e220: 20 20 78 20 3d 20 53 74 72 73 61 66 65 28 70 73    x = Strsafe(ps
e230: 70 2d 3e 74 6f 6b 65 6e 73 74 61 72 74 29 3b 20  p->tokenstart); 
e240: 20 20 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20      /* Save the 
e250: 74 6f 6b 65 6e 20 70 65 72 6d 61 6e 65 6e 74 6c  token permanentl
e260: 79 20 2a 2f 0a 23 69 66 20 30 0a 20 20 70 72 69  y */.#if 0.  pri
e270: 6e 74 66 28 22 25 73 3a 25 64 3a 20 54 6f 6b 65  ntf("%s:%d: Toke
e280: 6e 3d 5b 25 73 5d 20 73 74 61 74 65 3d 25 64 5c  n=[%s] state=%d\
e290: 6e 22 2c 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  n",psp->filename
e2a0: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
e2b0: 6f 2c 0a 20 20 20 20 78 2c 70 73 70 2d 3e 73 74  o,.    x,psp->st
e2c0: 61 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  ate);.#endif.  s
e2d0: 77 69 74 63 68 28 20 70 73 70 2d 3e 73 74 61 74  witch( psp->stat
e2e0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 49 4e  e ){.    case IN
e2f0: 49 54 49 41 4c 49 5a 45 3a 0a 20 20 20 20 20 20  ITIALIZE:.      
e300: 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20  psp->prevrule = 
e310: 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 70 72  0;.      psp->pr
e320: 65 63 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20  eccounter = 0;. 
e330: 20 20 20 20 20 70 73 70 2d 3e 66 69 72 73 74 72       psp->firstr
e340: 75 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72  ule = psp->lastr
e350: 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ule = 0;.      p
e360: 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d 20  sp->gp->nrule = 
e370: 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  0;.      /* Fall
e380: 20 74 68 72 75 20 74 6f 20 6e 65 78 74 20 63 61   thru to next ca
e390: 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 57  se */.    case W
e3a0: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
e3b0: 4f 52 5f 52 55 4c 45 3a 0a 20 20 20 20 20 20 69  OR_RULE:.      i
e3c0: 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a  f( x[0]=='%' ){.
e3d0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
e3e0: 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
e3f0: 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20  _DECL_KEYWORD;. 
e400: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
e410: 73 6c 6f 77 65 72 28 78 5b 30 5d 29 20 29 7b 0a  slower(x[0]) ){.
e420: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73          psp->lhs
e430: 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
e440: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6e  ;.        psp->n
e450: 72 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rhs = 0;.       
e460: 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d   psp->lhsalias =
e470: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   0;.        psp-
e480: 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
e490: 5f 46 4f 52 5f 41 52 52 4f 57 3b 0a 20 20 20 20  _FOR_ARROW;.    
e4a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d    }else if( x[0]
e4b0: 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 20 20 20  =='{' ){.       
e4c0: 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75   if( psp->prevru
e4d0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
e4e0: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
e4f0: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
e500: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65  okenlineno,."The
e510: 72 65 20 69 73 20 6e 6f 74 20 70 72 69 6f 72 20  re is not prior 
e520: 72 75 6c 65 20 6f 70 6f 6e 20 77 68 69 63 68 20  rule opon which 
e530: 74 6f 20 61 74 74 61 63 68 20 74 68 65 20 63 6f  to attach the co
e540: 64 65 20 5c 0a 66 72 61 67 6d 65 6e 74 20 77 68  de \.fragment wh
e550: 69 63 68 20 62 65 67 69 6e 73 20 6f 6e 20 74 68  ich begins on th
e560: 69 73 20 6c 69 6e 65 2e 22 29 3b 0a 20 20 20 20  is line.");.    
e570: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
e580: 63 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65 20 69 66  cnt++;..}else if
e590: 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d  ( psp->prevrule-
e5a0: 3e 63 6f 64 65 21 3d 30 20 29 7b 0a 20 20 20 20  >code!=0 ){.    
e5b0: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
e5c0: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
e5d0: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22  ->tokenlineno,."
e5e0: 43 6f 64 65 20 66 72 61 67 6d 65 6e 74 20 62 65  Code fragment be
e5f0: 67 69 6e 6e 69 6e 67 20 6f 6e 20 74 68 69 73 20  ginning on this 
e600: 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 65 20  line is not the 
e610: 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f  first \.to follo
e620: 77 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  w the previous r
e630: 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ule.");.        
e640: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
e650: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
e660: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
e670: 3e 70 72 65 76 72 75 6c 65 2d 3e 6c 69 6e 65 20  >prevrule->line 
e680: 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  = psp->tokenline
e690: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  no;.          ps
e6a0: 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64  p->prevrule->cod
e6b0: 65 20 3d 20 26 78 5b 31 5d 3b 0a 09 7d 0a 20 20  e = &x[1];..}.  
e6c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b      }else if( x[
e6d0: 30 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20  0]=='[' ){.     
e6e0: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
e6f0: 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f  PRECEDENCE_MARK_
e700: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
e710: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
e720: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
e730: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
e740: 0a 20 20 20 20 20 20 20 20 20 20 22 54 6f 6b 65  .          "Toke
e750: 6e 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20  n \"%s\" should 
e760: 62 65 20 65 69 74 68 65 72 20 5c 22 25 25 5c 22  be either \"%%\"
e770: 20 6f 72 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61   or a nontermina
e780: 6c 20 6e 61 6d 65 2e 22 2c 0a 20 20 20 20 20 20  l name.",.      
e790: 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20 20      x);.        
e7a0: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
e7b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
e7c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50  reak;.    case P
e7d0: 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31  RECEDENCE_MARK_1
e7e0: 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 75  :.      if( !isu
e7f0: 70 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20  pper(x[0]) ){.  
e800: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
e810: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
e820: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
e830: 20 20 20 20 20 20 20 20 20 22 54 68 65 20 70 72           "The pr
e840: 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20  ecedence symbol 
e850: 6d 75 73 74 20 62 65 20 61 20 74 65 72 6d 69 6e  must be a termin
e860: 61 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70  al.");.        p
e870: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
e880: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e890: 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30  psp->prevrule==0
e8a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
e8b0: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
e8c0: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
e8d0: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
e8e0: 54 68 65 72 65 20 69 73 20 6e 6f 20 70 72 69 6f  There is no prio
e8f0: 72 20 72 75 6c 65 20 74 6f 20 61 73 73 69 67 6e  r rule to assign
e900: 20 70 72 65 63 65 64 65 6e 63 65 20 5c 22 5b 25   precedence \"[%
e910: 73 5d 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20  s]\".",x);.     
e920: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
e930: 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
e940: 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c  if( psp->prevrul
e950: 65 2d 3e 70 72 65 63 73 79 6d 21 3d 30 20 29 7b  e->precsym!=0 ){
e960: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
e970: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
e980: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
e990: 2c 0a 22 50 72 65 63 65 64 65 6e 63 65 20 6d 61  ,."Precedence ma
e9a0: 72 6b 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20  rk on this line 
e9b0: 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  is not the first
e9c0: 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65   \.to follow the
e9d0: 20 70 72 65 76 69 6f 75 73 20 72 75 6c 65 2e 22   previous rule."
e9e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
e9f0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
ea00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ea10: 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e   psp->prevrule->
ea20: 70 72 65 63 73 79 6d 20 3d 20 53 79 6d 62 6f 6c  precsym = Symbol
ea30: 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 7d  _new(x);.      }
ea40: 0a 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74  .      psp->stat
ea50: 65 20 3d 20 50 52 45 43 45 44 45 4e 43 45 5f 4d  e = PRECEDENCE_M
ea60: 41 52 4b 5f 32 3b 0a 20 20 20 20 20 20 62 72 65  ARK_2;.      bre
ea70: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 52 45  ak;.    case PRE
ea80: 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3a 0a  CEDENCE_MARK_2:.
ea90: 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 21 3d        if( x[0]!=
eaa0: 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ']' ){.        E
eab0: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
eac0: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
ead0: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
eae0: 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 5d 5c 22    "Missing \"]\"
eaf0: 20 6f 6e 20 70 72 65 63 65 64 65 6e 63 65 20 6d   on precedence m
eb00: 61 72 6b 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ark.");.        
eb10: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
eb20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
eb30: 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
eb40: 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
eb50: 52 55 4c 45 3b 0a 20 20 20 20 20 20 62 72 65 61  RULE;.      brea
eb60: 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
eb70: 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3a 0a 20  ING_FOR_ARROW:. 
eb80: 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
eb90: 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20  :' && x[1]==':' 
eba0: 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a  && x[2]=='=' ){.
ebb0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
ebc0: 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20  te = IN_RHS;.   
ebd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30     }else if( x[0
ebe0: 5d 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20  ]=='(' ){.      
ebf0: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c    psp->state = L
ec00: 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20  HS_ALIAS_1;.    
ec10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ec20: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
ec30: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
ec40: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
ec50: 20 20 20 20 22 45 78 70 65 63 74 65 64 20 74 6f      "Expected to
ec60: 20 73 65 65 20 61 20 5c 22 3a 5c 22 20 66 6f 6c   see a \":\" fol
ec70: 6c 6f 77 69 6e 67 20 74 68 65 20 4c 48 53 20 73  lowing the LHS s
ec80: 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 2e 22 2c 0a  ymbol \"%s\".",.
ec90: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c            psp->l
eca0: 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  hs->name);.     
ecb0: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
ecc0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
ecd0: 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
ece0: 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
ecf0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ed00: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
ed10: 4c 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20  LHS_ALIAS_1:.   
ed20: 20 20 20 69 66 28 20 69 73 61 6c 70 68 61 28 78     if( isalpha(x
ed30: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
ed40: 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20  psp->lhsalias = 
ed50: 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  x;.        psp->
ed60: 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41  state = LHS_ALIA
ed70: 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  S_2;.      }else
ed80: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
ed90: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
eda0: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
edb0: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22  o,.          "\"
edc0: 25 73 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61  %s\" is not a va
edd0: 6c 69 64 20 61 6c 69 61 73 20 66 6f 72 20 74 68  lid alias for th
ede0: 65 20 4c 48 53 20 5c 22 25 73 5c 22 5c 6e 22 2c  e LHS \"%s\"\n",
edf0: 0a 20 20 20 20 20 20 20 20 20 20 78 2c 70 73 70  .          x,psp
ee00: 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ->lhs->name);.  
ee10: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
ee20: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
ee30: 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
ee40: 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
ee50: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
ee60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
ee70: 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3a 0a  se LHS_ALIAS_2:.
ee80: 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
ee90: 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ')' ){.        p
eea0: 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f  sp->state = LHS_
eeb0: 41 4c 49 41 53 5f 33 3b 0a 20 20 20 20 20 20 7d  ALIAS_3;.      }
eec0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
eed0: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
eee0: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
eef0: 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
ef00: 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22 20   "Missing \")\" 
ef10: 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c  following LHS al
ef20: 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e  ias name \"%s\".
ef30: 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29  ",psp->lhsalias)
ef40: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
ef50: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
ef60: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
ef70: 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
ef80: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
ef90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
efa0: 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53    case LHS_ALIAS
efb0: 5f 33 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b  _3:.      if( x[
efc0: 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d  0]==':' && x[1]=
efd0: 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d  =':' && x[2]=='=
efe0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
eff0: 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53  ->state = IN_RHS
f000: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f010: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
f020: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
f030: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
f040: 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69            "Missi
f050: 6e 67 20 5c 22 2d 3e 5c 22 20 66 6f 6c 6c 6f 77  ng \"->\" follow
f060: 69 6e 67 3a 20 5c 22 25 73 28 25 73 29 5c 22 2e  ing: \"%s(%s)\".
f070: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 73  ",.           ps
f080: 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 70 73 70  p->lhs->name,psp
f090: 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->lhsalias);.   
f0a0: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
f0b0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
f0c0: 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
f0d0: 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
f0e0: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
f0f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
f100: 65 20 49 4e 5f 52 48 53 3a 0a 20 20 20 20 20 20  e IN_RHS:.      
f110: 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b  if( x[0]=='.' ){
f120: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
f130: 72 75 6c 65 20 2a 72 70 3b 0a 20 20 20 20 20 20  rule *rp;.      
f140: 20 20 72 70 20 3d 20 28 73 74 72 75 63 74 20 72    rp = (struct r
f150: 75 6c 65 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  ule *)malloc( si
f160: 7a 65 6f 66 28 73 74 72 75 63 74 20 72 75 6c 65  zeof(struct rule
f170: 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20  ) + .           
f180: 20 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20    sizeof(struct 
f190: 73 79 6d 62 6f 6c 2a 29 2a 70 73 70 2d 3e 6e 72  symbol*)*psp->nr
f1a0: 68 73 20 2b 20 73 69 7a 65 6f 66 28 63 68 61 72  hs + sizeof(char
f1b0: 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 20 29 3b 0a  *)*psp->nrhs );.
f1c0: 20 20 20 20 20 20 20 20 69 66 28 20 72 70 3d 3d          if( rp==
f1d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
f1e0: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
f1f0: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
f200: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
f210: 20 20 20 20 22 43 61 6e 27 74 20 61 6c 6c 6f 63      "Can't alloc
f220: 61 74 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72  ate enough memor
f230: 79 20 66 6f 72 20 74 68 69 73 20 72 75 6c 65 2e  y for this rule.
f240: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ");.          ps
f250: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
f260: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
f270: 65 76 72 75 6c 65 20 3d 20 30 3b 0a 09 7d 65 6c  evrule = 0;..}el
f280: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
f290: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 72  t i;.          r
f2a0: 70 2d 3e 72 75 6c 65 6c 69 6e 65 20 3d 20 70 73  p->ruleline = ps
f2b0: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a  p->tokenlineno;.
f2c0: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
f2d0: 73 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62  s = (struct symb
f2e0: 6f 6c 2a 2a 29 26 72 70 5b 31 5d 3b 0a 20 20 20  ol**)&rp[1];.   
f2f0: 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c         rp->rhsal
f300: 69 61 73 20 3d 20 28 63 68 61 72 2a 2a 29 26 28  ias = (char**)&(
f310: 72 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68  rp->rhs[psp->nrh
f320: 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  s]);.          f
f330: 6f 72 28 69 3d 30 3b 20 69 3c 70 73 70 2d 3e 6e  or(i=0; i<psp->n
f340: 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
f350: 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69         rp->rhs[i
f360: 5d 20 3d 20 70 73 70 2d 3e 72 68 73 5b 69 5d 3b  ] = psp->rhs[i];
f370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d  .            rp-
f380: 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 3d 20 70  >rhsalias[i] = p
f390: 73 70 2d 3e 61 6c 69 61 73 5b 69 5d 3b 0a 09 20  sp->alias[i];.. 
f3a0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d   }.          rp-
f3b0: 3e 6c 68 73 20 3d 20 70 73 70 2d 3e 6c 68 73 3b  >lhs = psp->lhs;
f3c0: 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c  .          rp->l
f3d0: 68 73 61 6c 69 61 73 20 3d 20 70 73 70 2d 3e 6c  hsalias = psp->l
f3e0: 68 73 61 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  hsalias;.       
f3f0: 20 20 20 72 70 2d 3e 6e 72 68 73 20 3d 20 70 73     rp->nrhs = ps
f400: 70 2d 3e 6e 72 68 73 3b 0a 20 20 20 20 20 20 20  p->nrhs;.       
f410: 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b     rp->code = 0;
f420: 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70  .          rp->p
f430: 72 65 63 73 79 6d 20 3d 20 30 3b 0a 20 20 20 20  recsym = 0;.    
f440: 20 20 20 20 20 20 72 70 2d 3e 69 6e 64 65 78 20        rp->index 
f450: 3d 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65  = psp->gp->nrule
f460: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  ++;.          rp
f470: 2d 3e 6e 65 78 74 6c 68 73 20 3d 20 72 70 2d 3e  ->nextlhs = rp->
f480: 6c 68 73 2d 3e 72 75 6c 65 3b 0a 20 20 20 20 20  lhs->rule;.     
f490: 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 72 75       rp->lhs->ru
f4a0: 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20  le = rp;.       
f4b0: 20 20 20 72 70 2d 3e 6e 65 78 74 20 3d 20 30 3b     rp->next = 0;
f4c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
f4d0: 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 3d 3d 30  sp->firstrule==0
f4e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f4f0: 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d  psp->firstrule =
f500: 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d   psp->lastrule =
f510: 20 72 70 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a 20   rp;..  }else{. 
f520: 20 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e             psp->
f530: 6c 61 73 74 72 75 6c 65 2d 3e 6e 65 78 74 20 3d  lastrule->next =
f540: 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20   rp;.           
f550: 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d   psp->lastrule =
f560: 20 72 70 3b 0a 09 20 20 7d 0a 20 20 20 20 20 20   rp;..  }.      
f570: 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c      psp->prevrul
f580: 65 20 3d 20 72 70 3b 0a 09 7d 0a 20 20 20 20 20  e = rp;..}.     
f590: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f5a0: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
f5b0: 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20  _OR_RULE;.      
f5c0: 7d 65 6c 73 65 20 69 66 28 20 69 73 61 6c 70 68  }else if( isalph
f5d0: 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  a(x[0]) ){.     
f5e0: 20 20 20 69 66 28 20 70 73 70 2d 3e 6e 72 68 73     if( psp->nrhs
f5f0: 3e 3d 4d 41 58 52 48 53 20 29 7b 0a 20 20 20 20  >=MAXRHS ){.    
f600: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
f610: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
f620: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
f630: 20 20 20 20 20 20 20 20 20 20 20 22 54 6f 6f 20             "Too 
f640: 6d 61 6e 79 20 73 79 6d 62 6f 6c 20 6f 6e 20 52  many symbol on R
f650: 48 53 20 6f 72 20 72 75 6c 65 20 62 65 67 69 6e  HS or rule begin
f660: 6e 69 6e 67 20 61 74 20 5c 22 25 73 5c 22 2e 22  ning at \"%s\"."
f670: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 29  ,.            x)
f680: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
f690: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
f6a0: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
f6b0: 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
f6c0: 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 09 7d 65  _RULE_ERROR;..}e
f6d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
f6e0: 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68  sp->rhs[psp->nrh
f6f0: 73 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  s] = Symbol_new(
f700: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
f710: 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72  p->alias[psp->nr
f720: 68 73 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  hs] = 0;.       
f730: 20 20 20 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a     psp->nrhs++;.
f740: 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .}.      }else i
f750: 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 26 26 20  f( x[0]=='(' && 
f760: 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20  psp->nrhs>0 ){. 
f770: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
f780: 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 31 3b  e = RHS_ALIAS_1;
f790: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f7a0: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
f7b0: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
f7c0: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
f7d0: 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61           "Illega
f7e0: 6c 20 63 68 61 72 61 63 74 65 72 20 6f 6e 20 52  l character on R
f7f0: 48 53 20 6f 66 20 72 75 6c 65 3a 20 5c 22 25 73  HS of rule: \"%s
f800: 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20  \".",x);.       
f810: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
f820: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
f830: 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
f840: 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
f850: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
f860: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 48  eak;.    case RH
f870: 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20  S_ALIAS_1:.     
f880: 20 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30   if( isalpha(x[0
f890: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  ]) ){.        ps
f8a0: 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72  p->alias[psp->nr
f8b0: 68 73 2d 31 5d 20 3d 20 78 3b 0a 20 20 20 20 20  hs-1] = x;.     
f8c0: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f8d0: 52 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20 20  RHS_ALIAS_2;.   
f8e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f8f0: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
f900: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
f910: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
f920: 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73 20       "\"%s\" is 
f930: 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69 61  not a valid alia
f940: 73 20 66 6f 72 20 74 68 65 20 52 48 53 20 73 79  s for the RHS sy
f950: 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a  mbol \"%s\"\n",.
f960: 20 20 20 20 20 20 20 20 20 20 78 2c 70 73 70 2d            x,psp-
f970: 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31  >rhs[psp->nrhs-1
f980: 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
f990: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
f9a0: 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
f9b0: 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
f9c0: 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
f9d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
f9e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52  reak;.    case R
f9f0: 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20  HS_ALIAS_2:.    
fa00: 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20    if( x[0]==')' 
fa10: 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
fa20: 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a  state = IN_RHS;.
fa30: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fa40: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
fa50: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
fa60: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
fa70: 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67          "Missing
fa80: 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67   \")\" following
fa90: 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d 65 20   LHS alias name 
faa0: 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68  \"%s\".",psp->lh
fab0: 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20  salias);.       
fac0: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
fad0: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
fae0: 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
faf0: 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
fb00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
fb10: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
fb20: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b  ITING_FOR_DECL_K
fb30: 45 59 57 4f 52 44 3a 0a 20 20 20 20 20 20 69 66  EYWORD:.      if
fb40: 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20  ( isalpha(x[0]) 
fb50: 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
fb60: 64 65 63 6c 6b 65 79 77 6f 72 64 20 3d 20 78 3b  declkeyword = x;
fb70: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65  .        psp->de
fb80: 63 6c 61 72 67 73 6c 6f 74 20 3d 20 30 3b 0a 20  clargslot = 0;. 
fb90: 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
fba0: 6c 6e 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20  lnslot = 0;.    
fbb0: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
fbc0: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
fbd0: 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 20 20 69  L_ARG;.        i
fbe0: 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 61 6d  f( strcmp(x,"nam
fbf0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
fc00: 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
fc10: 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
fc20: 2d 3e 6e 61 6d 65 29 3b 0a 09 7d 65 6c 73 65 20  ->name);..}else 
fc30: 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 69 6e  if( strcmp(x,"in
fc40: 63 6c 75 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20  clude")==0 ){.  
fc50: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
fc60: 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
fc70: 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64 65 29 3b 0a  ->gp->include);.
fc80: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
fc90: 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70  ecllnslot = &psp
fca0: 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64 65 6c 6e 3b  ->gp->includeln;
fcb0: 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63  ..}else if( strc
fcc0: 6d 70 28 78 2c 22 63 6f 64 65 22 29 3d 3d 30 20  mp(x,"code")==0 
fcd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
fce0: 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
fcf0: 26 28 70 73 70 2d 3e 67 70 2d 3e 65 78 74 72 61  &(psp->gp->extra
fd00: 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20  code);.         
fd10: 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74   psp->decllnslot
fd20: 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 65 78 74   = &psp->gp->ext
fd30: 72 61 63 6f 64 65 6c 6e 3b 0a 09 7d 65 6c 73 65  racodeln;..}else
fd40: 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74   if( strcmp(x,"t
fd50: 6f 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f 72 22  oken_destructor"
fd60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
fd70: 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
fd80: 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74  ot = &psp->gp->t
fd90: 6f 6b 65 6e 64 65 73 74 3b 0a 20 20 20 20 20 20  okendest;.      
fda0: 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73      psp->decllns
fdb0: 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e  lot = &psp->gp->
fdc0: 74 6f 6b 65 6e 64 65 73 74 6c 6e 3b 0a 09 7d 65  tokendestln;..}e
fdd0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
fde0: 2c 22 64 65 66 61 75 6c 74 5f 64 65 73 74 72 75  ,"default_destru
fdf0: 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ctor")==0 ){.   
fe00: 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
fe10: 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e  argslot = &psp->
fe20: 67 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20  gp->vardest;.   
fe30: 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
fe40: 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67  lnslot = &psp->g
fe50: 70 2d 3e 76 61 72 64 65 73 74 6c 6e 3b 0a 09 7d  p->vardestln;..}
fe60: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
fe70: 78 2c 22 74 6f 6b 65 6e 5f 70 72 65 66 69 78 22  x,"token_prefix"
fe80: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
fe90: 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
fea0: 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74  ot = &psp->gp->t
feb0: 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 09 7d 65 6c  okenprefix;..}el
fec0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
fed0: 22 73 79 6e 74 61 78 5f 65 72 72 6f 72 22 29 3d  "syntax_error")=
fee0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
fef0: 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
ff00: 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65 72   = &(psp->gp->er
ff10: 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ror);.          
ff20: 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20  psp->decllnslot 
ff30: 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 65 72 72 6f  = &psp->gp->erro
ff40: 72 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  rln;..}else if( 
ff50: 73 74 72 63 6d 70 28 78 2c 22 70 61 72 73 65 5f  strcmp(x,"parse_
ff60: 61 63 63 65 70 74 22 29 3d 3d 30 20 29 7b 0a 20  accept")==0 ){. 
ff70: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
ff80: 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
ff90: 70 2d 3e 67 70 2d 3e 61 63 63 65 70 74 29 3b 0a  p->gp->accept);.
ffa0: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
ffb0: 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70  ecllnslot = &psp
ffc0: 2d 3e 67 70 2d 3e 61 63 63 65 70 74 6c 6e 3b 0a  ->gp->acceptln;.
ffd0: 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d  .}else if( strcm
ffe0: 70 28 78 2c 22 70 61 72 73 65 5f 66 61 69 6c 75  p(x,"parse_failu
fff0: 72 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  re")==0 ){.     
10000 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10010 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10020 70 2d 3e 66 61 69 6c 75 72 65 29 3b 0a 20 20 20  p->failure);.   
10030 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
10040 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67  lnslot = &psp->g
10050 70 2d 3e 66 61 69 6c 75 72 65 6c 6e 3b 0a 09 7d  p->failureln;..}
10060 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10070 78 2c 22 73 74 61 63 6b 5f 6f 76 65 72 66 6c 6f  x,"stack_overflo
10080 77 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  w")==0 ){.      
10090 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
100a0 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
100b0 2d 3e 6f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20  ->overflow);.   
100c0 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
100d0 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67  lnslot = &psp->g
100e0 70 2d 3e 6f 76 65 72 66 6c 6f 77 6c 6e 3b 0a 20  p->overflowln;. 
100f0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
10100 20 73 74 72 63 6d 70 28 78 2c 22 65 78 74 72 61   strcmp(x,"extra
10110 5f 61 72 67 75 6d 65 6e 74 22 29 3d 3d 30 20 29  _argument")==0 )
10120 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
10130 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
10140 28 70 73 70 2d 3e 67 70 2d 3e 61 72 67 29 3b 0a  (psp->gp->arg);.
10150 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
10160 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65  ( strcmp(x,"toke
10170 6e 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20  n_type")==0 ){. 
10180 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
10190 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
101a0 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 74 79 70 65  p->gp->tokentype
101b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
101c0 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64   if( strcmp(x,"d
101d0 65 66 61 75 6c 74 5f 74 79 70 65 22 29 3d 3d 30  efault_type")==0
101e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
101f0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
10200 20 26 28 70 73 70 2d 3e 67 70 2d 3e 76 61 72 74   &(psp->gp->vart
10210 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ype);.        }e
10220 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
10230 2c 22 73 74 61 63 6b 5f 73 69 7a 65 22 29 3d 3d  ,"stack_size")==
10240 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
10250 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
10260 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74 61  = &(psp->gp->sta
10270 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  cksize);.       
10280 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
10290 70 28 78 2c 22 73 74 61 72 74 5f 73 79 6d 62 6f  p(x,"start_symbo
102a0 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  l")==0 ){.      
102b0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
102c0 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
102d0 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 20 20  ->start);.      
102e0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
102f0 6d 70 28 78 2c 22 6c 65 66 74 22 29 3d 3d 30 20  mp(x,"left")==0 
10300 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
10310 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b  ->preccounter++;
10320 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10330 64 65 63 6c 61 73 73 6f 63 20 3d 20 4c 45 46 54  declassoc = LEFT
10340 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
10350 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
10360 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f  _FOR_PRECEDENCE_
10370 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20  SYMBOL;.        
10380 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10390 28 78 2c 22 72 69 67 68 74 22 29 3d 3d 30 20 29  (x,"right")==0 )
103a0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
103b0 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a  >preccounter++;.
103c0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
103d0 65 63 6c 61 73 73 6f 63 20 3d 20 52 49 47 48 54  eclassoc = RIGHT
103e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
103f0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
10400 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f  _FOR_PRECEDENCE_
10410 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20  SYMBOL;.        
10420 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10430 28 78 2c 22 6e 6f 6e 61 73 73 6f 63 22 29 3d 3d  (x,"nonassoc")==
10440 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
10450 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b  sp->preccounter+
10460 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  +;.          psp
10470 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 4e 4f  ->declassoc = NO
10480 4e 45 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  NE;.          ps
10490 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
104a0 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43  NG_FOR_PRECEDENC
104b0 45 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73 65  E_SYMBOL;..}else
104c0 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64   if( strcmp(x,"d
104d0 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29  estructor")==0 )
104e0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
104f0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
10500 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f  _FOR_DESTRUCTOR_
10510 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73 65 20 69  SYMBOL;..}else i
10520 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 79 70  f( strcmp(x,"typ
10530 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
10540 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
10550 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54   WAITING_FOR_DAT
10560 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20  ATYPE_SYMBOL;.  
10570 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10580 73 74 72 63 6d 70 28 78 2c 22 66 61 6c 6c 62 61  strcmp(x,"fallba
10590 63 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ck")==0 ){.     
105a0 20 20 20 20 20 70 73 70 2d 3e 66 61 6c 6c 62 61       psp->fallba
105b0 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ck = 0;.        
105c0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
105d0 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42  AITING_FOR_FALLB
105e0 41 43 4b 5f 49 44 3b 0a 20 20 20 20 20 20 20 20  ACK_ID;.        
105f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
10600 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
10610 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
10620 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
10630 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20 64        "Unknown d
10640 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f  eclaration keywo
10650 72 64 3a 20 5c 22 25 25 25 73 5c 22 2e 22 2c 78  rd: \"%%%s\".",x
10660 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
10670 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
10680 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
10690 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
106a0 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  R_DECL_ERROR;..}
106b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
106c0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
106d0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
106e0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
106f0 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61           "Illega
10700 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65  l declaration ke
10710 79 77 6f 72 64 3a 20 5c 22 25 73 5c 22 2e 22 2c  yword: \"%s\".",
10720 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
10730 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
10740 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10750 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
10760 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
10770 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
10780 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
10790 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f  _FOR_DESTRUCTOR_
107a0 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66  SYMBOL:.      if
107b0 28 20 21 69 73 61 6c 70 68 61 28 78 5b 30 5d 29  ( !isalpha(x[0])
107c0 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
107d0 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
107e0 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
107f0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
10800 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73  Symbol name miss
10810 69 6e 67 20 61 66 74 65 72 20 25 64 65 73 74 72  ing after %destr
10820 75 63 74 6f 72 20 6b 65 79 77 6f 72 64 22 29 3b  uctor keyword");
10830 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
10840 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
10850 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
10860 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
10870 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
10880 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72  lse{.        str
10890 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
108a0 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
108b0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
108c0 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e  largslot = &sp->
108d0 64 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 20 20  destructor;.    
108e0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73      psp->decllns
108f0 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73 74 72  lot = &sp->destr
10900 75 63 74 6f 72 6c 6e 3b 0a 20 20 20 20 20 20 20  uctorln;.       
10910 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
10920 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41  ITING_FOR_DECL_A
10930 52 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  RG;.      }.    
10940 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
10950 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41  e WAITING_FOR_DA
10960 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3a 0a 20  TATYPE_SYMBOL:. 
10970 20 20 20 20 20 69 66 28 20 21 69 73 61 6c 70 68       if( !isalph
10980 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  a(x[0]) ){.     
10990 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
109a0 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
109b0 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
109c0 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61        "Symbol na
109d0 6d 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72  me missing after
109e0 20 25 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79   %destructor key
109f0 77 6f 72 64 22 29 3b 0a 20 20 20 20 20 20 20 20  word");.        
10a00 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
10a10 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
10a20 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
10a30 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20  ER_DECL_ERROR;. 
10a40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10a50 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
10a60 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e  l *sp = Symbol_n
10a70 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ew(x);.        p
10a80 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
10a90 3d 20 26 73 70 2d 3e 64 61 74 61 74 79 70 65 3b  = &sp->datatype;
10aa0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65  .        psp->de
10ab0 63 6c 6c 6e 73 6c 6f 74 20 3d 20 30 3b 0a 20 20  cllnslot = 0;.  
10ac0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10ad0 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
10ae0 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 7d  ECL_ARG;.      }
10af0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10b00 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
10b10 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59  OR_PRECEDENCE_SY
10b20 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20  MBOL:.      if( 
10b30 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20  x[0]=='.' ){.   
10b40 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10b50 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
10b60 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20  CL_OR_RULE;.    
10b70 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 75 70    }else if( isup
10b80 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  per(x[0]) ){.   
10b90 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
10ba0 6f 6c 20 2a 73 70 3b 0a 20 20 20 20 20 20 20 20  ol *sp;.        
10bb0 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  sp = Symbol_new(
10bc0 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
10bd0 73 70 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20  sp->prec>=0 ){. 
10be0 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
10bf0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
10c00 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
10c10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53  ,.            "S
10c20 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 68 61 73  ymbol \"%s\" has
10c30 20 61 6c 72 65 61 64 79 20 62 65 20 67 69 76 65   already be give
10c40 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65 2e 22  n a precedence."
10c50 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ,x);.          p
10c60 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
10c70 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20  .}else{.        
10c80 20 20 73 70 2d 3e 70 72 65 63 20 3d 20 70 73 70    sp->prec = psp
10c90 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 3b 0a 20  ->preccounter;. 
10ca0 20 20 20 20 20 20 20 20 20 73 70 2d 3e 61 73 73           sp->ass
10cb0 6f 63 20 3d 20 70 73 70 2d 3e 64 65 63 6c 61 73  oc = psp->declas
10cc0 73 6f 63 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65  soc;..}.      }e
10cd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
10ce0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
10cf0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
10d00 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
10d10 22 43 61 6e 27 74 20 61 73 73 69 67 6e 20 61 20  "Can't assign a 
10d20 70 72 65 63 65 64 65 6e 63 65 20 74 6f 20 5c 22  precedence to \"
10d30 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20  %s\".",x);.     
10d40 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
10d50 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
10d60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
10d70 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  e WAITING_FOR_DE
10d80 43 4c 5f 41 52 47 3a 0a 20 20 20 20 20 20 69 66  CL_ARG:.      if
10d90 28 20 28 78 5b 30 5d 3d 3d 27 7b 27 20 7c 7c 20  ( (x[0]=='{' || 
10da0 78 5b 30 5d 3d 3d 27 5c 22 27 20 7c 7c 20 69 73  x[0]=='\"' || is
10db0 61 6c 6e 75 6d 28 78 5b 30 5d 29 29 20 29 7b 0a  alnum(x[0])) ){.
10dc0 20 20 20 20 20 20 20 20 69 66 28 20 2a 28 70 73          if( *(ps
10dd0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 29 21  p->declargslot)!
10de0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10df0 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
10e00 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
10e10 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
10e20 20 20 20 20 20 22 54 68 65 20 61 72 67 75 6d 65       "The argume
10e30 6e 74 20 5c 22 25 73 5c 22 20 74 6f 20 64 65 63  nt \"%s\" to dec
10e40 6c 61 72 61 74 69 6f 6e 20 5c 22 25 25 25 73 5c  laration \"%%%s\
10e50 22 20 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72  " is not the fir
10e60 73 74 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  st.",.          
10e70 20 20 78 5b 30 5d 3d 3d 27 5c 22 27 20 3f 20 26    x[0]=='\"' ? &
10e80 78 5b 31 5d 20 3a 20 78 2c 70 73 70 2d 3e 64 65  x[1] : x,psp->de
10e90 63 6c 6b 65 79 77 6f 72 64 29 3b 0a 20 20 20 20  clkeyword);.    
10ea0 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
10eb0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
10ec0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
10ed0 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
10ee0 45 52 52 4f 52 3b 0a 09 7d 65 6c 73 65 7b 0a 20  ERROR;..}else{. 
10ef0 20 20 20 20 20 20 20 20 20 2a 28 70 73 70 2d 3e           *(psp->
10f00 64 65 63 6c 61 72 67 73 6c 6f 74 29 20 3d 20 28  declargslot) = (
10f10 78 5b 30 5d 3d 3d 27 5c 22 27 20 7c 7c 20 78 5b  x[0]=='\"' || x[
10f20 30 5d 3d 3d 27 7b 27 29 20 3f 20 26 78 5b 31 5d  0]=='{') ? &x[1]
10f30 20 3a 20 78 3b 0a 20 20 20 20 20 20 20 20 20 20   : x;.          
10f40 69 66 28 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73  if( psp->decllns
10f50 6c 6f 74 20 29 20 2a 70 73 70 2d 3e 64 65 63 6c  lot ) *psp->decl
10f60 6c 6e 73 6c 6f 74 20 3d 20 70 73 70 2d 3e 74 6f  lnslot = psp->to
10f70 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20  kenlineno;.     
10f80 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10f90 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
10fa0 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 09 7d 0a 20  CL_OR_RULE;..}. 
10fb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10fc0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
10fd0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
10fe0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
10ff0 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20         "Illegal 
11000 61 72 67 75 6d 65 6e 74 20 74 6f 20 25 25 25 73  argument to %%%s
11010 3a 20 25 73 22 2c 70 73 70 2d 3e 64 65 63 6c 6b  : %s",psp->declk
11020 65 79 77 6f 72 64 2c 78 29 3b 0a 20 20 20 20 20  eyword,x);.     
11030 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
11040 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
11050 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
11060 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
11070 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11080 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
11090 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c  WAITING_FOR_FALL
110a0 42 41 43 4b 5f 49 44 3a 0a 20 20 20 20 20 20 69  BACK_ID:.      i
110b0 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a  f( x[0]=='.' ){.
110c0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
110d0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
110e0 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20  _DECL_OR_RULE;. 
110f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
11100 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b  isupper(x[0]) ){
11110 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
11120 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
11130 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e   psp->tokenlinen
11140 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25 25  o,.          "%%
11150 66 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e  fallback argumen
11160 74 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20  t \"%s\" should 
11170 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29 3b  be a token", x);
11180 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
11190 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
111a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
111b0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
111c0 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
111d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73  ;.        if( ps
111e0 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29  p->fallback==0 )
111f0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
11200 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 73 70 3b 0a  >fallback = sp;.
11210 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
11220 28 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 29  ( sp->fallback )
11230 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
11240 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
11250 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
11260 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
11270 20 20 22 4d 6f 72 65 20 74 68 61 6e 20 6f 6e 65    "More than one
11280 20 66 61 6c 6c 62 61 63 6b 20 61 73 73 69 67 6e   fallback assign
11290 65 64 20 74 6f 20 74 6f 6b 65 6e 20 25 73 22 2c  ed to token %s",
112a0 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   x);.          p
112b0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
112c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
112d0 20 20 20 20 20 20 20 20 20 73 70 2d 3e 66 61 6c           sp->fal
112e0 6c 62 61 63 6b 20 3d 20 70 73 70 2d 3e 66 61 6c  lback = psp->fal
112f0 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 20  lback;.         
11300 20 70 73 70 2d 3e 67 70 2d 3e 68 61 73 5f 66 61   psp->gp->has_fa
11310 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20  llback = 1;.    
11320 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11330 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
11340 61 73 65 20 52 45 53 59 4e 43 5f 41 46 54 45 52  ase RESYNC_AFTER
11350 5f 52 55 4c 45 5f 45 52 52 4f 52 3a 0a 2f 2a 20  _RULE_ERROR:./* 
11360 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
11370 2e 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20  .' ) psp->state 
11380 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
11390 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 2a 2a 20 20  CL_OR_RULE;.**  
113a0 20 20 20 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20      break; */.  
113b0 20 20 63 61 73 65 20 52 45 53 59 4e 43 5f 41 46    case RESYNC_AF
113c0 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3a 0a  TER_DECL_ERROR:.
113d0 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
113e0 27 2e 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65  '.' ) psp->state
113f0 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
11400 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20  ECL_OR_RULE;.   
11410 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 25 27     if( x[0]=='%'
11420 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20   ) psp->state = 
11430 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
11440 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20 20  _KEYWORD;.      
11450 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  break;.  }.}../*
11460 20 49 6e 20 73 70 69 74 65 20 6f 66 20 69 74 73   In spite of its
11470 20 6e 61 6d 65 2c 20 74 68 69 73 20 66 75 6e 63   name, this func
11480 74 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20 61  tion is really a
11490 20 73 63 61 6e 6e 65 72 2e 20 20 49 74 20 72 65   scanner.  It re
114a0 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 65 6e 74  ad.** in the ent
114b0 69 72 65 20 69 6e 70 75 74 20 66 69 6c 65 20 28  ire input file (
114c0 61 6c 6c 20 61 74 20 6f 6e 63 65 29 20 74 68 65  all at once) the
114d0 6e 20 74 6f 6b 65 6e 69 7a 65 73 20 69 74 2e 20  n tokenizes it. 
114e0 20 45 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e 20 69   Each.** token i
114f0 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
11500 66 75 6e 63 74 69 6f 6e 20 22 70 61 72 73 65 6f  function "parseo
11510 6e 65 74 6f 6b 65 6e 22 20 77 68 69 63 68 20 62  netoken" which b
11520 75 69 6c 64 73 20 61 6c 6c 0a 2a 2a 20 74 68 65  uilds all.** the
11530 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 61 74   appropriate dat
11540 61 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20  a structures in 
11550 74 68 65 20 67 6c 6f 62 61 6c 20 73 74 61 74 65  the global state
11560 20 76 65 63 74 6f 72 20 22 67 70 22 2e 0a 2a 2f   vector "gp"..*/
11570 0a 76 6f 69 64 20 50 61 72 73 65 28 67 70 29 0a  .void Parse(gp).
11580 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 67 70  struct lemon *gp
11590 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 73 74  ;.{.  struct pst
115a0 61 74 65 20 70 73 3b 0a 20 20 46 49 4c 45 20 2a  ate ps;.  FILE *
115b0 66 70 3b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65  fp;.  char *file
115c0 62 75 66 3b 0a 20 20 69 6e 74 20 66 69 6c 65 73  buf;.  int files
115d0 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e  ize;.  int linen
115e0 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68  o;.  int c;.  ch
115f0 61 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63 70 3b  ar *cp, *nextcp;
11600 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e 65  .  int startline
11610 20 3d 20 30 3b 0a 0a 20 20 70 73 2e 67 70 20 3d   = 0;..  ps.gp =
11620 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c 65 6e 61   gp;.  ps.filena
11630 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65 6e 61 6d  me = gp->filenam
11640 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72 63 6e 74  e;.  ps.errorcnt
11650 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74 61 74 65   = 0;.  ps.state
11660 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45 3b 0a 0a   = INITIALIZE;..
11670 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 65    /* Begin by re
11680 61 64 69 6e 67 20 74 68 65 20 69 6e 70 75 74 20  ading the input 
11690 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20 3d 20 66  file */.  fp = f
116a0 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e 61 6d 65  open(ps.filename
116b0 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 66 70  ,"rb");.  if( fp
116c0 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ==0 ){.    Error
116d0 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
116e0 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68  0,"Can't open th
116f0 69 73 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  is file for read
11700 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67 70 2d 3e  ing.");.    gp->
11710 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
11720 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 73  return;.  }.  fs
11730 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a 20 20 66  eek(fp,0,2);.  f
11740 69 6c 65 73 69 7a 65 20 3d 20 66 74 65 6c 6c 28  ilesize = ftell(
11750 66 70 29 3b 0a 20 20 72 65 77 69 6e 64 28 66 70  fp);.  rewind(fp
11760 29 3b 0a 20 20 66 69 6c 65 62 75 66 20 3d 20 28  );.  filebuf = (
11770 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 66  char *)malloc( f
11780 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a 20 20 69  ilesize+1 );.  i
11790 66 28 20 66 69 6c 65 62 75 66 3d 3d 30 20 29 7b  f( filebuf==0 ){
117a0 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73  .    ErrorMsg(ps
117b0 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e  .filename,0,"Can
117c0 27 74 20 61 6c 6c 6f 63 61 74 65 20 25 64 20 6f  't allocate %d o
117d0 66 20 6d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64  f memory to hold
117e0 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20   this file.",.  
117f0 20 20 20 20 66 69 6c 65 73 69 7a 65 2b 31 29 3b      filesize+1);
11800 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e  .    gp->errorcn
11810 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  t++;.    return;
11820 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 61 64  .  }.  if( fread
11830 28 66 69 6c 65 62 75 66 2c 31 2c 66 69 6c 65 73  (filebuf,1,files
11840 69 7a 65 2c 66 70 29 21 3d 66 69 6c 65 73 69 7a  ize,fp)!=filesiz
11850 65 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73  e ){.    ErrorMs
11860 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c  g(ps.filename,0,
11870 22 43 61 6e 27 74 20 72 65 61 64 20 69 6e 20 61  "Can't read in a
11880 6c 6c 20 25 64 20 62 79 74 65 73 20 6f 66 20 74  ll %d bytes of t
11890 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20 20 20  his file.",.    
118a0 20 20 66 69 6c 65 73 69 7a 65 29 3b 0a 20 20 20    filesize);.   
118b0 20 66 72 65 65 28 66 69 6c 65 62 75 66 29 3b 0a   free(filebuf);.
118c0 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74      gp->errorcnt
118d0 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
118e0 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70 29    }.  fclose(fp)
118f0 3b 0a 20 20 66 69 6c 65 62 75 66 5b 66 69 6c 65  ;.  filebuf[file
11900 73 69 7a 65 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a  size] = 0;..  /*
11910 20 4e 6f 77 20 73 63 61 6e 20 74 68 65 20 74 65   Now scan the te
11920 78 74 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  xt of the input 
11930 66 69 6c 65 20 2a 2f 0a 20 20 6c 69 6e 65 6e 6f  file */.  lineno
11940 20 3d 20 31 3b 0a 20 20 66 6f 72 28 63 70 3d 66   = 1;.  for(cp=f
11950 69 6c 65 62 75 66 3b 20 28 63 3d 20 2a 63 70 29  ilebuf; (c= *cp)
11960 21 3d 30 3b 20 29 7b 0a 20 20 20 20 69 66 28 20  !=0; ){.    if( 
11970 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f  c=='\n' ) lineno
11980 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ++;             
11990 20 2f 2a 20 4b 65 65 70 20 74 72 61 63 6b 20 6f   /* Keep track o
119a0 66 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65  f the line numbe
119b0 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 73  r */.    if( iss
119c0 70 61 63 65 28 63 29 20 29 7b 20 63 70 2b 2b 3b  pace(c) ){ cp++;
119d0 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 20 20 2f 2a   continue; }  /*
119e0 20 53 6b 69 70 20 61 6c 6c 20 77 68 69 74 65 20   Skip all white 
119f0 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 66 28  space */.    if(
11a00 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d   c=='/' && cp[1]
11a10 3d 3d 27 2f 27 20 29 7b 20 20 20 20 20 20 20 20  =='/' ){        
11a20 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74    /* Skip C++ st
11a30 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a  yle comments */.
11a40 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20        cp+=2;.   
11a50 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63     while( (c= *c
11a60 70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27  p)!=0 && c!='\n'
11a70 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63   ) cp++;.      c
11a80 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
11a90 20 20 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26     if( c=='/' &&
11aa0 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20   cp[1]=='*' ){  
11ab0 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20          /* Skip 
11ac0 43 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73  C style comments
11ad0 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b   */.      cp+=2;
11ae0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
11af0 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21  = *cp)!=0 && (c!
11b00 3d 27 2f 27 20 7c 7c 20 63 70 5b 2d 31 5d 21 3d  ='/' || cp[-1]!=
11b10 27 2a 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '*') ){.        
11b20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69  if( c=='\n' ) li
11b30 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
11b40 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  cp++;.      }.  
11b50 20 20 20 20 69 66 28 20 63 20 29 20 63 70 2b 2b      if( c ) cp++
11b60 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
11b70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 73 2e 74  ;.    }.    ps.t
11b80 6f 6b 65 6e 73 74 61 72 74 20 3d 20 63 70 3b 20  okenstart = cp; 
11b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11ba0 2a 20 4d 61 72 6b 20 74 68 65 20 62 65 67 69 6e  * Mark the begin
11bb0 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 6f 6b 65  ning of the toke
11bc0 6e 20 2a 2f 0a 20 20 20 20 70 73 2e 74 6f 6b 65  n */.    ps.toke
11bd0 6e 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f  nlineno = lineno
11be0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
11bf0 69 6e 65 6e 75 6d 62 65 72 20 6f 6e 20 77 68 69  inenumber on whi
11c00 63 68 20 74 6f 6b 65 6e 20 62 65 67 69 6e 73 20  ch token begins 
11c10 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  */.    if( c=='\
11c20 22 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  "' ){           
11c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72            /* Str
11c40 69 6e 67 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a  ing literals */.
11c50 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20        cp++;.    
11c60 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70    while( (c= *cp
11c70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 22 27 20  )!=0 && c!='\"' 
11c80 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
11c90 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
11ca0 2b 3b 0a 20 20 20 20 20 20 20 20 63 70 2b 2b 3b  +;.        cp++;
11cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11cc0 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
11cd0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66     ErrorMsg(ps.f
11ce0 69 6c 65 6e 61 6d 65 2c 73 74 61 72 74 6c 69 6e  ilename,startlin
11cf0 65 2c 0a 22 53 74 72 69 6e 67 20 73 74 61 72 74  e,."String start
11d00 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65  ing on this line
11d10 20 69 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74   is not terminat
11d20 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e  ed before the en
11d30 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 22 29  d of the file.")
11d40 3b 0a 20 20 20 20 20 20 20 20 70 73 2e 65 72 72  ;.        ps.err
11d50 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
11d60 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20   nextcp = cp;.  
11d70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11d80 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 2b 31     nextcp = cp+1
11d90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
11da0 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b 27 20 29  lse if( c=='{' )
11db0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
11dc0 2f 2a 20 41 20 62 6c 6f 63 6b 20 6f 66 20 43 20  /* A block of C 
11dd0 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  code */.      in
11de0 74 20 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 63  t level;.      c
11df0 70 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 6c  p++;.      for(l
11e00 65 76 65 6c 3d 31 3b 20 28 63 3d 20 2a 63 70 29  evel=1; (c= *cp)
11e10 21 3d 30 20 26 26 20 28 6c 65 76 65 6c 3e 31 20  !=0 && (level>1 
11e20 7c 7c 20 63 21 3d 27 7d 27 29 3b 20 63 70 2b 2b  || c!='}'); cp++
11e30 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
11e40 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
11e50 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20  +;.        else 
11e60 69 66 28 20 63 3d 3d 27 7b 27 20 29 20 6c 65 76  if( c=='{' ) lev
11e70 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c  el++;.        el
11e80 73 65 20 69 66 28 20 63 3d 3d 27 7d 27 20 29 20  se if( c=='}' ) 
11e90 6c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 20  level--;.       
11ea0 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2f 27   else if( c=='/'
11eb0 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29   && cp[1]=='*' )
11ec0 7b 20 20 2f 2a 20 53 6b 69 70 20 63 6f 6d 6d 65  {  /* Skip comme
11ed0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  nts */.         
11ee0 20 69 6e 74 20 70 72 65 76 63 3b 0a 20 20 20 20   int prevc;.    
11ef0 20 20 20 20 20 20 63 70 20 3d 20 26 63 70 5b 32        cp = &cp[2
11f00 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65  ];.          pre
11f10 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  vc = 0;.        
11f20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70    while( (c= *cp
11f30 29 21 3d 30 20 26 26 20 28 63 21 3d 27 2f 27 20  )!=0 && (c!='/' 
11f40 7c 7c 20 70 72 65 76 63 21 3d 27 2a 27 29 20 29  || prevc!='*') )
11f50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
11f60 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65  ( c=='\n' ) line
11f70 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  no++;.          
11f80 20 20 70 72 65 76 63 20 3d 20 63 3b 0a 20 20 20    prevc = c;.   
11f90 20 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 09           cp++;..
11fa0 20 20 7d 0a 09 7d 65 6c 73 65 20 69 66 28 20 63    }..}else if( c
11fb0 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d  =='/' && cp[1]==
11fc0 27 2f 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20  '/' ){  /* Skip 
11fd0 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e  C++ style commen
11fe0 74 73 20 74 6f 6f 20 2a 2f 0a 20 20 20 20 20 20  ts too */.      
11ff0 20 20 20 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b      cp = &cp[2];
12000 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
12010 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ( (c= *cp)!=0 &&
12020 20 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b   c!='\n' ) cp++;
12030 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
12040 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 09 7d 65   ) lineno++;..}e
12050 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20  lse if( c=='\'' 
12060 7c 7c 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20  || c=='\"' ){   
12070 20 2f 2a 20 53 74 72 69 6e 67 20 61 20 63 68 61   /* String a cha
12080 72 61 63 74 65 72 20 6c 69 74 65 72 61 6c 73 20  racter literals 
12090 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  */.          int
120a0 20 73 74 61 72 74 63 68 61 72 2c 20 70 72 65 76   startchar, prev
120b0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  c;.          sta
120c0 72 74 63 68 61 72 20 3d 20 63 3b 0a 20 20 20 20  rtchar = c;.    
120d0 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 30 3b        prevc = 0;
120e0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 63  .          for(c
120f0 70 2b 2b 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30  p++; (c= *cp)!=0
12100 20 26 26 20 28 63 21 3d 73 74 61 72 74 63 68 61   && (c!=startcha
12110 72 20 7c 7c 20 70 72 65 76 63 3d 3d 27 5c 5c 27  r || prevc=='\\'
12120 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ); cp++){.      
12130 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
12140 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
12150 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72            if( pr
12160 65 76 63 3d 3d 27 5c 5c 27 20 29 20 70 72 65 76  evc=='\\' ) prev
12170 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  c = 0;.         
12180 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20     else         
12190 20 20 20 20 20 70 72 65 76 63 20 3d 20 63 3b 0a       prevc = c;.
121a0 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a  .  }..}.      }.
121b0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
121c0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
121d0 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 70  sg(ps.filename,p
121e0 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22  s.tokenlineno,."
121f0 43 20 63 6f 64 65 20 73 74 61 72 74 69 6e 67 20  C code starting 
12200 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20  on this line is 
12210 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62  not terminated b
12220 65 66 6f 72 65 20 74 68 65 20 65 6e 64 20 6f 66  efore the end of
12230 20 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20   the file.");.  
12240 20 20 20 20 20 20 70 73 2e 65 72 72 6f 72 63 6e        ps.errorcn
12250 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65 78  t++;.        nex
12260 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 20 20  tcp = cp;.      
12270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
12280 65 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20  extcp = cp+1;.  
12290 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
122a0 69 66 28 20 69 73 61 6c 6e 75 6d 28 63 29 20 29  if( isalnum(c) )
122b0 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64  {          /* Id
122c0 65 6e 74 69 66 69 65 72 73 20 2a 2f 0a 20 20 20  entifiers */.   
122d0 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63     while( (c= *c
122e0 70 29 21 3d 30 20 26 26 20 28 69 73 61 6c 6e 75  p)!=0 && (isalnu
122f0 6d 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20  m(c) || c=='_') 
12300 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65  ) cp++;.      ne
12310 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d  xtcp = cp;.    }
12320 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 3a 27 20  else if( c==':' 
12330 26 26 20 63 70 5b 31 5d 3d 3d 27 3a 27 20 26 26  && cp[1]==':' &&
12340 20 63 70 5b 32 5d 3d 3d 27 3d 27 20 29 7b 20 2f   cp[2]=='=' ){ /
12350 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 22  * The operator "
12360 3a 3a 3d 22 20 2a 2f 0a 20 20 20 20 20 20 63 70  ::=" */.      cp
12370 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 6e 65 78   += 3;.      nex
12380 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65  tcp = cp;.    }e
12390 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
123b0 20 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65 20   All other (one 
123c0 63 68 61 72 61 63 74 65 72 29 20 6f 70 65 72 61  character) opera
123d0 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 63 70  tors */.      cp
123e0 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70  ++;.      nextcp
123f0 20 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20 20   = cp;.    }.   
12400 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63   c = *cp;.    *c
12410 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12430 20 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   Null terminate 
12440 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20  the token */.   
12450 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 26   parseonetoken(&
12460 70 73 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ps);            
12470 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 74 6f   /* Parse the to
12480 6b 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20 3d  ken */.    *cp =
12490 20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   c;             
124a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
124b0 73 74 6f 72 65 20 74 68 65 20 62 75 66 66 65 72  store the buffer
124c0 20 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65 78   */.    cp = nex
124d0 74 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28  tcp;.  }.  free(
124e0 66 69 6c 65 62 75 66 29 3b 20 20 20 20 20 20 20  filebuf);       
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12500 52 65 6c 65 61 73 65 20 74 68 65 20 62 75 66 66  Release the buff
12510 65 72 20 61 66 74 65 72 20 70 61 72 73 69 6e 67  er after parsing
12520 20 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20 3d   */.  gp->rule =
12530 20 70 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a 20   ps.firstrule;. 
12540 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d 20   gp->errorcnt = 
12550 70 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a 2f  ps.errorcnt;.}./
12560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
12580 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b   the file "plink
12590 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
125a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
125b0 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73   Routines proces
125c0 73 69 6e 67 20 63 6f 6e 66 69 67 75 72 61 74 69  sing configurati
125d0 6f 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72  on follow-set pr
125e0 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a  opagation links.
125f0 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20  ** in the LEMON 
12600 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
12610 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
12620 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b 5f  ct plink *plink_
12630 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a 2f  freelist = 0;../
12640 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
12650 20 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63 74   plink */.struct
12660 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65   plink *Plink_ne
12670 77 28 29 7b 0a 20 20 73 74 72 75 63 74 20 70 6c  w(){.  struct pl
12680 69 6e 6b 20 2a 6e 65 77 3b 0a 0a 20 20 69 66 28  ink *new;..  if(
12690 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d   plink_freelist=
126a0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
126b0 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 31  .    int amt = 1
126c0 30 30 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72  00;.    plink_fr
126d0 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74  eelist = (struct
126e0 20 70 6c 69 6e 6b 20 2a 29 6d 61 6c 6c 6f 63 28   plink *)malloc(
126f0 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 70   sizeof(struct p
12700 6c 69 6e 6b 29 2a 61 6d 74 20 29 3b 0a 20 20 20  link)*amt );.   
12710 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c   if( plink_freel
12720 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
12730 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a  fprintf(stderr,.
12740 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f        "Unable to
12750 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
12760 20 66 6f 72 20 61 20 6e 65 77 20 66 6f 6c 6c 6f   for a new follo
12770 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f  w-set propagatio
12780 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20 20 20  n link.\n");.   
12790 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
127a0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
127b0 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 70 6c 69  <amt-1; i++) pli
127c0 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e  nk_freelist[i].n
127d0 65 78 74 20 3d 20 26 70 6c 69 6e 6b 5f 66 72 65  ext = &plink_fre
127e0 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20  elist[i+1];.    
127f0 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 61  plink_freelist[a
12800 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a  mt-1].next = 0;.
12810 20 20 7d 0a 20 20 6e 65 77 20 3d 20 70 6c 69 6e    }.  new = plin
12820 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 70 6c  k_freelist;.  pl
12830 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 70  ink_freelist = p
12840 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 2d 3e 6e  link_freelist->n
12850 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65  ext;.  return ne
12860 77 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 70  w;.}../* Add a p
12870 6c 69 6e 6b 20 74 6f 20 61 20 70 6c 69 6e 6b 20  link to a plink 
12880 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69  list */.void Pli
12890 6e 6b 5f 61 64 64 28 70 6c 70 70 2c 63 66 70 29  nk_add(plpp,cfp)
128a0 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a  .struct plink **
128b0 70 6c 70 70 3b 0a 73 74 72 75 63 74 20 63 6f 6e  plpp;.struct con
128c0 66 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74  fig *cfp;.{.  st
128d0 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 3b  ruct plink *new;
128e0 0a 20 20 6e 65 77 20 3d 20 50 6c 69 6e 6b 5f 6e  .  new = Plink_n
128f0 65 77 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e 65 78  ew();.  new->nex
12900 74 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c  t = *plpp;.  *pl
12910 70 70 20 3d 20 6e 65 77 3b 0a 20 20 6e 65 77 2d  pp = new;.  new-
12920 3e 63 66 70 20 3d 20 63 66 70 3b 0a 7d 0a 0a 2f  >cfp = cfp;.}../
12930 2a 20 54 72 61 6e 73 66 65 72 20 65 76 65 72 79  * Transfer every
12940 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69   plink on the li
12950 73 74 20 22 66 72 6f 6d 22 20 74 6f 20 74 68 65  st "from" to the
12960 20 6c 69 73 74 20 22 74 6f 22 20 2a 2f 0a 76 6f   list "to" */.vo
12970 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 74 6f  id Plink_copy(to
12980 2c 66 72 6f 6d 29 0a 73 74 72 75 63 74 20 70 6c  ,from).struct pl
12990 69 6e 6b 20 2a 2a 74 6f 3b 0a 73 74 72 75 63 74  ink **to;.struct
129a0 20 70 6c 69 6e 6b 20 2a 66 72 6f 6d 3b 0a 7b 0a   plink *from;.{.
129b0 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
129c0 6e 65 78 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28  nextpl;.  while(
129d0 20 66 72 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78   from ){.    nex
129e0 74 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74  tpl = from->next
129f0 3b 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74  ;.    from->next
12a00 20 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20   = *to;.    *to 
12a10 3d 20 66 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d  = from;.    from
12a20 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d   = nextpl;.  }.}
12a30 0a 0a 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72  ../* Delete ever
12a40 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c  y plink on the l
12a50 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  ist */.void Plin
12a60 6b 5f 64 65 6c 65 74 65 28 70 6c 70 29 0a 73 74  k_delete(plp).st
12a70 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b  ruct plink *plp;
12a80 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  .{.  struct plin
12a90 6b 20 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20 77 68  k *nextpl;..  wh
12aa0 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20  ile( plp ){.    
12ab0 6e 65 78 74 70 6c 20 3d 20 70 6c 70 2d 3e 6e 65  nextpl = plp->ne
12ac0 78 74 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e 65 78  xt;.    plp->nex
12ad0 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  t = plink_freeli
12ae0 73 74 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72  st;.    plink_fr
12af0 65 65 6c 69 73 74 20 3d 20 70 6c 70 3b 0a 20 20  eelist = plp;.  
12b00 20 20 70 6c 70 20 3d 20 6e 65 78 74 70 6c 3b 0a    plp = nextpl;.
12b10 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a    }.}./*********
12b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
12b30 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65  rom the file "re
12b40 70 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  port.c" ********
12b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b60 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 64  **/./*.** Proced
12b70 75 72 65 73 20 66 6f 72 20 67 65 6e 65 72 61 74  ures for generat
12b80 69 6e 67 20 72 65 70 6f 72 74 73 20 61 6e 64 20  ing reports and 
12b90 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45  tables in the LE
12ba0 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
12bb0 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47 65 6e  ator..*/../* Gen
12bc0 65 72 61 74 65 20 61 20 66 69 6c 65 6e 61 6d 65  erate a filename
12bd0 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
12be0 73 75 66 66 69 78 2e 20 20 53 70 61 63 65 20 74  suffix.  Space t
12bf0 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 6e 61  o hold the.** na
12c00 6d 65 20 63 6f 6d 65 73 20 66 72 6f 6d 20 6d 61  me comes from ma
12c10 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
12c20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
12c30 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
12c40 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ion..*/.PRIVATE 
12c50 63 68 61 72 20 2a 66 69 6c 65 5f 6d 61 6b 65 6e  char *file_maken
12c60 61 6d 65 28 6c 65 6d 70 2c 73 75 66 66 69 78 29  ame(lemp,suffix)
12c70 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
12c80 65 6d 70 3b 0a 63 68 61 72 20 2a 73 75 66 66 69  emp;.char *suffi
12c90 78 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d  x;.{.  char *nam
12ca0 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a  e;.  char *cp;..
12cb0 20 20 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28    name = malloc(
12cc0 20 73 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69   strlen(lemp->fi
12cd0 6c 65 6e 61 6d 65 29 20 2b 20 73 74 72 6c 65 6e  lename) + strlen
12ce0 28 73 75 66 66 69 78 29 20 2b 20 35 20 29 3b 0a  (suffix) + 5 );.
12cf0 20 20 69 66 28 20 6e 61 6d 65 3d 3d 30 20 29 7b    if( name==0 ){
12d00 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
12d10 65 72 72 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63  err,"Can't alloc
12d20 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20  ate space for a 
12d30 66 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20  filename.\n");. 
12d40 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
12d50 20 20 73 74 72 63 70 79 28 6e 61 6d 65 2c 6c 65    strcpy(name,le
12d60 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
12d70 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 6e 61   cp = strrchr(na
12d80 6d 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63  me,'.');.  if( c
12d90 70 20 29 20 2a 63 70 20 3d 20 30 3b 0a 20 20 73  p ) *cp = 0;.  s
12da0 74 72 63 61 74 28 6e 61 6d 65 2c 73 75 66 66 69  trcat(name,suffi
12db0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 61 6d  x);.  return nam
12dc0 65 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20  e;.}../* Open a 
12dd0 66 69 6c 65 20 77 69 74 68 20 61 20 6e 61 6d 65  file with a name
12de0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6e 61   based on the na
12df0 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  me of the input 
12e00 66 69 6c 65 2c 0a 2a 2a 20 62 75 74 20 77 69 74  file,.** but wit
12e10 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 28 73  h a different (s
12e20 70 65 63 69 66 69 65 64 29 20 73 75 66 66 69 78  pecified) suffix
12e30 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  , and return a p
12e40 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
12e50 20 73 74 72 65 61 6d 20 2a 2f 0a 50 52 49 56 41   stream */.PRIVA
12e60 54 45 20 46 49 4c 45 20 2a 66 69 6c 65 5f 6f 70  TE FILE *file_op
12e70 65 6e 28 6c 65 6d 70 2c 73 75 66 66 69 78 2c 6d  en(lemp,suffix,m
12e80 6f 64 65 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  ode).struct lemo
12e90 6e 20 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73  n *lemp;.char *s
12ea0 75 66 66 69 78 3b 0a 63 68 61 72 20 2a 6d 6f 64  uffix;.char *mod
12eb0 65 3b 0a 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b  e;.{.  FILE *fp;
12ec0 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75  ..  if( lemp->ou
12ed0 74 6e 61 6d 65 20 29 20 66 72 65 65 28 6c 65 6d  tname ) free(lem
12ee0 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c  p->outname);.  l
12ef0 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66  emp->outname = f
12f00 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d  ile_makename(lem
12f10 70 2c 20 73 75 66 66 69 78 29 3b 0a 20 20 66 70  p, suffix);.  fp
12f20 20 3d 20 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f   = fopen(lemp->o
12f30 75 74 6e 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20  utname,mode);.  
12f40 69 66 28 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f  if( fp==0 && *mo
12f50 64 65 3d 3d 27 77 27 20 29 7b 0a 20 20 20 20 66  de=='w' ){.    f
12f60 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43  printf(stderr,"C
12f70 61 6e 27 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c  an't open file \
12f80 22 25 73 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e  "%s\".\n",lemp->
12f90 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65  outname);.    le
12fa0 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
12fb0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
12fc0 7d 0a 20 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d  }.  return fp;.}
12fd0 0a 0a 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74  ../* Duplicate t
12fe0 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 77 69  he input file wi
12ff0 74 68 6f 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61  thout comments a
13000 6e 64 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f  nd without actio
13010 6e 73 20 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20  ns .** on rules 
13020 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28  */.void Reprint(
13030 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
13040 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74  on *lemp;.{.  st
13050 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20  ruct rule *rp;. 
13060 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
13070 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  sp;.  int i, j, 
13080 6d 61 78 6c 65 6e 2c 20 6c 65 6e 2c 20 6e 63 6f  maxlen, len, nco
13090 6c 75 6d 6e 73 2c 20 73 6b 69 70 3b 0a 20 20 70  lumns, skip;.  p
130a0 72 69 6e 74 66 28 22 2f 2f 20 52 65 70 72 69 6e  rintf("// Reprin
130b0 74 20 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20  t of input file 
130c0 5c 22 25 73 5c 22 2e 5c 6e 2f 2f 20 53 79 6d 62  \"%s\".\n// Symb
130d0 6f 6c 73 3a 5c 6e 22 2c 6c 65 6d 70 2d 3e 66 69  ols:\n",lemp->fi
130e0 6c 65 6e 61 6d 65 29 3b 0a 20 20 6d 61 78 6c 65  lename);.  maxle
130f0 6e 20 3d 20 31 30 3b 0a 20 20 66 6f 72 28 69 3d  n = 10;.  for(i=
13100 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
13110 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70  ol; i++){.    sp
13120 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
13130 5b 69 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  [i];.    len = s
13140 74 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b  trlen(sp->name);
13150 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78  .    if( len>max
13160 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c  len ) maxlen = l
13170 65 6e 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d  en;.  }.  ncolum
13180 6e 73 20 3d 20 37 36 2f 28 6d 61 78 6c 65 6e 2b  ns = 76/(maxlen+
13190 35 29 3b 0a 20 20 69 66 28 20 6e 63 6f 6c 75 6d  5);.  if( ncolum
131a0 6e 73 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e 73 20  ns<1 ) ncolumns 
131b0 3d 20 31 3b 0a 20 20 73 6b 69 70 20 3d 20 28 6c  = 1;.  skip = (l
131c0 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e  emp->nsymbol + n
131d0 63 6f 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f  columns - 1)/nco
131e0 6c 75 6d 6e 73 3b 0a 20 20 66 6f 72 28 69 3d 30  lumns;.  for(i=0
131f0 3b 20 69 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a  ; i<skip; i++){.
13200 20 20 20 20 70 72 69 6e 74 66 28 22 2f 2f 22 29      printf("//")
13210 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a  ;.    for(j=i; j
13220 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
13230 6a 2b 3d 73 6b 69 70 29 7b 0a 20 20 20 20 20 20  j+=skip){.      
13240 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
13250 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73  ls[j];.      ass
13260 65 72 74 28 20 73 70 2d 3e 69 6e 64 65 78 3d 3d  ert( sp->index==
13270 6a 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74  j );.      print
13280 66 28 22 20 25 33 64 20 25 2d 2a 2e 2a 73 22 2c  f(" %3d %-*.*s",
13290 6a 2c 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c  j,maxlen,maxlen,
132a0 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  sp->name);.    }
132b0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22  .    printf("\n"
132c0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d  );.  }.  for(rp=
132d0 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
132e0 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
132f0 20 20 70 72 69 6e 74 66 28 22 25 73 22 2c 72 70    printf("%s",rp
13300 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 2f 2a  ->lhs->name);./*
13310 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61      if( rp->lhsa
13320 6c 69 61 73 20 29 20 70 72 69 6e 74 66 28 22 28  lias ) printf("(
13330 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61 6c 69 61  %s)",rp->lhsalia
13340 73 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74  s); */.    print
13350 66 28 22 20 3a 3a 3d 22 29 3b 0a 20 20 20 20 66  f(" ::=");.    f
13360 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
13370 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
13380 70 72 69 6e 74 66 28 22 20 25 73 22 2c 72 70 2d  printf(" %s",rp-
13390 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a  >rhs[i]->name);.
133a0 2f 2a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e  /*      if( rp->
133b0 72 68 73 61 6c 69 61 73 5b 69 5d 20 29 20 70 72  rhsalias[i] ) pr
133c0 69 6e 74 66 28 22 28 25 73 29 22 2c 72 70 2d 3e  intf("(%s)",rp->
133d0 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 20 2a 2f  rhsalias[i]); */
133e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74  .    }.    print
133f0 66 28 22 2e 22 29 3b 0a 20 20 20 20 69 66 28 20  f(".");.    if( 
13400 72 70 2d 3e 70 72 65 63 73 79 6d 20 29 20 70 72  rp->precsym ) pr
13410 69 6e 74 66 28 22 20 5b 25 73 5d 22 2c 72 70 2d  intf(" [%s]",rp-
13420 3e 70 72 65 63 73 79 6d 2d 3e 6e 61 6d 65 29 3b  >precsym->name);
13430 0a 2f 2a 20 20 20 20 69 66 28 20 72 70 2d 3e 63  ./*    if( rp->c
13440 6f 64 65 20 29 20 70 72 69 6e 74 66 28 22 5c 6e  ode ) printf("\n
13450 20 20 20 20 25 73 22 2c 72 70 2d 3e 63 6f 64 65      %s",rp->code
13460 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66  ); */.    printf
13470 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 76  ("\n");.  }.}..v
13480 6f 69 64 20 43 6f 6e 66 69 67 50 72 69 6e 74 28  oid ConfigPrint(
13490 66 70 2c 63 66 70 29 0a 46 49 4c 45 20 2a 66 70  fp,cfp).FILE *fp
134a0 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
134b0 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74  *cfp;.{.  struct
134c0 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e 74   rule *rp;.  int
134d0 20 69 3b 0a 20 20 72 70 20 3d 20 63 66 70 2d 3e   i;.  rp = cfp->
134e0 72 70 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70  rp;.  fprintf(fp
134f0 2c 22 25 73 20 3a 3a 3d 22 2c 72 70 2d 3e 6c 68  ,"%s ::=",rp->lh
13500 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  s->name);.  for(
13510 69 3d 30 3b 20 69 3c 3d 72 70 2d 3e 6e 72 68 73  i=0; i<=rp->nrhs
13520 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
13530 69 3d 3d 63 66 70 2d 3e 64 6f 74 20 29 20 66 70  i==cfp->dot ) fp
13540 72 69 6e 74 66 28 66 70 2c 22 20 2a 22 29 3b 0a  rintf(fp," *");.
13550 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e      if( i==rp->n
13560 72 68 73 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  rhs ) break;.   
13570 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73   fprintf(fp," %s
13580 22 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61  ",rp->rhs[i]->na
13590 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 23  me);.  }.}../* #
135a0 64 65 66 69 6e 65 20 54 45 53 54 20 2a 2f 0a 23  define TEST */.#
135b0 69 66 64 65 66 20 54 45 53 54 0a 2f 2a 20 50 72  ifdef TEST./* Pr
135c0 69 6e 74 20 61 20 73 65 74 20 2a 2f 0a 50 52 49  int a set */.PRI
135d0 56 41 54 45 20 76 6f 69 64 20 53 65 74 50 72 69  VATE void SetPri
135e0 6e 74 28 6f 75 74 2c 73 65 74 2c 6c 65 6d 70 29  nt(out,set,lemp)
135f0 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 63 68 61 72  .FILE *out;.char
13600 20 2a 73 65 74 3b 0a 73 74 72 75 63 74 20 6c 65   *set;.struct le
13610 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69  mon *lemp;.{.  i
13620 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 73 70  nt i;.  char *sp
13630 61 63 65 72 3b 0a 20 20 73 70 61 63 65 72 20 3d  acer;.  spacer =
13640 20 22 22 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f   "";.  fprintf(o
13650 75 74 2c 22 25 31 32 73 5b 22 2c 22 22 29 3b 0a  ut,"%12s[","");.
13660 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
13670 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b  p->nterminal; i+
13680 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 65 74 46  +){.    if( SetF
13690 69 6e 64 28 73 65 74 2c 69 29 20 29 7b 0a 20 20  ind(set,i) ){.  
136a0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
136b0 22 25 73 25 73 22 2c 73 70 61 63 65 72 2c 6c 65  "%s%s",spacer,le
136c0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
136d0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 70 61  name);.      spa
136e0 63 65 72 20 3d 20 22 20 22 3b 0a 20 20 20 20 7d  cer = " ";.    }
136f0 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
13700 75 74 2c 22 5d 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a  ut,"]\n");.}../*
13710 20 50 72 69 6e 74 20 61 20 70 6c 69 6e 6b 20 63   Print a plink c
13720 68 61 69 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20  hain */.PRIVATE 
13730 76 6f 69 64 20 50 6c 69 6e 6b 50 72 69 6e 74 28  void PlinkPrint(
13740 6f 75 74 2c 70 6c 70 2c 74 61 67 29 0a 46 49 4c  out,plp,tag).FIL
13750 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20 70  E *out;.struct p
13760 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 63 68 61 72 20  link *plp;.char 
13770 2a 74 61 67 3b 0a 7b 0a 20 20 77 68 69 6c 65 28  *tag;.{.  while(
13780 20 70 6c 70 20 29 7b 0a 20 20 20 20 66 70 72 69   plp ){.    fpri
13790 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 25 73 20  ntf(out,"%12s%s 
137a0 28 73 74 61 74 65 20 25 32 64 29 20 22 2c 22 22  (state %2d) ",""
137b0 2c 74 61 67 2c 70 6c 70 2d 3e 63 66 70 2d 3e 73  ,tag,plp->cfp->s
137c0 74 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  tp->index);.    
137d0 43 6f 6e 66 69 67 50 72 69 6e 74 28 6f 75 74 2c  ConfigPrint(out,
137e0 70 6c 70 2d 3e 63 66 70 29 3b 0a 20 20 20 20 66  plp->cfp);.    f
137f0 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29  printf(out,"\n")
13800 3b 0a 20 20 20 20 70 6c 70 20 3d 20 70 6c 70 2d  ;.    plp = plp-
13810 3e 6e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  >next;.  }.}.#en
13820 64 69 66 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 6e  dif../* Print an
13830 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 67   action to the g
13840 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
13850 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 46 41  ptor.  Return FA
13860 4c 53 45 20 69 66 0a 2a 2a 20 6e 6f 74 68 69 6e  LSE if.** nothin
13870 67 20 77 61 73 20 61 63 74 75 61 6c 6c 79 20 70  g was actually p
13880 72 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 50  rinted..*/.int P
13890 72 69 6e 74 41 63 74 69 6f 6e 28 73 74 72 75 63  rintAction(struc
138a0 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20 46 49  t action *ap, FI
138b0 4c 45 20 2a 66 70 2c 20 69 6e 74 20 69 6e 64 65  LE *fp, int inde
138c0 6e 74 29 7b 0a 20 20 69 6e 74 20 72 65 73 75 6c  nt){.  int resul
138d0 74 20 3d 20 31 3b 0a 20 20 73 77 69 74 63 68 28  t = 1;.  switch(
138e0 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20 20   ap->type ){.   
138f0 20 63 61 73 65 20 53 48 49 46 54 3a 0a 20 20 20   case SHIFT:.   
13900 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
13910 2a 73 20 73 68 69 66 74 20 20 25 64 22 2c 69 6e  *s shift  %d",in
13920 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
13930 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e 69 6e 64  e,ap->x.stp->ind
13940 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
13950 3b 0a 20 20 20 20 63 61 73 65 20 52 45 44 55 43  ;.    case REDUC
13960 45 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  E:.      fprintf
13970 28 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20  (fp,"%*s reduce 
13980 25 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73  %d",indent,ap->s
13990 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70  p->name,ap->x.rp
139a0 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
139b0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
139c0 41 43 43 45 50 54 3a 0a 20 20 20 20 20 20 66 70  ACCEPT:.      fp
139d0 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 61 63  rintf(fp,"%*s ac
139e0 63 65 70 74 22 2c 69 6e 64 65 6e 74 2c 61 70 2d  cept",indent,ap-
139f0 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  >sp->name);.    
13a00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
13a10 65 20 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 66  e ERROR:.      f
13a20 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 65  printf(fp,"%*s e
13a30 72 72 6f 72 22 2c 69 6e 64 65 6e 74 2c 61 70 2d  rror",indent,ap-
13a40 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  >sp->name);.    
13a50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
13a60 65 20 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20  e CONFLICT:.    
13a70 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a    fprintf(fp,"%*
13a80 73 20 72 65 64 75 63 65 20 25 2d 33 64 20 2a 2a  s reduce %-3d **
13a90 20 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63   Parsing conflic
13aa0 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20 20 20 69  t **",.        i
13ab0 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61  ndent,ap->sp->na
13ac0 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64  me,ap->x.rp->ind
13ad0 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
13ae0 3b 0a 20 20 20 20 63 61 73 65 20 53 48 5f 52 45  ;.    case SH_RE
13af0 53 4f 4c 56 45 44 3a 0a 20 20 20 20 63 61 73 65  SOLVED:.    case
13b00 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20   RD_RESOLVED:.  
13b10 20 20 63 61 73 65 20 4e 4f 54 5f 55 53 45 44 3a    case NOT_USED:
13b20 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20  .      result = 
13b30 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
13b40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
13b50 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72  ult;.}../* Gener
13b60 61 74 65 20 74 68 65 20 22 79 2e 6f 75 74 70 75  ate the "y.outpu
13b70 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 76  t" log file */.v
13b80 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74  oid ReportOutput
13b90 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65  (lemp).struct le
13ba0 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69  mon *lemp;.{.  i
13bb0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
13bc0 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72  tate *stp;.  str
13bd0 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
13be0 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
13bf0 20 2a 61 70 3b 0a 20 20 46 49 4c 45 20 2a 66 70   *ap;.  FILE *fp
13c00 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65 5f 6f  ;..  fp = file_o
13c10 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74 22 2c  pen(lemp,".out",
13c20 22 77 22 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d  "w");.  if( fp==
13c30 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 70  0 ) return;.  fp
13c40 72 69 6e 74 66 28 66 70 2c 22 20 5c 62 22 29 3b  rintf(fp," \b");
13c50 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
13c60 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
13c70 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  {.    stp = lemp
13c80 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
13c90 20 66 70 72 69 6e 74 66 28 66 70 2c 22 53 74 61   fprintf(fp,"Sta
13ca0 74 65 20 25 64 3a 5c 6e 22 2c 73 74 70 2d 3e 69  te %d:\n",stp->i
13cb0 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 6c  ndex);.    if( l
13cc0 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29  emp->basisflag )
13cd0 20 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a 20 20   cfp=stp->bp;.  
13ce0 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
13cf0 20 20 20 20 20 20 20 20 63 66 70 3d 73 74 70 2d          cfp=stp-
13d00 3e 63 66 70 3b 0a 20 20 20 20 77 68 69 6c 65 28  >cfp;.    while(
13d10 20 63 66 70 20 29 7b 0a 20 20 20 20 20 20 63 68   cfp ){.      ch
13d20 61 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20 20 20  ar buf[20];.    
13d30 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3d 3d    if( cfp->dot==
13d40 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 7b  cfp->rp->nrhs ){
13d50 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
13d60 28 62 75 66 2c 22 28 25 64 29 22 2c 63 66 70 2d  (buf,"(%d)",cfp-
13d70 3e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  >rp->index);.   
13d80 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
13d90 22 20 20 20 20 25 35 73 20 22 2c 62 75 66 29 3b  "    %5s ",buf);
13da0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13db0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
13dc0 2c 22 20 20 20 20 20 20 20 20 20 20 22 29 3b 0a  ,"          ");.
13dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 43 6f        }.      Co
13de0 6e 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66 70  nfigPrint(fp,cfp
13df0 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
13e00 28 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 64 65  (fp,"\n");.#ifde
13e10 66 20 54 45 53 54 0a 20 20 20 20 20 20 53 65 74  f TEST.      Set
13e20 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66 77  Print(fp,cfp->fw
13e30 73 2c 6c 65 6d 70 29 3b 0a 20 20 20 20 20 20 50  s,lemp);.      P
13e40 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66 70  linkPrint(fp,cfp
13e50 2d 3e 66 70 6c 70 2c 22 54 6f 20 20 22 29 3b 0a  ->fplp,"To  ");.
13e60 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e 74        PlinkPrint
13e70 28 66 70 2c 63 66 70 2d 3e 62 70 6c 70 2c 22 46  (fp,cfp->bplp,"F
13e80 72 6f 6d 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rom");.#endif.  
13e90 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62 61      if( lemp->ba
13ea0 73 69 73 66 6c 61 67 20 29 20 63 66 70 3d 63 66  sisflag ) cfp=cf
13eb0 70 2d 3e 62 70 3b 0a 20 20 20 20 20 20 65 6c 73  p->bp;.      els
13ec0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
13ed0 20 20 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74     cfp=cfp->next
13ee0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
13ef0 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20  ntf(fp,"\n");.  
13f00 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
13f10 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
13f20 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50 72  t){.      if( Pr
13f30 69 6e 74 41 63 74 69 6f 6e 28 61 70 2c 66 70 2c  intAction(ap,fp,
13f40 33 30 29 20 29 20 66 70 72 69 6e 74 66 28 66 70  30) ) fprintf(fp
13f50 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ,"\n");.    }.  
13f60 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e    fprintf(fp,"\n
13f70 22 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  ");.  }.  fclose
13f80 28 66 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  (fp);.  return;.
13f90 7d 0a 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  }../* Search for
13fa0 20 74 68 65 20 66 69 6c 65 20 22 6e 61 6d 65 22   the file "name"
13fb0 20 77 68 69 63 68 20 69 73 20 69 6e 20 74 68 65   which is in the
13fc0 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
13fd0 61 73 0a 2a 2a 20 74 68 65 20 65 78 61 63 75 74  as.** the exacut
13fe0 61 62 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45 20  able */.PRIVATE 
13ff0 63 68 61 72 20 2a 70 61 74 68 73 65 61 72 63 68  char *pathsearch
14000 28 61 72 67 76 30 2c 6e 61 6d 65 2c 6d 6f 64 65  (argv0,name,mode
14010 6d 61 73 6b 29 0a 63 68 61 72 20 2a 61 72 67 76  mask).char *argv
14020 30 3b 0a 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 69  0;.char *name;.i
14030 6e 74 20 6d 6f 64 65 6d 61 73 6b 3b 0a 7b 0a 20  nt modemask;.{. 
14040 20 63 68 61 72 20 2a 70 61 74 68 6c 69 73 74 3b   char *pathlist;
14050 0a 20 20 63 68 61 72 20 2a 70 61 74 68 2c 2a 63  .  char *path,*c
14060 70 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 65  p;.  char c;.  e
14070 78 74 65 72 6e 20 69 6e 74 20 61 63 63 65 73 73  xtern int access
14080 28 29 3b 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49  ();..#ifdef __WI
14090 4e 33 32 5f 5f 0a 20 20 63 70 20 3d 20 73 74 72  N32__.  cp = str
140a0 72 63 68 72 28 61 72 67 76 30 2c 27 5c 5c 27 29  rchr(argv0,'\\')
140b0 3b 0a 23 65 6c 73 65 0a 20 20 63 70 20 3d 20 73  ;.#else.  cp = s
140c0 74 72 72 63 68 72 28 61 72 67 76 30 2c 27 2f 27  trrchr(argv0,'/'
140d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
140e0 63 70 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 63  cp ){.    c = *c
140f0 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a  p;.    *cp = 0;.
14100 20 20 20 20 70 61 74 68 20 3d 20 28 63 68 61 72      path = (char
14110 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65   *)malloc( strle
14120 6e 28 61 72 67 76 30 29 20 2b 20 73 74 72 6c 65  n(argv0) + strle
14130 6e 28 6e 61 6d 65 29 20 2b 20 32 20 29 3b 0a 20  n(name) + 2 );. 
14140 20 20 20 69 66 28 20 70 61 74 68 20 29 20 73 70     if( path ) sp
14150 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73 2f 25  rintf(path,"%s/%
14160 73 22 2c 61 72 67 76 30 2c 6e 61 6d 65 29 3b 0a  s",argv0,name);.
14170 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 7d      *cp = c;.  }
14180 65 6c 73 65 7b 0a 20 20 20 20 65 78 74 65 72 6e  else{.    extern
14190 20 63 68 61 72 20 2a 67 65 74 65 6e 76 28 29 3b   char *getenv();
141a0 0a 20 20 20 20 70 61 74 68 6c 69 73 74 20 3d 20  .    pathlist = 
141b0 67 65 74 65 6e 76 28 22 50 41 54 48 22 29 3b 0a  getenv("PATH");.
141c0 20 20 20 20 69 66 28 20 70 61 74 68 6c 69 73 74      if( pathlist
141d0 3d 3d 30 20 29 20 70 61 74 68 6c 69 73 74 20 3d  ==0 ) pathlist =
141e0 20 22 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f 62 69   ".:/bin:/usr/bi
141f0 6e 22 3b 0a 20 20 20 20 70 61 74 68 20 3d 20 28  n";.    path = (
14200 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 73  char *)malloc( s
14210 74 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 2b  trlen(pathlist)+
14220 73 74 72 6c 65 6e 28 6e 61 6d 65 29 2b 32 20 29  strlen(name)+2 )
14230 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68 21 3d  ;.    if( path!=
14240 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  0 ){.      while
14250 28 20 2a 70 61 74 68 6c 69 73 74 20 29 7b 0a 20  ( *pathlist ){. 
14260 20 20 20 20 20 20 20 63 70 20 3d 20 73 74 72 63         cp = strc
14270 68 72 28 70 61 74 68 6c 69 73 74 2c 27 3a 27 29  hr(pathlist,':')
14280 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 70  ;.        if( cp
14290 3d 3d 30 20 29 20 63 70 20 3d 20 26 70 61 74 68  ==0 ) cp = &path
142a0 6c 69 73 74 5b 73 74 72 6c 65 6e 28 70 61 74 68  list[strlen(path
142b0 6c 69 73 74 29 5d 3b 0a 20 20 20 20 20 20 20 20  list)];.        
142c0 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20 20  c = *cp;.       
142d0 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 20 20   *cp = 0;.      
142e0 20 20 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22    sprintf(path,"
142f0 25 73 2f 25 73 22 2c 70 61 74 68 6c 69 73 74 2c  %s/%s",pathlist,
14300 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 2a  name);.        *
14310 63 70 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  cp = c;.        
14320 69 66 28 20 63 3d 3d 30 20 29 20 70 61 74 68 6c  if( c==0 ) pathl
14330 69 73 74 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  ist = "";.      
14340 20 20 65 6c 73 65 20 70 61 74 68 6c 69 73 74 20    else pathlist 
14350 3d 20 26 63 70 5b 31 5d 3b 0a 20 20 20 20 20 20  = &cp[1];.      
14360 20 20 69 66 28 20 61 63 63 65 73 73 28 70 61 74    if( access(pat
14370 68 2c 6d 6f 64 65 6d 61 73 6b 29 3d 3d 30 20 29  h,modemask)==0 )
14380 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
14390 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
143a0 72 6e 20 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 47  rn path;.}../* G
143b0 69 76 65 6e 20 61 6e 20 61 63 74 69 6f 6e 2c 20  iven an action, 
143c0 63 6f 6d 70 75 74 65 20 74 68 65 20 69 6e 74 65  compute the inte
143d0 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ger value for th
143e0 61 74 20 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69  at action.** whi
143f0 63 68 20 69 73 20 74 6f 20 62 65 20 70 75 74 20  ch is to be put 
14400 69 6e 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  in the action ta
14410 62 6c 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ble of the gener
14420 61 74 65 64 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  ated machine..**
14430 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
14440 20 69 66 20 6e 6f 20 61 63 74 69 6f 6e 20 73 68   if no action sh
14450 6f 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74 65  ould be generate
14460 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e  d..*/.PRIVATE in
14470 74 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e  t compute_action
14480 28 6c 65 6d 70 2c 61 70 29 0a 73 74 72 75 63 74  (lemp,ap).struct
14490 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 73 74   lemon *lemp;.st
144a0 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b  ruct action *ap;
144b0 0a 7b 0a 20 20 69 6e 74 20 61 63 74 3b 0a 20 20  .{.  int act;.  
144c0 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70 65  switch( ap->type
144d0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48 49   ){.    case SHI
144e0 46 54 3a 20 20 61 63 74 20 3d 20 61 70 2d 3e 78  FT:  act = ap->x
144f0 2e 73 74 70 2d 3e 69 6e 64 65 78 3b 20 20 20 20  .stp->index;    
14500 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
14510 3b 0a 20 20 20 20 63 61 73 65 20 52 45 44 55 43  ;.    case REDUC
14520 45 3a 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e 72  E: act = ap->x.r
14530 70 2d 3e 69 6e 64 65 78 20 2b 20 6c 65 6d 70 2d  p->index + lemp-
14540 3e 6e 73 74 61 74 65 3b 20 62 72 65 61 6b 3b 0a  >nstate; break;.
14550 20 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a 20      case ERROR: 
14560 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74   act = lemp->nst
14570 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c  ate + lemp->nrul
14580 65 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  e;     break;.  
14590 20 20 63 61 73 65 20 41 43 43 45 50 54 3a 20 61    case ACCEPT: a
145a0 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  ct = lemp->nstat
145b0 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20  e + lemp->nrule 
145c0 2b 20 31 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  + 1; break;.    
145d0 64 65 66 61 75 6c 74 3a 20 20 20 20 20 61 63 74  default:     act
145e0 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 0a 20 20   = -1; break;.  
145f0 7d 0a 20 20 72 65 74 75 72 6e 20 61 63 74 3b 0a  }.  return act;.
14600 7d 0a 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45 53  }..#define LINES
14610 49 5a 45 20 31 30 30 30 0a 2f 2a 20 54 68 65 20  IZE 1000./* The 
14620 6e 65 78 74 20 63 6c 75 73 74 65 72 20 6f 66 20  next cluster of 
14630 72 6f 75 74 69 6e 65 73 20 61 72 65 20 66 6f 72  routines are for
14640 20 72 65 61 64 69 6e 67 20 74 68 65 20 74 65 6d   reading the tem
14650 70 6c 61 74 65 20 66 69 6c 65 0a 2a 2a 20 61 6e  plate file.** an
14660 64 20 77 72 69 74 69 6e 67 20 74 68 65 20 72 65  d writing the re
14670 73 75 6c 74 73 20 74 6f 20 74 68 65 20 67 65 6e  sults to the gen
14680 65 72 61 74 65 64 20 70 61 72 73 65 72 20 2a 2f  erated parser */
14690 0a 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 75  ./* The first fu
146a0 6e 63 74 69 6f 6e 20 74 72 61 6e 73 66 65 72 73  nction transfers
146b0 20 64 61 74 61 20 66 72 6f 6d 20 22 69 6e 22 20   data from "in" 
146c0 74 6f 20 22 6f 75 74 22 20 75 6e 74 69 6c 0a 2a  to "out" until.*
146d0 2a 20 61 20 6c 69 6e 65 20 69 73 20 73 65 65 6e  * a line is seen
146e0 20 77 68 69 63 68 20 62 65 67 69 6e 73 20 77 69   which begins wi
146f0 74 68 20 22 25 25 22 2e 20 20 54 68 65 20 6c 69  th "%%".  The li
14700 6e 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20  ne number is.** 
14710 74 72 61 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 69  tracked..**.** i
14720 66 20 6e 61 6d 65 21 3d 30 2c 20 74 68 65 6e 20  f name!=0, then 
14730 61 6e 79 20 77 6f 72 64 20 74 68 61 74 20 62 65  any word that be
14740 67 69 6e 20 77 69 74 68 20 22 50 61 72 73 65 22  gin with "Parse"
14750 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 2a   is changed to.*
14760 2a 20 62 65 67 69 6e 20 77 69 74 68 20 2a 6e 61  * begin with *na
14770 6d 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 50  me instead..*/.P
14780 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74  RIVATE void tplt
14790 5f 78 66 65 72 28 6e 61 6d 65 2c 69 6e 2c 6f 75  _xfer(name,in,ou
147a0 74 2c 6c 69 6e 65 6e 6f 29 0a 63 68 61 72 20 2a  t,lineno).char *
147b0 6e 61 6d 65 3b 0a 46 49 4c 45 20 2a 69 6e 3b 0a  name;.FILE *in;.
147c0 46 49 4c 45 20 2a 6f 75 74 3b 0a 69 6e 74 20 2a  FILE *out;.int *
147d0 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 6e 74 20  lineno;.{.  int 
147e0 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 63 68 61  i, iStart;.  cha
147f0 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d  r line[LINESIZE]
14800 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74 73  ;.  while( fgets
14810 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69  (line,LINESIZE,i
14820 6e 29 20 26 26 20 28 6c 69 6e 65 5b 30 5d 21 3d  n) && (line[0]!=
14830 27 25 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d 21 3d  '%' || line[1]!=
14840 27 25 27 29 20 29 7b 0a 20 20 20 20 28 2a 6c 69  '%') ){.    (*li
14850 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69 53 74  neno)++;.    iSt
14860 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  art = 0;.    if(
14870 20 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 66   name ){.      f
14880 6f 72 28 69 3d 30 3b 20 6c 69 6e 65 5b 69 5d 3b  or(i=0; line[i];
14890 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
148a0 66 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50 27 20  f( line[i]=='P' 
148b0 26 26 20 73 74 72 6e 63 6d 70 28 26 6c 69 6e 65  && strncmp(&line
148c0 5b 69 5d 2c 22 50 61 72 73 65 22 2c 35 29 3d 3d  [i],"Parse",5)==
148d0 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
148e0 69 3d 3d 30 20 7c 7c 20 21 69 73 61 6c 70 68 61  i==0 || !isalpha
148f0 28 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a 20 20 20  (line[i-1])).   
14900 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
14910 20 20 69 66 28 20 69 3e 69 53 74 61 72 74 20 29    if( i>iStart )
14920 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e   fprintf(out,"%.
14930 2a 73 22 2c 69 2d 69 53 74 61 72 74 2c 26 6c 69  *s",i-iStart,&li
14940 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 20  ne[iStart]);.   
14950 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
14960 75 74 2c 22 25 73 22 2c 6e 61 6d 65 29 3b 0a 20  ut,"%s",name);. 
14970 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b           i += 4;
14980 0a 20 20 20 20 20 20 20 20 20 20 69 53 74 61 72  .          iStar
14990 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20  t = i+1;.       
149a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
149b0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
149c0 2c 22 25 73 22 2c 26 6c 69 6e 65 5b 69 53 74 61  ,"%s",&line[iSta
149d0 72 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  rt]);.  }.}../* 
149e0 54 68 65 20 6e 65 78 74 20 66 75 6e 63 74 69 6f  The next functio
149f0 6e 20 66 69 6e 64 73 20 74 68 65 20 74 65 6d 70  n finds the temp
14a00 6c 61 74 65 20 66 69 6c 65 20 61 6e 64 20 6f 70  late file and op
14a10 65 6e 73 20 69 74 2c 20 72 65 74 75 72 6e 69 6e  ens it, returnin
14a20 67 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  g.** a pointer t
14a30 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c  o the opened fil
14a40 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20 46 49  e. */.PRIVATE FI
14a50 4c 45 20 2a 74 70 6c 74 5f 6f 70 65 6e 28 6c 65  LE *tplt_open(le
14a60 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
14a70 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 61 74   *lemp;.{.  stat
14a80 69 63 20 63 68 61 72 20 74 65 6d 70 6c 61 74 65  ic char template
14a90 6e 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d 70 61 72  name[] = "lempar
14aa0 2e 63 22 3b 0a 20 20 63 68 61 72 20 62 75 66 5b  .c";.  char buf[
14ab0 31 30 30 30 5d 3b 0a 20 20 46 49 4c 45 20 2a 69  1000];.  FILE *i
14ac0 6e 3b 0a 20 20 63 68 61 72 20 2a 74 70 6c 74 6e  n;.  char *tpltn
14ad0 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b  ame;.  char *cp;
14ae0 0a 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72  ..  cp = strrchr
14af0 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
14b00 27 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20 29  '.');.  if( cp )
14b10 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 62 75  {.    sprintf(bu
14b20 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28 69 6e 74  f,"%.*s.lt",(int
14b30 29 28 63 70 2d 6c 65 6d 70 2d 3e 66 69 6c 65 6e  )(cp-lemp->filen
14b40 61 6d 65 29 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  ame),lemp->filen
14b50 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
14b60 20 20 20 73 70 72 69 6e 74 66 28 62 75 66 2c 22     sprintf(buf,"
14b70 25 73 2e 6c 74 22 2c 6c 65 6d 70 2d 3e 66 69 6c  %s.lt",lemp->fil
14b80 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66  ename);.  }.  if
14b90 28 20 61 63 63 65 73 73 28 62 75 66 2c 30 30 34  ( access(buf,004
14ba0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74  )==0 ){.    tplt
14bb0 6e 61 6d 65 20 3d 20 62 75 66 3b 0a 20 20 7d 65  name = buf;.  }e
14bc0 6c 73 65 20 69 66 28 20 61 63 63 65 73 73 28 74  lse if( access(t
14bd0 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34 29  emplatename,004)
14be0 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74 6e  ==0 ){.    tpltn
14bf0 61 6d 65 20 3d 20 74 65 6d 70 6c 61 74 65 6e 61  ame = templatena
14c00 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  me;.  }else{.   
14c10 20 74 70 6c 74 6e 61 6d 65 20 3d 20 70 61 74 68   tpltname = path
14c20 73 65 61 72 63 68 28 6c 65 6d 70 2d 3e 61 72 67  search(lemp->arg
14c30 76 30 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c  v0,templatename,
14c40 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 70  0);.  }.  if( tp
14c50 6c 74 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  ltname==0 ){.   
14c60 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14c70 22 43 61 6e 27 74 20 66 69 6e 64 20 74 68 65 20  "Can't find the 
14c80 70 61 72 73 65 72 20 64 72 69 76 65 72 20 74 65  parser driver te
14c90 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73  mplate file \"%s
14ca0 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 74 65 6d 70  \".\n",.    temp
14cb0 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c  latename);.    l
14cc0 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
14cd0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
14ce0 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28   }.  in = fopen(
14cf0 74 70 6c 74 6e 61 6d 65 2c 22 72 22 29 3b 0a 20  tpltname,"r");. 
14d00 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
14d10 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
14d20 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68 65  ,"Can't open the
14d30 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c   template file \
14d40 22 25 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70 6c 61  "%s\".\n",templa
14d50 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d  tename);.    lem
14d60 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
14d70 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
14d80 0a 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a 7d 0a  .  return in;.}.
14d90 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 74 72 69  ./* Print a stri
14da0 6e 67 20 74 6f 20 74 68 65 20 66 69 6c 65 20 61  ng to the file a
14db0 6e 64 20 6b 65 65 70 20 74 68 65 20 6c 69 6e 65  nd keep the line
14dc0 6e 75 6d 62 65 72 20 75 70 20 74 6f 20 64 61 74  number up to dat
14dd0 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  e */.PRIVATE voi
14de0 64 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74  d tplt_print(out
14df0 2c 6c 65 6d 70 2c 73 74 72 2c 73 74 72 6c 6e 2c  ,lemp,str,strln,
14e00 6c 69 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a 6f 75  lineno).FILE *ou
14e10 74 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  t;.struct lemon 
14e20 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73 74 72  *lemp;.char *str
14e30 3b 0a 69 6e 74 20 73 74 72 6c 6e 3b 0a 69 6e 74  ;.int strln;.int
14e40 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 66   *lineno;.{.  if
14e50 28 20 73 74 72 3d 3d 30 20 29 20 72 65 74 75 72  ( str==0 ) retur
14e60 6e 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  n;.  fprintf(out
14e70 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c  ,"#line %d \"%s\
14e80 22 5c 6e 22 2c 73 74 72 6c 6e 2c 6c 65 6d 70 2d  "\n",strln,lemp-
14e90 3e 66 69 6c 65 6e 61 6d 65 29 3b 20 28 2a 6c 69  >filename); (*li
14ea0 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 77 68 69 6c 65  neno)++;.  while
14eb0 28 20 2a 73 74 72 20 29 7b 0a 20 20 20 20 69 66  ( *str ){.    if
14ec0 28 20 2a 73 74 72 3d 3d 27 5c 6e 27 20 29 20 28  ( *str=='\n' ) (
14ed0 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20  *lineno)++;.    
14ee0 70 75 74 63 28 2a 73 74 72 2c 6f 75 74 29 3b 0a  putc(*str,out);.
14ef0 20 20 20 20 73 74 72 2b 2b 3b 0a 20 20 7d 0a 20      str++;.  }. 
14f00 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e   fprintf(out,"\n
14f10 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c  #line %d \"%s\"\
14f20 6e 22 2c 2a 6c 69 6e 65 6e 6f 2b 32 2c 6c 65 6d  n",*lineno+2,lem
14f30 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 28 2a 6c  p->outname); (*l
14f40 69 6e 65 6e 6f 29 2b 3d 32 3b 0a 20 20 72 65 74  ineno)+=2;.  ret
14f50 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
14f60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
14f70 69 6e 65 20 65 6d 69 74 73 20 63 6f 64 65 20 66  ine emits code f
14f80 6f 72 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  or the destructo
14f90 72 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 79 6d  r for the.** sym
14fa0 62 6f 6c 20 73 70 0a 2a 2f 0a 76 6f 69 64 20 65  bol sp.*/.void e
14fb0 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63  mit_destructor_c
14fc0 6f 64 65 28 6f 75 74 2c 73 70 2c 6c 65 6d 70 2c  ode(out,sp,lemp,
14fd0 6c 69 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a 6f 75  lineno).FILE *ou
14fe0 74 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  t;.struct symbol
14ff0 20 2a 73 70 3b 0a 73 74 72 75 63 74 20 6c 65 6d   *sp;.struct lem
15000 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20 2a 6c  on *lemp;.int *l
15010 69 6e 65 6e 6f 3b 0a 7b 0a 20 63 68 61 72 20 2a  ineno;.{. char *
15020 63 70 3b 0a 0a 20 69 6e 74 20 6c 69 6e 65 63 6e  cp;.. int linecn
15030 74 20 3d 20 30 3b 0a 20 69 66 28 20 73 70 2d 3e  t = 0;. if( sp->
15040 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 29  type==TERMINAL )
15050 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e  {.   cp = lemp->
15060 74 6f 6b 65 6e 64 65 73 74 3b 0a 20 20 20 69 66  tokendest;.   if
15070 28 20 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( cp==0 ) return
15080 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  ;.   fprintf(out
15090 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c  ,"#line %d \"%s\
150a0 22 5c 6e 7b 22 2c 6c 65 6d 70 2d 3e 74 6f 6b 65  "\n{",lemp->toke
150b0 6e 64 65 73 74 6c 6e 2c 6c 65 6d 70 2d 3e 66 69  ndestln,lemp->fi
150c0 6c 65 6e 61 6d 65 29 3b 0a 20 7d 65 6c 73 65 20  lename);. }else 
150d0 69 66 28 20 73 70 2d 3e 64 65 73 74 72 75 63 74  if( sp->destruct
150e0 6f 72 20 29 7b 0a 20 20 20 63 70 20 3d 20 73 70  or ){.   cp = sp
150f0 2d 3e 64 65 73 74 72 75 63 74 6f 72 3b 0a 20 20  ->destructor;.  
15100 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 6c   fprintf(out,"#l
15110 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c 6e 7b  ine %d \"%s\"\n{
15120 22 2c 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72  ",sp->destructor
15130 6c 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  ln,lemp->filenam
15140 65 29 3b 0a 20 7d 65 6c 73 65 20 69 66 28 20 6c  e);. }else if( l
15150 65 6d 70 2d 3e 76 61 72 64 65 73 74 20 29 7b 0a  emp->vardest ){.
15160 20 20 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61     cp = lemp->va
15170 72 64 65 73 74 3b 0a 20 20 20 69 66 28 20 63 70  rdest;.   if( cp
15180 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
15190 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 6c   fprintf(out,"#l
151a0 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c 6e 7b  ine %d \"%s\"\n{
151b0 22 2c 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74 6c  ",lemp->vardestl
151c0 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  n,lemp->filename
151d0 29 3b 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a 63 70  );. }. for(; *cp
151e0 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 69 66 28 20  ; cp++){.   if( 
151f0 2a 63 70 3d 3d 27 24 27 20 26 26 20 63 70 5b 31  *cp=='$' && cp[1
15200 5d 3d 3d 27 24 27 20 29 7b 0a 20 20 20 20 20 66  ]=='$' ){.     f
15210 70 72 69 6e 74 66 28 6f 75 74 2c 22 28 79 79 70  printf(out,"(yyp
15220 6d 69 6e 6f 72 2d 3e 79 79 25 64 29 22 2c 73 70  minor->yy%d)",sp
15230 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20 63  ->dtnum);.     c
15240 70 2b 2b 3b 0a 20 20 20 20 20 63 6f 6e 74 69 6e  p++;.     contin
15250 75 65 3b 0a 20 20 20 7d 0a 20 20 20 69 66 28 20  ue;.   }.   if( 
15260 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65  *cp=='\n' ) line
15270 63 6e 74 2b 2b 3b 0a 20 20 20 66 70 75 74 63 28  cnt++;.   fputc(
15280 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20 28 2a  *cp,out);. }. (*
15290 6c 69 6e 65 6e 6f 29 20 2b 3d 20 33 20 2b 20 6c  lineno) += 3 + l
152a0 69 6e 65 63 6e 74 3b 0a 20 66 70 72 69 6e 74 66  inecnt;. fprintf
152b0 28 6f 75 74 2c 22 7d 5c 6e 23 6c 69 6e 65 20 25  (out,"}\n#line %
152c0 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 2a 6c 69 6e  d \"%s\"\n",*lin
152d0 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  eno,lemp->outnam
152e0 65 29 3b 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a  e);. return;.}..
152f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
15300 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66 20  E (non-zero) if 
15310 74 68 65 20 67 69 76 65 6e 20 73 79 6d 62 6f 6c  the given symbol
15320 20 68 61 73 20 61 20 64 65 73 74 72 75 63 74 6f   has a destructo
15330 72 2e 0a 2a 2f 0a 69 6e 74 20 68 61 73 5f 64 65  r..*/.int has_de
15340 73 74 72 75 63 74 6f 72 28 73 70 2c 20 6c 65 6d  structor(sp, lem
15350 70 29 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  p).struct symbol
15360 20 2a 73 70 3b 0a 73 74 72 75 63 74 20 6c 65 6d   *sp;.struct lem
15370 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e  on *lemp;.{.  in
15380 74 20 72 65 74 3b 0a 20 20 69 66 28 20 73 70 2d  t ret;.  if( sp-
15390 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20  >type==TERMINAL 
153a0 29 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c 65 6d  ){.    ret = lem
153b0 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 21 3d 30 3b  p->tokendest!=0;
153c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
153d0 74 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73  t = lemp->vardes
153e0 74 21 3d 30 20 7c 7c 20 73 70 2d 3e 64 65 73 74  t!=0 || sp->dest
153f0 72 75 63 74 6f 72 21 3d 30 3b 0a 20 20 7d 0a 20  ructor!=0;.  }. 
15400 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
15410 2f 2a 20 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  /* .** Generate 
15420 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
15430 74 65 73 20 77 68 65 6e 20 74 68 65 20 72 75 6c  tes when the rul
15440 65 20 22 72 70 22 20 69 73 20 72 65 64 75 63 65  e "rp" is reduce
15450 64 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74 68 65  d.  Write.** the
15460 20 63 6f 64 65 20 74 6f 20 22 6f 75 74 22 2e 20   code to "out". 
15470 20 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e 65 6e   Make sure linen
15480 6f 20 73 74 61 79 73 20 75 70 2d 74 6f 2d 64 61  o stays up-to-da
15490 74 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76  te..*/.PRIVATE v
154a0 6f 69 64 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75  oid emit_code(ou
154b0 74 2c 72 70 2c 6c 65 6d 70 2c 6c 69 6e 65 6e 6f  t,rp,lemp,lineno
154c0 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72  ).FILE *out;.str
154d0 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 73 74  uct rule *rp;.st
154e0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
154f0 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b  ;.int *lineno;.{
15500 0a 20 63 68 61 72 20 2a 63 70 2c 20 2a 78 70 3b  . char *cp, *xp;
15510 0a 20 69 6e 74 20 6c 69 6e 65 63 6e 74 20 3d 20  . int linecnt = 
15520 30 3b 0a 20 69 6e 74 20 69 3b 0a 20 63 68 61 72  0;. int i;. char
15530 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 20 20 20   lhsused = 0;   
15540 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
15550 4c 48 53 20 65 6c 65 6d 65 6e 74 20 68 61 73 20  LHS element has 
15560 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20 63 68  been used */. ch
15570 61 72 20 75 73 65 64 5b 4d 41 58 52 48 53 5d 3b  ar used[MAXRHS];
15580 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 65     /* True for e
15590 61 63 68 20 52 48 53 20 65 6c 65 6d 65 6e 74 20  ach RHS element 
155a0 77 68 69 63 68 20 69 73 20 75 73 65 64 20 2a 2f  which is used */
155b0 0a 0a 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70  .. for(i=0; i<rp
155c0 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 20 75 73 65  ->nrhs; i++) use
155d0 64 5b 69 5d 20 3d 20 30 3b 0a 20 6c 68 73 75 73  d[i] = 0;. lhsus
155e0 65 64 20 3d 20 30 3b 0a 0a 20 2f 2a 20 47 65 6e  ed = 0;.. /* Gen
155f0 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64 6f  erate code to do
15600 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74 69   the reduce acti
15610 6f 6e 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 63  on */. if( rp->c
15620 6f 64 65 20 29 7b 0a 20 20 20 66 70 72 69 6e 74  ode ){.   fprint
15630 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25 64 20  f(out,"#line %d 
15640 5c 22 25 73 5c 22 5c 6e 7b 22 2c 72 70 2d 3e 6c  \"%s\"\n{",rp->l
15650 69 6e 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  ine,lemp->filena
15660 6d 65 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d 72  me);.   for(cp=r
15670 70 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20 63 70  p->code; *cp; cp
15680 2b 2b 29 7b 0a 20 20 20 20 20 69 66 28 20 69 73  ++){.     if( is
15690 61 6c 70 68 61 28 2a 63 70 29 20 26 26 20 28 63  alpha(*cp) && (c
156a0 70 3d 3d 72 70 2d 3e 63 6f 64 65 20 7c 7c 20 28  p==rp->code || (
156b0 21 69 73 61 6c 6e 75 6d 28 63 70 5b 2d 31 5d 29  !isalnum(cp[-1])
156c0 20 26 26 20 63 70 5b 2d 31 5d 21 3d 27 5f 27 29   && cp[-1]!='_')
156d0 29 20 29 7b 0a 20 20 20 20 20 20 20 63 68 61 72  ) ){.       char
156e0 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20 66   saved;.       f
156f0 6f 72 28 78 70 3d 20 26 63 70 5b 31 5d 3b 20 69  or(xp= &cp[1]; i
15700 73 61 6c 6e 75 6d 28 2a 78 70 29 20 7c 7c 20 2a  salnum(*xp) || *
15710 78 70 3d 3d 27 5f 27 3b 20 78 70 2b 2b 29 3b 0a  xp=='_'; xp++);.
15720 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a         saved = *
15730 78 70 3b 0a 20 20 20 20 20 20 20 2a 78 70 20 3d  xp;.       *xp =
15740 20 30 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72   0;.       if( r
15750 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20 73  p->lhsalias && s
15760 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 6c 68 73  trcmp(cp,rp->lhs
15770 61 6c 69 61 73 29 3d 3d 30 20 29 7b 0a 20 20 20  alias)==0 ){.   
15780 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
15790 74 2c 22 79 79 67 6f 74 6f 6d 69 6e 6f 72 2e 79  t,"yygotominor.y
157a0 79 25 64 22 2c 72 70 2d 3e 6c 68 73 2d 3e 64 74  y%d",rp->lhs->dt
157b0 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 63  num);.         c
157c0 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20 20 20  p = xp;.        
157d0 20 6c 68 73 75 73 65 64 20 3d 20 31 3b 0a 20 20   lhsused = 1;.  
157e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
157f0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15800 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a  rp->nrhs; i++){.
15810 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
15820 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 26  p->rhsalias[i] &
15830 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e  & strcmp(cp,rp->
15840 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30 20  rhsalias[i])==0 
15850 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
15860 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 79 79 6d  fprintf(out,"yym
15870 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79 25  sp[%d].minor.yy%
15880 64 22 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31 2c  d",i-rp->nrhs+1,
15890 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 64 74 6e 75  rp->rhs[i]->dtnu
158a0 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  m);.            
158b0 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20   cp = xp;.      
158c0 20 20 20 20 20 20 20 75 73 65 64 5b 69 5d 20 3d         used[i] =
158d0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
158e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
158f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 7d 0a     }.         }.
15900 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15910 2a 78 70 20 3d 20 73 61 76 65 64 3b 0a 20 20 20  *xp = saved;.   
15920 20 20 7d 0a 20 20 20 20 20 69 66 28 20 2a 63 70    }.     if( *cp
15930 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 63 6e 74  =='\n' ) linecnt
15940 2b 2b 3b 0a 20 20 20 20 20 66 70 75 74 63 28 2a  ++;.     fputc(*
15950 63 70 2c 6f 75 74 29 3b 0a 20 20 20 7d 20 2f 2a  cp,out);.   } /*
15960 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   End loop */.   
15970 28 2a 6c 69 6e 65 6e 6f 29 20 2b 3d 20 33 20 2b  (*lineno) += 3 +
15980 20 6c 69 6e 65 63 6e 74 3b 0a 20 20 20 66 70 72   linecnt;.   fpr
15990 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 23 6c 69  intf(out,"}\n#li
159a0 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c 6e 22 2c  ne %d \"%s\"\n",
159b0 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75  *lineno,lemp->ou
159c0 74 6e 61 6d 65 29 3b 0a 20 7d 20 2f 2a 20 45 6e  tname);. } /* En
159d0 64 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 20 29  d if( rp->code )
159e0 20 2a 2f 0a 0a 20 2f 2a 20 43 68 65 63 6b 20 74   */.. /* Check t
159f0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
15a00 4c 48 53 20 68 61 73 20 62 65 65 6e 20 75 73 65  LHS has been use
15a10 64 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 6c 68  d */. if( rp->lh
15a20 73 61 6c 69 61 73 20 26 26 20 21 6c 68 73 75 73  salias && !lhsus
15a30 65 64 20 29 7b 0a 20 20 20 45 72 72 6f 72 4d 73  ed ){.   ErrorMs
15a40 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  g(lemp->filename
15a50 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a 20  ,rp->ruleline,. 
15a60 20 20 20 20 22 4c 61 62 65 6c 20 5c 22 25 73 5c      "Label \"%s\
15a70 22 20 66 6f 72 20 5c 22 25 73 28 25 73 29 5c 22  " for \"%s(%s)\"
15a80 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 22   is never used."
15a90 2c 0a 20 20 20 20 20 20 20 72 70 2d 3e 6c 68 73  ,.       rp->lhs
15aa0 61 6c 69 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e 6e  alias,rp->lhs->n
15ab0 61 6d 65 2c 72 70 2d 3e 6c 68 73 61 6c 69 61 73  ame,rp->lhsalias
15ac0 29 3b 0a 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f  );.   lemp->erro
15ad0 72 63 6e 74 2b 2b 3b 0a 20 7d 0a 0a 20 2f 2a 20  rcnt++;. }.. /* 
15ae0 47 65 6e 65 72 61 74 65 20 64 65 73 74 72 75 63  Generate destruc
15af0 74 6f 72 20 63 6f 64 65 20 66 6f 72 20 52 48 53  tor code for RHS
15b00 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20 61   symbols which a
15b10 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 74  re not used in t
15b20 68 65 0a 20 2a 2a 20 72 65 64 75 63 65 20 63 6f  he. ** reduce co
15b30 64 65 20 2a 2f 0a 20 66 6f 72 28 69 3d 30 3b 20  de */. for(i=0; 
15b40 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  i<rp->nrhs; i++)
15b50 7b 0a 20 20 20 69 66 28 20 72 70 2d 3e 72 68 73  {.   if( rp->rhs
15b60 61 6c 69 61 73 5b 69 5d 20 26 26 20 21 75 73 65  alias[i] && !use
15b70 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20 45 72 72  d[i] ){.     Err
15b80 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65  orMsg(lemp->file
15b90 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e  name,rp->rulelin
15ba0 65 2c 0a 20 20 20 20 20 20 20 22 4c 61 62 65 6c  e,.       "Label
15bb0 20 25 73 20 66 6f 72 20 5c 22 25 73 28 25 73 29   %s for \"%s(%s)
15bc0 5c 22 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  \" is never used
15bd0 2e 22 2c 0a 20 20 20 20 20 20 20 72 70 2d 3e 72  .",.       rp->r
15be0 68 73 61 6c 69 61 73 5b 69 5d 2c 72 70 2d 3e 72  hsalias[i],rp->r
15bf0 68 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 72 70 2d 3e  hs[i]->name,rp->
15c00 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 0a 20 20  rhsalias[i]);.  
15c10 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e     lemp->errorcn
15c20 74 2b 2b 3b 0a 20 20 20 7d 65 6c 73 65 20 69 66  t++;.   }else if
15c30 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69  ( rp->rhsalias[i
15c40 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 69 66 28  ]==0 ){.     if(
15c50 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28   has_destructor(
15c60 72 70 2d 3e 72 68 73 5b 69 5d 2c 6c 65 6d 70 29  rp->rhs[i],lemp)
15c70 20 29 7b 0a 20 20 20 20 20 20 20 66 70 72 69 6e   ){.       fprin
15c80 74 66 28 6f 75 74 2c 22 20 20 79 79 5f 64 65 73  tf(out,"  yy_des
15c90 74 72 75 63 74 6f 72 28 25 64 2c 26 79 79 6d 73  tructor(%d,&yyms
15ca0 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29 3b 5c 6e 22  p[%d].minor);\n"
15cb0 2c 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ,.          rp->
15cc0 72 68 73 5b 69 5d 2d 3e 69 6e 64 65 78 2c 69 2d  rhs[i]->index,i-
15cd0 72 70 2d 3e 6e 72 68 73 2b 31 29 3b 20 28 2a 6c  rp->nrhs+1); (*l
15ce0 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 7d  ineno)++;.     }
15cf0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 66 70 72  else{.       fpr
15d00 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
15d10 20 20 2f 2a 20 4e 6f 20 64 65 73 74 72 75 63 74    /* No destruct
15d20 6f 72 20 64 65 66 69 6e 65 64 20 66 6f 72 20 25  or defined for %
15d30 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s */\n",.       
15d40 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d   rp->rhs[i]->nam
15d50 65 29 3b 0a 20 20 20 20 20 20 20 20 28 2a 6c 69  e);.        (*li
15d60 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 7d 0a  neno)++;.     }.
15d70 20 20 20 7d 0a 20 7d 0a 20 72 65 74 75 72 6e 3b     }. }. return;
15d80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  .}../*.** Print 
15d90 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f  the definition o
15da0 66 20 74 68 65 20 75 6e 69 6f 6e 20 75 73 65 64  f the union used
15db0 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72 27   for the parser'
15dc0 73 20 64 61 74 61 20 73 74 61 63 6b 2e 0a 2a 2a  s data stack..**
15dd0 20 54 68 69 73 20 75 6e 69 6f 6e 20 63 6f 6e 74   This union cont
15de0 61 69 6e 73 20 66 69 65 6c 64 73 20 66 6f 72 20  ains fields for 
15df0 65 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20 64  every possible d
15e00 61 74 61 20 74 79 70 65 20 66 6f 72 20 74 6f 6b  ata type for tok
15e10 65 6e 73 0a 2a 2a 20 61 6e 64 20 6e 6f 6e 74 65  ens.** and nonte
15e20 72 6d 69 6e 61 6c 73 2e 20 20 49 6e 20 74 68 65  rminals.  In the
15e30 20 70 72 6f 63 65 73 73 20 6f 66 20 63 6f 6d 70   process of comp
15e40 75 74 69 6e 67 20 61 6e 64 20 70 72 69 6e 74 69  uting and printi
15e50 6e 67 20 74 68 69 73 0a 2a 2a 20 75 6e 69 6f 6e  ng this.** union
15e60 2c 20 61 6c 73 6f 20 73 65 74 20 74 68 65 20 22  , also set the "
15e70 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f 66  .dtnum" field of
15e80 20 65 76 65 72 79 20 74 65 72 6d 69 6e 61 6c 20   every terminal 
15e90 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 0a  and nonterminal.
15ea0 2a 2a 20 73 79 6d 62 6f 6c 2e 0a 2a 2f 0a 76 6f  ** symbol..*/.vo
15eb0 69 64 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75  id print_stack_u
15ec0 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c 70 6c  nion(out,lemp,pl
15ed0 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 0a 46 49  ineno,mhflag).FI
15ee0 4c 45 20 2a 6f 75 74 3b 20 20 20 20 20 20 20 20  LE *out;        
15ef0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
15f00 20 6f 75 74 70 75 74 20 73 74 72 65 61 6d 20 2a   output stream *
15f10 2f 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  /.struct lemon *
15f20 6c 65 6d 70 3b 20 20 20 20 20 20 20 20 20 2f 2a  lemp;         /*
15f30 20 54 68 65 20 6d 61 69 6e 20 69 6e 66 6f 20 73   The main info s
15f40 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 69  tructure for thi
15f50 73 20 70 61 72 73 65 72 20 2a 2f 0a 69 6e 74 20  s parser */.int 
15f60 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20  *plineno;       
15f70 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
15f80 65 72 20 74 6f 20 74 68 65 20 6c 69 6e 65 20 6e  er to the line n
15f90 75 6d 62 65 72 20 2a 2f 0a 69 6e 74 20 6d 68 66  umber */.int mhf
15fa0 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  lag;            
15fb0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
15fc0 67 65 6e 65 72 61 74 69 6e 67 20 6d 61 6b 65 68  generating makeh
15fd0 65 61 64 65 72 73 20 6f 75 74 70 75 74 20 2a 2f  eaders output */
15fe0 0a 7b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20  .{.  int lineno 
15ff0 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20 20 2f  = *plineno;    /
16000 2a 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65  * The line numbe
16010 72 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74 20  r of the output 
16020 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 74 79 70 65  */.  char **type
16030 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s;             /
16040 2a 20 41 20 68 61 73 68 20 74 61 62 6c 65 20 6f  * A hash table o
16050 66 20 64 61 74 61 74 79 70 65 73 20 2a 2f 0a 20  f datatypes */. 
16060 20 69 6e 74 20 61 72 72 61 79 73 69 7a 65 3b 20   int arraysize; 
16070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
16080 7a 65 20 6f 66 20 74 68 65 20 22 74 79 70 65 73  ze of the "types
16090 22 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  " array */.  int
160a0 20 6d 61 78 64 74 6c 65 6e 67 74 68 3b 20 20 20   maxdtlength;   
160b0 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75         /* Maximu
160c0 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61 6e 79 20  m length of any 
160d0 22 2e 64 61 74 61 74 79 70 65 22 20 66 69 65 6c  ".datatype" fiel
160e0 64 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73 74  d. */.  char *st
160f0 64 64 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ddt;            
16100 20 20 2f 2a 20 53 74 61 6e 64 61 72 64 69 7a 65    /* Standardize
16110 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 64 61 74  d name for a dat
16120 61 74 79 70 65 20 2a 2f 0a 20 20 69 6e 74 20 69  atype */.  int i
16130 2c 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ,j;             
16140 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
16150 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 68  nters */.  int h
16160 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ash;            
16170 20 20 20 20 20 2f 2a 20 46 6f 72 20 68 61 73 68       /* For hash
16180 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ing the name of 
16190 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72  a type */.  char
161a0 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20   *name;         
161b0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
161c0 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 0a   the parser */..
161d0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e    /* Allocate an
161e0 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 79 70  d initialize typ
161f0 65 73 5b 5d 20 61 6e 64 20 61 6c 6c 6f 63 61 74  es[] and allocat
16200 65 20 73 74 64 64 74 5b 5d 20 2a 2f 0a 20 20 61  e stddt[] */.  a
16210 72 72 61 79 73 69 7a 65 20 3d 20 6c 65 6d 70 2d  rraysize = lemp-
16220 3e 6e 73 79 6d 62 6f 6c 20 2a 20 32 3b 0a 20 20  >nsymbol * 2;.  
16230 74 79 70 65 73 20 3d 20 28 63 68 61 72 2a 2a 29  types = (char**)
16240 6d 61 6c 6c 6f 63 28 20 61 72 72 61 79 73 69 7a  malloc( arraysiz
16250 65 20 2a 20 73 69 7a 65 6f 66 28 63 68 61 72 2a  e * sizeof(char*
16260 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ) );.  for(i=0; 
16270 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b  i<arraysize; i++
16280 29 20 74 79 70 65 73 5b 69 5d 20 3d 20 30 3b 0a  ) types[i] = 0;.
16290 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d 20    maxdtlength = 
162a0 30 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76  0;.  if( lemp->v
162b0 61 72 74 79 70 65 20 29 7b 0a 20 20 20 20 6d 61  artype ){.    ma
162c0 78 64 74 6c 65 6e 67 74 68 20 3d 20 73 74 72 6c  xdtlength = strl
162d0 65 6e 28 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65  en(lemp->vartype
162e0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
162f0 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
16300 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  l; i++){.    int
16310 20 6c 65 6e 3b 0a 20 20 20 20 73 74 72 75 63 74   len;.    struct
16320 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65   symbol *sp = le
16330 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a  mp->symbols[i];.
16340 20 20 20 20 69 66 28 20 73 70 2d 3e 64 61 74 61      if( sp->data
16350 74 79 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  type==0 ) contin
16360 75 65 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74  ue;.    len = st
16370 72 6c 65 6e 28 73 70 2d 3e 64 61 74 61 74 79 70  rlen(sp->datatyp
16380 65 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e  e);.    if( len>
16390 6d 61 78 64 74 6c 65 6e 67 74 68 20 29 20 6d 61  maxdtlength ) ma
163a0 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 3b  xdtlength = len;
163b0 0a 20 20 7d 0a 20 20 73 74 64 64 74 20 3d 20 28  .  }.  stddt = (
163c0 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 6d 61  char*)malloc( ma
163d0 78 64 74 6c 65 6e 67 74 68 2a 32 20 2b 20 31 20  xdtlength*2 + 1 
163e0 29 3b 0a 20 20 69 66 28 20 74 79 70 65 73 3d 3d  );.  if( types==
163f0 30 20 7c 7c 20 73 74 64 64 74 3d 3d 30 20 29 7b  0 || stddt==0 ){
16400 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
16410 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f  err,"Out of memo
16420 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  ry.\n");.    exi
16430 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  t(1);.  }..  /* 
16440 42 75 69 6c 64 20 61 20 68 61 73 68 20 74 61 62  Build a hash tab
16450 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65 73 2e  le of datatypes.
16460 20 54 68 65 20 22 2e 64 74 6e 75 6d 22 20 66 69   The ".dtnum" fi
16470 65 6c 64 20 6f 66 20 65 61 63 68 20 73 79 6d 62  eld of each symb
16480 6f 6c 0a 20 20 2a 2a 20 69 73 20 66 69 6c 6c 65  ol.  ** is fille
16490 64 20 69 6e 20 77 69 74 68 20 74 68 65 20 68 61  d in with the ha
164a0 73 68 20 69 6e 64 65 78 20 70 6c 75 73 20 31 2e  sh index plus 1.
164b0 20 20 41 20 22 2e 64 74 6e 75 6d 22 20 76 61 6c    A ".dtnum" val
164c0 75 65 20 6f 66 20 30 20 69 73 0a 20 20 2a 2a 20  ue of 0 is.  ** 
164d0 75 73 65 64 20 66 6f 72 20 74 65 72 6d 69 6e 61  used for termina
164e0 6c 20 73 79 6d 62 6f 6c 73 2e 20 20 49 66 20 74  l symbols.  If t
164f0 68 65 72 65 20 69 73 20 6e 6f 20 25 64 65 66 61  here is no %defa
16500 75 6c 74 5f 74 79 70 65 20 64 65 66 69 6e 65 64  ult_type defined
16510 20 74 68 65 6e 0a 20 20 2a 2a 20 30 20 69 73 20   then.  ** 0 is 
16520 61 6c 73 6f 20 75 73 65 64 20 61 73 20 74 68 65  also used as the
16530 20 2e 64 74 6e 75 6d 20 76 61 6c 75 65 20 66 6f   .dtnum value fo
16540 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 77  r nonterminals w
16550 68 69 63 68 20 64 6f 20 6e 6f 74 20 73 70 65 63  hich do not spec
16560 69 66 79 0a 20 20 2a 2a 20 61 20 64 61 74 61 74  ify.  ** a datat
16570 79 70 65 20 75 73 69 6e 67 20 74 68 65 20 25 74  ype using the %t
16580 79 70 65 20 64 69 72 65 63 74 69 76 65 2e 0a 20  ype directive.. 
16590 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
165a0 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
165b0 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  i++){.    struct
165c0 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65   symbol *sp = le
165d0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a  mp->symbols[i];.
165e0 20 20 20 20 63 68 61 72 20 2a 63 70 3b 0a 20 20      char *cp;.  
165f0 20 20 69 66 28 20 73 70 3d 3d 6c 65 6d 70 2d 3e    if( sp==lemp->
16600 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20  errsym ){.      
16610 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 61 72 72 61  sp->dtnum = arra
16620 79 73 69 7a 65 2b 31 3b 0a 20 20 20 20 20 20 63  ysize+1;.      c
16630 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
16640 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65 21     if( sp->type!
16650 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c 20  =NONTERMINAL || 
16660 28 73 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30  (sp->datatype==0
16670 20 26 26 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70   && lemp->vartyp
16680 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73  e==0) ){.      s
16690 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20 20  p->dtnum = 0;.  
166a0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
166b0 20 20 7d 0a 20 20 20 20 63 70 20 3d 20 73 70 2d    }.    cp = sp-
166c0 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20 20 69  >datatype;.    i
166d0 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20 3d 20  f( cp==0 ) cp = 
166e0 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3b 0a 20  lemp->vartype;. 
166f0 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 77 68     j = 0;.    wh
16700 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 63 70  ile( isspace(*cp
16710 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 77 68  ) ) cp++;.    wh
16720 69 6c 65 28 20 2a 63 70 20 29 20 73 74 64 64 74  ile( *cp ) stddt
16730 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b 0a 20  [j++] = *cp++;. 
16740 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26     while( j>0 &&
16750 20 69 73 73 70 61 63 65 28 73 74 64 64 74 5b 6a   isspace(stddt[j
16760 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20 20 20  -1]) ) j--;.    
16770 73 74 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a 20 20  stddt[j] = 0;.  
16780 20 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 20 20    hash = 0;.    
16790 66 6f 72 28 6a 3d 30 3b 20 73 74 64 64 74 5b 6a  for(j=0; stddt[j
167a0 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 68  ]; j++){.      h
167b0 61 73 68 20 3d 20 68 61 73 68 2a 35 33 20 2b 20  ash = hash*53 + 
167c0 73 74 64 64 74 5b 6a 5d 3b 0a 20 20 20 20 7d 0a  stddt[j];.    }.
167d0 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68      hash = (hash
167e0 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25 61   & 0x7fffffff)%a
167f0 72 72 61 79 73 69 7a 65 3b 0a 20 20 20 20 77 68  rraysize;.    wh
16800 69 6c 65 28 20 74 79 70 65 73 5b 68 61 73 68 5d  ile( types[hash]
16810 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
16820 72 63 6d 70 28 74 79 70 65 73 5b 68 61 73 68 5d  rcmp(types[hash]
16830 2c 73 74 64 64 74 29 3d 3d 30 20 29 7b 0a 20 20  ,stddt)==0 ){.  
16840 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20        sp->dtnum 
16850 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20 20 20 20  = hash + 1;.    
16860 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
16870 20 7d 0a 20 20 20 20 20 20 68 61 73 68 2b 2b 3b   }.      hash++;
16880 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 68 3e  .      if( hash>
16890 3d 61 72 72 61 79 73 69 7a 65 20 29 20 68 61 73  =arraysize ) has
168a0 68 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  h = 0;.    }.   
168b0 20 69 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d   if( types[hash]
168c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 70 2d  ==0 ){.      sp-
168d0 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20  >dtnum = hash + 
168e0 31 3b 0a 20 20 20 20 20 20 74 79 70 65 73 5b 68  1;.      types[h
168f0 61 73 68 5d 20 3d 20 28 63 68 61 72 2a 29 6d 61  ash] = (char*)ma
16900 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 73 74 64  lloc( strlen(std
16910 64 74 29 2b 31 20 29 3b 0a 20 20 20 20 20 20 69  dt)+1 );.      i
16920 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d 3d  f( types[hash]==
16930 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  0 ){.        fpr
16940 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74  intf(stderr,"Out
16950 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b   of memory.\n");
16960 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29  .        exit(1)
16970 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16980 73 74 72 63 70 79 28 74 79 70 65 73 5b 68 61 73  strcpy(types[has
16990 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20 20 20 7d  h],stddt);.    }
169a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e 74  .  }..  /* Print
169b0 20 6f 75 74 20 74 68 65 20 64 65 66 69 6e 69 74   out the definit
169c0 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45 4e 54 59  ion of YYTOKENTY
169d0 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f 52 54 59  PE and YYMINORTY
169e0 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d 20 6c  PE */.  name = l
169f0 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70  emp->name ? lemp
16a00 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22  ->name : "Parse"
16a10 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c  ;.  lineno = *pl
16a20 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20 6d 68 66  ineno;.  if( mhf
16a30 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66 28 6f  lag ){ fprintf(o
16a40 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43  ut,"#if INTERFAC
16a50 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  E\n"); lineno++;
16a60 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
16a70 2c 22 23 64 65 66 69 6e 65 20 25 73 54 4f 4b 45  ,"#define %sTOKE
16a80 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e 61 6d 65  NTYPE %s\n",name
16a90 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 6f 6b 65  ,.    lemp->toke
16aa0 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f 6b 65  ntype?lemp->toke
16ab0 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22 29 3b 20  ntype:"void*"); 
16ac0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66 28   lineno++;.  if(
16ad0 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69 6e   mhflag ){ fprin
16ae0 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e  tf(out,"#endif\n
16af0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a  "); lineno++; }.
16b00 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 74    fprintf(out,"t
16b10 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 5c 6e  ypedef union {\n
16b20 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
16b30 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 25  fprintf(out,"  %
16b40 73 54 4f 4b 45 4e 54 59 50 45 20 79 79 30 3b 5c  sTOKENTYPE yy0;\
16b50 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f  n",name); lineno
16b60 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ++;.  for(i=0; i
16b70 3c 61 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b 29  <arraysize; i++)
16b80 7b 0a 20 20 20 20 69 66 28 20 74 79 70 65 73 5b  {.    if( types[
16b90 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  i]==0 ) continue
16ba0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
16bb0 74 2c 22 20 20 25 73 20 79 79 25 64 3b 5c 6e 22  t,"  %s yy%d;\n"
16bc0 2c 74 79 70 65 73 5b 69 5d 2c 69 2b 31 29 3b 20  ,types[i],i+1); 
16bd0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72  lineno++;.    fr
16be0 65 65 28 74 79 70 65 73 5b 69 5d 29 3b 0a 20 20  ee(types[i]);.  
16bf0 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
16c00 22 20 20 69 6e 74 20 79 79 25 64 3b 5c 6e 22 2c  "  int yy%d;\n",
16c10 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64 74  lemp->errsym->dt
16c20 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  num); lineno++;.
16c30 20 20 66 72 65 65 28 73 74 64 64 74 29 3b 0a 20    free(stddt);. 
16c40 20 66 72 65 65 28 74 79 70 65 73 29 3b 0a 20 20   free(types);.  
16c50 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 20 59  fprintf(out,"} Y
16c60 59 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e 22 29 3b  YMINORTYPE;\n");
16c70 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a 70 6c   lineno++;.  *pl
16c80 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b 0a  ineno = lineno;.
16c90 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
16ca0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 43 20  the name of a C 
16cb0 64 61 74 61 74 79 70 65 20 61 62 6c 65 20 74 6f  datatype able to
16cc0 20 72 65 70 72 65 73 65 6e 74 20 76 61 6c 75 65   represent value
16cd0 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 6c 77 72  s between.** lwr
16ce0 20 61 6e 64 20 75 70 72 2c 20 69 6e 63 6c 75 73   and upr, inclus
16cf0 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ive..*/.static c
16d00 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e 69 6d  onst char *minim
16d10 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e 74  um_size_type(int
16d20 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 29 7b 0a   lwr, int upr){.
16d30 20 20 69 66 28 20 6c 77 72 3e 3d 30 20 29 7b 0a    if( lwr>=0 ){.
16d40 20 20 20 20 69 66 28 20 75 70 72 3c 3d 32 35 35      if( upr<=255
16d50 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16d60 20 22 75 6e 73 69 67 6e 65 64 20 63 68 61 72 22   "unsigned char"
16d70 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
16d80 75 70 72 3c 36 35 35 33 35 20 29 7b 0a 20 20 20  upr<65535 ){.   
16d90 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67     return "unsig
16da0 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 22 3b 0a  ned short int";.
16db0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16dc0 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67 6e 65   return "unsigne
16dd0 64 20 69 6e 74 22 3b 0a 20 20 20 20 7d 0a 20 20  d int";.    }.  
16de0 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d  }else if( lwr>=-
16df0 31 32 37 20 26 26 20 75 70 72 3c 3d 31 32 37 20  127 && upr<=127 
16e00 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22 73  ){.    return "s
16e10 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20 20 7d  igned char";.  }
16e20 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d 33  else if( lwr>=-3
16e30 32 37 36 37 20 26 26 20 75 70 72 3c 33 32 37 36  2767 && upr<3276
16e40 37 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  7 ){.    return 
16e50 22 73 68 6f 72 74 22 3b 0a 20 20 7d 65 6c 73 65  "short";.  }else
16e60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22 69 6e  {.    return "in
16e70 74 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  t";.  }.}../*.**
16e80 20 45 61 63 68 20 73 74 61 74 65 20 63 6f 6e 74   Each state cont
16e90 61 69 6e 73 20 61 20 73 65 74 20 6f 66 20 74 6f  ains a set of to
16ea0 6b 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ken transaction 
16eb0 61 6e 64 20 61 20 73 65 74 20 6f 66 0a 2a 2a 20  and a set of.** 
16ec0 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 74 72 61 6e  nonterminal tran
16ed0 73 61 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 20  sactions.  Each 
16ee0 6f 66 20 74 68 65 73 65 20 73 65 74 73 20 6d 61  of these sets ma
16ef0 6b 65 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 0a  kes an instance.
16f00 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
16f10 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
16f20 41 6e 20 61 72 72 61 79 20 6f 66 20 74 68 65 73  An array of thes
16f30 65 20 73 74 72 75 63 74 75 72 65 73 20 69 73 20  e structures is 
16f40 75 73 65 64 0a 2a 2a 20 74 6f 20 6f 72 64 65 72  used.** to order
16f50 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66   the creation of
16f60 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
16f70 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62 6c  yy_action[] tabl
16f80 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 61 78 73  e..*/.struct axs
16f90 65 74 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74  et {.  struct st
16fa0 61 74 65 20 2a 73 74 70 3b 20 20 20 2f 2a 20 41  ate *stp;   /* A
16fb0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74   pointer to a st
16fc0 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54  ate */.  int isT
16fd0 6b 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  kn;           /*
16fe0 20 54 72 75 65 20 74 6f 20 75 73 65 20 74 6f 6b   True to use tok
16ff0 65 6e 73 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ens.  False for 
17000 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 2a 2f  non-terminals */
17010 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b 20  .  int nAction; 
17020 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
17030 72 20 6f 66 20 61 63 74 69 6f 6e 73 20 2a 2f 0a  r of actions */.
17040 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  };../*.** Compar
17050 65 20 74 6f 20 61 78 73 65 74 20 73 74 72 75 63  e to axset struc
17060 74 75 72 65 73 20 66 6f 72 20 73 6f 72 74 69 6e  tures for sortin
17070 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73 74  g purposes.*/.st
17080 61 74 69 63 20 69 6e 74 20 61 78 73 65 74 5f 63  atic int axset_c
17090 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76 6f 69  ompare(const voi
170a0 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69 64  d *a, const void
170b0 20 2a 62 29 7b 0a 20 20 73 74 72 75 63 74 20 61   *b){.  struct a
170c0 78 73 65 74 20 2a 70 31 20 3d 20 28 73 74 72 75  xset *p1 = (stru
170d0 63 74 20 61 78 73 65 74 2a 29 61 3b 0a 20 20 73  ct axset*)a;.  s
170e0 74 72 75 63 74 20 61 78 73 65 74 20 2a 70 32 20  truct axset *p2 
170f0 3d 20 28 73 74 72 75 63 74 20 61 78 73 65 74 2a  = (struct axset*
17100 29 62 3b 0a 20 20 72 65 74 75 72 6e 20 70 32 2d  )b;.  return p2-
17110 3e 6e 41 63 74 69 6f 6e 20 2d 20 70 31 2d 3e 6e  >nAction - p1->n
17120 41 63 74 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65  Action;.}../* Ge
17130 6e 65 72 61 74 65 20 43 20 73 6f 75 72 63 65 20  nerate C source 
17140 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70 61 72  code for the par
17150 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f  ser */.void Repo
17160 72 74 54 61 62 6c 65 28 6c 65 6d 70 2c 20 6d 68  rtTable(lemp, mh
17170 66 6c 61 67 29 0a 73 74 72 75 63 74 20 6c 65 6d  flag).struct lem
17180 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20 6d 68  on *lemp;.int mh
17190 66 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74  flag;     /* Out
171a0 70 75 74 20 69 6e 20 6d 61 6b 65 68 65 61 64 65  put in makeheade
171b0 72 73 20 66 6f 72 6d 61 74 20 69 66 20 74 72 75  rs format if tru
171c0 65 20 2a 2f 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f  e */.{.  FILE *o
171d0 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20  ut, *in;.  char 
171e0 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a  line[LINESIZE];.
171f0 20 20 69 6e 74 20 20 6c 69 6e 65 6e 6f 3b 0a 20    int  lineno;. 
17200 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73   struct state *s
17210 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74  tp;.  struct act
17220 69 6f 6e 20 2a 61 70 3b 0a 20 20 73 74 72 75 63  ion *ap;.  struc
17230 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73 74  t rule *rp;.  st
17240 72 75 63 74 20 61 63 74 74 61 62 20 2a 70 41 63  ruct acttab *pAc
17250 74 74 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  ttab;.  int i, j
17260 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 6e 61 6d  , n;.  char *nam
17270 65 3b 0a 20 20 69 6e 74 20 6d 6e 54 6b 6e 4f 66  e;.  int mnTknOf
17280 73 74 2c 20 6d 78 54 6b 6e 4f 66 73 74 3b 0a 20  st, mxTknOfst;. 
17290 20 69 6e 74 20 6d 6e 4e 74 4f 66 73 74 2c 20 6d   int mnNtOfst, m
172a0 78 4e 74 4f 66 73 74 3b 0a 20 20 73 74 72 75 63  xNtOfst;.  struc
172b0 74 20 61 78 73 65 74 20 2a 61 78 3b 0a 0a 20 20  t axset *ax;..  
172c0 69 6e 20 3d 20 74 70 6c 74 5f 6f 70 65 6e 28 6c  in = tplt_open(l
172d0 65 6d 70 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d  emp);.  if( in==
172e0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 75  0 ) return;.  ou
172f0 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65  t = file_open(le
17300 6d 70 2c 22 2e 63 22 2c 22 77 22 29 3b 0a 20 20  mp,".c","w");.  
17310 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20  if( out==0 ){.  
17320 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
17330 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
17340 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 74 70  lineno = 1;.  tp
17350 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
17360 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
17370 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
17380 74 65 20 74 68 65 20 69 6e 63 6c 75 64 65 20 63  te the include c
17390 6f 64 65 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20  ode, if any */. 
173a0 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c   tplt_print(out,
173b0 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 69 6e 63 6c 75  lemp,lemp->inclu
173c0 64 65 2c 6c 65 6d 70 2d 3e 69 6e 63 6c 75 64 65  de,lemp->include
173d0 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 69  ln,&lineno);.  i
173e0 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20  f( mhflag ){.   
173f0 20 63 68 61 72 20 2a 6e 61 6d 65 20 3d 20 66 69   char *name = fi
17400 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70  le_makename(lemp
17410 2c 20 22 2e 68 22 29 3b 0a 20 20 20 20 66 70 72  , ".h");.    fpr
17420 69 6e 74 66 28 6f 75 74 2c 22 23 69 6e 63 6c 75  intf(out,"#inclu
17430 64 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 6e 61  de \"%s\"\n", na
17440 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); lineno++;. 
17450 20 20 20 66 72 65 65 28 6e 61 6d 65 29 3b 0a 20     free(name);. 
17460 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
17470 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
17480 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
17490 20 47 65 6e 65 72 61 74 65 20 23 64 65 66 69 6e   Generate #defin
174a0 65 73 20 66 6f 72 20 61 6c 6c 20 74 6f 6b 65 6e  es for all token
174b0 73 20 2a 2f 0a 20 20 69 66 28 20 6d 68 66 6c 61  s */.  if( mhfla
174c0 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70  g ){.    char *p
174d0 72 65 66 69 78 3b 0a 20 20 20 20 66 70 72 69 6e  refix;.    fprin
174e0 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54 45  tf(out,"#if INTE
174f0 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e  RFACE\n"); linen
17500 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6c 65 6d  o++;.    if( lem
17510 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20 29  p->tokenprefix )
17520 20 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d 3e   prefix = lemp->
17530 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20 20  tokenprefix;.   
17540 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20   else           
17550 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20           prefix 
17560 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72 28 69 3d  = "";.    for(i=
17570 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  1; i<lemp->nterm
17580 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  inal; i++){.    
17590 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
175a0 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25  define %s%-30s %
175b0 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d  2d\n",prefix,lem
175c0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
175d0 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 6c 69  ame,i);.      li
175e0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  neno++;.    }.  
175f0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
17600 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e  endif\n"); linen
17610 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
17620 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
17630 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
17640 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
17650 74 68 65 20 64 65 66 69 6e 65 73 20 2a 2f 0a 20  the defines */. 
17660 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 2f 2a   fprintf(out,"/*
17670 20 5c 30 30 31 20 2a 2f 5c 6e 22 29 3b 0a 20 20   \001 */\n");.  
17680 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
17690 66 69 6e 65 20 59 59 43 4f 44 45 54 59 50 45 20  fine YYCODETYPE 
176a0 25 73 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e 69 6d  %s\n",.    minim
176b0 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 30 2c 20  um_size_type(0, 
176c0 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 35 29  lemp->nsymbol+5)
176d0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66  ); lineno++;.  f
176e0 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
176f0 69 6e 65 20 59 59 4e 4f 43 4f 44 45 20 25 64 5c  ine YYNOCODE %d\
17700 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c  n",lemp->nsymbol
17710 2b 31 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  +1);  lineno++;.
17720 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
17730 64 65 66 69 6e 65 20 59 59 41 43 54 49 4f 4e 54  define YYACTIONT
17740 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20 6d  YPE %s\n",.    m
17750 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65  inimum_size_type
17760 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  (0, lemp->nstate
17770 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2b 35 29 29  +lemp->nrule+5))
17780 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 70  ;  lineno++;.  p
17790 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f 6e  rint_stack_union
177a0 28 6f 75 74 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e  (out,lemp,&linen
177b0 6f 2c 6d 68 66 6c 61 67 29 3b 0a 20 20 69 66 28  o,mhflag);.  if(
177c0 20 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65   lemp->stacksize
177d0 20 29 7b 0a 20 20 20 20 69 66 28 20 61 74 6f 69   ){.    if( atoi
177e0 28 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65  (lemp->stacksize
177f0 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 45 72  )<=0 ){.      Er
17800 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
17810 65 6e 61 6d 65 2c 30 2c 0a 22 49 6c 6c 65 67 61  ename,0,."Illega
17820 6c 20 73 74 61 63 6b 20 73 69 7a 65 3a 20 5b 25  l stack size: [%
17830 73 5d 2e 20 20 54 68 65 20 73 74 61 63 6b 20 73  s].  The stack s
17840 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 20 61 6e  ize should be an
17850 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   integer constan
17860 74 2e 22 2c 0a 20 20 20 20 20 20 20 20 6c 65 6d  t.",.        lem
17870 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b 0a 20  p->stacksize);. 
17880 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72       lemp->error
17890 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 6c 65 6d  cnt++;.      lem
178a0 70 2d 3e 73 74 61 63 6b 73 69 7a 65 20 3d 20 22  p->stacksize = "
178b0 31 30 30 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  100";.    }.    
178c0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
178d0 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50 54  fine YYSTACKDEPT
178e0 48 20 25 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73 74  H %s\n",lemp->st
178f0 61 63 6b 73 69 7a 65 29 3b 20 20 6c 69 6e 65 6e  acksize);  linen
17900 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  o++;.  }else{.  
17910 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
17920 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45  define YYSTACKDE
17930 50 54 48 20 31 30 30 5c 6e 22 29 3b 20 20 6c 69  PTH 100\n");  li
17940 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  neno++;.  }.  if
17950 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( mhflag ){.    
17960 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66  fprintf(out,"#if
17970 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20   INTERFACE\n"); 
17980 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20  lineno++;.  }.  
17990 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d  name = lemp->nam
179a0 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a  e ? lemp->name :
179b0 20 22 50 61 72 73 65 22 3b 0a 20 20 69 66 28 20   "Parse";.  if( 
179c0 6c 65 6d 70 2d 3e 61 72 67 20 26 26 20 6c 65 6d  lemp->arg && lem
179d0 70 2d 3e 61 72 67 5b 30 5d 20 29 7b 0a 20 20 20  p->arg[0] ){.   
179e0 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 20 3d 20   int i;.    i = 
179f0 73 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72 67  strlen(lemp->arg
17a00 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3e  );.    while( i>
17a10 3d 31 20 26 26 20 69 73 73 70 61 63 65 28 6c 65  =1 && isspace(le
17a20 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 29 20  mp->arg[i-1]) ) 
17a30 69 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  i--;.    while( 
17a40 69 3e 3d 31 20 26 26 20 28 69 73 61 6c 6e 75 6d  i>=1 && (isalnum
17a50 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29  (lemp->arg[i-1])
17a60 20 7c 7c 20 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d   || lemp->arg[i-
17a70 31 5d 3d 3d 27 5f 27 29 20 29 20 69 2d 2d 3b 0a  1]=='_') ) i--;.
17a80 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
17a90 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53  "#define %sARG_S
17aa0 44 45 43 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d 65  DECL %s;\n",name
17ab0 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69  ,lemp->arg);  li
17ac0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
17ad0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
17ae0 20 25 73 41 52 47 5f 50 44 45 43 4c 20 2c 25 73   %sARG_PDECL ,%s
17af0 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61  \n",name,lemp->a
17b00 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  rg);  lineno++;.
17b10 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
17b20 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46  "#define %sARG_F
17b30 45 54 43 48 20 25 73 20 3d 20 79 79 70 50 61 72  ETCH %s = yypPar
17b40 73 65 72 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20 20  ser->%s\n",.    
17b50 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d               nam
17b60 65 2c 6c 65 6d 70 2d 3e 61 72 67 2c 26 6c 65 6d  e,lemp->arg,&lem
17b70 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69 6e  p->arg[i]);  lin
17b80 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  eno++;.    fprin
17b90 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
17ba0 25 73 41 52 47 5f 53 54 4f 52 45 20 79 79 70 50  %sARG_STORE yypP
17bb0 61 72 73 65 72 2d 3e 25 73 20 3d 20 25 73 5c 6e  arser->%s = %s\n
17bc0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
17bd0 20 20 20 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d 3e      name,&lemp->
17be0 61 72 67 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61 72  arg[i],&lemp->ar
17bf0 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  g[i]);  lineno++
17c00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
17c10 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66  printf(out,"#def
17c20 69 6e 65 20 25 73 41 52 47 5f 53 44 45 43 4c 5c  ine %sARG_SDECL\
17c30 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65 6e  n",name);  linen
17c40 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66  o++;.    fprintf
17c50 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
17c60 41 52 47 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61 6d  ARG_PDECL\n",nam
17c70 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  e);  lineno++;. 
17c80 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
17c90 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46 45  #define %sARG_FE
17ca0 54 43 48 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69  TCH\n",name); li
17cb0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
17cc0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
17cd0 20 25 73 41 52 47 5f 53 54 4f 52 45 5c 6e 22 2c   %sARG_STORE\n",
17ce0 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  name); lineno++;
17cf0 0a 20 20 7d 0a 20 20 69 66 28 20 6d 68 66 6c 61  .  }.  if( mhfla
17d00 67 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  g ){.    fprintf
17d10 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29  (out,"#endif\n")
17d20 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
17d30 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
17d40 64 65 66 69 6e 65 20 59 59 4e 53 54 41 54 45 20  define YYNSTATE 
17d50 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 74 61  %d\n",lemp->nsta
17d60 74 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  te);  lineno++;.
17d70 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
17d80 64 65 66 69 6e 65 20 59 59 4e 52 55 4c 45 20 25  define YYNRULE %
17d90 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 72 75 6c 65  d\n",lemp->nrule
17da0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
17db0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
17dc0 66 69 6e 65 20 59 59 45 52 52 4f 52 53 59 4d 42  fine YYERRORSYMB
17dd0 4f 4c 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65  OL %d\n",lemp->e
17de0 72 72 73 79 6d 2d 3e 69 6e 64 65 78 29 3b 20 20  rrsym->index);  
17df0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69  lineno++;.  fpri
17e00 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
17e10 20 59 59 45 52 52 53 59 4d 44 54 20 79 79 25 64   YYERRSYMDT yy%d
17e20 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  \n",lemp->errsym
17e30 2d 3e 64 74 6e 75 6d 29 3b 20 20 6c 69 6e 65 6e  ->dtnum);  linen
17e40 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d  o++;.  if( lemp-
17e50 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b  >has_fallback ){
17e60 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
17e70 2c 22 23 64 65 66 69 6e 65 20 59 59 46 41 4c 4c  ,"#define YYFALL
17e80 42 41 43 4b 20 31 5c 6e 22 29 3b 20 20 6c 69 6e  BACK 1\n");  lin
17e90 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c  eno++;.  }.  tpl
17ea0 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d  t_xfer(lemp->nam
17eb0 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f  e,in,out,&lineno
17ec0 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  );..  /* Generat
17ed0 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62  e the action tab
17ee0 6c 65 20 61 6e 64 20 69 74 73 20 61 73 73 6f 63  le and its assoc
17ef0 69 61 74 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  iates:.  **.  **
17f00 20 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 20 20    yy_action[]   
17f10 20 20 20 20 20 41 20 73 69 6e 67 6c 65 20 74 61       A single ta
17f20 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  ble containing a
17f30 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a  ll actions..  **
17f40 20 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b 5d    yy_lookahead[]
17f50 20 20 20 20 20 41 20 74 61 62 6c 65 20 63 6f 6e       A table con
17f60 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 6f 6b  taining the look
17f70 61 68 65 61 64 20 66 6f 72 20 65 61 63 68 20 65  ahead for each e
17f80 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 20 20 20  ntry in.  **    
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fa0 20 79 79 5f 61 63 74 69 6f 6e 2e 20 20 55 73 65   yy_action.  Use
17fb0 64 20 74 6f 20 64 65 74 65 63 74 20 68 61 73 68  d to detect hash
17fc0 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20 2a   collisions..  *
17fd0 2a 20 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74  *  yy_shift_ofst
17fe0 5b 5d 20 20 20 20 46 6f 72 20 65 61 63 68 20 73  []    For each s
17ff0 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73 65 74  tate, the offset
18000 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20   into yy_action 
18010 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20 20 20  for.  **        
18020 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 69               shi
18030 66 74 69 6e 67 20 74 65 72 6d 69 6e 61 6c 73 2e  fting terminals.
18040 0a 20 20 2a 2a 20 20 79 79 5f 72 65 64 75 63 65  .  **  yy_reduce
18050 5f 6f 66 73 74 5b 5d 20 20 20 46 6f 72 20 65 61  _ofst[]   For ea
18060 63 68 20 73 74 61 74 65 2c 20 74 68 65 20 6f 66  ch state, the of
18070 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61 63 74  fset into yy_act
18080 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20  ion for.  **    
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180a0 20 73 68 69 66 74 69 6e 67 20 6e 6f 6e 2d 74 65   shifting non-te
180b0 72 6d 69 6e 61 6c 73 20 61 66 74 65 72 20 61 20  rminals after a 
180c0 72 65 64 75 63 65 2e 0a 20 20 2a 2a 20 20 79 79  reduce..  **  yy
180d0 5f 64 65 66 61 75 6c 74 5b 5d 20 20 20 20 20 20  _default[]      
180e0 20 44 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20   Default action 
180f0 66 6f 72 20 65 61 63 68 20 73 74 61 74 65 2e 0a  for each state..
18100 20 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75    */..  /* Compu
18110 74 65 20 74 68 65 20 61 63 74 69 6f 6e 73 20 6f  te the actions o
18120 6e 20 61 6c 6c 20 73 74 61 74 65 73 20 61 6e 64  n all states and
18130 20 63 6f 75 6e 74 20 74 68 65 6d 20 75 70 20 2a   count them up *
18140 2f 0a 20 20 61 78 20 3d 20 6d 61 6c 6c 6f 63 28  /.  ax = malloc(
18150 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29 2a 6c   sizeof(ax[0])*l
18160 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 20 29 3b  emp->nstate*2 );
18170 0a 20 20 69 66 28 20 61 78 3d 3d 30 20 29 7b 0a  .  if( ax==0 ){.
18180 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
18190 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65  rr,"malloc faile
181a0 64 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  d\n");.    exit(
181b0 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  1);.  }.  for(i=
181c0 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
181d0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  e; i++){.    stp
181e0 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
181f0 69 5d 3b 0a 20 20 20 20 73 74 70 2d 3e 6e 54 6b  i];.    stp->nTk
18200 6e 41 63 74 20 3d 20 73 74 70 2d 3e 6e 4e 74 41  nAct = stp->nNtA
18210 63 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 70 2d  ct = 0;.    stp-
18220 3e 69 44 66 6c 74 20 3d 20 6c 65 6d 70 2d 3e 6e  >iDflt = lemp->n
18230 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72  state + lemp->nr
18240 75 6c 65 3b 0a 20 20 20 20 73 74 70 2d 3e 69 54  ule;.    stp->iT
18250 6b 6e 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53  knOfst = NO_OFFS
18260 45 54 3b 0a 20 20 20 20 73 74 70 2d 3e 69 4e 74  ET;.    stp->iNt
18270 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45 54  Ofst = NO_OFFSET
18280 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70  ;.    for(ap=stp
18290 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
182a0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
182b0 28 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e  ( compute_action
182c0 28 6c 65 6d 70 2c 61 70 29 3e 3d 30 20 29 7b 0a  (lemp,ap)>=0 ){.
182d0 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e          if( ap->
182e0 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e  sp->index<lemp->
182f0 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20 20  nterminal ){.   
18300 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 54 6b 6e         stp->nTkn
18310 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  Act++;.        }
18320 65 6c 73 65 20 69 66 28 20 61 70 2d 3e 73 70 2d  else if( ap->sp-
18330 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 73 79  >index<lemp->nsy
18340 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  mbol ){.        
18350 20 20 73 74 70 2d 3e 6e 4e 74 41 63 74 2b 2b 3b    stp->nNtAct++;
18360 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
18370 20 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e 69            stp->i
18380 44 66 6c 74 20 3d 20 63 6f 6d 70 75 74 65 5f 61  Dflt = compute_a
18390 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b  ction(lemp, ap);
183a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
183b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 78 5b   }.    }.    ax[
183c0 69 2a 32 5d 2e 73 74 70 20 3d 20 73 74 70 3b 0a  i*2].stp = stp;.
183d0 20 20 20 20 61 78 5b 69 2a 32 5d 2e 69 73 54 6b      ax[i*2].isTk
183e0 6e 20 3d 20 31 3b 0a 20 20 20 20 61 78 5b 69 2a  n = 1;.    ax[i*
183f0 32 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70  2].nAction = stp
18400 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20 61  ->nTknAct;.    a
18410 78 5b 69 2a 32 2b 31 5d 2e 73 74 70 20 3d 20 73  x[i*2+1].stp = s
18420 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31  tp;.    ax[i*2+1
18430 5d 2e 69 73 54 6b 6e 20 3d 20 30 3b 0a 20 20 20  ].isTkn = 0;.   
18440 20 61 78 5b 69 2a 32 2b 31 5d 2e 6e 41 63 74 69   ax[i*2+1].nActi
18450 6f 6e 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63 74  on = stp->nNtAct
18460 3b 0a 20 20 7d 0a 20 20 6d 78 54 6b 6e 4f 66 73  ;.  }.  mxTknOfs
18470 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20  t = mnTknOfst = 
18480 30 3b 0a 20 20 6d 78 4e 74 4f 66 73 74 20 3d 20  0;.  mxNtOfst = 
18490 6d 6e 4e 74 4f 66 73 74 20 3d 20 30 3b 0a 0a 20  mnNtOfst = 0;.. 
184a0 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20   /* Compute the 
184b0 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20 49  action table.  I
184c0 6e 20 6f 72 64 65 72 20 74 6f 20 74 72 79 20 74  n order to try t
184d0 6f 20 6b 65 65 70 20 74 68 65 20 73 69 7a 65 20  o keep the size 
184e0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 69  of the.  ** acti
184f0 6f 6e 20 74 61 62 6c 65 20 74 6f 20 61 20 6d 69  on table to a mi
18500 6e 69 6d 75 6d 2c 20 74 68 65 20 68 65 75 72 69  nimum, the heuri
18510 73 74 69 63 20 6f 66 20 70 6c 61 63 69 6e 67 20  stic of placing 
18520 74 68 65 20 6c 61 72 67 65 73 74 20 61 63 74 69  the largest acti
18530 6f 6e 0a 20 20 2a 2a 20 73 65 74 73 20 66 69 72  on.  ** sets fir
18540 73 74 20 69 73 20 75 73 65 64 2e 0a 20 20 2a 2f  st is used..  */
18550 0a 20 20 71 73 6f 72 74 28 61 78 2c 20 6c 65 6d  .  qsort(ax, lem
18560 70 2d 3e 6e 73 74 61 74 65 2a 32 2c 20 73 69 7a  p->nstate*2, siz
18570 65 6f 66 28 61 78 5b 30 5d 29 2c 20 61 78 73 65  eof(ax[0]), axse
18580 74 5f 63 6f 6d 70 61 72 65 29 3b 0a 20 20 70 41  t_compare);.  pA
18590 63 74 74 61 62 20 3d 20 61 63 74 74 61 62 5f 61  cttab = acttab_a
185a0 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d  lloc();.  for(i=
185b0 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
185c0 65 2a 32 20 26 26 20 61 78 5b 69 5d 2e 6e 41 63  e*2 && ax[i].nAc
185d0 74 69 6f 6e 3e 30 3b 20 69 2b 2b 29 7b 0a 20 20  tion>0; i++){.  
185e0 20 20 73 74 70 20 3d 20 61 78 5b 69 5d 2e 73 74    stp = ax[i].st
185f0 70 3b 0a 20 20 20 20 69 66 28 20 61 78 5b 69 5d  p;.    if( ax[i]
18600 2e 69 73 54 6b 6e 20 29 7b 0a 20 20 20 20 20 20  .isTkn ){.      
18610 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20  for(ap=stp->ap; 
18620 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
18630 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 63  {.        int ac
18640 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69 66  tion;.        if
18650 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3e  ( ap->sp->index>
18660 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  =lemp->nterminal
18670 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
18680 20 20 20 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f       action = co
18690 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d  mpute_action(lem
186a0 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20  p, ap);.        
186b0 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 63  if( action<0 ) c
186c0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
186d0 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 70   acttab_action(p
186e0 41 63 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e  Acttab, ap->sp->
186f0 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a  index, action);.
18700 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74        }.      st
18710 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 61 63  p->iTknOfst = ac
18720 74 74 61 62 5f 69 6e 73 65 72 74 28 70 41 63 74  ttab_insert(pAct
18730 74 61 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tab);.      if( 
18740 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3c 6d 6e  stp->iTknOfst<mn
18750 54 6b 6e 4f 66 73 74 20 29 20 6d 6e 54 6b 6e 4f  TknOfst ) mnTknO
18760 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f  fst = stp->iTknO
18770 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73  fst;.      if( s
18780 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3e 6d 78 54  tp->iTknOfst>mxT
18790 6b 6e 4f 66 73 74 20 29 20 6d 78 54 6b 6e 4f 66  knOfst ) mxTknOf
187a0 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66  st = stp->iTknOf
187b0 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  st;.    }else{. 
187c0 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70 2d       for(ap=stp-
187d0 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e  >ap; ap; ap=ap->
187e0 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69  next){.        i
187f0 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20 20  nt action;.     
18800 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69     if( ap->sp->i
18810 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  ndex<lemp->nterm
18820 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  inal ) continue;
18830 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d  .        if( ap-
18840 3e 73 70 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d 70  >sp->index==lemp
18850 2d 3e 6e 73 79 6d 62 6f 6c 20 29 20 63 6f 6e 74  ->nsymbol ) cont
18860 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63  inue;.        ac
18870 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61  tion = compute_a
18880 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b  ction(lemp, ap);
18890 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 63 74  .        if( act
188a0 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65  ion<0 ) continue
188b0 3b 0a 20 20 20 20 20 20 20 20 61 63 74 74 61 62  ;.        acttab
188c0 5f 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c  _action(pActtab,
188d0 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20   ap->sp->index, 
188e0 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  action);.      }
188f0 0a 20 20 20 20 20 20 73 74 70 2d 3e 69 4e 74 4f  .      stp->iNtO
18900 66 73 74 20 3d 20 61 63 74 74 61 62 5f 69 6e 73  fst = acttab_ins
18910 65 72 74 28 70 41 63 74 74 61 62 29 3b 0a 20 20  ert(pActtab);.  
18920 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 4e 74      if( stp->iNt
18930 4f 66 73 74 3c 6d 6e 4e 74 4f 66 73 74 20 29 20  Ofst<mnNtOfst ) 
18940 6d 6e 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d 3e  mnNtOfst = stp->
18950 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 20 20 69  iNtOfst;.      i
18960 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3e  f( stp->iNtOfst>
18970 6d 78 4e 74 4f 66 73 74 20 29 20 6d 78 4e 74 4f  mxNtOfst ) mxNtO
18980 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66  fst = stp->iNtOf
18990 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  st;.    }.  }.  
189a0 66 72 65 65 28 61 78 29 3b 0a 0a 20 20 2f 2a 20  free(ax);..  /* 
189b0 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 61 63  Output the yy_ac
189c0 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20  tion table */.  
189d0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 73 74 61  fprintf(out,"sta
189e0 74 69 63 20 59 59 41 43 54 49 4f 4e 54 59 50 45  tic YYACTIONTYPE
189f0 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 3d 20 7b   yy_action[] = {
18a00 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
18a10 20 20 6e 20 3d 20 61 63 74 74 61 62 5f 73 69 7a    n = acttab_siz
18a20 65 28 70 41 63 74 74 61 62 29 3b 0a 20 20 66 6f  e(pActtab);.  fo
18a30 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
18a40 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 63 74 69  +){.    int acti
18a50 6f 6e 20 3d 20 61 63 74 74 61 62 5f 79 79 61 63  on = acttab_yyac
18a60 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 69 29  tion(pActtab, i)
18a70 3b 0a 20 20 20 20 69 66 28 20 61 63 74 69 6f 6e  ;.    if( action
18a80 3c 30 20 29 20 61 63 74 69 6f 6e 20 3d 20 6c 65  <0 ) action = le
18a90 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6c 65  mp->nsymbol + le
18aa0 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20 32 3b 0a 20  mp->nrule + 2;. 
18ab0 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70     if( j==0 ) fp
18ac0 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25  rintf(out," /* %
18ad0 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20  5d */ ", i);.   
18ae0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
18af0 25 34 64 2c 22 2c 20 61 63 74 69 6f 6e 29 3b 0a  %4d,", action);.
18b00 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
18b10 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
18b20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
18b30 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
18b40 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
18b50 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
18b60 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
18b70 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
18b80 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20  ); lineno++;..  
18b90 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79  /* Output the yy
18ba0 5f 6c 6f 6f 6b 61 68 65 61 64 20 74 61 62 6c 65  _lookahead table
18bb0 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
18bc0 74 2c 22 73 74 61 74 69 63 20 59 59 43 4f 44 45  t,"static YYCODE
18bd0 54 59 50 45 20 79 79 5f 6c 6f 6f 6b 61 68 65 61  TYPE yy_lookahea
18be0 64 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e  d[] = {\n"); lin
18bf0 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 6a  eno++;.  for(i=j
18c00 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
18c10 20 20 20 69 6e 74 20 6c 61 20 3d 20 61 63 74 74     int la = actt
18c20 61 62 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28 70  ab_yylookahead(p
18c30 41 63 74 74 61 62 2c 20 69 29 3b 0a 20 20 20 20  Acttab, i);.    
18c40 69 66 28 20 6c 61 3c 30 20 29 20 6c 61 20 3d 20  if( la<0 ) la = 
18c50 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 0a 20  lemp->nsymbol;. 
18c60 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66 70     if( j==0 ) fp
18c70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20 25  rintf(out," /* %
18c80 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20 20  5d */ ", i);.   
18c90 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20   fprintf(out, " 
18ca0 25 34 64 2c 22 2c 20 6c 61 29 3b 0a 20 20 20 20  %4d,", la);.    
18cb0 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d 6e  if( j==9 || i==n
18cc0 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  -1 ){.      fpri
18cd0 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 20  ntf(out, "\n"); 
18ce0 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
18cf0 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  j = 0;.    }else
18d00 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  {.      j++;.   
18d10 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66   }.  }.  fprintf
18d20 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20 6c  (out, "};\n"); l
18d30 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f  ineno++;..  /* O
18d40 75 74 70 75 74 20 74 68 65 20 79 79 5f 73 68 69  utput the yy_shi
18d50 66 74 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65 20  ft_ofst[] table 
18d60 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  */.  fprintf(out
18d70 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53 48  , "#define YY_SH
18d80 49 46 54 5f 55 53 45 5f 44 46 4c 54 20 28 25 64  IFT_USE_DFLT (%d
18d90 29 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74 2d  )\n", mnTknOfst-
18da0 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  1); lineno++;.  
18db0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74  fprintf(out, "st
18dc0 61 74 69 63 20 25 73 20 79 79 5f 73 68 69 66 74  atic %s yy_shift
18dd0 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20  _ofst[] = {\n", 
18de0 0a 20 20 20 20 20 20 20 20 20 20 6d 69 6e 69 6d  .          minim
18df0 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e 54  um_size_type(mnT
18e00 6b 6e 4f 66 73 74 2d 31 2c 20 6d 78 54 6b 6e 4f  knOfst-1, mxTknO
18e10 66 73 74 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  fst)); lineno++;
18e20 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74  .  n = lemp->nst
18e30 61 74 65 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  ate;.  for(i=j=0
18e40 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
18e50 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20 73   int ofst;.    s
18e60 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65  tp = lemp->sorte
18e70 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20 3d  d[i];.    ofst =
18e80 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a   stp->iTknOfst;.
18e90 20 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e 4f      if( ofst==NO
18ea0 5f 4f 46 46 53 45 54 20 29 20 6f 66 73 74 20 3d  _OFFSET ) ofst =
18eb0 20 6d 6e 54 6b 6e 4f 66 73 74 20 2d 20 31 3b 0a   mnTknOfst - 1;.
18ec0 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66      if( j==0 ) f
18ed0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
18ee0 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20  %5d */ ", i);.  
18ef0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
18f00 20 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a 20   %4d,", ofst);. 
18f10 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69     if( j==9 || i
18f20 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66  ==n-1 ){.      f
18f30 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
18f40 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
18f50 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65     j = 0;.    }e
18f60 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a  lse{.      j++;.
18f70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69      }.  }.  fpri
18f80 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29  ntf(out, "};\n")
18f90 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f  ; lineno++;..  /
18fa0 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f  * Output the yy_
18fb0 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 74 61  reduce_ofst[] ta
18fc0 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66  ble */.  fprintf
18fd0 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20 59  (out, "#define Y
18fe0 59 5f 52 45 44 55 43 45 5f 55 53 45 5f 44 46 4c  Y_REDUCE_USE_DFL
18ff0 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74 4f  T (%d)\n", mnNtO
19000 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  fst-1); lineno++
19010 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ;.  fprintf(out,
19020 20 22 73 74 61 74 69 63 20 25 73 20 79 79 5f 72   "static %s yy_r
19030 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 3d 20 7b  educe_ofst[] = {
19040 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
19050 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
19060 65 28 6d 6e 4e 74 4f 66 73 74 2d 31 2c 20 6d 78  e(mnNtOfst-1, mx
19070 4e 74 4f 66 73 74 29 29 3b 20 6c 69 6e 65 6e 6f  NtOfst)); lineno
19080 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e  ++;.  n = lemp->
19090 6e 73 74 61 74 65 3b 0a 20 20 66 6f 72 28 69 3d  nstate;.  for(i=
190a0 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
190b0 20 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20      int ofst;.  
190c0 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
190d0 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73  rted[i];.    ofs
190e0 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  t = stp->iNtOfst
190f0 3b 0a 20 20 20 20 69 66 28 20 6f 66 73 74 3d 3d  ;.    if( ofst==
19100 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6f 66 73 74  NO_OFFSET ) ofst
19110 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 2d 20 31 3b   = mnNtOfst - 1;
19120 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20  .    if( j==0 ) 
19130 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
19140 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20   %5d */ ", i);. 
19150 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
19160 22 20 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a  " %4d,", ofst);.
19170 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
19180 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
19190 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
191a0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
191b0 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
191c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
191d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
191e0 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
191f0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20  ); lineno++;..  
19200 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 64 65  /* Output the de
19210 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 74 61 62  fault action tab
19220 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  le */.  fprintf(
19230 6f 75 74 2c 20 22 73 74 61 74 69 63 20 59 59 41  out, "static YYA
19240 43 54 49 4f 4e 54 59 50 45 20 79 79 5f 64 65 66  CTIONTYPE yy_def
19250 61 75 6c 74 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20  ault[] = {\n"); 
19260 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20  lineno++;.  n = 
19270 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20  lemp->nstate;.  
19280 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
19290 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20  i++){.    stp = 
192a0 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b  lemp->sorted[i];
192b0 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20  .    if( j==0 ) 
192c0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
192d0 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20   %5d */ ", i);. 
192e0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
192f0 22 20 25 34 64 2c 22 2c 20 73 74 70 2d 3e 69 44  " %4d,", stp->iD
19300 66 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d  flt);.    if( j=
19310 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
19320 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
19330 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
19340 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
19350 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19360 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
19370 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
19380 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
19390 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  +;.  tplt_xfer(l
193a0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
193b0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
193c0 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 61   Generate the ta
193d0 62 6c 65 20 6f 66 20 66 61 6c 6c 62 61 63 6b 20  ble of fallback 
193e0 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69  tokens..  */.  i
193f0 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c  f( lemp->has_fal
19400 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f 72  lback ){.    for
19410 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74  (i=0; i<lemp->nt
19420 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20  erminal; i++){. 
19430 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
19440 6f 6c 20 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73 79  ol *p = lemp->sy
19450 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20  mbols[i];.      
19460 69 66 28 20 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d  if( p->fallback=
19470 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  =0 ){.        fp
19480 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20 20  rintf(out, "    
19490 30 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 6e  0,  /* %10s => n
194a0 6f 74 68 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70 2d  othing */\n", p-
194b0 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  >name);.      }e
194c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72  lse{.        fpr
194d0 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 25 33 64  intf(out, "  %3d
194e0 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 25 73  ,  /* %10s => %s
194f0 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c 62   */\n", p->fallb
19500 61 63 6b 2d 3e 69 6e 64 65 78 2c 0a 20 20 20 20  ack->index,.    
19510 20 20 20 20 20 20 70 2d 3e 6e 61 6d 65 2c 20 70        p->name, p
19520 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d 65  ->fallback->name
19530 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
19540 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d   lineno++;.    }
19550 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72  .  }.  tplt_xfer
19560 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e 2c  (lemp->name, in,
19570 20 6f 75 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a   out, &lineno);.
19580 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
19590 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
195a0 67 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e  g the symbolic n
195b0 61 6d 65 20 6f 66 20 65 76 65 72 79 20 73 79 6d  ame of every sym
195c0 62 6f 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  bol.  */.  for(i
195d0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
195e0 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  bol; i++){.    s
195f0 70 72 69 6e 74 66 28 6c 69 6e 65 2c 22 5c 22 25  printf(line,"\"%
19600 73 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d 62  s\",",lemp->symb
19610 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20  ols[i]->name);. 
19620 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
19630 20 20 25 2d 31 35 73 22 2c 6c 69 6e 65 29 3b 0a    %-15s",line);.
19640 20 20 20 20 69 66 28 20 28 69 26 33 29 3d 3d 33      if( (i&3)==3
19650 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c   ){ fprintf(out,
19660 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
19670 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 69 26   }.  }.  if( (i&
19680 33 29 21 3d 30 20 29 7b 20 66 70 72 69 6e 74 66  3)!=0 ){ fprintf
19690 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65  (out,"\n"); line
196a0 6e 6f 2b 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f 78  no++; }.  tplt_x
196b0 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69  fer(lemp->name,i
196c0 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  n,out,&lineno);.
196d0 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 61  .  /* Generate a
196e0 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
196f0 67 20 61 20 74 65 78 74 20 73 74 72 69 6e 67 20  g a text string 
19700 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 65  that describes e
19710 76 65 72 79 0a 20 20 2a 2a 20 72 75 6c 65 20 69  very.  ** rule i
19720 6e 20 74 68 65 20 72 75 6c 65 20 73 65 74 20 6f  n the rule set o
19730 66 20 74 68 65 20 67 72 61 6d 6d 65 72 2e 20 20  f the grammer.  
19740 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
19750 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 77 68   is used.  ** wh
19760 65 6e 20 74 72 61 63 69 6e 67 20 52 45 44 55 43  en tracing REDUC
19770 45 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a  E actions..  */.
19780 20 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c 65    for(i=0, rp=le
19790 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
197a0 3d 72 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29 7b  =rp->next, i++){
197b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 70 2d  .    assert( rp-
197c0 3e 69 6e 64 65 78 3d 3d 69 20 29 3b 0a 20 20 20  >index==i );.   
197d0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f   fprintf(out," /
197e0 2a 20 25 33 64 20 2a 2f 20 5c 22 25 73 20 3a 3a  * %3d */ \"%s ::
197f0 3d 22 2c 20 69 2c 20 72 70 2d 3e 6c 68 73 2d 3e  =", i, rp->lhs->
19800 6e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28 6a  name);.    for(j
19810 3d 30 3b 20 6a 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; j<rp->nrhs; 
19820 6a 2b 2b 29 20 66 70 72 69 6e 74 66 28 6f 75 74  j++) fprintf(out
19830 2c 22 20 25 73 22 2c 72 70 2d 3e 72 68 73 5b 6a  ," %s",rp->rhs[j
19840 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 66 70  ]->name);.    fp
19850 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22 2c 5c 6e  rintf(out,"\",\n
19860 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
19870 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
19880 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
19890 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
198a0 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68  Generate code wh
198b0 69 63 68 20 65 78 65 63 75 74 65 73 20 65 76 65  ich executes eve
198c0 72 79 20 74 69 6d 65 20 61 20 73 79 6d 62 6f 6c  ry time a symbol
198d0 20 69 73 20 70 6f 70 70 65 64 20 66 72 6f 6d 0a   is popped from.
198e0 20 20 2a 2a 20 74 68 65 20 73 74 61 63 6b 20 77    ** the stack w
198f0 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 20  hile processing 
19900 65 72 72 6f 72 73 20 6f 72 20 77 68 69 6c 65 20  errors or while 
19910 64 65 73 74 72 6f 79 69 6e 67 20 74 68 65 20 70  destroying the p
19920 61 72 73 65 72 2e 20 0a 20 20 2a 2a 20 28 49 6e  arser. .  ** (In
19930 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 67 65   other words, ge
19940 6e 65 72 61 74 65 20 74 68 65 20 25 64 65 73 74  nerate the %dest
19950 72 75 63 74 6f 72 20 61 63 74 69 6f 6e 73 29 0a  ructor actions).
19960 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d    */.  if( lemp-
19970 3e 74 6f 6b 65 6e 64 65 73 74 20 29 7b 0a 20 20  >tokendest ){.  
19980 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
19990 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
199a0 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
199b0 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
199c0 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
199d0 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c      if( sp==0 ||
199e0 20 73 70 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49   sp->type!=TERMI
199f0 4e 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  NAL ) continue;.
19a00 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
19a10 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 5c  t,"    case %d:\
19a20 6e 22 2c 73 70 2d 3e 69 6e 64 65 78 29 3b 20 6c  n",sp->index); l
19a30 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ineno++;.    }. 
19a40 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65     for(i=0; i<le
19a50 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 26 26 20 6c  mp->nsymbol && l
19a60 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d  emp->symbols[i]-
19a70 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c 3b  >type!=TERMINAL;
19a80 20 69 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20 69   i++);.    if( i
19a90 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29  <lemp->nsymbol )
19aa0 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f 64 65 73  {.      emit_des
19ab0 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74  tructor_code(out
19ac0 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
19ad0 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b  ],lemp,&lineno);
19ae0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
19af0 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b 3b  ut,"      break;
19b00 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
19b10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
19b20 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
19b30 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
19b40 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
19b50 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  p = lemp->symbol
19b60 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73 70  s[i];.    if( sp
19b70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65 3d  ==0 || sp->type=
19b80 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70 2d  =TERMINAL || sp-
19b90 3e 64 65 73 74 72 75 63 74 6f 72 3d 3d 30 20 29  >destructor==0 )
19ba0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66   continue;.    f
19bb0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
19bc0 63 61 73 65 20 25 64 3a 5c 6e 22 2c 73 70 2d 3e  case %d:\n",sp->
19bd0 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  index); lineno++
19be0 3b 0a 20 20 20 20 65 6d 69 74 5f 64 65 73 74 72  ;.    emit_destr
19bf0 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 6c  uctor_code(out,l
19c00 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2c  emp->symbols[i],
19c10 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20  lemp,&lineno);. 
19c20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
19c30 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29        break;\n")
19c40 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
19c50 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64    if( lemp->vard
19c60 65 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75 63  est ){.    struc
19c70 74 20 73 79 6d 62 6f 6c 20 2a 64 66 6c 74 5f 73  t symbol *dflt_s
19c80 70 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  p = 0;.    for(i
19c90 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d  =0; i<lemp->nsym
19ca0 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  bol; i++){.     
19cb0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
19cc0 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
19cd0 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  ls[i];.      if(
19ce0 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79   sp==0 || sp->ty
19cf0 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 0a  pe==TERMINAL ||.
19d00 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 69 6e            sp->in
19d10 64 65 78 3c 3d 30 20 7c 7c 20 73 70 2d 3e 64 65  dex<=0 || sp->de
19d20 73 74 72 75 63 74 6f 72 21 3d 30 20 29 20 63 6f  structor!=0 ) co
19d30 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 70  ntinue;.      fp
19d40 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63  rintf(out,"    c
19d50 61 73 65 20 25 64 3a 5c 6e 22 2c 73 70 2d 3e 69  ase %d:\n",sp->i
19d60 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ndex); lineno++;
19d70 0a 20 20 20 20 20 20 64 66 6c 74 5f 73 70 20 3d  .      dflt_sp =
19d80 20 73 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   sp;.    }.    i
19d90 66 28 20 64 66 6c 74 5f 73 70 21 3d 30 20 29 7b  f( dflt_sp!=0 ){
19da0 0a 20 20 20 20 20 20 65 6d 69 74 5f 64 65 73 74  .      emit_dest
19db0 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c  ructor_code(out,
19dc0 64 66 6c 74 5f 73 70 2c 6c 65 6d 70 2c 26 6c 69  dflt_sp,lemp,&li
19dd0 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 66 70 72  neno);.      fpr
19de0 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20  intf(out,"      
19df0 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65  break;\n"); line
19e00 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  no++;.    }.  }.
19e10 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
19e20 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
19e30 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
19e40 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63  nerate code whic
19e50 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 65  h executes whene
19e60 76 65 72 20 74 68 65 20 70 61 72 73 65 72 20 73  ver the parser s
19e70 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77 73 20 2a  tack overflows *
19e80 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f  /.  tplt_print(o
19e90 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 6f 76  ut,lemp,lemp->ov
19ea0 65 72 66 6c 6f 77 2c 6c 65 6d 70 2d 3e 6f 76 65  erflow,lemp->ove
19eb0 72 66 6c 6f 77 6c 6e 2c 26 6c 69 6e 65 6e 6f 29  rflowln,&lineno)
19ec0 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
19ed0 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
19ee0 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
19ef0 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 61 62  Generate the tab
19f00 6c 65 20 6f 66 20 72 75 6c 65 20 69 6e 66 6f 72  le of rule infor
19f10 6d 61 74 69 6f 6e 20 0a 20 20 2a 2a 0a 20 20 2a  mation .  **.  *
19f20 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 63 6f 64  * Note: This cod
19f30 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  e depends on the
19f40 20 66 61 63 74 20 74 68 61 74 20 72 75 6c 65 73   fact that rules
19f50 20 61 72 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a   are number.  **
19f60 20 73 65 71 75 65 6e 74 75 61 6c 6c 79 20 62 65   sequentually be
19f70 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30 2e 0a  ginning with 0..
19f80 20 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65    */.  for(rp=le
19f90 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
19fa0 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
19fb0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 7b  fprintf(out,"  {
19fc0 20 25 64 2c 20 25 64 20 7d 2c 5c 6e 22 2c 72 70   %d, %d },\n",rp
19fd0 2d 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c 72 70 2d  ->lhs->index,rp-
19fe0 3e 6e 72 68 73 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  >nrhs); lineno++
19ff0 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ;.  }.  tplt_xfe
1a000 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1a010 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1a020 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1a030 65 20 77 68 69 63 68 20 65 78 65 63 75 74 69 6f  e which executio
1a040 6e 20 64 75 72 69 6e 67 20 65 61 63 68 20 52 45  n during each RE
1a050 44 55 43 45 20 61 63 74 69 6f 6e 20 2a 2f 0a 20  DUCE action */. 
1a060 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
1a070 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
1a080 65 78 74 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  ext){.    fprint
1a090 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63 61 73  f(out,"      cas
1a0a0 65 20 25 64 3a 5c 6e 22 2c 72 70 2d 3e 69 6e 64  e %d:\n",rp->ind
1a0b0 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ex); lineno++;. 
1a0c0 20 20 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75 74     emit_code(out
1a0d0 2c 72 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f  ,rp,lemp,&lineno
1a0e0 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  );.    fprintf(o
1a0f0 75 74 2c 22 20 20 20 20 20 20 20 20 62 72 65 61  ut,"        brea
1a100 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  k;\n"); lineno++
1a110 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  ;.  }.  tplt_xfe
1a120 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1a130 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1a140 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1a150 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
1a160 20 69 66 20 61 20 70 61 72 73 65 20 66 61 69 6c   if a parse fail
1a170 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e  s */.  tplt_prin
1a180 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d  t(out,lemp,lemp-
1a190 3e 66 61 69 6c 75 72 65 2c 6c 65 6d 70 2d 3e 66  >failure,lemp->f
1a1a0 61 69 6c 75 72 65 6c 6e 2c 26 6c 69 6e 65 6e 6f  ailureln,&lineno
1a1b0 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  );.  tplt_xfer(l
1a1c0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1a1d0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1a1e0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
1a1f0 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77 68  hich executes wh
1a200 65 6e 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f  en a syntax erro
1a210 72 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 74 70  r occurs */.  tp
1a220 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d  lt_print(out,lem
1a230 70 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72 2c 6c 65  p,lemp->error,le
1a240 6d 70 2d 3e 65 72 72 6f 72 6c 6e 2c 26 6c 69 6e  mp->errorln,&lin
1a250 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65  eno);.  tplt_xfe
1a260 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c  r(lemp->name,in,
1a270 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20  out,&lineno);.. 
1a280 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
1a290 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65 73  e which executes
1a2a0 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65 72   when the parser
1a2b0 20 61 63 63 65 70 74 73 20 69 74 73 20 69 6e 70   accepts its inp
1a2c0 75 74 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  ut */.  tplt_pri
1a2d0 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
1a2e0 2d 3e 61 63 63 65 70 74 2c 6c 65 6d 70 2d 3e 61  ->accept,lemp->a
1a2f0 63 63 65 70 74 6c 6e 2c 26 6c 69 6e 65 6e 6f 29  cceptln,&lineno)
1a300 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  ;.  tplt_xfer(le
1a310 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
1a320 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
1a330 41 70 70 65 6e 64 20 61 6e 79 20 61 64 64 69 74  Append any addit
1a340 69 6f 6e 20 63 6f 64 65 20 74 68 65 20 75 73 65  ion code the use
1a350 72 20 64 65 73 69 72 65 73 20 2a 2f 0a 20 20 74  r desires */.  t
1a360 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
1a370 6d 70 2c 6c 65 6d 70 2d 3e 65 78 74 72 61 63 6f  mp,lemp->extraco
1a380 64 65 2c 6c 65 6d 70 2d 3e 65 78 74 72 61 63 6f  de,lemp->extraco
1a390 64 65 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  deln,&lineno);..
1a3a0 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20    fclose(in);.  
1a3b0 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 72  fclose(out);.  r
1a3c0 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e  eturn;.}../* Gen
1a3d0 65 72 61 74 65 20 61 20 68 65 61 64 65 72 20 66  erate a header f
1a3e0 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 72 73  ile for the pars
1a3f0 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72  er */.void Repor
1a400 74 48 65 61 64 65 72 28 6c 65 6d 70 29 0a 73 74  tHeader(lemp).st
1a410 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
1a420 3b 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 2c  ;.{.  FILE *out,
1a430 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a 70 72   *in;.  char *pr
1a440 65 66 69 78 3b 0a 20 20 63 68 61 72 20 6c 69 6e  efix;.  char lin
1a450 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20 63  e[LINESIZE];.  c
1a460 68 61 72 20 70 61 74 74 65 72 6e 5b 4c 49 4e 45  har pattern[LINE
1a470 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 69 3b 0a  SIZE];.  int i;.
1a480 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b  .  if( lemp->tok
1a490 65 6e 70 72 65 66 69 78 20 29 20 70 72 65 66 69  enprefix ) prefi
1a4a0 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70  x = lemp->tokenp
1a4b0 72 65 66 69 78 3b 0a 20 20 65 6c 73 65 20 20 20  refix;.  else   
1a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4d0 20 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20   prefix = "";.  
1a4e0 69 6e 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c  in = file_open(l
1a4f0 65 6d 70 2c 22 2e 68 22 2c 22 72 22 29 3b 0a 20  emp,".h","r");. 
1a500 20 69 66 28 20 69 6e 20 29 7b 0a 20 20 20 20 66   if( in ){.    f
1a510 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=1; i<lemp->
1a520 6e 74 65 72 6d 69 6e 61 6c 20 26 26 20 66 67 65  nterminal && fge
1a530 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45  ts(line,LINESIZE
1a540 2c 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ,in); i++){.    
1a550 20 20 73 70 72 69 6e 74 66 28 70 61 74 74 65 72    sprintf(patter
1a560 6e 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d 33  n,"#define %s%-3
1a570 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69 78  0s %2d\n",prefix
1a580 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69  ,lemp->symbols[i
1a590 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20  ]->name,i);.    
1a5a0 20 20 69 66 28 20 73 74 72 63 6d 70 28 6c 69 6e    if( strcmp(lin
1a5b0 65 2c 70 61 74 74 65 72 6e 29 20 29 20 62 72 65  e,pattern) ) bre
1a5c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 63  ak;.    }.    fc
1a5d0 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 69 66  lose(in);.    if
1a5e0 28 20 69 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d  ( i==lemp->nterm
1a5f0 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  inal ){.      /*
1a600 20 4e 6f 20 63 68 61 6e 67 65 20 69 6e 20 74 68   No change in th
1a610 65 20 66 69 6c 65 2e 20 20 44 6f 6e 27 74 20 72  e file.  Don't r
1a620 65 77 72 69 74 65 20 69 74 2e 20 2a 2f 0a 20 20  ewrite it. */.  
1a630 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
1a640 7d 0a 20 20 7d 0a 20 20 6f 75 74 20 3d 20 66 69  }.  }.  out = fi
1a650 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68  le_open(lemp,".h
1a660 22 2c 22 77 22 29 3b 0a 20 20 69 66 28 20 6f 75  ","w");.  if( ou
1a670 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31  t ){.    for(i=1
1a680 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; i<lemp->ntermi
1a690 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nal; i++){.     
1a6a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
1a6b0 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25 32  efine %s%-30s %2
1a6c0 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d 70  d\n",prefix,lemp
1a6d0 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61  ->symbols[i]->na
1a6e0 6d 65 2c 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20  me,i);.    }.   
1a6f0 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 20 20 0a   fclose(out);  .
1a700 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a    }.  return;.}.
1a710 0a 2f 2a 20 52 65 64 75 63 65 20 74 68 65 20 73  ./* Reduce the s
1a720 69 7a 65 20 6f 66 20 74 68 65 20 61 63 74 69 6f  ize of the actio
1a730 6e 20 74 61 62 6c 65 73 2c 20 69 66 20 70 6f 73  n tables, if pos
1a740 73 69 62 6c 65 2c 20 62 79 20 6d 61 6b 69 6e 67  sible, by making
1a750 20 75 73 65 0a 2a 2a 20 6f 66 20 64 65 66 61 75   use.** of defau
1a760 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68  lts..**.** In th
1a770 69 73 20 76 65 72 73 69 6f 6e 2c 20 77 65 20 74  is version, we t
1a780 61 6b 65 20 74 68 65 20 6d 6f 73 74 20 66 72 65  ake the most fre
1a790 71 75 65 6e 74 20 52 45 44 55 43 45 20 61 63 74  quent REDUCE act
1a7a0 69 6f 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a 20  ion and make.** 
1a7b0 69 74 20 74 68 65 20 64 65 66 61 75 6c 74 2e 20  it the default. 
1a7c0 20 4f 6e 6c 79 20 64 65 66 61 75 6c 74 20 61 20   Only default a 
1a7d0 72 65 64 75 63 65 20 69 66 20 74 68 65 72 65 20  reduce if there 
1a7e0 61 72 65 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  are more than on
1a7f0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6d 70 72  e..*/.void Compr
1a800 65 73 73 54 61 62 6c 65 73 28 6c 65 6d 70 29 0a  essTables(lemp).
1a810 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
1a820 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73  mp;.{.  struct s
1a830 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72  tate *stp;.  str
1a840 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20  uct action *ap, 
1a850 2a 61 70 32 3b 0a 20 20 73 74 72 75 63 74 20 72  *ap2;.  struct r
1a860 75 6c 65 20 2a 72 70 2c 20 2a 72 70 32 2c 20 2a  ule *rp, *rp2, *
1a870 72 62 65 73 74 3b 0a 20 20 69 6e 74 20 6e 62 65  rbest;.  int nbe
1a880 73 74 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a  st, n;.  int i;.
1a890 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
1a8a0 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
1a8b0 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  {.    stp = lemp
1a8c0 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
1a8d0 20 6e 62 65 73 74 20 3d 20 30 3b 0a 20 20 20 20   nbest = 0;.    
1a8e0 72 62 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20  rbest = 0;..    
1a8f0 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20  for(ap=stp->ap; 
1a900 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
1a910 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  {.      if( ap->
1a920 74 79 70 65 21 3d 52 45 44 55 43 45 20 29 20 63  type!=REDUCE ) c
1a930 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 72  ontinue;.      r
1a940 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20 20  p = ap->x.rp;.  
1a950 20 20 20 20 69 66 28 20 72 70 3d 3d 72 62 65 73      if( rp==rbes
1a960 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
1a970 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20      n = 1;.     
1a980 20 66 6f 72 28 61 70 32 3d 61 70 2d 3e 6e 65 78   for(ap2=ap->nex
1a990 74 3b 20 61 70 32 3b 20 61 70 32 3d 61 70 32 2d  t; ap2; ap2=ap2-
1a9a0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
1a9b0 69 66 28 20 61 70 32 2d 3e 74 79 70 65 21 3d 52  if( ap2->type!=R
1a9c0 45 44 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65  EDUCE ) continue
1a9d0 3b 0a 20 20 20 20 20 20 20 20 72 70 32 20 3d 20  ;.        rp2 = 
1a9e0 61 70 32 2d 3e 78 2e 72 70 3b 0a 20 20 20 20 20  ap2->x.rp;.     
1a9f0 20 20 20 69 66 28 20 72 70 32 3d 3d 72 62 65 73     if( rp2==rbes
1aa00 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  t ) continue;.  
1aa10 20 20 20 20 20 20 69 66 28 20 72 70 32 3d 3d 72        if( rp2==r
1aa20 70 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d  p ) n++;.      }
1aa30 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 62 65  .      if( n>nbe
1aa40 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 62  st ){.        nb
1aa50 65 73 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  est = n;.       
1aa60 20 72 62 65 73 74 20 3d 20 72 70 3b 0a 20 20 20   rbest = rp;.   
1aa70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 0a 20 20 20     }.    }. .   
1aa80 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b 65 20   /* Do not make 
1aa90 61 20 64 65 66 61 75 6c 74 20 69 66 20 74 68 65  a default if the
1aaa0 20 6e 75 6d 62 65 72 20 6f 66 20 72 75 6c 65 73   number of rules
1aab0 20 74 6f 20 64 65 66 61 75 6c 74 0a 20 20 20 20   to default.    
1aac0 2a 2a 20 69 73 20 6e 6f 74 20 61 74 20 6c 65 61  ** is not at lea
1aad0 73 74 20 32 20 2a 2f 0a 20 20 20 20 69 66 28 20  st 2 */.    if( 
1aae0 6e 62 65 73 74 3c 32 20 29 20 63 6f 6e 74 69 6e  nbest<2 ) contin
1aaf0 75 65 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d  ue;...    /* Com
1ab00 62 69 6e 65 20 6d 61 74 63 68 69 6e 67 20 52 45  bine matching RE
1ab10 44 55 43 45 20 61 63 74 69 6f 6e 73 20 69 6e 74  DUCE actions int
1ab20 6f 20 61 20 73 69 6e 67 6c 65 20 64 65 66 61 75  o a single defau
1ab30 6c 74 20 2a 2f 0a 20 20 20 20 66 6f 72 28 61 70  lt */.    for(ap
1ab40 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70  =stp->ap; ap; ap
1ab50 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =ap->next){.    
1ab60 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d    if( ap->type==
1ab70 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78 2e  REDUCE && ap->x.
1ab80 72 70 3d 3d 72 62 65 73 74 20 29 20 62 72 65 61  rp==rbest ) brea
1ab90 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  k;.    }.    ass
1aba0 65 72 74 28 20 61 70 20 29 3b 0a 20 20 20 20 61  ert( ap );.    a
1abb0 70 2d 3e 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e  p->sp = Symbol_n
1abc0 65 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29 3b  ew("{default}");
1abd0 0a 20 20 20 20 66 6f 72 28 61 70 3d 61 70 2d 3e  .    for(ap=ap->
1abe0 6e 65 78 74 3b 20 61 70 3b 20 61 70 3d 61 70 2d  next; ap; ap=ap-
1abf0 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  >next){.      if
1ac00 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44 55  ( ap->type==REDU
1ac10 43 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d 3d  CE && ap->x.rp==
1ac20 72 62 65 73 74 20 29 20 61 70 2d 3e 74 79 70 65  rbest ) ap->type
1ac30 20 3d 20 4e 4f 54 5f 55 53 45 44 3b 0a 20 20 20   = NOT_USED;.   
1ac40 20 7d 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d   }.    stp->ap =
1ac50 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70   Action_sort(stp
1ac60 2d 3e 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ->ap);.  }.}../*
1ac70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac80 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22   From the file "
1ac90 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  set.c" *********
1aca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1acb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
1acc0 2a 2a 20 53 65 74 20 6d 61 6e 69 70 75 6c 61 74  ** Set manipulat
1acd0 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  ion routines for
1ace0 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
1acf0 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
1ad00 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 7a 65  .static int size
1ad10 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74 20 74 68   = 0;../* Set th
1ad20 65 20 73 65 74 20 73 69 7a 65 20 2a 2f 0a 76 6f  e set size */.vo
1ad30 69 64 20 53 65 74 53 69 7a 65 28 6e 29 0a 69 6e  id SetSize(n).in
1ad40 74 20 6e 3b 0a 7b 0a 20 20 73 69 7a 65 20 3d 20  t n;.{.  size = 
1ad50 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63  n+1;.}../* Alloc
1ad60 61 74 65 20 61 20 6e 65 77 20 73 65 74 20 2a 2f  ate a new set */
1ad70 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28 29 7b  .char *SetNew(){
1ad80 0a 20 20 63 68 61 72 20 2a 73 3b 0a 20 20 69 6e  .  char *s;.  in
1ad90 74 20 69 3b 0a 20 20 73 20 3d 20 28 63 68 61 72  t i;.  s = (char
1ada0 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 20 29  *)malloc( size )
1adb0 3b 0a 20 20 69 66 28 20 73 3d 3d 30 20 29 7b 0a  ;.  if( s==0 ){.
1adc0 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20      extern void 
1add0 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b 0a  memory_error();.
1ade0 20 20 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72      memory_error
1adf0 28 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ();.  }.  for(i=
1ae00 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20  0; i<size; i++) 
1ae10 73 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  s[i] = 0;.  retu
1ae20 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20 44 65 61 6c  rn s;.}../* Deal
1ae30 6c 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f 0a  locate a set */.
1ae40 76 6f 69 64 20 53 65 74 46 72 65 65 28 73 29 0a  void SetFree(s).
1ae50 63 68 61 72 20 2a 73 3b 0a 7b 0a 20 20 66 72 65  char *s;.{.  fre
1ae60 65 28 73 29 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20  e(s);.}../* Add 
1ae70 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
1ae80 20 74 68 65 20 73 65 74 2e 20 20 52 65 74 75 72   the set.  Retur
1ae90 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 65 6c  n TRUE if the el
1aea0 65 6d 65 6e 74 20 77 61 73 20 61 64 64 65 64 0a  ement was added.
1aeb0 2a 2a 20 61 6e 64 20 46 41 4c 53 45 20 69 66 20  ** and FALSE if 
1aec0 69 74 20 77 61 73 20 61 6c 72 65 61 64 79 20 74  it was already t
1aed0 68 65 72 65 2e 20 2a 2f 0a 69 6e 74 20 53 65 74  here. */.int Set
1aee0 41 64 64 28 73 2c 65 29 0a 63 68 61 72 20 2a 73  Add(s,e).char *s
1aef0 3b 0a 69 6e 74 20 65 3b 0a 7b 0a 20 20 69 6e 74  ;.int e;.{.  int
1af00 20 72 76 3b 0a 20 20 72 76 20 3d 20 73 5b 65 5d   rv;.  rv = s[e]
1af10 3b 0a 20 20 73 5b 65 5d 20 3d 20 31 3b 0a 20 20  ;.  s[e] = 1;.  
1af20 72 65 74 75 72 6e 20 21 72 76 3b 0a 7d 0a 0a 2f  return !rv;.}../
1af30 2a 20 41 64 64 20 65 76 65 72 79 20 65 6c 65 6d  * Add every elem
1af40 65 6e 74 20 6f 66 20 73 32 20 74 6f 20 73 31 2e  ent of s2 to s1.
1af50 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
1af60 20 73 31 20 63 68 61 6e 67 65 73 2e 20 2a 2f 0a   s1 changes. */.
1af70 69 6e 74 20 53 65 74 55 6e 69 6f 6e 28 73 31 2c  int SetUnion(s1,
1af80 73 32 29 0a 63 68 61 72 20 2a 73 31 3b 0a 63 68  s2).char *s1;.ch
1af90 61 72 20 2a 73 32 3b 0a 7b 0a 20 20 69 6e 74 20  ar *s2;.{.  int 
1afa0 69 2c 20 70 72 6f 67 72 65 73 73 3b 0a 20 20 70  i, progress;.  p
1afb0 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 66  rogress = 0;.  f
1afc0 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20  or(i=0; i<size; 
1afd0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 32  i++){.    if( s2
1afe0 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
1aff0 65 3b 0a 20 20 20 20 69 66 28 20 73 31 5b 69 5d  e;.    if( s1[i]
1b000 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72 6f  ==0 ){.      pro
1b010 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20 20  gress = 1;.     
1b020 20 73 31 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20   s1[i] = 1;.    
1b030 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
1b040 72 6f 67 72 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a 2a  rogress;.}./****
1b050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b060 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
1b070 20 22 74 61 62 6c 65 2e 63 22 20 2a 2a 2a 2a 2a   "table.c" *****
1b080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b090 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41  *******/./*.** A
1b0a0 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20  ll code in this 
1b0b0 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61 75  file has been au
1b0c0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65  tomatically gene
1b0d0 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61 20  rated.** from a 
1b0e0 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69 6e  specification in
1b0f0 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20   the file.**    
1b100 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c 65            "table
1b110 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20 61 73  .q".** by the as
1b120 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
1b130 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20 70 72  code building pr
1b140 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a 2a  ogram "aagen"..*
1b150 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 74 68  * Do not edit th
1b160 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74 65 61  is file!  Instea
1b170 64 2c 20 65 64 69 74 20 74 68 65 20 73 70 65 63  d, edit the spec
1b180 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69 6c  ification.** fil
1b190 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20 61 61  e, then rerun aa
1b1a0 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f  gen..*/./*.** Co
1b1b0 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73 69 6e  de for processin
1b1c0 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  g tables in the 
1b1d0 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e  LEMON parser gen
1b1e0 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 50 52 49 56  erator..*/..PRIV
1b1f0 41 54 45 20 69 6e 74 20 73 74 72 68 61 73 68 28  ATE int strhash(
1b200 78 29 0a 63 68 61 72 20 2a 78 3b 0a 7b 0a 20 20  x).char *x;.{.  
1b210 69 6e 74 20 68 20 3d 20 30 3b 0a 20 20 77 68 69  int h = 0;.  whi
1b220 6c 65 28 20 2a 78 29 20 68 20 3d 20 68 2a 31 33  le( *x) h = h*13
1b230 20 2b 20 2a 28 78 2b 2b 29 3b 0a 20 20 72 65 74   + *(x++);.  ret
1b240 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f 72  urn h;.}../* Wor
1b250 6b 73 20 6c 69 6b 65 20 73 74 72 64 75 70 2c 20  ks like strdup, 
1b260 73 6f 72 74 20 6f 66 2e 20 20 53 61 76 65 20 61  sort of.  Save a
1b270 20 73 74 72 69 6e 67 20 69 6e 20 6d 61 6c 6c 6f   string in mallo
1b280 63 65 64 20 6d 65 6d 6f 72 79 2c 20 62 75 74 0a  ced memory, but.
1b290 2a 2a 20 6b 65 65 70 20 73 74 72 69 6e 67 73 20  ** keep strings 
1b2a0 69 6e 20 61 20 74 61 62 6c 65 20 73 6f 20 74 68  in a table so th
1b2b0 61 74 20 74 68 65 20 73 61 6d 65 20 73 74 72 69  at the same stri
1b2c0 6e 67 20 69 73 20 6e 6f 74 20 69 6e 20 6d 6f 72  ng is not in mor
1b2d0 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 70 6c  e.** than one pl
1b2e0 61 63 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 53 74  ace..*/.char *St
1b2f0 72 73 61 66 65 28 79 29 0a 63 68 61 72 20 2a 79  rsafe(y).char *y
1b300 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a  ;.{.  char *z;..
1b310 20 20 7a 20 3d 20 53 74 72 73 61 66 65 5f 66 69    z = Strsafe_fi
1b320 6e 64 28 79 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  nd(y);.  if( z==
1b330 30 20 26 26 20 28 7a 3d 6d 61 6c 6c 6f 63 28 20  0 && (z=malloc( 
1b340 73 74 72 6c 65 6e 28 79 29 2b 31 20 29 29 21 3d  strlen(y)+1 ))!=
1b350 30 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79 28  0 ){.    strcpy(
1b360 7a 2c 79 29 3b 0a 20 20 20 20 53 74 72 73 61 66  z,y);.    Strsaf
1b370 65 5f 69 6e 73 65 72 74 28 7a 29 3b 0a 20 20 7d  e_insert(z);.  }
1b380 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 7a  .  MemoryCheck(z
1b390 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  );.  return z;.}
1b3a0 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
1b3b0 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
1b3c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
1b3d0 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a 2a  cture for each.*
1b3e0 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72  * associative ar
1b3f0 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 31 22  ray of type "x1"
1b400 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78 31  ..*/.struct s_x1
1b410 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20 20   {.  int size;  
1b420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b430 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76  The number of av
1b440 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a  ailable slots. *
1b450 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1b460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
1b470 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   Must be a power
1b480 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74 68   of 2 greater th
1b490 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20  an or */.       
1b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4b0 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f     /*   equal to
1b4c0 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e   1 */.  int coun
1b4d0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1b4e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
1b4f0 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c  rently slots fil
1b500 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  led */.  struct 
1b510 73 5f 78 31 6e 6f 64 65 20 2a 74 62 6c 3b 20 20  s_x1node *tbl;  
1b520 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f 72  /* The data stor
1b530 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74 72  ed here */.  str
1b540 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 68  uct s_x1node **h
1b550 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c  t;  /* Hash tabl
1b560 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f  e for lookups */
1b570 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  .};../* There is
1b580 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
1b590 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
1b5a0 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20 65  for every data e
1b5b0 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20  lement.** in an 
1b5c0 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
1b5d0 79 20 6f 66 20 74 79 70 65 20 22 78 31 22 2e 0a  y of type "x1"..
1b5e0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1b5f0 74 20 73 5f 78 31 6e 6f 64 65 20 7b 0a 20 20 63  t s_x1node {.  c
1b600 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20 20  har *data;      
1b610 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1b620 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72  he data */.  str
1b630 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 6e 65  uct s_x1node *ne
1b640 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e  xt;   /* Next en
1b650 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
1b660 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75  e hash */.  stru
1b670 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 66 72  ct s_x1node **fr
1b680 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73  om;  /* Previous
1b690 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 31 6e 6f 64   link */.} x1nod
1b6a0 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20  e;../* There is 
1b6b0 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63  only one instanc
1b6c0 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20  e of the array, 
1b6d0 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c  which is the fol
1b6e0 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63  lowing */.static
1b6f0 20 73 74 72 75 63 74 20 73 5f 78 31 20 2a 78 31   struct s_x1 *x1
1b700 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  a;../* Allocate 
1b710 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76  a new associativ
1b720 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20  e array */.void 
1b730 53 74 72 73 61 66 65 5f 69 6e 69 74 28 29 7b 0a  Strsafe_init(){.
1b740 20 20 69 66 28 20 78 31 61 20 29 20 72 65 74 75    if( x1a ) retu
1b750 72 6e 3b 0a 20 20 78 31 61 20 3d 20 28 73 74 72  rn;.  x1a = (str
1b760 75 63 74 20 73 5f 78 31 2a 29 6d 61 6c 6c 6f 63  uct s_x1*)malloc
1b770 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20  ( sizeof(struct 
1b780 73 5f 78 31 29 20 29 3b 0a 20 20 69 66 28 20 78  s_x1) );.  if( x
1b790 31 61 20 29 7b 0a 20 20 20 20 78 31 61 2d 3e 73  1a ){.    x1a->s
1b7a0 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20 20  ize = 1024;.    
1b7b0 78 31 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a  x1a->count = 0;.
1b7c0 20 20 20 20 78 31 61 2d 3e 74 62 6c 20 3d 20 28      x1a->tbl = (
1b7d0 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 20  x1node*)malloc( 
1b7e0 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78  .      (sizeof(x
1b7f0 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28  1node) + sizeof(
1b800 78 31 6e 6f 64 65 2a 29 29 2a 31 30 32 34 20 29  x1node*))*1024 )
1b810 3b 0a 20 20 20 20 69 66 28 20 78 31 61 2d 3e 74  ;.    if( x1a->t
1b820 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  bl==0 ){.      f
1b830 72 65 65 28 78 31 61 29 3b 0a 20 20 20 20 20 20  ree(x1a);.      
1b840 78 31 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  x1a = 0;.    }el
1b850 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  se{.      int i;
1b860 0a 20 20 20 20 20 20 78 31 61 2d 3e 68 74 20 3d  .      x1a->ht =
1b870 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28 78 31 61   (x1node**)&(x1a
1b880 2d 3e 74 62 6c 5b 31 30 32 34 5d 29 3b 0a 20 20  ->tbl[1024]);.  
1b890 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
1b8a0 30 32 34 3b 20 69 2b 2b 29 20 78 31 61 2d 3e 68  024; i++) x1a->h
1b8b0 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  t[i] = 0;.    }.
1b8c0 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20    }.}./* Insert 
1b8d0 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74  a new record int
1b8e0 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65  o the array.  Re
1b8f0 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63  turn TRUE if suc
1b900 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f  cessful..** Prio
1b910 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20  r data with the 
1b920 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20  same key is NOT 
1b930 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69  overwritten */.i
1b940 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72  nt Strsafe_inser
1b950 74 28 64 61 74 61 29 0a 63 68 61 72 20 2a 64 61  t(data).char *da
1b960 74 61 3b 0a 7b 0a 20 20 78 31 6e 6f 64 65 20 2a  ta;.{.  x1node *
1b970 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69  np;.  int h;.  i
1b980 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 31  nt ph;..  if( x1
1b990 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
1b9a0 0a 20 20 70 68 20 3d 20 73 74 72 68 61 73 68 28  .  ph = strhash(
1b9b0 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20  data);.  h = ph 
1b9c0 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b  & (x1a->size-1);
1b9d0 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b  .  np = x1a->ht[
1b9e0 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20  h];.  while( np 
1b9f0 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
1ba00 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61 29  p(np->data,data)
1ba10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
1ba20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  An existing entr
1ba30 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
1ba40 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f  key is found. */
1ba50 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62  .      /* Fail b
1ba60 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74 65  ecause overwrite
1ba70 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20   is not allows. 
1ba80 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1ba90 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20  0;.    }.    np 
1baa0 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
1bab0 20 20 69 66 28 20 78 31 61 2d 3e 63 6f 75 6e 74    if( x1a->count
1bac0 3e 3d 78 31 61 2d 3e 73 69 7a 65 20 29 7b 0a 20  >=x1a->size ){. 
1bad0 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61     /* Need to ma
1bae0 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  ke the hash tabl
1baf0 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20  e bigger */.    
1bb00 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20  int i,size;.    
1bb10 73 74 72 75 63 74 20 73 5f 78 31 20 61 72 72 61  struct s_x1 arra
1bb20 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a  y;.    array.siz
1bb30 65 20 3d 20 73 69 7a 65 20 3d 20 78 31 61 2d 3e  e = size = x1a->
1bb40 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61  size*2;.    arra
1bb50 79 2e 63 6f 75 6e 74 20 3d 20 78 31 61 2d 3e 63  y.count = x1a->c
1bb60 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e  ount;.    array.
1bb70 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29 6d  tbl = (x1node*)m
1bb80 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69  alloc(.      (si
1bb90 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20 73  zeof(x1node) + s
1bba0 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29 2a  izeof(x1node*))*
1bbb0 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  size );.    if( 
1bbc0 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72  array.tbl==0 ) r
1bbd0 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69  eturn 0;  /* Fai
1bbe0 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20  l due to malloc 
1bbf0 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61  failure */.    a
1bc00 72 72 61 79 2e 68 74 20 3d 20 28 78 31 6e 6f 64  rray.ht = (x1nod
1bc10 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b  e**)&(array.tbl[
1bc20 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28  size]);.    for(
1bc30 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b  i=0; i<size; i++
1bc40 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20  ) array.ht[i] = 
1bc50 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
1bc60 69 3c 78 31 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b  i<x1a->count; i+
1bc70 2b 29 7b 0a 20 20 20 20 20 20 78 31 6e 6f 64 65  +){.      x1node
1bc80 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b   *oldnp, *newnp;
1bc90 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26  .      oldnp = &
1bca0 28 78 31 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20  (x1a->tbl[i]);. 
1bcb0 20 20 20 20 20 68 20 3d 20 73 74 72 68 61 73 68       h = strhash
1bcc0 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26 20  (oldnp->data) & 
1bcd0 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20  (size-1);.      
1bce0 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e  newnp = &(array.
1bcf0 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69  tbl[i]);.      i
1bd00 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29  f( array.ht[h] )
1bd10 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72   array.ht[h]->fr
1bd20 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65  om = &(newnp->ne
1bd30 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  xt);.      newnp
1bd40 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68  ->next = array.h
1bd50 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e  t[h];.      newn
1bd60 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d  p->data = oldnp-
1bd70 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77  >data;.      new
1bd80 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72  np->from = &(arr
1bd90 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20  ay.ht[h]);.     
1bda0 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e   array.ht[h] = n
1bdb0 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ewnp;.    }.    
1bdc0 66 72 65 65 28 78 31 61 2d 3e 74 62 6c 29 3b 0a  free(x1a->tbl);.
1bdd0 20 20 20 20 2a 78 31 61 20 3d 20 61 72 72 61 79      *x1a = array
1bde0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72  ;.  }.  /* Inser
1bdf0 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a  t the new data *
1be00 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 31  /.  h = ph & (x1
1be10 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
1be20 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 78 31   = &(x1a->tbl[x1
1be30 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20  a->count++]);.  
1be40 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b  np->data = data;
1be50 0a 20 20 69 66 28 20 78 31 61 2d 3e 68 74 5b 68  .  if( x1a->ht[h
1be60 5d 20 29 20 78 31 61 2d 3e 68 74 5b 68 5d 2d 3e  ] ) x1a->ht[h]->
1be70 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78  from = &(np->nex
1be80 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d  t);.  np->next =
1be90 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78   x1a->ht[h];.  x
1bea0 31 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a  1a->ht[h] = np;.
1beb0 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78    np->from = &(x
1bec0 31 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65  1a->ht[h]);.  re
1bed0 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65  turn 1;.}../* Re
1bee0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1bef0 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20  o data assigned 
1bf00 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79  to the given key
1bf10 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a  .  Return NULL.*
1bf20 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79  * if no such key
1bf30 2e 20 2a 2f 0a 63 68 61 72 20 2a 53 74 72 73 61  . */.char *Strsa
1bf40 66 65 5f 66 69 6e 64 28 6b 65 79 29 0a 63 68 61  fe_find(key).cha
1bf50 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20  r *key;.{.  int 
1bf60 68 3b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70 3b  h;.  x1node *np;
1bf70 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d 30 20 29  ..  if( x1a==0 )
1bf80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d   return 0;.  h =
1bf90 20 73 74 72 68 61 73 68 28 6b 65 79 29 20 26 20   strhash(key) & 
1bfa0 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x1a->size-1);. 
1bfb0 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68 5d   np = x1a->ht[h]
1bfc0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
1bfd0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
1bfe0 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29 3d 3d 30  np->data,key)==0
1bff0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70   ) break;.    np
1c000 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
1c010 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e  .  return np ? n
1c020 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a  p->data : 0;.}..
1c030 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  /* Return a poin
1c040 74 65 72 20 74 6f 20 74 68 65 20 28 74 65 72 6d  ter to the (term
1c050 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74 65 72 6d 69  inal or nontermi
1c060 6e 61 6c 29 20 73 79 6d 62 6f 6c 20 22 78 22 2e  nal) symbol "x".
1c070 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
1c080 20 73 79 6d 62 6f 6c 20 69 66 20 74 68 69 73 20   symbol if this 
1c090 69 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  is the first tim
1c0a0 65 20 22 78 22 20 68 61 73 20 62 65 65 6e 20 73  e "x" has been s
1c0b0 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73  een..*/.struct s
1c0c0 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e 65  ymbol *Symbol_ne
1c0d0 77 28 78 29 0a 63 68 61 72 20 2a 78 3b 0a 7b 0a  w(x).char *x;.{.
1c0e0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
1c0f0 2a 73 70 3b 0a 0a 20 20 73 70 20 3d 20 53 79 6d  *sp;..  sp = Sym
1c100 62 6f 6c 5f 66 69 6e 64 28 78 29 3b 0a 20 20 69  bol_find(x);.  i
1c110 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20 20  f( sp==0 ){.    
1c120 73 70 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d  sp = (struct sym
1c130 62 6f 6c 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  bol *)malloc( si
1c140 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62  zeof(struct symb
1c150 6f 6c 29 20 29 3b 0a 20 20 20 20 4d 65 6d 6f 72  ol) );.    Memor
1c160 79 43 68 65 63 6b 28 73 70 29 3b 0a 20 20 20 20  yCheck(sp);.    
1c170 73 70 2d 3e 6e 61 6d 65 20 3d 20 53 74 72 73 61  sp->name = Strsa
1c180 66 65 28 78 29 3b 0a 20 20 20 20 73 70 2d 3e 74  fe(x);.    sp->t
1c190 79 70 65 20 3d 20 69 73 75 70 70 65 72 28 2a 78  ype = isupper(*x
1c1a0 29 20 3f 20 54 45 52 4d 49 4e 41 4c 20 3a 20 4e  ) ? TERMINAL : N
1c1b0 4f 4e 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20 20  ONTERMINAL;.    
1c1c0 73 70 2d 3e 72 75 6c 65 20 3d 20 30 3b 0a 20 20  sp->rule = 0;.  
1c1d0 20 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d    sp->fallback =
1c1e0 20 30 3b 0a 20 20 20 20 73 70 2d 3e 70 72 65 63   0;.    sp->prec
1c1f0 20 3d 20 2d 31 3b 0a 20 20 20 20 73 70 2d 3e 61   = -1;.    sp->a
1c200 73 73 6f 63 20 3d 20 55 4e 4b 3b 0a 20 20 20 20  ssoc = UNK;.    
1c210 73 70 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 30  sp->firstset = 0
1c220 3b 0a 20 20 20 20 73 70 2d 3e 6c 61 6d 62 64 61  ;.    sp->lambda
1c230 20 3d 20 42 5f 46 41 4c 53 45 3b 0a 20 20 20 20   = B_FALSE;.    
1c240 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 20 3d  sp->destructor =
1c250 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64 61 74 61   0;.    sp->data
1c260 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 53 79  type = 0;.    Sy
1c270 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73 70 2c 73  mbol_insert(sp,s
1c280 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  p->name);.  }.  
1c290 72 65 74 75 72 6e 20 73 70 3b 0a 7d 0a 0a 2f 2a  return sp;.}../*
1c2a0 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 79 6d   Compare two sym
1c2b0 62 6f 6c 73 20 66 6f 72 20 77 6f 72 6b 69 6e 67  bols for working
1c2c0 20 70 75 72 70 6f 73 65 73 0a 2a 2a 0a 2a 2a 20   purposes.**.** 
1c2d0 53 79 6d 62 6f 6c 73 20 74 68 61 74 20 62 65 67  Symbols that beg
1c2e0 69 6e 20 77 69 74 68 20 75 70 70 65 72 20 63 61  in with upper ca
1c2f0 73 65 20 6c 65 74 74 65 72 73 20 28 74 65 72 6d  se letters (term
1c300 69 6e 61 6c 73 20 6f 72 20 74 6f 6b 65 6e 73 29  inals or tokens)
1c310 0a 2a 2a 20 6d 75 73 74 20 73 6f 72 74 20 62 65  .** must sort be
1c320 66 6f 72 65 20 73 79 6d 62 6f 6c 73 20 74 68 61  fore symbols tha
1c330 74 20 62 65 67 69 6e 20 77 69 74 68 20 6c 6f 77  t begin with low
1c340 65 72 20 63 61 73 65 20 6c 65 74 74 65 72 73 0a  er case letters.
1c350 2a 2a 20 28 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c  ** (non-terminal
1c360 73 29 2e 20 20 4f 74 68 65 72 20 74 68 61 6e 20  s).  Other than 
1c370 74 68 61 74 2c 20 74 68 65 20 6f 72 64 65 72 20  that, the order 
1c380 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 2e  does not matter.
1c390 0a 2a 2a 0a 2a 2a 20 57 65 20 66 69 6e 64 20 65  .**.** We find e
1c3a0 78 70 65 72 69 6d 65 6e 74 61 6c 6c 79 20 74 68  xperimentally th
1c3b0 61 74 20 6c 65 61 76 69 6e 67 20 74 68 65 20 73  at leaving the s
1c3c0 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 69 72 20  ymbols in their 
1c3d0 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 6f 72 64 65  original.** orde
1c3e0 72 20 28 74 68 65 20 6f 72 64 65 72 20 74 68 65  r (the order the
1c3f0 79 20 61 70 70 65 61 72 65 64 20 69 6e 20 74 68  y appeared in th
1c400 65 20 67 72 61 6d 6d 61 72 20 66 69 6c 65 29 20  e grammar file) 
1c410 67 69 76 65 73 20 74 68 65 0a 2a 2a 20 73 6d 61  gives the.** sma
1c420 6c 6c 65 73 74 20 70 61 72 73 65 72 20 74 61 62  llest parser tab
1c430 6c 65 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a  les in SQLite..*
1c440 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70  /.int Symbolcmpp
1c450 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  (struct symbol *
1c460 2a 61 2c 20 73 74 72 75 63 74 20 73 79 6d 62 6f  *a, struct symbo
1c470 6c 20 2a 2a 62 29 7b 0a 20 20 69 6e 74 20 69 31  l **b){.  int i1
1c480 20 3d 20 28 2a 2a 61 29 2e 69 6e 64 65 78 20 2b   = (**a).index +
1c490 20 31 30 30 30 30 30 30 30 2a 28 28 2a 2a 61 29   10000000*((**a)
1c4a0 2e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 29 3b 0a 20  .name[0]>'Z');. 
1c4b0 20 69 6e 74 20 69 32 20 3d 20 28 2a 2a 62 29 2e   int i2 = (**b).
1c4c0 69 6e 64 65 78 20 2b 20 31 30 30 30 30 30 30 30  index + 10000000
1c4d0 2a 28 28 2a 2a 62 29 2e 6e 61 6d 65 5b 30 5d 3e  *((**b).name[0]>
1c4e0 27 5a 27 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  'Z');.  return i
1c4f0 31 2d 69 32 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72  1-i2;.}../* Ther
1c500 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
1c510 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
1c520 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  ng structure for
1c530 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61   each.** associa
1c540 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
1c550 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 73 74 72 75  pe "x2"..*/.stru
1c560 63 74 20 73 5f 78 32 20 7b 0a 20 20 69 6e 74 20  ct s_x2 {.  int 
1c570 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
1c580 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
1c590 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73  r of available s
1c5a0 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lots. */.       
1c5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5c0 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20     /*   Must be 
1c5d0 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65  a power of 2 gre
1c5e0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a  ater than or */.
1c5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65            /*   e
1c610 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69  qual to 1 */.  i
1c620 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20  nt count;       
1c630 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1c640 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c   of currently sl
1c650 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ots filled */.  
1c660 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20  struct s_x2node 
1c670 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61  *tbl;  /* The da
1c680 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a  ta stored here *
1c690 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32 6e  /.  struct s_x2n
1c6a0 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61  ode **ht;  /* Ha
1c6b0 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f  sh table for loo
1c6c0 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54  kups */.};../* T
1c6d0 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
1c6e0 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
1c6f0 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79  ucture for every
1c700 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a   data element.**
1c710 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69   in an associati
1c720 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
1c730 20 22 78 32 22 2e 0a 2a 2f 0a 74 79 70 65 64 65   "x2"..*/.typede
1c740 66 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64  f struct s_x2nod
1c750 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  e {.  struct sym
1c760 62 6f 6c 20 2a 64 61 74 61 3b 20 20 20 20 20 20  bol *data;      
1c770 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c780 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 63 68 61  he data */.  cha
1c790 72 20 2a 6b 65 79 3b 20 20 20 20 20 20 20 20 20  r *key;         
1c7a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c7b0 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63 74   key */.  struct
1c7c0 20 73 5f 78 32 6e 6f 64 65 20 2a 6e 65 78 74 3b   s_x2node *next;
1c7d0 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79     /* Next entry
1c7e0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 68   with the same h
1c7f0 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ash */.  struct 
1c800 73 5f 78 32 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b  s_x2node **from;
1c810 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c 69    /* Previous li
1c820 6e 6b 20 2a 2f 0a 7d 20 78 32 6e 6f 64 65 3b 0a  nk */.} x2node;.
1c830 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 6c  ./* There is onl
1c840 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  y one instance o
1c850 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68 69  f the array, whi
1c860 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77  ch is the follow
1c870 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ing */.static st
1c880 72 75 63 74 20 73 5f 78 32 20 2a 78 32 61 3b 0a  ruct s_x2 *x2a;.
1c890 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  ./* Allocate a n
1c8a0 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ew associative a
1c8b0 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 79 6d  rray */.void Sym
1c8c0 62 6f 6c 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66  bol_init(){.  if
1c8d0 28 20 78 32 61 20 29 20 72 65 74 75 72 6e 3b 0a  ( x2a ) return;.
1c8e0 20 20 78 32 61 20 3d 20 28 73 74 72 75 63 74 20    x2a = (struct 
1c8f0 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  s_x2*)malloc( si
1c900 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78 32  zeof(struct s_x2
1c910 29 20 29 3b 0a 20 20 69 66 28 20 78 32 61 20 29  ) );.  if( x2a )
1c920 7b 0a 20 20 20 20 78 32 61 2d 3e 73 69 7a 65 20  {.    x2a->size 
1c930 3d 20 31 32 38 3b 0a 20 20 20 20 78 32 61 2d 3e  = 128;.    x2a->
1c940 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78  count = 0;.    x
1c950 32 61 2d 3e 74 62 6c 20 3d 20 28 78 32 6e 6f 64  2a->tbl = (x2nod
1c960 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20  e*)malloc( .    
1c970 20 20 28 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65    (sizeof(x2node
1c980 29 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64  ) + sizeof(x2nod
1c990 65 2a 29 29 2a 31 32 38 20 29 3b 0a 20 20 20 20  e*))*128 );.    
1c9a0 69 66 28 20 78 32 61 2d 3e 74 62 6c 3d 3d 30 20  if( x2a->tbl==0 
1c9b0 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78 32  ){.      free(x2
1c9c0 61 29 3b 0a 20 20 20 20 20 20 78 32 61 20 3d 20  a);.      x2a = 
1c9d0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1c9e0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
1c9f0 20 78 32 61 2d 3e 68 74 20 3d 20 28 78 32 6e 6f   x2a->ht = (x2no
1ca00 64 65 2a 2a 29 26 28 78 32 61 2d 3e 74 62 6c 5b  de**)&(x2a->tbl[
1ca10 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72  128]);.      for
1ca20 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b  (i=0; i<128; i++
1ca30 29 20 78 32 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x2a->ht[i] = 0
1ca40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
1ca50 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65   Insert a new re
1ca60 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72  cord into the ar
1ca70 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ray.  Return TRU
1ca80 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e  E if successful.
1ca90 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77  .** Prior data w
1caa0 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
1cab0 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74   is NOT overwrit
1cac0 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f  ten */.int Symbo
1cad0 6c 5f 69 6e 73 65 72 74 28 64 61 74 61 2c 6b 65  l_insert(data,ke
1cae0 79 29 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  y).struct symbol
1caf0 20 2a 64 61 74 61 3b 0a 63 68 61 72 20 2a 6b 65   *data;.char *ke
1cb00 79 3b 0a 7b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e  y;.{.  x2node *n
1cb10 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e  p;.  int h;.  in
1cb20 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 32 61  t ph;..  if( x2a
1cb30 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1cb40 20 20 70 68 20 3d 20 73 74 72 68 61 73 68 28 6b    ph = strhash(k
1cb50 65 79 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20  ey);.  h = ph & 
1cb60 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x2a->size-1);. 
1cb70 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d   np = x2a->ht[h]
1cb80 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
1cb90 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
1cba0 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20  np->key,key)==0 
1cbb0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  ){.      /* An e
1cbc0 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77 69  xisting entry wi
1cbd0 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
1cbe0 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20  is found. */.   
1cbf0 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61 75     /* Fail becau
1cc00 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73 20  se overwrite is 
1cc10 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20  not allows. */. 
1cc20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1cc30 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70     }.    np = np
1cc40 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  ->next;.  }.  if
1cc50 28 20 78 32 61 2d 3e 63 6f 75 6e 74 3e 3d 78 32  ( x2a->count>=x2
1cc60 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f  a->size ){.    /
1cc70 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20 74  * Need to make t
1cc80 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62 69  he hash table bi
1cc90 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  gger */.    int 
1cca0 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72 75  i,size;.    stru
1ccb0 63 74 20 73 5f 78 32 20 61 72 72 61 79 3b 0a 20  ct s_x2 array;. 
1ccc0 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d 20     array.size = 
1ccd0 73 69 7a 65 20 3d 20 78 32 61 2d 3e 73 69 7a 65  size = x2a->size
1cce0 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63 6f  *2;.    array.co
1ccf0 75 6e 74 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74  unt = x2a->count
1cd00 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c 20  ;.    array.tbl 
1cd10 3d 20 28 78 32 6e 6f 64 65 2a 29 6d 61 6c 6c 6f  = (x2node*)mallo
1cd20 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66  c(.      (sizeof
1cd30 28 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x2node) + sizeo
1cd40 66 28 78 32 6e 6f 64 65 2a 29 29 2a 73 69 7a 65  f(x2node*))*size
1cd50 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72 61   );.    if( arra
1cd60 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75 72  y.tbl==0 ) retur
1cd70 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75  n 0;  /* Fail du
1cd80 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  e to malloc fail
1cd90 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61 79  ure */.    array
1cda0 2e 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29  .ht = (x2node**)
1cdb0 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65  &(array.tbl[size
1cdc0 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ]);.    for(i=0;
1cdd0 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72   i<size; i++) ar
1cde0 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  ray.ht[i] = 0;. 
1cdf0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 32     for(i=0; i<x2
1ce00 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a  a->count; i++){.
1ce10 20 20 20 20 20 20 78 32 6e 6f 64 65 20 2a 6f 6c        x2node *ol
1ce20 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20  dnp, *newnp;.   
1ce30 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 32 61     oldnp = &(x2a
1ce40 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  ->tbl[i]);.     
1ce50 20 68 20 3d 20 73 74 72 68 61 73 68 28 6f 6c 64   h = strhash(old
1ce60 6e 70 2d 3e 6b 65 79 29 20 26 20 28 73 69 7a 65  np->key) & (size
1ce70 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  -1);.      newnp
1ce80 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b 69   = &(array.tbl[i
1ce90 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 72  ]);.      if( ar
1cea0 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72 61  ray.ht[h] ) arra
1ceb0 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20  y.ht[h]->from = 
1cec0 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a  &(newnp->next);.
1ced0 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78        newnp->nex
1cee0 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b  t = array.ht[h];
1cef0 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65  .      newnp->ke
1cf00 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a  y = oldnp->key;.
1cf10 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74        newnp->dat
1cf20 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b  a = oldnp->data;
1cf30 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72  .      newnp->fr
1cf40 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b  om = &(array.ht[
1cf50 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79  h]);.      array
1cf60 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a  .ht[h] = newnp;.
1cf70 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78      }.    free(x
1cf80 32 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78  2a->tbl);.    *x
1cf90 32 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a  2a = array;.  }.
1cfa0 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20    /* Insert the 
1cfb0 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20  new data */.  h 
1cfc0 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69 7a  = ph & (x2a->siz
1cfd0 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78  e-1);.  np = &(x
1cfe0 32 61 2d 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f 75  2a->tbl[x2a->cou
1cff0 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65  nt++]);.  np->ke
1d000 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64  y = key;.  np->d
1d010 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69 66  ata = data;.  if
1d020 28 20 78 32 61 2d 3e 68 74 5b 68 5d 20 29 20 78  ( x2a->ht[h] ) x
1d030 32 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20  2a->ht[h]->from 
1d040 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20  = &(np->next);. 
1d050 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 32 61 2d   np->next = x2a-
1d060 3e 68 74 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e 68  >ht[h];.  x2a->h
1d070 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d  t[h] = np;.  np-
1d080 3e 66 72 6f 6d 20 3d 20 26 28 78 32 61 2d 3e 68  >from = &(x2a->h
1d090 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20  t[h]);.  return 
1d0a0 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  1;.}../* Return 
1d0b0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74  a pointer to dat
1d0c0 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68  a assigned to th
1d0d0 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52 65  e given key.  Re
1d0e0 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20  turn NULL.** if 
1d0f0 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a  no such key. */.
1d100 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
1d110 79 6d 62 6f 6c 5f 66 69 6e 64 28 6b 65 79 29 0a  ymbol_find(key).
1d120 63 68 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69  char *key;.{.  i
1d130 6e 74 20 68 3b 0a 20 20 78 32 6e 6f 64 65 20 2a  nt h;.  x2node *
1d140 6e 70 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d  np;..  if( x2a==
1d150 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1d160 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29  h = strhash(key)
1d170 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29   & (x2a->size-1)
1d180 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74  ;.  np = x2a->ht
1d190 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
1d1a0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63   ){.    if( strc
1d1b0 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d  mp(np->key,key)=
1d1c0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1d1d0 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20  np = np->next;. 
1d1e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f   }.  return np ?
1d1f0 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d   np->data : 0;.}
1d200 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ../* Return the 
1d210 6e 2d 74 68 20 64 61 74 61 2e 20 20 52 65 74 75  n-th data.  Retu
1d220 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 20 69 73 20  rn NULL if n is 
1d230 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 2a 2f  out of range. */
1d240 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
1d250 53 79 6d 62 6f 6c 5f 4e 74 68 28 6e 29 0a 69 6e  Symbol_Nth(n).in
1d260 74 20 6e 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  t n;.{.  struct 
1d270 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a 20 20  symbol *data;.  
1d280 69 66 28 20 78 32 61 20 26 26 20 6e 3e 30 20 26  if( x2a && n>0 &
1d290 26 20 6e 3c 3d 78 32 61 2d 3e 63 6f 75 6e 74 20  & n<=x2a->count 
1d2a0 29 7b 0a 20 20 20 20 64 61 74 61 20 3d 20 78 32  ){.    data = x2
1d2b0 61 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e 64 61 74 61  a->tbl[n-1].data
1d2c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
1d2d0 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  ata = 0;.  }.  r
1d2e0 65 74 75 72 6e 20 64 61 74 61 3b 0a 7d 0a 0a 2f  eturn data;.}../
1d2f0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
1d300 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 2a  e of the array *
1d310 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75  /.int Symbol_cou
1d320 6e 74 28 29 0a 7b 0a 20 20 72 65 74 75 72 6e 20  nt().{.  return 
1d330 78 32 61 20 3f 20 78 32 61 2d 3e 63 6f 75 6e 74  x2a ? x2a->count
1d340 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75   : 0;.}../* Retu
1d350 72 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70  rn an array of p
1d360 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 64  ointers to all d
1d370 61 74 61 20 69 6e 20 74 68 65 20 74 61 62 6c 65  ata in the table
1d380 2e 0a 2a 2a 20 54 68 65 20 61 72 72 61 79 20 69  ..** The array i
1d390 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
1d3a0 6d 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20  malloc.  Return 
1d3b0 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61  NULL if memory a
1d3c0 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f  llocation.** pro
1d3d0 62 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74 68 65  blems, or if the
1d3e0 20 61 72 72 61 79 20 69 73 20 65 6d 70 74 79 2e   array is empty.
1d3f0 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f   */.struct symbo
1d400 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72 61 79  l **Symbol_array
1d410 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  of().{.  struct 
1d420 73 79 6d 62 6f 6c 20 2a 2a 61 72 72 61 79 3b 0a  symbol **array;.
1d430 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20    int i,size;.  
1d440 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65 74  if( x2a==0 ) ret
1d450 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65 20 3d 20  urn 0;.  size = 
1d460 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61 72  x2a->count;.  ar
1d470 72 61 79 20 3d 20 28 73 74 72 75 63 74 20 73 79  ray = (struct sy
1d480 6d 62 6f 6c 20 2a 2a 29 6d 61 6c 6c 6f 63 28 20  mbol **)malloc( 
1d490 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79  sizeof(struct sy
1d4a0 6d 62 6f 6c 20 2a 29 2a 73 69 7a 65 20 29 3b 0a  mbol *)*size );.
1d4b0 20 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a 20    if( array ){. 
1d4c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
1d4d0 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b 69  ze; i++) array[i
1d4e0 5d 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 69 5d 2e  ] = x2a->tbl[i].
1d4f0 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75  data;.  }.  retu
1d500 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20  rn array;.}../* 
1d510 43 6f 6d 70 61 72 65 20 74 77 6f 20 63 6f 6e 66  Compare two conf
1d520 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 69 6e  igurations */.in
1d530 74 20 43 6f 6e 66 69 67 63 6d 70 28 61 2c 62 29  t Configcmp(a,b)
1d540 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
1d550 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67  a;.struct config
1d560 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20 78 3b 0a   *b;.{.  int x;.
1d570 20 20 78 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64    x = a->rp->ind
1d580 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65  ex - b->rp->inde
1d590 78 3b 0a 20 20 69 66 28 20 78 3d 3d 30 20 29 20  x;.  if( x==0 ) 
1d5a0 78 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e  x = a->dot - b->
1d5b0 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 78 3b  dot;.  return x;
1d5c0 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74  .}../* Compare t
1d5d0 77 6f 20 73 74 61 74 65 73 20 2a 2f 0a 50 52 49  wo states */.PRI
1d5e0 56 41 54 45 20 69 6e 74 20 73 74 61 74 65 63 6d  VATE int statecm
1d5f0 70 28 61 2c 62 29 0a 73 74 72 75 63 74 20 63 6f  p(a,b).struct co
1d600 6e 66 69 67 20 2a 61 3b 0a 73 74 72 75 63 74 20  nfig *a;.struct 
1d610 63 6f 6e 66 69 67 20 2a 62 3b 0a 7b 0a 20 20 69  config *b;.{.  i
1d620 6e 74 20 72 63 3b 0a 20 20 66 6f 72 28 72 63 3d  nt rc;.  for(rc=
1d630 30 3b 20 72 63 3d 3d 30 20 26 26 20 61 20 26 26  0; rc==0 && a &&
1d640 20 62 3b 20 20 61 3d 61 2d 3e 62 70 2c 20 62 3d   b;  a=a->bp, b=
1d650 62 2d 3e 62 70 29 7b 0a 20 20 20 20 72 63 20 3d  b->bp){.    rc =
1d660 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20   a->rp->index - 
1d670 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20  b->rp->index;.  
1d680 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63    if( rc==0 ) rc
1d690 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64   = a->dot - b->d
1d6a0 6f 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  ot;.  }.  if( rc
1d6b0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 61  ==0 ){.    if( a
1d6c0 20 29 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 69   ) rc = 1;.    i
1d6d0 66 28 20 62 20 29 20 72 63 20 3d 20 2d 31 3b 0a  f( b ) rc = -1;.
1d6e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1d6f0 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 73 74  .}../* Hash a st
1d700 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 69  ate */.PRIVATE i
1d710 6e 74 20 73 74 61 74 65 68 61 73 68 28 61 29 0a  nt statehash(a).
1d720 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61  struct config *a
1d730 3b 0a 7b 0a 20 20 69 6e 74 20 68 3d 30 3b 0a 20  ;.{.  int h=0;. 
1d740 20 77 68 69 6c 65 28 20 61 20 29 7b 0a 20 20 20   while( a ){.   
1d750 20 68 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e   h = h*571 + a->
1d760 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61  rp->index*37 + a
1d770 2d 3e 64 6f 74 3b 0a 20 20 20 20 61 20 3d 20 61  ->dot;.    a = a
1d780 2d 3e 62 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ->bp;.  }.  retu
1d790 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f  rn h;.}../* Allo
1d7a0 63 61 74 65 20 61 20 6e 65 77 20 73 74 61 74 65  cate a new state
1d7b0 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 73 74   structure */.st
1d7c0 72 75 63 74 20 73 74 61 74 65 20 2a 53 74 61 74  ruct state *Stat
1d7d0 65 5f 6e 65 77 28 29 0a 7b 0a 20 20 73 74 72 75  e_new().{.  stru
1d7e0 63 74 20 73 74 61 74 65 20 2a 6e 65 77 3b 0a 20  ct state *new;. 
1d7f0 20 6e 65 77 20 3d 20 28 73 74 72 75 63 74 20 73   new = (struct s
1d800 74 61 74 65 20 2a 29 6d 61 6c 6c 6f 63 28 20 73  tate *)malloc( s
1d810 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 74 61  izeof(struct sta
1d820 74 65 29 20 29 3b 0a 20 20 4d 65 6d 6f 72 79 43  te) );.  MemoryC
1d830 68 65 63 6b 28 6e 65 77 29 3b 0a 20 20 72 65 74  heck(new);.  ret
1d840 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 54  urn new;.}../* T
1d850 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
1d860 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
1d870 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
1d880 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f  for each.** asso
1d890 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66  ciative array of
1d8a0 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 73   type "x3"..*/.s
1d8b0 74 72 75 63 74 20 73 5f 78 33 20 7b 0a 20 20 69  truct s_x3 {.  i
1d8c0 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
1d8d0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
1d8e0 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
1d8f0 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20  e slots. */.    
1d900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d910 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20        /*   Must 
1d920 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
1d930 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1d940 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1d950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d960 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a    equal to 1 */.
1d970 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20    int count;    
1d980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1d990 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79  ber of currently
1d9a0 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f   slots filled */
1d9b0 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f  .  struct s_x3no
1d9c0 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65  de *tbl;  /* The
1d9d0 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72   data stored her
1d9e0 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  e */.  struct s_
1d9f0 78 33 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a  x3node **ht;  /*
1da00 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20   Hash table for 
1da10 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f  lookups */.};../
1da20 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
1da30 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
1da40 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76  structure for ev
1da50 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ery data element
1da60 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69  .** in an associ
1da70 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
1da80 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 74 79 70  ype "x3"..*/.typ
1da90 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 33  edef struct s_x3
1daa0 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20  node {.  struct 
1dab0 73 74 61 74 65 20 2a 64 61 74 61 3b 20 20 20 20  state *data;    
1dac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dad0 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73   The data */.  s
1dae0 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65  truct config *ke
1daf0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1db00 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20       /* The key 
1db10 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33  */.  struct s_x3
1db20 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a  node *next;   /*
1db30 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68   Next entry with
1db40 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a   the same hash *
1db50 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e  /.  struct s_x3n
1db60 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20  ode **from;  /* 
1db70 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f  Previous link */
1db80 0a 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f 2a 20 54  .} x3node;../* T
1db90 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65  here is only one
1dba0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
1dbb0 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73   array, which is
1dbc0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a   the following *
1dbd0 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
1dbe0 73 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f 2a 20 41  s_x3 *x3a;../* A
1dbf0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73  llocate a new as
1dc00 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
1dc10 2a 2f 0a 76 6f 69 64 20 53 74 61 74 65 5f 69 6e  */.void State_in
1dc20 69 74 28 29 7b 0a 20 20 69 66 28 20 78 33 61 20  it(){.  if( x3a 
1dc30 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 33 61 20  ) return;.  x3a 
1dc40 3d 20 28 73 74 72 75 63 74 20 73 5f 78 33 2a 29  = (struct s_x3*)
1dc50 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
1dc60 74 72 75 63 74 20 73 5f 78 33 29 20 29 3b 0a 20  truct s_x3) );. 
1dc70 20 69 66 28 20 78 33 61 20 29 7b 0a 20 20 20 20   if( x3a ){.    
1dc80 78 33 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b  x3a->size = 128;
1dc90 0a 20 20 20 20 78 33 61 2d 3e 63 6f 75 6e 74 20  .    x3a->count 
1dca0 3d 20 30 3b 0a 20 20 20 20 78 33 61 2d 3e 74 62  = 0;.    x3a->tb
1dcb0 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 6d 61 6c  l = (x3node*)mal
1dcc0 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a  loc( .      (siz
1dcd0 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73 69  eof(x3node) + si
1dce0 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 2a 31  zeof(x3node*))*1
1dcf0 32 38 20 29 3b 0a 20 20 20 20 69 66 28 20 78 33  28 );.    if( x3
1dd00 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20  a->tbl==0 ){.   
1dd10 20 20 20 66 72 65 65 28 78 33 61 29 3b 0a 20 20     free(x3a);.  
1dd20 20 20 20 20 78 33 61 20 3d 20 30 3b 0a 20 20 20      x3a = 0;.   
1dd30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1dd40 74 20 69 3b 0a 20 20 20 20 20 20 78 33 61 2d 3e  t i;.      x3a->
1dd50 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26  ht = (x3node**)&
1dd60 28 78 33 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b  (x3a->tbl[128]);
1dd70 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1dd80 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78 33 61 2d  i<128; i++) x3a-
1dd90 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  >ht[i] = 0;.    
1dda0 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72  }.  }.}./* Inser
1ddb0 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
1ddc0 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20  nto the array.  
1ddd0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73  Return TRUE if s
1dde0 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72  uccessful..** Pr
1ddf0 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68  ior data with th
1de00 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f  e same key is NO
1de10 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f  T overwritten */
1de20 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65 72  .int State_inser
1de30 74 28 64 61 74 61 2c 6b 65 79 29 0a 73 74 72 75  t(data,key).stru
1de40 63 74 20 73 74 61 74 65 20 2a 64 61 74 61 3b 0a  ct state *data;.
1de50 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b  struct config *k
1de60 65 79 3b 0a 7b 0a 20 20 78 33 6e 6f 64 65 20 2a  ey;.{.  x3node *
1de70 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69  np;.  int h;.  i
1de80 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 33  nt ph;..  if( x3
1de90 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
1dea0 0a 20 20 70 68 20 3d 20 73 74 61 74 65 68 61 73  .  ph = statehas
1deb0 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70 68  h(key);.  h = ph
1dec0 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29   & (x3a->size-1)
1ded0 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74  ;.  np = x3a->ht
1dee0 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
1def0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74   ){.    if( stat
1df00 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79  ecmp(np->key,key
1df10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
1df20 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   An existing ent
1df30 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
1df40 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a   key is found. *
1df50 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20  /.      /* Fail 
1df60 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74  because overwrit
1df70 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e  e is not allows.
1df80 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1df90 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70   0;.    }.    np
1dfa0 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
1dfb0 0a 20 20 69 66 28 20 78 33 61 2d 3e 63 6f 75 6e  .  if( x3a->coun
1dfc0 74 3e 3d 78 33 61 2d 3e 73 69 7a 65 20 29 7b 0a  t>=x3a->size ){.
1dfd0 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d      /* Need to m
1dfe0 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62  ake the hash tab
1dff0 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20  le bigger */.   
1e000 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20   int i,size;.   
1e010 20 73 74 72 75 63 74 20 73 5f 78 33 20 61 72 72   struct s_x3 arr
1e020 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69  ay;.    array.si
1e030 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 33 61 2d  ze = size = x3a-
1e040 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72  >size*2;.    arr
1e050 61 79 2e 63 6f 75 6e 74 20 3d 20 78 33 61 2d 3e  ay.count = x3a->
1e060 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79  count;.    array
1e070 2e 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29  .tbl = (x3node*)
1e080 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73  malloc(.      (s
1e090 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20  izeof(x3node) + 
1e0a0 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29  sizeof(x3node*))
1e0b0 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28  *size );.    if(
1e0c0 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20   array.tbl==0 ) 
1e0d0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61  return 0;  /* Fa
1e0e0 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63  il due to malloc
1e0f0 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20   failure */.    
1e100 61 72 72 61 79 2e 68 74 20 3d 20 28 78 33 6e 6f  array.ht = (x3no
1e110 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c  de**)&(array.tbl
1e120 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72  [size]);.    for
1e130 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b  (i=0; i<size; i+
1e140 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d  +) array.ht[i] =
1e150 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
1e160 20 69 3c 78 33 61 2d 3e 63 6f 75 6e 74 3b 20 69   i<x3a->count; i
1e170 2b 2b 29 7b 0a 20 20 20 20 20 20 78 33 6e 6f 64  ++){.      x3nod
1e180 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70  e *oldnp, *newnp
1e190 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20  ;.      oldnp = 
1e1a0 26 28 78 33 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a  &(x3a->tbl[i]);.
1e1b0 20 20 20 20 20 20 68 20 3d 20 73 74 61 74 65 68        h = stateh
1e1c0 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20  ash(oldnp->key) 
1e1d0 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20  & (size-1);.    
1e1e0 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61    newnp = &(arra
1e1f0 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  y.tbl[i]);.     
1e200 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d   if( array.ht[h]
1e210 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e   ) array.ht[h]->
1e220 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e  from = &(newnp->
1e230 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77  next);.      new
1e240 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79  np->next = array
1e250 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65  .ht[h];.      ne
1e260 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70  wnp->key = oldnp
1e270 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65 77  ->key;.      new
1e280 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70  np->data = oldnp
1e290 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65  ->data;.      ne
1e2a0 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72  wnp->from = &(ar
1e2b0 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20  ray.ht[h]);.    
1e2c0 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20    array.ht[h] = 
1e2d0 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20  newnp;.    }.   
1e2e0 20 66 72 65 65 28 78 33 61 2d 3e 74 62 6c 29 3b   free(x3a->tbl);
1e2f0 0a 20 20 20 20 2a 78 33 61 20 3d 20 61 72 72 61  .    *x3a = arra
1e300 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65  y;.  }.  /* Inse
1e310 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20  rt the new data 
1e320 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  */.  h = ph & (x
1e330 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  3a->size-1);.  n
1e340 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b 78  p = &(x3a->tbl[x
1e350 33 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20  3a->count++]);. 
1e360 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a   np->key = key;.
1e370 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74    np->data = dat
1e380 61 3b 0a 20 20 69 66 28 20 78 33 61 2d 3e 68 74  a;.  if( x3a->ht
1e390 5b 68 5d 20 29 20 78 33 61 2d 3e 68 74 5b 68 5d  [h] ) x3a->ht[h]
1e3a0 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e  ->from = &(np->n
1e3b0 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74  ext);.  np->next
1e3c0 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x3a->ht[h];. 
1e3d0 20 78 33 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70   x3a->ht[h] = np
1e3e0 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26  ;.  np->from = &
1e3f0 28 78 33 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20  (x3a->ht[h]);.  
1e400 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20  return 1;.}../* 
1e410 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1e420 20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65   to data assigne
1e430 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b  d to the given k
1e440 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ey.  Return NULL
1e450 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b  .** if no such k
1e460 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74  ey. */.struct st
1e470 61 74 65 20 2a 53 74 61 74 65 5f 66 69 6e 64 28  ate *State_find(
1e480 6b 65 79 29 0a 73 74 72 75 63 74 20 63 6f 6e 66  key).struct conf
1e490 69 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74  ig *key;.{.  int
1e4a0 20 68 3b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70   h;.  x3node *np
1e4b0 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20  ;..  if( x3a==0 
1e4c0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20  ) return 0;.  h 
1e4d0 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65 79 29  = statehash(key)
1e4e0 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29   & (x3a->size-1)
1e4f0 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74  ;.  np = x3a->ht
1e500 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
1e510 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74   ){.    if( stat
1e520 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79  ecmp(np->key,key
1e530 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
1e540 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
1e550 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70  .  }.  return np
1e560 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b   ? np->data : 0;
1e570 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e  .}../* Return an
1e580 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
1e590 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20 69  rs to all data i
1e5a0 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  n the table..** 
1e5b0 54 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74  The array is obt
1e5c0 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
1e5d0 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  c.  Return NULL 
1e5e0 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  if memory alloca
1e5f0 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73  tion.** problems
1e600 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72 72 61  , or if the arra
1e610 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73  y is empty. */.s
1e620 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53 74  truct state **St
1e630 61 74 65 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a  ate_arrayof().{.
1e640 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
1e650 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c  *array;.  int i,
1e660 73 69 7a 65 3b 0a 20 20 69 66 28 20 78 33 61 3d  size;.  if( x3a=
1e670 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1e680 20 73 69 7a 65 20 3d 20 78 33 61 2d 3e 63 6f 75   size = x3a->cou
1e690 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20 28 73  nt;.  array = (s
1e6a0 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 29 6d  truct state **)m
1e6b0 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74  alloc( sizeof(st
1e6c0 72 75 63 74 20 73 74 61 74 65 20 2a 29 2a 73 69  ruct state *)*si
1e6d0 7a 65 20 29 3b 0a 20 20 69 66 28 20 61 72 72 61  ze );.  if( arra
1e6e0 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  y ){.    for(i=0
1e6f0 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61  ; i<size; i++) a
1e700 72 72 61 79 5b 69 5d 20 3d 20 78 33 61 2d 3e 74  rray[i] = x3a->t
1e710 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a  bl[i].data;.  }.
1e720 20 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b 0a    return array;.
1e730 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 63 6f 6e  }../* Hash a con
1e740 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52  figuration */.PR
1e750 49 56 41 54 45 20 69 6e 74 20 63 6f 6e 66 69 67  IVATE int config
1e760 68 61 73 68 28 61 29 0a 73 74 72 75 63 74 20 63  hash(a).struct c
1e770 6f 6e 66 69 67 20 2a 61 3b 0a 7b 0a 20 20 69 6e  onfig *a;.{.  in
1e780 74 20 68 3d 30 3b 0a 20 20 68 20 3d 20 68 2a 35  t h=0;.  h = h*5
1e790 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65  71 + a->rp->inde
1e7a0 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20  x*37 + a->dot;. 
1e7b0 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a   return h;.}../*
1e7c0 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
1e7d0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
1e7e0 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
1e7f0 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73  e for each.** as
1e800 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20  sociative array 
1e810 6f 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f  of type "x4"..*/
1e820 0a 73 74 72 75 63 74 20 73 5f 78 34 20 7b 0a 20  .struct s_x4 {. 
1e830 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20   int size;      
1e840 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e850 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
1e860 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20  ble slots. */.  
1e870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e880 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73          /*   Mus
1e890 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
1e8a0 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  2 greater than o
1e8b0 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  r */.           
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e8d0 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a  *   equal to 1 *
1e8e0 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20  /.  int count;  
1e8f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1e900 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74  umber of current
1e910 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20  ly slots filled 
1e920 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34  */.  struct s_x4
1e930 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54  node *tbl;  /* T
1e940 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68  he data stored h
1e950 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ere */.  struct 
1e960 73 5f 78 34 6e 6f 64 65 20 2a 2a 68 74 3b 20 20  s_x4node **ht;  
1e970 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f  /* Hash table fo
1e980 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a  r lookups */.};.
1e990 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65  ./* There is one
1e9a0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
1e9b0 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  s structure for 
1e9c0 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65  every data eleme
1e9d0 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f  nt.** in an asso
1e9e0 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66  ciative array of
1e9f0 20 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 74   type "x4"..*/.t
1ea00 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f  ypedef struct s_
1ea10 78 34 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63  x4node {.  struc
1ea20 74 20 63 6f 6e 66 69 67 20 2a 64 61 74 61 3b 20  t config *data; 
1ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea40 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a   /* The data */.
1ea50 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64    struct s_x4nod
1ea60 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65  e *next;   /* Ne
1ea70 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  xt entry with th
1ea80 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20  e same hash */. 
1ea90 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65   struct s_x4node
1eaa0 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65   **from;  /* Pre
1eab0 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20  vious link */.} 
1eac0 78 34 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72  x4node;../* Ther
1ead0 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e  e is only one in
1eae0 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72  stance of the ar
1eaf0 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68  ray, which is th
1eb00 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
1eb10 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78  tatic struct s_x
1eb20 34 20 2a 78 34 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f  4 *x4a;../* Allo
1eb30 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63  cate a new assoc
1eb40 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a  iative array */.
1eb50 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c 65  void Configtable
1eb60 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78  _init(){.  if( x
1eb70 34 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78  4a ) return;.  x
1eb80 34 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78  4a = (struct s_x
1eb90 34 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  4*)malloc( sizeo
1eba0 66 28 73 74 72 75 63 74 20 73 5f 78 34 29 20 29  f(struct s_x4) )
1ebb0 3b 0a 20 20 69 66 28 20 78 34 61 20 29 7b 0a 20  ;.  if( x4a ){. 
1ebc0 20 20 20 78 34 61 2d 3e 73 69 7a 65 20 3d 20 36     x4a->size = 6
1ebd0 34 3b 0a 20 20 20 20 78 34 61 2d 3e 63 6f 75 6e  4;.    x4a->coun
1ebe0 74 20 3d 20 30 3b 0a 20 20 20 20 78 34 61 2d 3e  t = 0;.    x4a->
1ebf0 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29 6d  tbl = (x4node*)m
1ec00 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73  alloc( .      (s
1ec10 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20  izeof(x4node) + 
1ec20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29  sizeof(x4node*))
1ec30 2a 36 34 20 29 3b 0a 20 20 20 20 69 66 28 20 78  *64 );.    if( x
1ec40 34 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20  4a->tbl==0 ){.  
1ec50 20 20 20 20 66 72 65 65 28 78 34 61 29 3b 0a 20      free(x4a);. 
1ec60 20 20 20 20 20 78 34 61 20 3d 20 30 3b 0a 20 20       x4a = 0;.  
1ec70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1ec80 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 34 61 2d  nt i;.      x4a-
1ec90 3e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29  >ht = (x4node**)
1eca0 26 28 78 34 61 2d 3e 74 62 6c 5b 36 34 5d 29 3b  &(x4a->tbl[64]);
1ecb0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
1ecc0 69 3c 36 34 3b 20 69 2b 2b 29 20 78 34 61 2d 3e  i<64; i++) x4a->
1ecd0 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ht[i] = 0;.    }
1ece0 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74  .  }.}./* Insert
1ecf0 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e   a new record in
1ed00 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52  to the array.  R
1ed10 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75  eturn TRUE if su
1ed20 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69  ccessful..** Pri
1ed30 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65  or data with the
1ed40 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54   same key is NOT
1ed50 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a   overwritten */.
1ed60 69 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f  int Configtable_
1ed70 69 6e 73 65 72 74 28 64 61 74 61 29 0a 73 74 72  insert(data).str
1ed80 75 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74 61  uct config *data
1ed90 3b 0a 7b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70  ;.{.  x4node *np
1eda0 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74  ;.  int h;.  int
1edb0 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d   ph;..  if( x4a=
1edc0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1edd0 20 70 68 20 3d 20 63 6f 6e 66 69 67 68 61 73 68   ph = confighash
1ede0 28 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70 68  (data);.  h = ph
1edf0 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29   & (x4a->size-1)
1ee00 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74  ;.  np = x4a->ht
1ee10 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
1ee20 20 29 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e 66   ){.    if( Conf
1ee30 69 67 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64  igcmp(np->data,d
1ee40 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ata)==0 ){.     
1ee50 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
1ee60 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
1ee70 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64  ame key is found
1ee80 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61  . */.      /* Fa
1ee90 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72 77  il because overw
1eea0 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  rite is not allo
1eeb0 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ws. */.      ret
1eec0 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1eed0 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
1eee0 20 20 7d 0a 20 20 69 66 28 20 78 34 61 2d 3e 63    }.  if( x4a->c
1eef0 6f 75 6e 74 3e 3d 78 34 61 2d 3e 73 69 7a 65 20  ount>=x4a->size 
1ef00 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74  ){.    /* Need t
1ef10 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20  o make the hash 
1ef20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a  table bigger */.
1ef30 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a      int i,size;.
1ef40 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 34 20      struct s_x4 
1ef50 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79  array;.    array
1ef60 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78  .size = size = x
1ef70 34 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20  4a->size*2;.    
1ef80 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 34  array.count = x4
1ef90 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72  a->count;.    ar
1efa0 72 61 79 2e 74 62 6c 20 3d 20 28 78 34 6e 6f 64  ray.tbl = (x4nod
1efb0 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e*)malloc(.     
1efc0 20 28 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29   (sizeof(x4node)
1efd0 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65   + sizeof(x4node
1efe0 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20  *))*size );.    
1eff0 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30  if( array.tbl==0
1f000 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a   ) return 0;  /*
1f010 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c   Fail due to mal
1f020 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20  loc failure */. 
1f030 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78     array.ht = (x
1f040 34 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e  4node**)&(array.
1f050 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20  tbl[size]);.    
1f060 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
1f070 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69   i++) array.ht[i
1f080 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  ] = 0;.    for(i
1f090 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74  =0; i<x4a->count
1f0a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 34  ; i++){.      x4
1f0b0 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65  node *oldnp, *ne
1f0c0 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70  wnp;.      oldnp
1f0d0 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b 69 5d   = &(x4a->tbl[i]
1f0e0 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 63 6f 6e  );.      h = con
1f0f0 66 69 67 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64  fighash(oldnp->d
1f100 61 74 61 29 20 26 20 28 73 69 7a 65 2d 31 29 3b  ata) & (size-1);
1f110 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26  .      newnp = &
1f120 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a  (array.tbl[i]);.
1f130 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e        if( array.
1f140 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74  ht[h] ) array.ht
1f150 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65  [h]->from = &(ne
1f160 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20  wnp->next);.    
1f170 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20    newnp->next = 
1f180 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20  array.ht[h];.   
1f190 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d     newnp->data =
1f1a0 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20   oldnp->data;.  
1f1b0 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20      newnp->from 
1f1c0 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29  = &(array.ht[h])
1f1d0 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74  ;.      array.ht
1f1e0 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20  [h] = newnp;.   
1f1f0 20 7d 0a 20 20 20 20 66 72 65 65 28 78 34 61 2d   }.    free(x4a-
1f200 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 34 61 20  >tbl);.    *x4a 
1f210 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f  = array;.  }.  /
1f220 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
1f230 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70   data */.  h = p
1f240 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31  h & (x4a->size-1
1f250 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 34 61 2d  );.  np = &(x4a-
1f260 3e 74 62 6c 5b 78 34 61 2d 3e 63 6f 75 6e 74 2b  >tbl[x4a->count+
1f270 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20  +]);.  np->data 
1f280 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 34  = data;.  if( x4
1f290 61 2d 3e 68 74 5b 68 5d 20 29 20 78 34 61 2d 3e  a->ht[h] ) x4a->
1f2a0 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
1f2b0 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d  np->next);.  np-
1f2c0 3e 6e 65 78 74 20 3d 20 78 34 61 2d 3e 68 74 5b  >next = x4a->ht[
1f2d0 68 5d 3b 0a 20 20 78 34 61 2d 3e 68 74 5b 68 5d  h];.  x4a->ht[h]
1f2e0 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f   = np;.  np->fro
1f2f0 6d 20 3d 20 26 28 78 34 61 2d 3e 68 74 5b 68 5d  m = &(x4a->ht[h]
1f300 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
1f310 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
1f320 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73  inter to data as
1f330 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69  signed to the gi
1f340 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e  ven key.  Return
1f350 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73   NULL.** if no s
1f360 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75  uch key. */.stru
1f370 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
1f380 67 74 61 62 6c 65 5f 66 69 6e 64 28 6b 65 79 29  gtable_find(key)
1f390 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
1f3a0 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a  key;.{.  int h;.
1f3b0 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20    x4node *np;.. 
1f3c0 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72 65   if( x4a==0 ) re
1f3d0 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 63 6f  turn 0;.  h = co
1f3e0 6e 66 69 67 68 61 73 68 28 6b 65 79 29 20 26 20  nfighash(key) & 
1f3f0 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x4a->size-1);. 
1f400 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d   np = x4a->ht[h]
1f410 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
1f420 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63  .    if( Configc
1f430 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29  mp(np->data,key)
1f440 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
1f450 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
1f460 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20    }.  return np 
1f470 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a  ? np->data : 0;.
1f480 7d 0a 0a 2f 2a 20 52 65 6d 6f 76 65 20 61 6c 6c  }../* Remove all
1f490 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 74   data from the t
1f4a0 61 62 6c 65 2e 20 20 50 61 73 73 20 65 61 63 68  able.  Pass each
1f4b0 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 75 6e   data to the fun
1f4c0 63 74 69 6f 6e 20 22 66 22 0a 2a 2a 20 61 73 20  ction "f".** as 
1f4d0 69 74 20 69 73 20 72 65 6d 6f 76 65 64 2e 20 20  it is removed.  
1f4e0 28 22 66 22 20 6d 61 79 20 62 65 20 6e 75 6c 6c  ("f" may be null
1f4f0 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20 73   to avoid this s
1f500 74 65 70 2e 29 20 2a 2f 0a 76 6f 69 64 20 43 6f  tep.) */.void Co
1f510 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28  nfigtable_clear(
1f520 66 29 0a 69 6e 74 28 2a 66 29 28 2f 2a 20 73 74  f).int(*f)(/* st
1f530 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f  ruct config * */
1f540 29 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  );.{.  int i;.  
1f550 69 66 28 20 78 34 61 3d 3d 30 20 7c 7c 20 78 34  if( x4a==0 || x4
1f560 61 2d 3e 63 6f 75 6e 74 3d 3d 30 20 29 20 72 65  a->count==0 ) re
1f570 74 75 72 6e 3b 0a 20 20 69 66 28 20 66 20 29 20  turn;.  if( f ) 
1f580 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e  for(i=0; i<x4a->
1f590 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 28 2a 66 29  count; i++) (*f)
1f5a0 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74  (x4a->tbl[i].dat
1f5b0 61 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  a);.  for(i=0; i
1f5c0 3c 78 34 61 2d 3e 73 69 7a 65 3b 20 69 2b 2b 29  <x4a->size; i++)
1f5d0 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b   x4a->ht[i] = 0;
1f5e0 0a 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20  .  x4a->count = 
1f5f0 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a     0;.  return;.}.