/ Hex Artifact Content
Login

Artifact e37dcb5b8cdb16f4ac98338134bf8d8cd28e399f:


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 2d  p->mxLookahead -
4700: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20   p->mnLookahead 
4710: 2b 20 31 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 41  + 1;.  if( p->nA
4720: 63 74 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70 2d 3e  ction + n >= p->
4730: 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 29 7b 0a  nActionAlloc ){.
4740: 20 20 20 20 69 6e 74 20 6f 6c 64 41 6c 6c 6f 63      int oldAlloc
4750: 20 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c   = p->nActionAll
4760: 6f 63 3b 0a 20 20 20 20 70 2d 3e 6e 41 63 74 69  oc;.    p->nActi
4770: 6f 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63  onAlloc = p->nAc
4780: 74 69 6f 6e 20 2b 20 6e 20 2b 20 70 2d 3e 6e 41  tion + n + p->nA
4790: 63 74 69 6f 6e 41 6c 6c 6f 63 20 2b 20 32 30 3b  ctionAlloc + 20;
47a0: 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 20  .    p->aAction 
47b0: 3d 20 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 41  = realloc( p->aA
47c0: 63 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20  ction,.         
47d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47e0: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 41 63 74 69   sizeof(p->aActi
47f0: 6f 6e 5b 30 5d 29 2a 70 2d 3e 6e 41 63 74 69 6f  on[0])*p->nActio
4800: 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28  nAlloc);.    if(
4810: 20 70 2d 3e 61 41 63 74 69 6f 6e 3d 3d 30 20 29   p->aAction==0 )
4820: 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
4830: 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66  stderr,"malloc f
4840: 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20  ailed\n");.     
4850: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
4860: 20 20 20 20 66 6f 72 28 69 3d 6f 6c 64 41 6c 6c      for(i=oldAll
4870: 6f 63 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e  oc; i<p->nAction
4880: 41 6c 6c 6f 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  Alloc; i++){.   
4890: 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d     p->aAction[i]
48a0: 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 2d 31 3b  .lookahead = -1;
48b0: 0a 20 20 20 20 20 20 70 2d 3e 61 41 63 74 69 6f  .      p->aActio
48c0: 6e 5b 69 5d 2e 61 63 74 69 6f 6e 20 3d 20 2d 31  n[i].action = -1
48d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
48e0: 2a 20 53 63 61 6e 20 74 68 65 20 65 78 69 73 74  * Scan the exist
48f0: 69 6e 67 20 61 63 74 69 6f 6e 20 74 61 62 6c 65  ing action table
4900: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 6e 20   looking for an 
4910: 6f 66 66 73 65 74 20 77 68 65 72 65 20 77 65 20  offset where we 
4920: 63 61 6e 0a 20 20 2a 2a 20 69 6e 73 65 72 74 20  can.  ** insert 
4930: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
4940: 73 61 63 74 69 6f 6e 20 73 65 74 2e 20 20 46 61  saction set.  Fa
4950: 6c 6c 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f  ll out of the lo
4960: 6f 70 20 77 68 65 6e 20 74 68 61 74 0a 20 20 2a  op when that.  *
4970: 2a 20 6f 66 66 73 65 74 20 69 73 20 66 6f 75 6e  * offset is foun
4980: 64 2e 20 20 49 6e 20 74 68 65 20 77 6f 72 73 74  d.  In the worst
4990: 20 63 61 73 65 2c 20 77 65 20 66 61 6c 6c 20 6f   case, we fall o
49a0: 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77  ut of the loop w
49b0: 68 65 6e 0a 20 20 2a 2a 20 69 20 72 65 61 63 68  hen.  ** i reach
49c0: 65 73 20 70 2d 3e 6e 41 63 74 69 6f 6e 2c 20 77  es p->nAction, w
49d0: 68 69 63 68 20 6d 65 61 6e 73 20 77 65 20 61 70  hich means we ap
49e0: 70 65 6e 64 20 74 68 65 20 6e 65 77 20 74 72 61  pend the new tra
49f0: 6e 73 61 63 74 69 6f 6e 20 73 65 74 2e 0a 20 20  nsaction set..  
4a00: 2a 2a 0a 20 20 2a 2a 20 69 20 69 73 20 74 68 65  **.  ** i is the
4a10: 20 69 6e 64 65 78 20 69 6e 20 70 2d 3e 61 41 63   index in p->aAc
4a20: 74 69 6f 6e 5b 5d 20 77 68 65 72 65 20 70 2d 3e  tion[] where p->
4a30: 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 69 73 20 69  mnLookahead is i
4a40: 6e 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  nserted..  */.  
4a50: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 41  for(i=0; i<p->nA
4a60: 63 74 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ction; i++){.   
4a70: 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b   if( p->aAction[
4a80: 69 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29  i].lookahead<0 )
4a90: 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  {.      for(j=0;
4aa0: 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64   j<p->nLookahead
4ab0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
4ac0: 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  k = p->aLookahea
4ad0: 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d  d[j].lookahead -
4ae0: 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20   p->mnLookahead 
4af0: 2b 20 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28  + i;.        if(
4b00: 20 6b 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20   k<0 ) break;.  
4b10: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63        if( p->aAc
4b20: 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61  tion[k].lookahea
4b30: 64 3e 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  d>=0 ) break;.  
4b40: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
4b50: 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20  j<p->nLookahead 
4b60: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
4b70: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e    for(j=0; j<p->
4b80: 6e 41 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20  nAction; j++){. 
4b90: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41         if( p->aA
4ba0: 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65  ction[j].lookahe
4bb0: 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61  ad==j+p->mnLooka
4bc0: 68 65 61 64 2d 69 20 29 20 62 72 65 61 6b 3b 0a  head-i ) break;.
4bd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
4be0: 28 20 6a 3d 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20  ( j==p->nAction 
4bf0: 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
4c00: 3b 20 20 2f 2a 20 46 69 74 73 20 69 6e 20 65 6d  ;  /* Fits in em
4c10: 70 74 79 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 20  pty slots */.   
4c20: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
4c30: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d  f( p->aAction[i]
4c40: 2e 6c 6f 6f 6b 61 68 65 61 64 3d 3d 70 2d 3e 6d  .lookahead==p->m
4c50: 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20  nLookahead ){.  
4c60: 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69      if( p->aActi
4c70: 6f 6e 5b 69 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d  on[i].action!=p-
4c80: 3e 6d 6e 41 63 74 69 6f 6e 20 29 20 63 6f 6e 74  >mnAction ) cont
4c90: 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28  inue;.      for(
4ca0: 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61  j=0; j<p->nLooka
4cb0: 68 65 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  head; j++){.    
4cc0: 20 20 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b      k = p->aLook
4cd0: 61 68 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65  ahead[j].lookahe
4ce0: 61 64 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68  ad - p->mnLookah
4cf0: 65 61 64 20 2b 20 69 3b 0a 20 20 20 20 20 20 20  ead + i;.       
4d00: 20 69 66 28 20 6b 3c 30 20 7c 7c 20 6b 3e 3d 70   if( k<0 || k>=p
4d10: 2d 3e 6e 41 63 74 69 6f 6e 20 29 20 62 72 65 61  ->nAction ) brea
4d20: 6b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  k;.        if( p
4d30: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e  ->aLookahead[j].
4d40: 6c 6f 6f 6b 61 68 65 61 64 21 3d 70 2d 3e 61 41  lookahead!=p->aA
4d50: 63 74 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65  ction[k].lookahe
4d60: 61 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ad ) break;.    
4d70: 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b      if( p->aLook
4d80: 61 68 65 61 64 5b 6a 5d 2e 61 63 74 69 6f 6e 21  ahead[j].action!
4d90: 3d 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 61  =p->aAction[k].a
4da0: 63 74 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20  ction ) break;. 
4db0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4dc0: 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64   j<p->nLookahead
4dd0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
4de0: 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20     n = 0;.      
4df0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41  for(j=0; j<p->nA
4e00: 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ction; j++){.   
4e10: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74       if( p->aAct
4e20: 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[j].lookahead
4e30: 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  <0 ) continue;. 
4e40: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41         if( p->aA
4e50: 63 74 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65  ction[j].lookahe
4e60: 61 64 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61  ad==j+p->mnLooka
4e70: 68 65 61 64 2d 69 20 29 20 6e 2b 2b 3b 0a 20 20  head-i ) n++;.  
4e80: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
4e90: 6e 3d 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  n==p->nLookahead
4ea0: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
4eb0: 6b 3b 20 20 2f 2a 20 53 61 6d 65 20 61 73 20 61  k;  /* Same as a
4ec0: 20 70 72 69 6f 72 20 74 72 61 6e 73 61 63 74 69   prior transacti
4ed0: 6f 6e 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20  on set */.      
4ee0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
4ef0: 20 49 6e 73 65 72 74 20 74 72 61 6e 73 61 63 74   Insert transact
4f00: 69 6f 6e 20 73 65 74 20 61 74 20 69 6e 64 65 78  ion set at index
4f10: 20 69 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30   i. */.  for(j=0
4f20: 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  ; j<p->nLookahea
4f30: 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6b 20 3d  d; j++){.    k =
4f40: 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a   p->aLookahead[j
4f50: 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d  ].lookahead - p-
4f60: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69  >mnLookahead + i
4f70: 3b 0a 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e  ;.    p->aAction
4f80: 5b 6b 5d 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68  [k] = p->aLookah
4f90: 65 61 64 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  ead[j];.    if( 
4fa0: 6b 3e 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20  k>=p->nAction ) 
4fb0: 70 2d 3e 6e 41 63 74 69 6f 6e 20 3d 20 6b 2b 31  p->nAction = k+1
4fc0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b  ;.  }.  p->nLook
4fd0: 61 68 65 61 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a  ahead = 0;..  /*
4fe0: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73   Return the offs
4ff0: 65 74 20 74 68 61 74 20 69 73 20 61 64 64 65 64  et that is added
5000: 20 74 6f 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61   to the lookahea
5010: 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65  d in order to ge
5020: 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78  t the.  ** index
5030: 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20   into yy_action 
5040: 6f 66 20 74 68 65 20 61 63 74 69 6f 6e 20 2a 2f  of the action */
5050: 0a 20 20 72 65 74 75 72 6e 20 69 20 2d 20 70 2d  .  return i - p-
5060: 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 3b 0a 7d 0a  >mnLookahead;.}.
5070: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
5080: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
5090: 65 20 66 69 6c 65 20 22 61 73 73 65 72 74 2e 63  e file "assert.c
50a0: 22 20 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 2a 2a 2f 0a  **************/.
50c0: 2f 2a 0a 2a 2a 20 41 20 6d 6f 72 65 20 65 66 66  /*.** A more eff
50d0: 69 63 69 65 6e 74 20 77 61 79 20 6f 66 20 68 61  icient way of ha
50e0: 6e 64 6c 69 6e 67 20 61 73 73 65 72 74 69 6f 6e  ndling assertion
50f0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 6d 79 61 73 73  s..*/.void myass
5100: 65 72 74 28 66 69 6c 65 2c 6c 69 6e 65 29 0a 63  ert(file,line).c
5110: 68 61 72 20 2a 66 69 6c 65 3b 0a 69 6e 74 20 6c  har *file;.int l
5120: 69 6e 65 3b 0a 7b 0a 20 20 66 70 72 69 6e 74 66  ine;.{.  fprintf
5130: 28 73 74 64 65 72 72 2c 22 41 73 73 65 72 74 69  (stderr,"Asserti
5140: 6f 6e 20 66 61 69 6c 65 64 20 6f 6e 20 6c 69 6e  on failed on lin
5150: 65 20 25 64 20 6f 66 20 66 69 6c 65 20 5c 22 25  e %d of file \"%
5160: 73 5c 22 5c 6e 22 2c 6c 69 6e 65 2c 66 69 6c 65  s\"\n",line,file
5170: 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a  );.  exit(1);.}.
5180: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
5190: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
51a0: 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 63 22 20   file "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 2a 2a 2f 0a 2f  *************/./
51d0: 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f  *.** Routines to
51e0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 68   construction th
51f0: 65 20 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d  e finite state m
5200: 61 63 68 69 6e 65 20 66 6f 72 20 74 68 65 20 4c  achine for the L
5210: 45 4d 4f 4e 0a 2a 2a 20 70 61 72 73 65 72 20 67  EMON.** parser g
5220: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
5230: 20 46 69 6e 64 20 61 20 70 72 65 63 65 64 65 6e   Find a preceden
5240: 63 65 20 73 79 6d 62 6f 6c 20 6f 66 20 65 76 65  ce symbol of eve
5250: 72 79 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67  ry rule in the g
5260: 72 61 6d 6d 61 72 2e 0a 2a 2a 20 0a 2a 2a 20 54  rammar..** .** T
5270: 68 6f 73 65 20 72 75 6c 65 73 20 77 68 69 63 68  hose rules which
5280: 20 68 61 76 65 20 61 20 70 72 65 63 65 64 65 6e   have a preceden
5290: 63 65 20 73 79 6d 62 6f 6c 20 63 6f 64 65 64 20  ce symbol coded 
52a0: 69 6e 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20  in the input.** 
52b0: 67 72 61 6d 6d 61 72 20 75 73 69 6e 67 20 74 68  grammar using th
52c0: 65 20 22 5b 73 79 6d 62 6f 6c 5d 22 20 63 6f 6e  e "[symbol]" con
52d0: 73 74 72 75 63 74 20 77 69 6c 6c 20 61 6c 72 65  struct will alre
52e0: 61 64 79 20 68 61 76 65 20 74 68 65 0a 2a 2a 20  ady have the.** 
52f0: 72 70 2d 3e 70 72 65 63 73 79 6d 20 66 69 65 6c  rp->precsym fiel
5300: 64 20 66 69 6c 6c 65 64 2e 20 20 4f 74 68 65 72  d filled.  Other
5310: 20 72 75 6c 65 73 20 74 61 6b 65 20 61 73 20 74   rules take as t
5320: 68 65 69 72 20 70 72 65 63 65 64 65 6e 63 65 0a  heir precedence.
5330: 2a 2a 20 73 79 6d 62 6f 6c 20 74 68 65 20 66 69  ** symbol the fi
5340: 72 73 74 20 52 48 53 20 73 79 6d 62 6f 6c 20 77  rst RHS symbol w
5350: 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 70 72  ith a defined pr
5360: 65 63 65 64 65 6e 63 65 2e 20 20 49 66 20 74 68  ecedence.  If th
5370: 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 52  ere.** are not R
5380: 48 53 20 73 79 6d 62 6f 6c 73 20 77 69 74 68 20  HS symbols with 
5390: 61 20 64 65 66 69 6e 65 64 20 70 72 65 63 65 64  a defined preced
53a0: 65 6e 63 65 2c 20 74 68 65 20 70 72 65 63 65 64  ence, the preced
53b0: 65 6e 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 66  ence.** symbol f
53c0: 69 65 6c 64 20 69 73 20 6c 65 66 74 20 62 6c 61  ield is left bla
53d0: 6e 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64  nk..*/.void Find
53e0: 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73 28  RulePrecedences(
53f0: 78 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  xp).struct lemon
5400: 20 2a 78 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74   *xp;.{.  struct
5410: 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 66 6f 72   rule *rp;.  for
5420: 28 72 70 3d 78 70 2d 3e 72 75 6c 65 3b 20 72 70  (rp=xp->rule; rp
5430: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a  ; rp=rp->next){.
5440: 20 20 20 20 69 66 28 20 72 70 2d 3e 70 72 65 63      if( rp->prec
5450: 73 79 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sym==0 ){.      
5460: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72  int i;.      for
5470: 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
5480: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
5490: 69 66 28 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e  if( rp->rhs[i]->
54a0: 70 72 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20  prec>=0 ){.     
54b0: 20 20 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d       rp->precsym
54c0: 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
54d0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
54e0: 09 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .}.      }.    }
54f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
5500: 0a 0a 2f 2a 20 46 69 6e 64 20 61 6c 6c 20 6e 6f  ../* Find all no
5510: 6e 74 65 72 6d 69 6e 61 6c 73 20 77 68 69 63 68  nterminals which
5520: 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 74   will generate t
5530: 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e  he empty string.
5540: 0a 2a 2a 20 54 68 65 6e 20 67 6f 20 62 61 63 6b  .** Then go back
5550: 20 61 6e 64 20 63 6f 6d 70 75 74 65 20 74 68 65   and compute the
5560: 20 66 69 72 73 74 20 73 65 74 73 20 6f 66 20 65   first sets of e
5570: 76 65 72 79 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  very nonterminal
5580: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 73  ..** The first s
5590: 65 74 20 69 73 20 74 68 65 20 73 65 74 20 6f 66  et is the set of
55a0: 20 61 6c 6c 20 74 65 72 6d 69 6e 61 6c 20 73 79   all terminal sy
55b0: 6d 62 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20  mbols which can 
55c0: 62 65 67 69 6e 0a 2a 2a 20 61 20 73 74 72 69 6e  begin.** a strin
55d0: 67 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 74  g generated by t
55e0: 68 61 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e  hat nonterminal.
55f0: 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46 69 72  .*/.void FindFir
5600: 73 74 53 65 74 73 28 6c 65 6d 70 29 0a 73 74 72  stSets(lemp).str
5610: 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
5620: 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  .{.  int i;.  st
5630: 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20  ruct rule *rp;. 
5640: 20 69 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 0a   int progress;..
5650: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
5660: 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
5670: 7b 0a 20 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62  {.    lemp->symb
5680: 6f 6c 73 5b 69 5d 2d 3e 6c 61 6d 62 64 61 20 3d  ols[i]->lambda =
5690: 20 42 5f 46 41 4c 53 45 3b 0a 20 20 7d 0a 20 20   B_FALSE;.  }.  
56a0: 66 6f 72 28 69 3d 6c 65 6d 70 2d 3e 6e 74 65 72  for(i=lemp->nter
56b0: 6d 69 6e 61 6c 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  minal; i<lemp->n
56c0: 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  symbol; i++){.  
56d0: 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b    lemp->symbols[
56e0: 69 5d 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 53  i]->firstset = S
56f0: 65 74 4e 65 77 28 29 3b 0a 20 20 7d 0a 0a 20 20  etNew();.  }..  
5700: 2f 2a 20 46 69 72 73 74 20 63 6f 6d 70 75 74 65  /* First compute
5710: 20 61 6c 6c 20 6c 61 6d 62 64 61 73 20 2a 2f 0a   all lambdas */.
5720: 20 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65    do{.    progre
5730: 73 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ss = 0;.    for(
5740: 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72  rp=lemp->rule; r
5750: 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b  p; rp=rp->next){
5760: 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c  .      if( rp->l
5770: 68 73 2d 3e 6c 61 6d 62 64 61 20 29 20 63 6f 6e  hs->lambda ) con
5780: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72  tinue;.      for
5790: 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73  (i=0; i<rp->nrhs
57a0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
57b0: 20 69 66 28 20 72 70 2d 3e 72 68 73 5b 69 5d 2d   if( rp->rhs[i]-
57c0: 3e 6c 61 6d 62 64 61 3d 3d 42 5f 46 41 4c 53 45  >lambda==B_FALSE
57d0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
57e0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 72  }.      if( i==r
57f0: 70 2d 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20  p->nrhs ){.     
5800: 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62     rp->lhs->lamb
5810: 64 61 20 3d 20 42 5f 54 52 55 45 3b 0a 20 20 20  da = B_TRUE;.   
5820: 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20       progress = 
5830: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
5840: 0a 20 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72  .  }while( progr
5850: 65 73 73 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77  ess );..  /* Now
5860: 20 63 6f 6d 70 75 74 65 20 61 6c 6c 20 66 69 72   compute all fir
5870: 73 74 20 73 65 74 73 20 2a 2f 0a 20 20 64 6f 7b  st sets */.  do{
5880: 0a 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62  .    struct symb
5890: 6f 6c 20 2a 73 31 2c 20 2a 73 32 3b 0a 20 20 20  ol *s1, *s2;.   
58a0: 20 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20   progress = 0;. 
58b0: 20 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e     for(rp=lemp->
58c0: 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d  rule; rp; rp=rp-
58d0: 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 73 31  >next){.      s1
58e0: 20 3d 20 72 70 2d 3e 6c 68 73 3b 0a 20 20 20 20   = rp->lhs;.    
58f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d    for(i=0; i<rp-
5900: 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nrhs; i++){.   
5910: 20 20 20 20 20 73 32 20 3d 20 72 70 2d 3e 72 68       s2 = rp->rh
5920: 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  s[i];.        if
5930: 28 20 73 32 2d 3e 74 79 70 65 3d 3d 54 45 52 4d  ( s2->type==TERM
5940: 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  INAL ){.        
5950: 20 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65    progress += Se
5960: 74 41 64 64 28 73 31 2d 3e 66 69 72 73 74 73 65  tAdd(s1->firstse
5970: 74 2c 73 32 2d 3e 69 6e 64 65 78 29 3b 0a 20 20  t,s2->index);.  
5980: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09          break;..
5990: 7d 65 6c 73 65 20 69 66 28 20 73 31 3d 3d 73 32  }else if( s1==s2
59a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
59b0: 28 20 73 31 2d 3e 6c 61 6d 62 64 61 3d 3d 42 5f  ( s1->lambda==B_
59c0: 46 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 09  FALSE ) break;..
59d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
59e0: 20 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74   progress += Set
59f0: 55 6e 69 6f 6e 28 73 31 2d 3e 66 69 72 73 74 73  Union(s1->firsts
5a00: 65 74 2c 73 32 2d 3e 66 69 72 73 74 73 65 74 29  et,s2->firstset)
5a10: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
5a20: 73 32 2d 3e 6c 61 6d 62 64 61 3d 3d 42 5f 46 41  s2->lambda==B_FA
5a30: 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 09 7d 0a  LSE ) break;..}.
5a40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
5a50: 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73  }while( progress
5a60: 20 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   );.  return;.}.
5a70: 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20  ./* Compute all 
5a80: 4c 52 28 30 29 20 73 74 61 74 65 73 20 66 6f 72  LR(0) states for
5a90: 20 74 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 4c   the grammar.  L
5aa0: 69 6e 6b 73 0a 2a 2a 20 61 72 65 20 61 64 64 65  inks.** are adde
5ab0: 64 20 74 6f 20 62 65 74 77 65 65 6e 20 73 6f 6d  d to between som
5ac0: 65 20 73 74 61 74 65 73 20 73 6f 20 74 68 61 74  e states so that
5ad0: 20 74 68 65 20 4c 52 28 31 29 20 66 6f 6c 6c 6f   the LR(1) follo
5ae0: 77 20 73 65 74 73 0a 2a 2a 20 63 61 6e 20 62 65  w sets.** can be
5af0: 20 63 6f 6d 70 75 74 65 64 20 6c 61 74 65 72 2e   computed later.
5b00: 0a 2a 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75  .*/.PRIVATE stru
5b10: 63 74 20 73 74 61 74 65 20 2a 67 65 74 73 74 61  ct state *getsta
5b20: 74 65 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d  te(/* struct lem
5b30: 6f 6e 20 2a 20 2a 2f 29 3b 20 20 2f 2a 20 66 6f  on * */);  /* fo
5b40: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
5b50: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 53 74 61 74  */.void FindStat
5b60: 65 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20  es(lemp).struct 
5b70: 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20  lemon *lemp;.{. 
5b80: 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
5b90: 73 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c  sp;.  struct rul
5ba0: 65 20 2a 72 70 3b 0a 0a 20 20 43 6f 6e 66 69 67  e *rp;..  Config
5bb0: 6c 69 73 74 5f 69 6e 69 74 28 29 3b 0a 0a 20 20  list_init();..  
5bc0: 2f 2a 20 46 69 6e 64 20 74 68 65 20 73 74 61 72  /* Find the star
5bd0: 74 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69 66  t symbol */.  if
5be0: 28 20 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b  ( lemp->start ){
5bf0: 0a 20 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c  .    sp = Symbol
5c00: 5f 66 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72  _find(lemp->star
5c10: 74 29 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d  t);.    if( sp==
5c20: 30 20 29 7b 0a 20 20 20 20 20 20 45 72 72 6f 72  0 ){.      Error
5c30: 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61  Msg(lemp->filena
5c40: 6d 65 2c 30 2c 0a 22 54 68 65 20 73 70 65 63 69  me,0,."The speci
5c50: 66 69 65 64 20 73 74 61 72 74 20 73 79 6d 62 6f  fied start symbo
5c60: 6c 20 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20  l \"%s\" is not 
5c70: 5c 0a 69 6e 20 61 20 6e 6f 6e 74 65 72 6d 69 6e  \.in a nontermin
5c80: 61 6c 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  al of the gramma
5c90: 72 2e 20 20 5c 22 25 73 5c 22 20 77 69 6c 6c 20  r.  \"%s\" will 
5ca0: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 73  be used as the s
5cb0: 74 61 72 74 20 5c 0a 73 79 6d 62 6f 6c 20 69 6e  tart \.symbol in
5cc0: 73 74 65 61 64 2e 22 2c 6c 65 6d 70 2d 3e 73 74  stead.",lemp->st
5cd0: 61 72 74 2c 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e  art,lemp->rule->
5ce0: 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  lhs->name);.    
5cf0: 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
5d00: 2b 2b 3b 0a 20 20 20 20 20 20 73 70 20 3d 20 6c  ++;.      sp = l
5d10: 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a  emp->rule->lhs;.
5d20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
5d30: 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75     sp = lemp->ru
5d40: 6c 65 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 0a 20 20  le->lhs;.  }..  
5d50: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
5d60: 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 64 6f   start symbol do
5d70: 65 73 6e 27 74 20 6f 63 63 75 72 20 6f 6e 20 74  esn't occur on t
5d80: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69  he right-hand si
5d90: 64 65 20 6f 66 0a 20 20 2a 2a 20 61 6e 79 20 72  de of.  ** any r
5da0: 75 6c 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20  ule.  Report an 
5db0: 65 72 72 6f 72 20 69 66 20 69 74 20 64 6f 65 73  error if it does
5dc0: 2e 20 20 28 59 41 43 43 20 77 6f 75 6c 64 20 67  .  (YACC would g
5dd0: 65 6e 65 72 61 74 65 20 61 20 6e 65 77 0a 20 20  enerate a new.  
5de0: 2a 2a 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  ** start symbol 
5df0: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 29 20 2a  in this case.) *
5e00: 2f 0a 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d  /.  for(rp=lemp-
5e10: 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70  >rule; rp; rp=rp
5e20: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74  ->next){.    int
5e30: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
5e40: 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
5e50: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d  ){.      if( rp-
5e60: 3e 72 68 73 5b 69 5d 3d 3d 73 70 20 29 7b 0a 20  >rhs[i]==sp ){. 
5e70: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
5e80: 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30  lemp->filename,0
5e90: 2c 0a 22 54 68 65 20 73 74 61 72 74 20 73 79 6d  ,."The start sym
5ea0: 62 6f 6c 20 5c 22 25 73 5c 22 20 6f 63 63 75 72  bol \"%s\" occur
5eb0: 73 20 6f 6e 20 74 68 65 20 5c 0a 72 69 67 68 74  s on the \.right
5ec0: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20  -hand side of a 
5ed0: 72 75 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20  rule. This will 
5ee0: 72 65 73 75 6c 74 20 69 6e 20 61 20 70 61 72 73  result in a pars
5ef0: 65 72 20 77 68 69 63 68 20 5c 0a 64 6f 65 73 20  er which \.does 
5f00: 6e 6f 74 20 77 6f 72 6b 20 70 72 6f 70 65 72 6c  not work properl
5f10: 79 2e 22 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20  y.",sp->name);. 
5f20: 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72         lemp->err
5f30: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d  orcnt++;.      }
5f40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
5f50: 20 54 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69   The basis confi
5f60: 67 75 72 61 74 69 6f 6e 20 73 65 74 20 66 6f 72  guration set for
5f70: 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74 65   the first state
5f80: 0a 20 20 2a 2a 20 69 73 20 61 6c 6c 20 72 75 6c  .  ** is all rul
5f90: 65 73 20 77 68 69 63 68 20 68 61 76 65 20 74 68  es which have th
5fa0: 65 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 61  e start symbol a
5fb0: 73 20 74 68 65 69 72 0a 20 20 2a 2a 20 6c 65 66  s their.  ** lef
5fc0: 74 2d 68 61 6e 64 20 73 69 64 65 20 2a 2f 0a 20  t-hand side */. 
5fd0: 20 66 6f 72 28 72 70 3d 73 70 2d 3e 72 75 6c 65   for(rp=sp->rule
5fe0: 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78  ; rp; rp=rp->nex
5ff0: 74 6c 68 73 29 7b 0a 20 20 20 20 73 74 72 75 63  tlhs){.    struc
6000: 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 70  t config *newcfp
6010: 3b 0a 20 20 20 20 6e 65 77 63 66 70 20 3d 20 43  ;.    newcfp = C
6020: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73  onfiglist_addbas
6030: 69 73 28 72 70 2c 30 29 3b 0a 20 20 20 20 53 65  is(rp,0);.    Se
6040: 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66 77 73  tAdd(newcfp->fws
6050: 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  ,0);.  }..  /* C
6060: 6f 6d 70 75 74 65 20 74 68 65 20 66 69 72 73 74  ompute the first
6070: 20 73 74 61 74 65 2e 20 20 41 6c 6c 20 6f 74 68   state.  All oth
6080: 65 72 20 73 74 61 74 65 73 20 77 69 6c 6c 20 62  er states will b
6090: 65 0a 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20  e.  ** computed 
60a0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 75  automatically du
60b0: 72 69 6e 67 20 74 68 65 20 63 6f 6d 70 75 74 61  ring the computa
60c0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73  tion of the firs
60d0: 74 20 6f 6e 65 2e 0a 20 20 2a 2a 20 54 68 65 20  t one..  ** The 
60e0: 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72  returned pointer
60f0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 73 74   to the first st
6100: 61 74 65 20 69 73 20 6e 6f 74 20 75 73 65 64 2e  ate is not used.
6110: 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 73   */.  (void)gets
6120: 74 61 74 65 28 6c 65 6d 70 29 3b 0a 20 20 72 65  tate(lemp);.  re
6130: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75  turn;.}../* Retu
6140: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
6150: 61 20 73 74 61 74 65 20 77 68 69 63 68 20 69 73  a state which is
6160: 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74 68   described by th
6170: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a  e configuration.
6180: 2a 2a 20 6c 69 73 74 20 77 68 69 63 68 20 68 61  ** list which ha
6190: 73 20 62 65 65 6e 20 62 75 69 6c 74 20 66 72 6f  s been built fro
61a0: 6d 20 63 61 6c 6c 73 20 74 6f 20 43 6f 6e 66 69  m calls to Confi
61b0: 67 6c 69 73 74 5f 61 64 64 2e 0a 2a 2f 0a 50 52  glist_add..*/.PR
61c0: 49 56 41 54 45 20 76 6f 69 64 20 62 75 69 6c 64  IVATE void build
61d0: 73 68 69 66 74 73 28 2f 2a 20 73 74 72 75 63 74  shifts(/* struct
61e0: 20 6c 65 6d 6f 6e 20 2a 2c 20 73 74 72 75 63 74   lemon *, struct
61f0: 20 73 74 61 74 65 20 2a 20 2a 2f 29 3b 20 2f 2a   state * */); /*
6200: 20 46 6f 72 77 64 20 72 65 66 20 2a 2f 0a 50 52   Forwd ref */.PR
6210: 49 56 41 54 45 20 73 74 72 75 63 74 20 73 74 61  IVATE struct sta
6220: 74 65 20 2a 67 65 74 73 74 61 74 65 28 6c 65 6d  te *getstate(lem
6230: 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  p).struct lemon 
6240: 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63  *lemp;.{.  struc
6250: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a  t config *cfp, *
6260: 62 70 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61  bp;.  struct sta
6270: 74 65 20 2a 73 74 70 3b 0a 0a 20 20 2f 2a 20 45  te *stp;..  /* E
6280: 78 74 72 61 63 74 20 74 68 65 20 73 6f 72 74 65  xtract the sorte
6290: 64 20 62 61 73 69 73 20 6f 66 20 74 68 65 20 6e  d basis of the n
62a0: 65 77 20 73 74 61 74 65 2e 20 20 54 68 65 20 62  ew state.  The b
62b0: 61 73 69 73 20 77 61 73 20 63 6f 6e 73 74 72 75  asis was constru
62c0: 63 74 65 64 0a 20 20 2a 2a 20 62 79 20 70 72 69  cted.  ** by pri
62d0: 6f 72 20 63 61 6c 6c 73 20 74 6f 20 22 43 6f 6e  or calls to "Con
62e0: 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73  figlist_addbasis
62f0: 28 29 22 2e 20 2a 2f 0a 20 20 43 6f 6e 66 69 67  ()". */.  Config
6300: 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28 29  list_sortbasis()
6310: 3b 0a 20 20 62 70 20 3d 20 43 6f 6e 66 69 67 6c  ;.  bp = Configl
6320: 69 73 74 5f 62 61 73 69 73 28 29 3b 0a 0a 20 20  ist_basis();..  
6330: 2f 2a 20 47 65 74 20 61 20 73 74 61 74 65 20 77  /* Get a state w
6340: 69 74 68 20 74 68 65 20 73 61 6d 65 20 62 61 73  ith the same bas
6350: 69 73 20 2a 2f 0a 20 20 73 74 70 20 3d 20 53 74  is */.  stp = St
6360: 61 74 65 5f 66 69 6e 64 28 62 70 29 3b 0a 20 20  ate_find(bp);.  
6370: 69 66 28 20 73 74 70 20 29 7b 0a 20 20 20 20 2f  if( stp ){.    /
6380: 2a 20 41 20 73 74 61 74 65 20 77 69 74 68 20 74  * A state with t
6390: 68 65 20 73 61 6d 65 20 62 61 73 69 73 20 61 6c  he same basis al
63a0: 72 65 61 64 79 20 65 78 69 73 74 73 21 20 20 43  ready exists!  C
63b0: 6f 70 79 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c  opy all the foll
63c0: 6f 77 2d 73 65 74 0a 20 20 20 20 2a 2a 20 70 72  ow-set.    ** pr
63d0: 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20  opagation links 
63e0: 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65 20 75  from the state u
63f0: 6e 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f  nder constructio
6400: 6e 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a  n into the.    *
6410: 2a 20 70 72 65 65 78 69 73 74 69 6e 67 20 73 74  * preexisting st
6420: 61 74 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e  ate, then return
6430: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
6440: 65 20 70 72 65 65 78 69 73 74 69 6e 67 20 73 74  e preexisting st
6450: 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  ate */.    struc
6460: 74 20 63 6f 6e 66 69 67 20 2a 78 2c 20 2a 79 3b  t config *x, *y;
6470: 0a 20 20 20 20 66 6f 72 28 78 3d 62 70 2c 20 79  .    for(x=bp, y
6480: 3d 73 74 70 2d 3e 62 70 3b 20 78 20 26 26 20 79  =stp->bp; x && y
6490: 3b 20 78 3d 78 2d 3e 62 70 2c 20 79 3d 79 2d 3e  ; x=x->bp, y=y->
64a0: 62 70 29 7b 0a 20 20 20 20 20 20 50 6c 69 6e 6b  bp){.      Plink
64b0: 5f 63 6f 70 79 28 26 79 2d 3e 62 70 6c 70 2c 78  _copy(&y->bplp,x
64c0: 2d 3e 62 70 6c 70 29 3b 0a 20 20 20 20 20 20 50  ->bplp);.      P
64d0: 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 78 2d 3e 66  link_delete(x->f
64e0: 70 6c 70 29 3b 0a 20 20 20 20 20 20 78 2d 3e 66  plp);.      x->f
64f0: 70 6c 70 20 3d 20 78 2d 3e 62 70 6c 70 20 3d 20  plp = x->bplp = 
6500: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 66 70  0;.    }.    cfp
6510: 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65   = Configlist_re
6520: 74 75 72 6e 28 29 3b 0a 20 20 20 20 43 6f 6e 66  turn();.    Conf
6530: 69 67 6c 69 73 74 5f 65 61 74 28 63 66 70 29 3b  iglist_eat(cfp);
6540: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
6550: 20 54 68 69 73 20 72 65 61 6c 6c 79 20 69 73 20   This really is 
6560: 61 20 6e 65 77 20 73 74 61 74 65 2e 20 20 43 6f  a new state.  Co
6570: 6e 73 74 72 75 63 74 20 61 6c 6c 20 74 68 65 20  nstruct all the 
6580: 64 65 74 61 69 6c 73 20 2a 2f 0a 20 20 20 20 43  details */.    C
6590: 6f 6e 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72  onfiglist_closur
65a0: 65 28 6c 65 6d 70 29 3b 20 20 20 20 2f 2a 20 43  e(lemp);    /* C
65b0: 6f 6d 70 75 74 65 20 74 68 65 20 63 6f 6e 66 69  ompute the confi
65c0: 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65  guration closure
65d0: 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69   */.    Configli
65e0: 73 74 5f 73 6f 72 74 28 29 3b 20 20 20 20 20 20  st_sort();      
65f0: 20 20 20 20 20 2f 2a 20 53 6f 72 74 20 74 68 65       /* Sort the
6600: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   configuration c
6610: 6c 6f 73 75 72 65 20 2a 2f 0a 20 20 20 20 63 66  losure */.    cf
6620: 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72  p = Configlist_r
6630: 65 74 75 72 6e 28 29 3b 20 20 20 2f 2a 20 47 65  eturn();   /* Ge
6640: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  t a pointer to t
6650: 68 65 20 63 6f 6e 66 69 67 20 6c 69 73 74 20 2a  he config list *
6660: 2f 0a 20 20 20 20 73 74 70 20 3d 20 53 74 61 74  /.    stp = Stat
6670: 65 5f 6e 65 77 28 29 3b 20 20 20 20 20 20 20 20  e_new();        
6680: 20 20 20 2f 2a 20 41 20 6e 65 77 20 73 74 61 74     /* A new stat
6690: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
66a0: 20 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73     MemoryCheck(s
66b0: 74 70 29 3b 0a 20 20 20 20 73 74 70 2d 3e 62 70  tp);.    stp->bp
66c0: 20 3d 20 62 70 3b 20 20 20 20 20 20 20 20 20 20   = bp;          
66d0: 20 20 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65        /* Remembe
66e0: 72 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  r the configurat
66f0: 69 6f 6e 20 62 61 73 69 73 20 2a 2f 0a 20 20 20  ion basis */.   
6700: 20 73 74 70 2d 3e 63 66 70 20 3d 20 63 66 70 3b   stp->cfp = cfp;
6710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6720: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63 6f   Remember the co
6730: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73  nfiguration clos
6740: 75 72 65 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e  ure */.    stp->
6750: 69 6e 64 65 78 20 3d 20 6c 65 6d 70 2d 3e 6e 73  index = lemp->ns
6760: 74 61 74 65 2b 2b 3b 20 2f 2a 20 45 76 65 72 79  tate++; /* Every
6770: 20 73 74 61 74 65 20 67 65 74 73 20 61 20 73 65   state gets a se
6780: 71 75 65 6e 63 65 20 6e 75 6d 62 65 72 20 2a 2f  quence number */
6790: 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 30  .    stp->ap = 0
67a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
67b0: 20 20 2f 2a 20 4e 6f 20 61 63 74 69 6f 6e 73 2c    /* No actions,
67c0: 20 79 65 74 2e 20 2a 2f 0a 20 20 20 20 53 74 61   yet. */.    Sta
67d0: 74 65 5f 69 6e 73 65 72 74 28 73 74 70 2c 73 74  te_insert(stp,st
67e0: 70 2d 3e 62 70 29 3b 20 20 20 2f 2a 20 41 64 64  p->bp);   /* Add
67f0: 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74 61   to the state ta
6800: 62 6c 65 20 2a 2f 0a 20 20 20 20 62 75 69 6c 64  ble */.    build
6810: 73 68 69 66 74 73 28 6c 65 6d 70 2c 73 74 70 29  shifts(lemp,stp)
6820: 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 63 75 72  ;       /* Recur
6830: 73 69 76 65 6c 79 20 63 6f 6d 70 75 74 65 20 73  sively compute s
6840: 75 63 63 65 73 73 6f 72 20 73 74 61 74 65 73 20  uccessor states 
6850: 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  */.  }.  return 
6860: 73 74 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73 74  stp;.}../* Const
6870: 72 75 63 74 20 61 6c 6c 20 73 75 63 63 65 73 73  ruct all success
6880: 6f 72 20 73 74 61 74 65 73 20 74 6f 20 74 68 65  or states to the
6890: 20 67 69 76 65 6e 20 73 74 61 74 65 2e 20 20 41   given state.  A
68a0: 20 22 73 75 63 63 65 73 73 6f 72 22 0a 2a 2a 20   "successor".** 
68b0: 73 74 61 74 65 20 69 73 20 61 6e 79 20 73 74 61  state is any sta
68c0: 74 65 20 77 68 69 63 68 20 63 61 6e 20 62 65 20  te which can be 
68d0: 72 65 61 63 68 65 64 20 62 79 20 61 20 73 68 69  reached by a shi
68e0: 66 74 20 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52  ft action..*/.PR
68f0: 49 56 41 54 45 20 76 6f 69 64 20 62 75 69 6c 64  IVATE void build
6900: 73 68 69 66 74 73 28 6c 65 6d 70 2c 73 74 70 29  shifts(lemp,stp)
6910: 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
6920: 65 6d 70 3b 0a 73 74 72 75 63 74 20 73 74 61 74  emp;.struct stat
6930: 65 20 2a 73 74 70 3b 20 20 20 20 20 2f 2a 20 54  e *stp;     /* T
6940: 68 65 20 73 74 61 74 65 20 66 72 6f 6d 20 77 68  he state from wh
6950: 69 63 68 20 73 75 63 63 65 73 73 6f 72 73 20 61  ich successors a
6960: 72 65 20 63 6f 6d 70 75 74 65 64 20 2a 2f 0a 7b  re computed */.{
6970: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
6980: 20 2a 63 66 70 3b 20 20 2f 2a 20 46 6f 72 20 6c   *cfp;  /* For l
6990: 6f 6f 70 69 6e 67 20 74 68 72 75 20 74 68 65 20  ooping thru the 
69a0: 63 6f 6e 66 69 67 20 63 6c 6f 73 75 72 65 20 6f  config closure o
69b0: 66 20 22 73 74 70 22 20 2a 2f 0a 20 20 73 74 72  f "stp" */.  str
69c0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 62 63 66 70  uct config *bcfp
69d0: 3b 20 2f 2a 20 46 6f 72 20 74 68 65 20 69 6e 6e  ; /* For the inn
69e0: 65 72 20 6c 6f 6f 70 20 6f 6e 20 63 6f 6e 66 69  er loop on confi
69f0: 67 20 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74  g closure of "st
6a00: 70 22 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63  p" */.  struct c
6a10: 6f 6e 66 69 67 20 2a 6e 65 77 3b 20 20 2f 2a 20  onfig *new;  /* 
6a20: 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62  */.  struct symb
6a30: 6f 6c 20 2a 73 70 3b 20 20 20 2f 2a 20 53 79 6d  ol *sp;   /* Sym
6a40: 62 6f 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  bol following th
6a50: 65 20 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75  e dot in configu
6a60: 72 61 74 69 6f 6e 20 22 63 66 70 22 20 2a 2f 0a  ration "cfp" */.
6a70: 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
6a80: 2a 62 73 70 3b 20 20 2f 2a 20 53 79 6d 62 6f 6c  *bsp;  /* Symbol
6a90: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64   following the d
6aa0: 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61 74  ot in configurat
6ab0: 69 6f 6e 20 22 62 63 66 70 22 20 2a 2f 0a 20 20  ion "bcfp" */.  
6ac0: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 6e 65  struct state *ne
6ad0: 77 73 74 70 3b 20 2f 2a 20 41 20 70 6f 69 6e 74  wstp; /* A point
6ae0: 65 72 20 74 6f 20 61 20 73 75 63 63 65 73 73 6f  er to a successo
6af0: 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a  r state */..  /*
6b00: 20 45 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74   Each configurat
6b10: 69 6f 6e 20 62 65 63 6f 6d 65 73 20 63 6f 6d 70  ion becomes comp
6b20: 6c 65 74 65 20 61 66 74 65 72 20 69 74 20 63 6f  lete after it co
6b30: 6e 74 69 62 75 74 65 73 20 74 6f 20 61 20 73 75  ntibutes to a su
6b40: 63 63 65 73 73 6f 72 0a 20 20 2a 2a 20 73 74 61  ccessor.  ** sta
6b50: 74 65 2e 20 20 49 6e 69 74 69 61 6c 6c 79 2c 20  te.  Initially, 
6b60: 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  all configuratio
6b70: 6e 73 20 61 72 65 20 69 6e 63 6f 6d 70 6c 65 74  ns are incomplet
6b80: 65 20 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73  e */.  for(cfp=s
6b90: 74 70 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66  tp->cfp; cfp; cf
6ba0: 70 3d 63 66 70 2d 3e 6e 65 78 74 29 20 63 66 70  p=cfp->next) cfp
6bb0: 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d  ->status = INCOM
6bc0: 50 4c 45 54 45 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f  PLETE;..  /* Loo
6bd0: 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f  p through all co
6be0: 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 6f 66 20  nfigurations of 
6bf0: 74 68 65 20 73 74 61 74 65 20 22 73 74 70 22 20  the state "stp" 
6c00: 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70  */.  for(cfp=stp
6c10: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
6c20: 63 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  cfp->next){.    
6c30: 69 66 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d  if( cfp->status=
6c40: 3d 43 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74  =COMPLETE ) cont
6c50: 69 6e 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65  inue;    /* Alre
6c60: 61 64 79 20 75 73 65 64 20 62 79 20 69 6e 6e 65  ady used by inne
6c70: 72 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66  r loop */.    if
6c80: 28 20 63 66 70 2d 3e 64 6f 74 3e 3d 63 66 70 2d  ( cfp->dot>=cfp-
6c90: 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74  >rp->nrhs ) cont
6ca0: 69 6e 75 65 3b 20 20 2f 2a 20 43 61 6e 27 74 20  inue;  /* Can't 
6cb0: 73 68 69 66 74 20 74 68 69 73 20 63 6f 6e 66 69  shift this confi
6cc0: 67 20 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c  g */.    Configl
6cd0: 69 73 74 5f 72 65 73 65 74 28 29 3b 20 20 20 20  ist_reset();    
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cf0: 20 20 2f 2a 20 52 65 73 65 74 20 74 68 65 20 6e    /* Reset the n
6d00: 65 77 20 63 6f 6e 66 69 67 20 73 65 74 20 2a 2f  ew config set */
6d10: 0a 20 20 20 20 73 70 20 3d 20 63 66 70 2d 3e 72  .    sp = cfp->r
6d20: 70 2d 3e 72 68 73 5b 63 66 70 2d 3e 64 6f 74 5d  p->rhs[cfp->dot]
6d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
6d40: 20 53 79 6d 62 6f 6c 20 61 66 74 65 72 20 74 68   Symbol after th
6d50: 65 20 64 6f 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a  e dot */..    /*
6d60: 20 46 6f 72 20 65 76 65 72 79 20 63 6f 6e 66 69   For every confi
6d70: 67 75 72 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  guration in the 
6d80: 73 74 61 74 65 20 22 73 74 70 22 20 77 68 69 63  state "stp" whic
6d90: 68 20 68 61 73 20 74 68 65 20 73 79 6d 62 6f 6c  h has the symbol
6da0: 20 22 73 70 22 0a 20 20 20 20 2a 2a 20 66 6f 6c   "sp".    ** fol
6db0: 6c 6f 77 69 6e 67 20 69 74 73 20 64 6f 74 2c 20  lowing its dot, 
6dc0: 61 64 64 20 74 68 65 20 73 61 6d 65 20 63 6f 6e  add the same con
6dd0: 66 69 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68  figuration to th
6de0: 65 20 62 61 73 69 73 20 73 65 74 20 75 6e 64 65  e basis set unde
6df0: 72 0a 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75  r.    ** constru
6e00: 63 74 69 6f 6e 20 62 75 74 20 77 69 74 68 20 74  ction but with t
6e10: 68 65 20 64 6f 74 20 73 68 69 66 74 65 64 20 6f  he dot shifted o
6e20: 6e 65 20 73 79 6d 62 6f 6c 20 74 6f 20 74 68 65  ne symbol to the
6e30: 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 66   right. */.    f
6e40: 6f 72 28 62 63 66 70 3d 63 66 70 3b 20 62 63 66  or(bcfp=cfp; bcf
6e50: 70 3b 20 62 63 66 70 3d 62 63 66 70 2d 3e 6e 65  p; bcfp=bcfp->ne
6e60: 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62  xt){.      if( b
6e70: 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d  cfp->status==COM
6e80: 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65  PLETE ) continue
6e90: 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20  ;    /* Already 
6ea0: 75 73 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66  used */.      if
6eb0: 28 20 62 63 66 70 2d 3e 64 6f 74 3e 3d 62 63 66  ( bcfp->dot>=bcf
6ec0: 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f  p->rp->nrhs ) co
6ed0: 6e 74 69 6e 75 65 3b 20 2f 2a 20 43 61 6e 27 74  ntinue; /* Can't
6ee0: 20 73 68 69 66 74 20 74 68 69 73 20 6f 6e 65 20   shift this one 
6ef0: 2a 2f 0a 20 20 20 20 20 20 62 73 70 20 3d 20 62  */.      bsp = b
6f00: 63 66 70 2d 3e 72 70 2d 3e 72 68 73 5b 62 63 66  cfp->rp->rhs[bcf
6f10: 70 2d 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20  p->dot];        
6f20: 20 20 20 2f 2a 20 47 65 74 20 73 79 6d 62 6f 6c     /* Get symbol
6f30: 20 61 66 74 65 72 20 64 6f 74 20 2a 2f 0a 20 20   after dot */.  
6f40: 20 20 20 20 69 66 28 20 62 73 70 21 3d 73 70 20      if( bsp!=sp 
6f50: 29 20 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20  ) continue;     
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6f70: 20 4d 75 73 74 20 62 65 20 73 61 6d 65 20 61 73   Must be same as
6f80: 20 66 6f 72 20 22 63 66 70 22 20 2a 2f 0a 20 20   for "cfp" */.  
6f90: 20 20 20 20 62 63 66 70 2d 3e 73 74 61 74 75 73      bcfp->status
6fa0: 20 3d 20 43 4f 4d 50 4c 45 54 45 3b 20 20 20 20   = COMPLETE;    
6fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6fc0: 20 4d 61 72 6b 20 74 68 69 73 20 63 6f 6e 66 69   Mark this confi
6fd0: 67 20 61 73 20 75 73 65 64 20 2a 2f 0a 20 20 20  g as used */.   
6fe0: 20 20 20 6e 65 77 20 3d 20 43 6f 6e 66 69 67 6c     new = Configl
6ff0: 69 73 74 5f 61 64 64 62 61 73 69 73 28 62 63 66  ist_addbasis(bcf
7000: 70 2d 3e 72 70 2c 62 63 66 70 2d 3e 64 6f 74 2b  p->rp,bcfp->dot+
7010: 31 29 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f  1);.      Plink_
7020: 61 64 64 28 26 6e 65 77 2d 3e 62 70 6c 70 2c 62  add(&new->bplp,b
7030: 63 66 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  cfp);.    }..   
7040: 20 2f 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65   /* Get a pointe
7050: 72 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 64  r to the state d
7060: 65 73 63 72 69 62 65 64 20 62 79 20 74 68 65 20  escribed by the 
7070: 62 61 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74  basis configurat
7080: 69 6f 6e 20 73 65 74 0a 20 20 20 20 2a 2a 20 63  ion set.    ** c
7090: 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68  onstructed in th
70a0: 65 20 70 72 65 63 65 64 69 6e 67 20 6c 6f 6f 70  e preceding loop
70b0: 20 2a 2f 0a 20 20 20 20 6e 65 77 73 74 70 20 3d   */.    newstp =
70c0: 20 67 65 74 73 74 61 74 65 28 6c 65 6d 70 29 3b   getstate(lemp);
70d0: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61  ..    /* The sta
70e0: 74 65 20 22 6e 65 77 73 74 70 22 20 69 73 20 72  te "newstp" is r
70f0: 65 61 63 68 65 64 20 66 72 6f 6d 20 74 68 65 20  eached from the 
7100: 73 74 61 74 65 20 22 73 74 70 22 20 62 79 20 61  state "stp" by a
7110: 20 73 68 69 66 74 20 61 63 74 69 6f 6e 0a 20 20   shift action.  
7120: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 79 6d 62    ** on the symb
7130: 6f 6c 20 22 73 70 22 20 2a 2f 0a 20 20 20 20 41  ol "sp" */.    A
7140: 63 74 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e  ction_add(&stp->
7150: 61 70 2c 53 48 49 46 54 2c 73 70 2c 6e 65 77 73  ap,SHIFT,sp,news
7160: 74 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  tp);.  }.}../*.*
7170: 2a 20 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20  * Construct the 
7180: 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b  propagation link
7190: 73 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 4c 69  s.*/.void FindLi
71a0: 6e 6b 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74  nks(lemp).struct
71b0: 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a   lemon *lemp;.{.
71c0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63    int i;.  struc
71d0: 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a  t config *cfp, *
71e0: 6f 74 68 65 72 3b 0a 20 20 73 74 72 75 63 74 20  other;.  struct 
71f0: 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
7200: 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b  ruct plink *plp;
7210: 0a 0a 20 20 2f 2a 20 48 6f 75 73 65 6b 65 65 70  ..  /* Housekeep
7220: 69 6e 67 20 64 65 74 61 69 6c 3a 0a 20 20 2a 2a  ing detail:.  **
7230: 20 41 64 64 20 74 6f 20 65 76 65 72 79 20 70 72   Add to every pr
7240: 6f 70 61 67 61 74 65 20 6c 69 6e 6b 20 61 20 70  opagate link a p
7250: 6f 69 6e 74 65 72 20 62 61 63 6b 20 74 6f 20 74  ointer back to t
7260: 68 65 20 73 74 61 74 65 20 74 6f 0a 20 20 2a 2a  he state to.  **
7270: 20 77 68 69 63 68 20 74 68 65 20 6c 69 6e 6b 20   which the link 
7280: 69 73 20 61 74 74 61 63 68 65 64 2e 20 2a 2f 0a  is attached. */.
7290: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
72a0: 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
72b0: 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
72c0: 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
72d0: 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70  for(cfp=stp->cfp
72e0: 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e  ; cfp; cfp=cfp->
72f0: 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70  next){.      cfp
7300: 2d 3e 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20  ->stp = stp;.   
7310: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e   }.  }..  /* Con
7320: 76 65 72 74 20 61 6c 6c 20 62 61 63 6b 6c 69 6e  vert all backlin
7330: 6b 73 20 69 6e 74 6f 20 66 6f 72 77 61 72 64 20  ks into forward 
7340: 6c 69 6e 6b 73 2e 20 20 4f 6e 6c 79 20 74 68 65  links.  Only the
7350: 20 66 6f 72 77 61 72 64 0a 20 20 2a 2a 20 6c 69   forward.  ** li
7360: 6e 6b 73 20 61 72 65 20 75 73 65 64 20 69 6e 20  nks are used in 
7370: 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63  the follow-set c
7380: 6f 6d 70 75 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20  omputation. */. 
7390: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
73a0: 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
73b0: 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
73c0: 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66  sorted[i];.    f
73d0: 6f 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b  or(cfp=stp->cfp;
73e0: 20 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e   cfp; cfp=cfp->n
73f0: 65 78 74 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  ext){.      for(
7400: 70 6c 70 3d 63 66 70 2d 3e 62 70 6c 70 3b 20 70  plp=cfp->bplp; p
7410: 6c 70 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78  lp; plp=plp->nex
7420: 74 29 7b 0a 20 20 20 20 20 20 20 20 6f 74 68 65  t){.        othe
7430: 72 20 3d 20 70 6c 70 2d 3e 63 66 70 3b 0a 20 20  r = plp->cfp;.  
7440: 20 20 20 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28        Plink_add(
7450: 26 6f 74 68 65 72 2d 3e 66 70 6c 70 2c 63 66 70  &other->fplp,cfp
7460: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7470: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75  .  }.}../* Compu
7480: 74 65 20 61 6c 6c 20 66 6f 6c 6c 6f 77 73 65 74  te all followset
7490: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 66 6f 6c 6c 6f  s..**.** A follo
74a0: 77 73 65 74 20 69 73 20 74 68 65 20 73 65 74 20  wset is the set 
74b0: 6f 66 20 61 6c 6c 20 73 79 6d 62 6f 6c 73 20 77  of all symbols w
74c0: 68 69 63 68 20 63 61 6e 20 63 6f 6d 65 20 69 6d  hich can come im
74d0: 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74  mediately.** aft
74e0: 65 72 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69  er a configurati
74f0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64  on..*/.void Find
7500: 46 6f 6c 6c 6f 77 53 65 74 73 28 6c 65 6d 70 29  FollowSets(lemp)
7510: 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
7520: 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  emp;.{.  int i;.
7530: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
7540: 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20 70  *cfp;.  struct p
7550: 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 20 20 69 6e 74  link *plp;.  int
7560: 20 70 72 6f 67 72 65 73 73 3b 0a 20 20 69 6e 74   progress;.  int
7570: 20 63 68 61 6e 67 65 3b 0a 0a 20 20 66 6f 72 28   change;..  for(
7580: 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74  i=0; i<lemp->nst
7590: 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66  ate; i++){.    f
75a0: 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72  or(cfp=lemp->sor
75b0: 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70  ted[i]->cfp; cfp
75c0: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
75d0: 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61  {.      cfp->sta
75e0: 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45  tus = INCOMPLETE
75f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
7600: 20 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73   do{.    progres
7610: 73 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  s = 0;.    for(i
7620: 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
7630: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  te; i++){.      
7640: 66 6f 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f  for(cfp=lemp->so
7650: 72 74 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66  rted[i]->cfp; cf
7660: 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74  p; cfp=cfp->next
7670: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
7680: 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50  fp->status==COMP
7690: 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b  LETE ) continue;
76a0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 6c 70  .        for(plp
76b0: 3d 63 66 70 2d 3e 66 70 6c 70 3b 20 70 6c 70 3b  =cfp->fplp; plp;
76c0: 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b   plp=plp->next){
76d0: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 6e 67  .          chang
76e0: 65 20 3d 20 53 65 74 55 6e 69 6f 6e 28 70 6c 70  e = SetUnion(plp
76f0: 2d 3e 63 66 70 2d 3e 66 77 73 2c 63 66 70 2d 3e  ->cfp->fws,cfp->
7700: 66 77 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  fws);.          
7710: 69 66 28 20 63 68 61 6e 67 65 20 29 7b 0a 20 20  if( change ){.  
7720: 20 20 20 20 20 20 20 20 20 20 70 6c 70 2d 3e 63            plp->c
7730: 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43  fp->status = INC
7740: 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 20  OMPLETE;.       
7750: 20 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20       progress = 
7760: 31 3b 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20  1;..  }..}.     
7770: 20 20 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d     cfp->status =
7780: 20 43 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20   COMPLETE;.     
7790: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c   }.    }.  }whil
77a0: 65 28 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 7d  e( progress );.}
77b0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  ..static int res
77c0: 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 29 3b  olve_conflict();
77d0: 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65  ../* Compute the
77e0: 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 73 2c   reduce actions,
77f0: 20 61 6e 64 20 72 65 73 6f 6c 76 65 20 63 6f 6e   and resolve con
7800: 66 6c 69 63 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20  flicts..*/.void 
7810: 46 69 6e 64 41 63 74 69 6f 6e 73 28 6c 65 6d 70  FindActions(lemp
7820: 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
7830: 6c 65 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c  lemp;.{.  int i,
7840: 6a 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  j;.  struct conf
7850: 69 67 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63  ig *cfp;.  struc
7860: 74 20 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20  t state *stp;.  
7870: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
7880: 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  p;.  struct rule
7890: 20 2a 72 70 3b 0a 0a 20 20 2f 2a 20 41 64 64 20   *rp;..  /* Add 
78a0: 61 6c 6c 20 6f 66 20 74 68 65 20 72 65 64 75 63  all of the reduc
78b0: 65 20 61 63 74 69 6f 6e 73 20 0a 20 20 2a 2a 20  e actions .  ** 
78c0: 41 20 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20  A reduce action 
78d0: 69 73 20 61 64 64 65 64 20 66 6f 72 20 65 61 63  is added for eac
78e0: 68 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65  h element of the
78f0: 20 66 6f 6c 6c 6f 77 73 65 74 20 6f 66 0a 20 20   followset of.  
7900: 2a 2a 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69  ** a configurati
7910: 6f 6e 20 77 68 69 63 68 20 68 61 73 20 69 74 73  on which has its
7920: 20 64 6f 74 20 61 74 20 74 68 65 20 65 78 74 72   dot at the extr
7930: 65 6d 65 20 72 69 67 68 74 2e 0a 20 20 2a 2f 0a  eme right..  */.
7940: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
7950: 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b  p->nstate; i++){
7960: 20 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20     /* Loop over 
7970: 61 6c 6c 20 73 74 61 74 65 73 20 2a 2f 0a 20 20  all states */.  
7980: 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
7990: 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  rted[i];.    for
79a0: 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63  (cfp=stp->cfp; c
79b0: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
79c0: 74 29 7b 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65  t){  /* Loop ove
79d0: 72 20 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74  r all configurat
79e0: 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66  ions */.      if
79f0: 28 20 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 3d  ( cfp->rp->nrhs=
7a00: 3d 63 66 70 2d 3e 64 6f 74 20 29 7b 20 20 20 20  =cfp->dot ){    
7a10: 20 20 20 20 2f 2a 20 49 73 20 64 6f 74 20 61 74      /* Is dot at
7a20: 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 3f 20   extreme right? 
7a30: 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  */.        for(j
7a40: 3d 30 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =0; j<lemp->nter
7a50: 6d 69 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  minal; j++){.   
7a60: 20 20 20 20 20 20 20 69 66 28 20 53 65 74 46 69         if( SetFi
7a70: 6e 64 28 63 66 70 2d 3e 66 77 73 2c 6a 29 20 29  nd(cfp->fws,j) )
7a80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
7a90: 20 41 64 64 20 61 20 72 65 64 75 63 65 20 61 63   Add a reduce ac
7aa0: 74 69 6f 6e 20 74 6f 20 74 68 65 20 73 74 61 74  tion to the stat
7ab0: 65 20 22 73 74 70 22 20 77 68 69 63 68 20 77 69  e "stp" which wi
7ac0: 6c 6c 20 72 65 64 75 63 65 20 62 79 20 74 68 65  ll reduce by the
7ad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
7ae0: 72 75 6c 65 20 22 63 66 70 2d 3e 72 70 22 20 69  rule "cfp->rp" i
7af0: 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20  f the lookahead 
7b00: 73 79 6d 62 6f 6c 20 69 73 20 22 6c 65 6d 70 2d  symbol is "lemp-
7b10: 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 22 20 2a 2f 0a  >symbols[j]" */.
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 41 63 74 69              Acti
7b30: 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c  on_add(&stp->ap,
7b40: 52 45 44 55 43 45 2c 6c 65 6d 70 2d 3e 73 79 6d  REDUCE,lemp->sym
7b50: 62 6f 6c 73 5b 6a 5d 2c 63 66 70 2d 3e 72 70 29  bols[j],cfp->rp)
7b60: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 09 7d  ;.          }..}
7b70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7b80: 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65   }..  /* Add the
7b90: 20 61 63 63 65 70 74 69 6e 67 20 74 6f 6b 65 6e   accepting token
7ba0: 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   */.  if( lemp->
7bb0: 73 74 61 72 74 20 29 7b 0a 20 20 20 20 73 70 20  start ){.    sp 
7bc0: 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65  = Symbol_find(le
7bd0: 6d 70 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20  mp->start);.    
7be0: 69 66 28 20 73 70 3d 3d 30 20 29 20 73 70 20 3d  if( sp==0 ) sp =
7bf0: 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73   lemp->rule->lhs
7c00: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
7c10: 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e  p = lemp->rule->
7c20: 6c 68 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 64  lhs;.  }.  /* Ad
7c30: 64 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 73  d to the first s
7c40: 74 61 74 65 20 28 77 68 69 63 68 20 69 73 20 61  tate (which is a
7c50: 6c 77 61 79 73 20 74 68 65 20 73 74 61 72 74 69  lways the starti
7c60: 6e 67 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  ng state of the.
7c70: 20 20 2a 2a 20 66 69 6e 69 74 65 20 73 74 61 74    ** finite stat
7c80: 65 20 6d 61 63 68 69 6e 65 29 20 61 6e 20 61 63  e machine) an ac
7c90: 74 69 6f 6e 20 74 6f 20 41 43 43 45 50 54 20 69  tion to ACCEPT i
7ca0: 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20  f the lookahead 
7cb0: 69 73 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72  is the.  ** star
7cc0: 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 20 20  t nonterminal.  
7cd0: 2a 2f 0a 20 20 41 63 74 69 6f 6e 5f 61 64 64 28  */.  Action_add(
7ce0: 26 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d  &lemp->sorted[0]
7cf0: 2d 3e 61 70 2c 41 43 43 45 50 54 2c 73 70 2c 30  ->ap,ACCEPT,sp,0
7d00: 29 3b 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65  );..  /* Resolve
7d10: 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20   conflicts */.  
7d20: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
7d30: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
7d40: 20 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e     struct action
7d50: 20 2a 61 70 2c 20 2a 6e 61 70 3b 0a 20 20 20 20   *ap, *nap;.    
7d60: 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74  struct state *st
7d70: 70 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  p;.    stp = lem
7d80: 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
7d90: 20 20 61 73 73 65 72 74 28 20 73 74 70 2d 3e 61    assert( stp->a
7da0: 70 20 29 3b 0a 20 20 20 20 73 74 70 2d 3e 61 70  p );.    stp->ap
7db0: 20 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73   = Action_sort(s
7dc0: 74 70 2d 3e 61 70 29 3b 0a 20 20 20 20 66 6f 72  tp->ap);.    for
7dd0: 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 20  (ap=stp->ap; ap 
7de0: 26 26 20 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3d  && ap->next; ap=
7df0: 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
7e00: 20 66 6f 72 28 6e 61 70 3d 61 70 2d 3e 6e 65 78   for(nap=ap->nex
7e10: 74 3b 20 6e 61 70 20 26 26 20 6e 61 70 2d 3e 73  t; nap && nap->s
7e20: 70 3d 3d 61 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e  p==ap->sp; nap=n
7e30: 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
7e40: 20 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 61      /* The two a
7e50: 63 74 69 6f 6e 73 20 22 61 70 22 20 61 6e 64 20  ctions "ap" and 
7e60: 22 6e 61 70 22 20 68 61 76 65 20 74 68 65 20 73  "nap" have the s
7e70: 61 6d 65 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20  ame lookahead.. 
7e80: 20 20 20 20 20 20 20 20 2a 2a 20 46 69 67 75 72          ** Figur
7e90: 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20  e out which one 
7ea0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 2a  should be used *
7eb0: 2f 0a 20 20 20 20 20 20 20 20 20 6c 65 6d 70 2d  /.         lemp-
7ec0: 3e 6e 63 6f 6e 66 6c 69 63 74 20 2b 3d 20 72 65  >nconflict += re
7ed0: 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61  solve_conflict(a
7ee0: 70 2c 6e 61 70 2c 6c 65 6d 70 2d 3e 65 72 72 73  p,nap,lemp->errs
7ef0: 79 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ym);.      }.   
7f00: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70   }.  }..  /* Rep
7f10: 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 66 6f 72  ort an error for
7f20: 20 65 61 63 68 20 72 75 6c 65 20 74 68 61 74 20   each rule that 
7f30: 63 61 6e 20 6e 65 76 65 72 20 62 65 20 72 65 64  can never be red
7f40: 75 63 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 72  uced. */.  for(r
7f50: 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70  p=lemp->rule; rp
7f60: 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 20 72  ; rp=rp->next) r
7f70: 70 2d 3e 63 61 6e 52 65 64 75 63 65 20 3d 20 42  p->canReduce = B
7f80: 5f 46 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d  _FALSE;.  for(i=
7f90: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
7fa0: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  e; i++){.    str
7fb0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
7fc0: 20 20 20 20 66 6f 72 28 61 70 3d 6c 65 6d 70 2d      for(ap=lemp-
7fd0: 3e 73 6f 72 74 65 64 5b 69 5d 2d 3e 61 70 3b 20  >sorted[i]->ap; 
7fe0: 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29  ap; ap=ap->next)
7ff0: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e  {.      if( ap->
8000: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 20 61  type==REDUCE ) a
8010: 70 2d 3e 78 2e 72 70 2d 3e 63 61 6e 52 65 64 75  p->x.rp->canRedu
8020: 63 65 20 3d 20 42 5f 54 52 55 45 3b 0a 20 20 20  ce = B_TRUE;.   
8030: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d   }.  }.  for(rp=
8040: 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
8050: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
8060: 20 20 69 66 28 20 72 70 2d 3e 63 61 6e 52 65 64    if( rp->canRed
8070: 75 63 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  uce ) continue;.
8080: 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
8090: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e  p->filename,rp->
80a0: 72 75 6c 65 6c 69 6e 65 2c 22 54 68 69 73 20 72  ruleline,"This r
80b0: 75 6c 65 20 63 61 6e 20 6e 6f 74 20 62 65 20 72  ule can not be r
80c0: 65 64 75 63 65 64 2e 5c 6e 22 29 3b 0a 20 20 20  educed.\n");.   
80d0: 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b   lemp->errorcnt+
80e0: 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 73  +;.  }.}../* Res
80f0: 6f 6c 76 65 20 61 20 63 6f 6e 66 6c 69 63 74 20  olve a conflict 
8100: 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20  between the two 
8110: 67 69 76 65 6e 20 61 63 74 69 6f 6e 73 2e 20 20  given actions.  
8120: 49 66 20 74 68 65 0a 2a 2a 20 63 6f 6e 66 6c 69  If the.** confli
8130: 63 74 20 63 61 6e 27 74 20 62 65 20 72 65 73 6f  ct can't be reso
8140: 6c 76 65 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d  lve, return non-
8150: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c  zero..**.** NO L
8160: 4f 4e 47 45 52 20 54 52 55 45 3a 0a 2a 2a 20 20  ONGER TRUE:.**  
8170: 20 54 6f 20 72 65 73 6f 6c 76 65 20 61 20 63 6f   To resolve a co
8180: 6e 66 6c 69 63 74 2c 20 66 69 72 73 74 20 6c 6f  nflict, first lo
8190: 6f 6b 20 74 6f 20 73 65 65 20 69 66 20 65 69 74  ok to see if eit
81a0: 68 65 72 20 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  her action.**   
81b0: 69 73 20 6f 6e 20 61 6e 20 65 72 72 6f 72 20 72  is on an error r
81c0: 75 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61  ule.  In that ca
81d0: 73 65 2c 20 74 61 6b 65 20 74 68 65 20 61 63 74  se, take the act
81e0: 69 6f 6e 20 77 68 69 63 68 0a 2a 2a 20 20 20 69  ion which.**   i
81f0: 73 20 6e 6f 74 20 61 73 73 6f 63 69 61 74 65 64  s not associated
8200: 20 77 69 74 68 20 74 68 65 20 65 72 72 6f 72 20   with the error 
8210: 72 75 6c 65 2e 20 20 49 66 20 6e 65 69 74 68 65  rule.  If neithe
8220: 72 20 6f 72 20 62 6f 74 68 0a 2a 2a 20 20 20 61  r or both.**   a
8230: 63 74 69 6f 6e 73 20 61 72 65 20 61 73 73 6f 63  ctions are assoc
8240: 69 61 74 65 64 20 77 69 74 68 20 61 6e 20 65 72  iated with an er
8250: 72 6f 72 20 72 75 6c 65 2c 20 74 68 65 6e 20 74  ror rule, then t
8260: 72 79 20 74 6f 0a 2a 2a 20 20 20 75 73 65 20 70  ry to.**   use p
8270: 72 65 63 65 64 65 6e 63 65 20 74 6f 20 72 65 73  recedence to res
8280: 6f 6c 76 65 20 74 68 65 20 63 6f 6e 66 6c 69 63  olve the conflic
8290: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68  t..**.** If eith
82a0: 65 72 20 61 63 74 69 6f 6e 20 69 73 20 61 20 53  er action is a S
82b0: 48 49 46 54 2c 20 74 68 65 6e 20 69 74 20 6d 75  HIFT, then it mu
82c0: 73 74 20 62 65 20 61 70 78 2e 20 20 54 68 69 73  st be apx.  This
82d0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 6e  .** function won
82e0: 27 74 20 77 6f 72 6b 20 69 66 20 61 70 78 2d 3e  't work if apx->
82f0: 74 79 70 65 3d 3d 52 45 44 55 43 45 20 61 6e 64  type==REDUCE and
8300: 20 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46   apy->type==SHIF
8310: 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
8320: 20 72 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63   resolve_conflic
8330: 74 28 61 70 78 2c 61 70 79 2c 65 72 72 73 79 6d  t(apx,apy,errsym
8340: 29 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  ).struct action 
8350: 2a 61 70 78 3b 0a 73 74 72 75 63 74 20 61 63 74  *apx;.struct act
8360: 69 6f 6e 20 2a 61 70 79 3b 0a 73 74 72 75 63 74  ion *apy;.struct
8370: 20 73 79 6d 62 6f 6c 20 2a 65 72 72 73 79 6d 3b   symbol *errsym;
8380: 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20     /* The error 
8390: 73 79 6d 62 6f 6c 20 28 69 66 20 64 65 66 69 6e  symbol (if defin
83a0: 65 64 2e 20 20 4e 55 4c 4c 20 6f 74 68 65 72 77  ed.  NULL otherw
83b0: 69 73 65 29 20 2a 2f 0a 7b 0a 20 20 73 74 72 75  ise) */.{.  stru
83c0: 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 78 2c 20  ct symbol *spx, 
83d0: 2a 73 70 79 3b 0a 20 20 69 6e 74 20 65 72 72 63  *spy;.  int errc
83e0: 6e 74 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  nt = 0;.  assert
83f0: 28 20 61 70 78 2d 3e 73 70 3d 3d 61 70 79 2d 3e  ( apx->sp==apy->
8400: 73 70 20 29 3b 20 20 2f 2a 20 4f 74 68 65 72 77  sp );  /* Otherw
8410: 69 73 65 20 74 68 65 72 65 20 77 6f 75 6c 64 20  ise there would 
8420: 62 65 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 20 2a  be no conflict *
8430: 2f 0a 20 20 69 66 28 20 61 70 78 2d 3e 74 79 70  /.  if( apx->typ
8440: 65 3d 3d 53 48 49 46 54 20 26 26 20 61 70 79 2d  e==SHIFT && apy-
8450: 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b  >type==REDUCE ){
8460: 0a 20 20 20 20 73 70 78 20 3d 20 61 70 78 2d 3e  .    spx = apx->
8470: 73 70 3b 0a 20 20 20 20 73 70 79 20 3d 20 61 70  sp;.    spy = ap
8480: 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d  y->x.rp->precsym
8490: 3b 0a 20 20 20 20 69 66 28 20 73 70 79 3d 3d 30  ;.    if( spy==0
84a0: 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30 20   || spx->prec<0 
84b0: 7c 7c 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 29  || spy->prec<0 )
84c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 65  {.      /* Not e
84d0: 6e 6f 75 67 68 20 70 72 65 63 65 64 65 6e 63 65  nough precedence
84e0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f   information. */
84f0: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
8500: 20 3d 20 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20   = CONFLICT;.   
8510: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
8520: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e   }else if( spx->
8530: 70 72 65 63 3e 73 70 79 2d 3e 70 72 65 63 20 29  prec>spy->prec )
8540: 7b 20 20 20 20 2f 2a 20 4c 6f 77 65 72 20 70 72  {    /* Lower pr
8550: 65 63 65 64 65 6e 63 65 20 77 69 6e 73 20 2a 2f  ecedence wins */
8560: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
8570: 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a   = RD_RESOLVED;.
8580: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70      }else if( sp
8590: 78 2d 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72 65  x->prec<spy->pre
85a0: 63 20 29 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e  c ){.      apx->
85b0: 74 79 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56  type = SH_RESOLV
85c0: 45 44 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ED;.    }else if
85d0: 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79  ( spx->prec==spy
85e0: 2d 3e 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61  ->prec && spx->a
85f0: 73 73 6f 63 3d 3d 52 49 47 48 54 20 29 7b 20 2f  ssoc==RIGHT ){ /
8600: 2a 20 55 73 65 20 6f 70 65 72 61 74 6f 72 20 2a  * Use operator *
8610: 2f 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70  /.      apy->typ
8620: 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b  e = 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 20 20 2f 2a 20               /* 
8650: 61 73 73 6f 63 69 61 74 69 76 69 74 79 20 2a 2f  associativity */
8660: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
8670: 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70  px->prec==spy->p
8680: 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f  rec && spx->asso
8690: 63 3d 3d 4c 45 46 54 20 29 7b 20 20 2f 2a 20 74  c==LEFT ){  /* t
86a0: 6f 20 62 72 65 61 6b 20 74 69 65 20 2a 2f 0a 20  o break tie */. 
86b0: 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d       apx->type =
86c0: 20 53 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   SH_RESOLVED;.  
86d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
86e0: 73 73 65 72 74 28 20 73 70 78 2d 3e 70 72 65 63  ssert( spx->prec
86f0: 3d 3d 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73  ==spy->prec && s
8700: 70 78 2d 3e 61 73 73 6f 63 3d 3d 4e 4f 4e 45 20  px->assoc==NONE 
8710: 29 3b 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79  );.      apy->ty
8720: 70 65 20 3d 20 43 4f 4e 46 4c 49 43 54 3b 0a 20  pe = CONFLICT;. 
8730: 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20       errcnt++;. 
8740: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
8750: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55   apx->type==REDU
8760: 43 45 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d  CE && apy->type=
8770: 3d 52 45 44 55 43 45 20 29 7b 0a 20 20 20 20 73  =REDUCE ){.    s
8780: 70 78 20 3d 20 61 70 78 2d 3e 78 2e 72 70 2d 3e  px = apx->x.rp->
8790: 70 72 65 63 73 79 6d 3b 0a 20 20 20 20 73 70 79  precsym;.    spy
87a0: 20 3d 20 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72   = apy->x.rp->pr
87b0: 65 63 73 79 6d 3b 0a 20 20 20 20 69 66 28 20 73  ecsym;.    if( s
87c0: 70 78 3d 3d 30 20 7c 7c 20 73 70 79 3d 3d 30 20  px==0 || spy==0 
87d0: 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c  || spx->prec<0 |
87e0: 7c 0a 20 20 20 20 73 70 79 2d 3e 70 72 65 63 3c  |.    spy->prec<
87f0: 30 20 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3d 3d  0 || spx->prec==
8800: 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20  spy->prec ){.   
8810: 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 43     apy->type = C
8820: 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65  ONFLICT;.      e
8830: 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c  rrcnt++;.    }el
8840: 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63  se if( spx->prec
8850: 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20  >spy->prec ){.  
8860: 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20      apy->type = 
8870: 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20  RD_RESOLVED;.   
8880: 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e   }else if( spx->
8890: 70 72 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29  prec<spy->prec )
88a0: 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70  {.      apx->typ
88b0: 65 20 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b  e = RD_RESOLVED;
88c0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
88d0: 20 20 20 20 61 73 73 65 72 74 28 20 0a 20 20 20      assert( .   
88e0: 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48     apx->type==SH
88f0: 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20  _RESOLVED ||.   
8900: 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 44     apx->type==RD
8910: 5f 52 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20  _RESOLVED ||.   
8920: 20 20 20 61 70 78 2d 3e 74 79 70 65 3d 3d 43 4f     apx->type==CO
8930: 4e 46 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20  NFLICT ||.      
8940: 61 70 79 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45  apy->type==SH_RE
8950: 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20  SOLVED ||.      
8960: 61 70 79 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45  apy->type==RD_RE
8970: 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20  SOLVED ||.      
8980: 61 70 79 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46 4c  apy->type==CONFL
8990: 49 43 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 2f  ICT.    );.    /
89a0: 2a 20 54 68 65 20 52 45 44 55 43 45 2f 53 48 49  * The REDUCE/SHI
89b0: 46 54 20 63 61 73 65 20 63 61 6e 6e 6f 74 20 68  FT case cannot h
89c0: 61 70 70 65 6e 20 62 65 63 61 75 73 65 20 53 48  appen because SH
89d0: 49 46 54 73 20 63 6f 6d 65 20 62 65 66 6f 72 65  IFTs come before
89e0: 0a 20 20 20 20 2a 2a 20 52 45 44 55 43 45 73 20  .    ** REDUCEs 
89f0: 6f 6e 20 74 68 65 20 6c 69 73 74 2e 20 20 49 66  on the list.  If
8a00: 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20 70   we reach this p
8a10: 6f 69 6e 74 20 69 74 20 6d 75 73 74 20 62 65 20  oint it must be 
8a20: 62 65 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74  because.    ** t
8a30: 68 65 20 70 61 72 73 65 72 20 63 6f 6e 66 6c 69  he parser confli
8a40: 63 74 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  ct had already b
8a50: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f  een resolved. */
8a60: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72  .  }.  return er
8a70: 72 63 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  rcnt;.}./*******
8a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
8a90: 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 63 6f  rom the file "co
8aa0: 6e 66 69 67 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a  nfiglist.c" ****
8ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ac0: 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75  *****/./*.** Rou
8ad0: 74 69 6e 65 73 20 74 6f 20 70 72 6f 63 65 73 73  tines to process
8ae0: 69 6e 67 20 61 20 63 6f 6e 66 69 67 75 72 61 74  ing a configurat
8af0: 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 62 75 69  ion list and bui
8b00: 6c 64 69 6e 67 20 61 20 73 74 61 74 65 0a 2a 2a  lding a state.**
8b10: 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
8b20: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
8b30: 2a 2f 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63  */..static struc
8b40: 74 20 63 6f 6e 66 69 67 20 2a 66 72 65 65 6c 69  t config *freeli
8b50: 73 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  st = 0;      /* 
8b60: 4c 69 73 74 20 6f 66 20 66 72 65 65 20 63 6f 6e  List of free con
8b70: 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73  figurations */.s
8b80: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e  tatic struct con
8b90: 66 69 67 20 2a 63 75 72 72 65 6e 74 20 3d 20 30  fig *current = 0
8ba0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f  ;       /* Top o
8bb0: 66 20 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67  f list of config
8bc0: 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74  urations */.stat
8bd0: 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  ic struct config
8be0: 20 2a 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20   **currentend = 
8bf0: 30 3b 20 20 20 2f 2a 20 4c 61 73 74 20 6f 6e 20  0;   /* Last on 
8c00: 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 73 20  list of configs 
8c10: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
8c20: 20 63 6f 6e 66 69 67 20 2a 62 61 73 69 73 20 3d   config *basis =
8c30: 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
8c40: 6f 70 20 6f 66 20 6c 69 73 74 20 6f 66 20 62 61  op of list of ba
8c50: 73 69 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73  sis configs */.s
8c60: 74 61 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e  tatic struct con
8c70: 66 69 67 20 2a 2a 62 61 73 69 73 65 6e 64 20 3d  fig **basisend =
8c80: 20 30 3b 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f   0;     /* End o
8c90: 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69 73 20  f list of basis 
8ca0: 63 6f 6e 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52  configs */../* R
8cb0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
8cc0: 74 6f 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75  to a new configu
8cd0: 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54  ration */.PRIVAT
8ce0: 45 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  E struct config 
8cf0: 2a 6e 65 77 63 6f 6e 66 69 67 28 29 7b 0a 20 20  *newconfig(){.  
8d00: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
8d10: 65 77 3b 0a 20 20 69 66 28 20 66 72 65 65 6c 69  ew;.  if( freeli
8d20: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  st==0 ){.    int
8d30: 20 69 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20   i;.    int amt 
8d40: 3d 20 33 3b 0a 20 20 20 20 66 72 65 65 6c 69 73  = 3;.    freelis
8d50: 74 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66  t = (struct conf
8d60: 69 67 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a  ig *)malloc( siz
8d70: 65 6f 66 28 73 74 72 75 63 74 20 63 6f 6e 66 69  eof(struct confi
8d80: 67 29 2a 61 6d 74 20 29 3b 0a 20 20 20 20 69 66  g)*amt );.    if
8d90: 28 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b  ( freelist==0 ){
8da0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
8db0: 74 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f  tderr,"Unable to
8dc0: 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
8dd0: 20 66 6f 72 20 61 20 6e 65 77 20 63 6f 6e 66 69   for a new confi
8de0: 67 75 72 61 74 69 6f 6e 2e 22 29 3b 0a 20 20 20  guration.");.   
8df0: 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
8e00: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
8e10: 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65  <amt-1; i++) fre
8e20: 65 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20  elist[i].next = 
8e30: 26 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a  &freelist[i+1];.
8e40: 20 20 20 20 66 72 65 65 6c 69 73 74 5b 61 6d 74      freelist[amt
8e50: 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20  -1].next = 0;.  
8e60: 7d 0a 20 20 6e 65 77 20 3d 20 66 72 65 65 6c 69  }.  new = freeli
8e70: 73 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d  st;.  freelist =
8e80: 20 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b   freelist->next;
8e90: 0a 20 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d  .  return new;.}
8ea0: 0a 0a 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67 75  ../* The configu
8eb0: 72 61 74 69 6f 6e 20 22 6f 6c 64 22 20 69 73 20  ration "old" is 
8ec0: 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 64 20 2a  no longer used *
8ed0: 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64 20 64  /.PRIVATE void d
8ee0: 65 6c 65 74 65 63 6f 6e 66 69 67 28 6f 6c 64 29  eleteconfig(old)
8ef0: 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
8f00: 6f 6c 64 3b 0a 7b 0a 20 20 6f 6c 64 2d 3e 6e 65  old;.{.  old->ne
8f10: 78 74 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20  xt = freelist;. 
8f20: 20 66 72 65 65 6c 69 73 74 20 3d 20 6f 6c 64 3b   freelist = old;
8f30: 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  .}../* Initializ
8f40: 65 64 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  ed the configura
8f50: 74 69 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65  tion list builde
8f60: 72 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  r */.void Config
8f70: 6c 69 73 74 5f 69 6e 69 74 28 29 7b 0a 20 20 63  list_init(){.  c
8f80: 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75  urrent = 0;.  cu
8f90: 72 72 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72  rrentend = &curr
8fa0: 65 6e 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30  ent;.  basis = 0
8fb0: 3b 0a 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26  ;.  basisend = &
8fc0: 62 61 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74  basis;.  Configt
8fd0: 61 62 6c 65 5f 69 6e 69 74 28 29 3b 0a 20 20 72  able_init();.  r
8fe0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69  eturn;.}../* Ini
8ff0: 74 69 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e  tialized the con
9000: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
9010: 62 75 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20  builder */.void 
9020: 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74  Configlist_reset
9030: 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20  (){.  current = 
9040: 30 3b 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20  0;.  currentend 
9050: 3d 20 26 63 75 72 72 65 6e 74 3b 0a 20 20 62 61  = &current;.  ba
9060: 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73  sis = 0;.  basis
9070: 65 6e 64 20 3d 20 26 62 61 73 69 73 3b 0a 20 20  end = &basis;.  
9080: 43 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61  Configtable_clea
9090: 72 28 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  r(0);.  return;.
90a0: 7d 0a 0a 2f 2a 20 41 64 64 20 61 6e 6f 74 68 65  }../* Add anothe
90b0: 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  r configuration 
90c0: 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  to the configura
90d0: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72  tion list */.str
90e0: 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
90f0: 69 67 6c 69 73 74 5f 61 64 64 28 72 70 2c 64 6f  iglist_add(rp,do
9100: 74 29 0a 73 74 72 75 63 74 20 72 75 6c 65 20 2a  t).struct rule *
9110: 72 70 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 75  rp;    /* The ru
9120: 6c 65 20 2a 2f 0a 69 6e 74 20 64 6f 74 3b 20 20  le */.int dot;  
9130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
9140: 65 78 20 69 6e 74 6f 20 74 68 65 20 52 48 53 20  ex into the RHS 
9150: 6f 66 20 74 68 65 20 72 75 6c 65 20 77 68 65 72  of the rule wher
9160: 65 20 74 68 65 20 64 6f 74 20 67 6f 65 73 20 2a  e the dot goes *
9170: 2f 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  /.{.  struct con
9180: 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b  fig *cfp, model;
9190: 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 72  ..  assert( curr
91a0: 65 6e 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d  entend!=0 );.  m
91b0: 6f 64 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20  odel.rp = rp;.  
91c0: 6d 6f 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b  model.dot = dot;
91d0: 0a 20 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 74  .  cfp = Configt
91e0: 61 62 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c  able_find(&model
91f0: 29 3b 0a 20 20 69 66 28 20 63 66 70 3d 3d 30 20  );.  if( cfp==0 
9200: 29 7b 0a 20 20 20 20 63 66 70 20 3d 20 6e 65 77  ){.    cfp = new
9210: 63 6f 6e 66 69 67 28 29 3b 0a 20 20 20 20 63 66  config();.    cf
9220: 70 2d 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20 20  p->rp = rp;.    
9230: 63 66 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a  cfp->dot = dot;.
9240: 20 20 20 20 63 66 70 2d 3e 66 77 73 20 3d 20 53      cfp->fws = S
9250: 65 74 4e 65 77 28 29 3b 0a 20 20 20 20 63 66 70  etNew();.    cfp
9260: 2d 3e 73 74 70 20 3d 20 30 3b 0a 20 20 20 20 63  ->stp = 0;.    c
9270: 66 70 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e  fp->fplp = cfp->
9280: 62 70 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63 66  bplp = 0;.    cf
9290: 70 2d 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20  p->next = 0;.   
92a0: 20 63 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20   cfp->bp = 0;.  
92b0: 20 20 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20    *currentend = 
92c0: 63 66 70 3b 0a 20 20 20 20 63 75 72 72 65 6e 74  cfp;.    current
92d0: 65 6e 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74  end = &cfp->next
92e0: 3b 0a 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c  ;.    Configtabl
92f0: 65 5f 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20  e_insert(cfp);. 
9300: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b   }.  return cfp;
9310: 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 62 61 73  .}../* Add a bas
9320: 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  is configuration
9330: 20 74 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72   to the configur
9340: 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74  ation list */.st
9350: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e  ruct config *Con
9360: 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73  figlist_addbasis
9370: 28 72 70 2c 64 6f 74 29 0a 73 74 72 75 63 74 20  (rp,dot).struct 
9380: 72 75 6c 65 20 2a 72 70 3b 0a 69 6e 74 20 64 6f  rule *rp;.int do
9390: 74 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f  t;.{.  struct co
93a0: 6e 66 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c  nfig *cfp, model
93b0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 62 61 73  ;..  assert( bas
93c0: 69 73 65 6e 64 21 3d 30 20 29 3b 0a 20 20 61 73  isend!=0 );.  as
93d0: 73 65 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64  sert( currentend
93e0: 21 3d 30 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72  !=0 );.  model.r
93f0: 70 20 3d 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e  p = rp;.  model.
9400: 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70  dot = dot;.  cfp
9410: 20 3d 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66   = Configtable_f
9420: 69 6e 64 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69  ind(&model);.  i
9430: 66 28 20 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20  f( cfp==0 ){.   
9440: 20 63 66 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67   cfp = newconfig
9450: 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e 72 70 20  ();.    cfp->rp 
9460: 3d 20 72 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64  = rp;.    cfp->d
9470: 6f 74 20 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66  ot = dot;.    cf
9480: 70 2d 3e 66 77 73 20 3d 20 53 65 74 4e 65 77 28  p->fws = SetNew(
9490: 29 3b 0a 20 20 20 20 63 66 70 2d 3e 73 74 70 20  );.    cfp->stp 
94a0: 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70  = 0;.    cfp->fp
94b0: 6c 70 20 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d  lp = cfp->bplp =
94c0: 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78   0;.    cfp->nex
94d0: 74 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e  t = 0;.    cfp->
94e0: 62 70 20 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72  bp = 0;.    *cur
94f0: 72 65 6e 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20  rentend = cfp;. 
9500: 20 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20     currentend = 
9510: 26 63 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20  &cfp->next;.    
9520: 2a 62 61 73 69 73 65 6e 64 20 3d 20 63 66 70 3b  *basisend = cfp;
9530: 0a 20 20 20 20 62 61 73 69 73 65 6e 64 20 3d 20  .    basisend = 
9540: 26 63 66 70 2d 3e 62 70 3b 0a 20 20 20 20 43 6f  &cfp->bp;.    Co
9550: 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74  nfigtable_insert
9560: 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (cfp);.  }.  ret
9570: 75 72 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 43  urn cfp;.}../* C
9580: 6f 6d 70 75 74 65 20 74 68 65 20 63 6c 6f 73 75  ompute the closu
9590: 72 65 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67  re of the config
95a0: 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  uration list */.
95b0: 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f  void Configlist_
95c0: 63 6c 6f 73 75 72 65 28 6c 65 6d 70 29 0a 73 74  closure(lemp).st
95d0: 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
95e0: 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  ;.{.  struct con
95f0: 66 69 67 20 2a 63 66 70 2c 20 2a 6e 65 77 63 66  fig *cfp, *newcf
9600: 70 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  p;.  struct rule
9610: 20 2a 72 70 2c 20 2a 6e 65 77 72 70 3b 0a 20 20   *rp, *newrp;.  
9620: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73  struct symbol *s
9630: 70 2c 20 2a 78 73 70 3b 0a 20 20 69 6e 74 20 69  p, *xsp;.  int i
9640: 2c 20 64 6f 74 3b 0a 0a 20 20 61 73 73 65 72 74  , dot;..  assert
9650: 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20  ( currentend!=0 
9660: 29 3b 0a 20 20 66 6f 72 28 63 66 70 3d 63 75 72  );.  for(cfp=cur
9670: 72 65 6e 74 3b 20 63 66 70 3b 20 63 66 70 3d 63  rent; cfp; cfp=c
9680: 66 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 72  fp->next){.    r
9690: 70 20 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20 20  p = cfp->rp;.   
96a0: 20 64 6f 74 20 3d 20 63 66 70 2d 3e 64 6f 74 3b   dot = cfp->dot;
96b0: 0a 20 20 20 20 69 66 28 20 64 6f 74 3e 3d 72 70  .    if( dot>=rp
96c0: 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75  ->nrhs ) continu
96d0: 65 3b 0a 20 20 20 20 73 70 20 3d 20 72 70 2d 3e  e;.    sp = rp->
96e0: 72 68 73 5b 64 6f 74 5d 3b 0a 20 20 20 20 69 66  rhs[dot];.    if
96f0: 28 20 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54  ( sp->type==NONT
9700: 45 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20  ERMINAL ){.     
9710: 20 69 66 28 20 73 70 2d 3e 72 75 6c 65 3d 3d 30   if( sp->rule==0
9720: 20 26 26 20 73 70 21 3d 6c 65 6d 70 2d 3e 65 72   && sp!=lemp->er
9730: 72 73 79 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  rsym ){.        
9740: 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66  ErrorMsg(lemp->f
9750: 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 6c 69 6e 65  ilename,rp->line
9760: 2c 22 4e 6f 6e 74 65 72 6d 69 6e 61 6c 20 5c 22  ,"Nonterminal \"
9770: 25 73 5c 22 20 68 61 73 20 6e 6f 20 72 75 6c 65  %s\" has no rule
9780: 73 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 73  s.",.          s
9790: 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  p->name);.      
97a0: 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74    lemp->errorcnt
97b0: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
97c0: 20 20 66 6f 72 28 6e 65 77 72 70 3d 73 70 2d 3e    for(newrp=sp->
97d0: 72 75 6c 65 3b 20 6e 65 77 72 70 3b 20 6e 65 77  rule; newrp; new
97e0: 72 70 3d 6e 65 77 72 70 2d 3e 6e 65 78 74 6c 68  rp=newrp->nextlh
97f0: 73 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 63  s){.        newc
9800: 66 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f  fp = Configlist_
9810: 61 64 64 28 6e 65 77 72 70 2c 30 29 3b 0a 20 20  add(newrp,0);.  
9820: 20 20 20 20 20 20 66 6f 72 28 69 3d 64 6f 74 2b        for(i=dot+
9830: 31 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  1; i<rp->nrhs; i
9840: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78  ++){.          x
9850: 73 70 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b  sp = rp->rhs[i];
9860: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78  .          if( x
9870: 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  sp->type==TERMIN
9880: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
9890: 20 20 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d    SetAdd(newcfp-
98a0: 3e 66 77 73 2c 78 73 70 2d 3e 69 6e 64 65 78 29  >fws,xsp->index)
98b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
98c0: 65 61 6b 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a 20  eak;..  }else{. 
98d0: 20 20 20 20 20 20 20 20 20 20 20 53 65 74 55 6e             SetUn
98e0: 69 6f 6e 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c  ion(newcfp->fws,
98f0: 78 73 70 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a  xsp->firstset);.
9900: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
9910: 78 73 70 2d 3e 6c 61 6d 62 64 61 3d 3d 42 5f 46  xsp->lambda==B_F
9920: 41 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 09 20  ALSE ) break;.. 
9930: 20 7d 0a 09 7d 0a 20 20 20 20 20 20 20 20 69 66   }..}.        if
9940: 28 20 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20  ( i==rp->nrhs ) 
9950: 50 6c 69 6e 6b 5f 61 64 64 28 26 63 66 70 2d 3e  Plink_add(&cfp->
9960: 66 70 6c 70 2c 6e 65 77 63 66 70 29 3b 0a 20 20  fplp,newcfp);.  
9970: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9980: 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20    return;.}../* 
9990: 53 6f 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75  Sort the configu
99a0: 72 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76  ration list */.v
99b0: 6f 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73  oid Configlist_s
99c0: 6f 72 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74  ort(){.  current
99d0: 20 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69   = (struct confi
99e0: 67 20 2a 29 6d 73 6f 72 74 28 63 75 72 72 65 6e  g *)msort(curren
99f0: 74 2c 26 28 63 75 72 72 65 6e 74 2d 3e 6e 65 78  t,&(current->nex
9a00: 74 29 2c 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20  t),Configcmp);. 
9a10: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b   currentend = 0;
9a20: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
9a30: 20 53 6f 72 74 20 74 68 65 20 62 61 73 69 73 20   Sort the basis 
9a40: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69  configuration li
9a50: 73 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  st */.void Confi
9a60: 67 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28  glist_sortbasis(
9a70: 29 7b 0a 20 20 62 61 73 69 73 20 3d 20 28 73 74  ){.  basis = (st
9a80: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 29 6d 73  ruct config *)ms
9a90: 6f 72 74 28 63 75 72 72 65 6e 74 2c 26 28 63 75  ort(current,&(cu
9aa0: 72 72 65 6e 74 2d 3e 62 70 29 2c 43 6f 6e 66 69  rrent->bp),Confi
9ab0: 67 63 6d 70 29 3b 0a 20 20 62 61 73 69 73 65 6e  gcmp);.  basisen
9ac0: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b  d = 0;.  return;
9ad0: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
9ae0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
9af0: 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69  ead of the confi
9b00: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  guration list an
9b10: 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c  d.** reset the l
9b20: 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f  ist */.struct co
9b30: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
9b40: 5f 72 65 74 75 72 6e 28 29 7b 0a 20 20 73 74 72  _return(){.  str
9b50: 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b  uct config *old;
9b60: 0a 20 20 6f 6c 64 20 3d 20 63 75 72 72 65 6e 74  .  old = current
9b70: 3b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b  ;.  current = 0;
9b80: 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20  .  currentend = 
9b90: 30 3b 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b  0;.  return old;
9ba0: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20  .}../* Return a 
9bb0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
9bc0: 65 61 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69  ead of the confi
9bd0: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  guration list an
9be0: 64 0a 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c  d.** reset the l
9bf0: 69 73 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f  ist */.struct co
9c00: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
9c10: 5f 62 61 73 69 73 28 29 7b 0a 20 20 73 74 72 75  _basis(){.  stru
9c20: 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a  ct config *old;.
9c30: 20 20 6f 6c 64 20 3d 20 62 61 73 69 73 3b 0a 20    old = basis;. 
9c40: 20 62 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61   basis = 0;.  ba
9c50: 73 69 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65  sisend = 0;.  re
9c60: 74 75 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20  turn old;.}../* 
9c70: 46 72 65 65 20 61 6c 6c 20 65 6c 65 6d 65 6e 74  Free all element
9c80: 73 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63  s of the given c
9c90: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73  onfiguration lis
9ca0: 74 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  t */.void Config
9cb0: 6c 69 73 74 5f 65 61 74 28 63 66 70 29 0a 73 74  list_eat(cfp).st
9cc0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70  ruct config *cfp
9cd0: 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  ;.{.  struct con
9ce0: 66 69 67 20 2a 6e 65 78 74 63 66 70 3b 0a 20 20  fig *nextcfp;.  
9cf0: 66 6f 72 28 3b 20 63 66 70 3b 20 63 66 70 3d 6e  for(; cfp; cfp=n
9d00: 65 78 74 63 66 70 29 7b 0a 20 20 20 20 6e 65 78  extcfp){.    nex
9d10: 74 63 66 70 20 3d 20 63 66 70 2d 3e 6e 65 78 74  tcfp = cfp->next
9d20: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 66  ;.    assert( cf
9d30: 70 2d 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a 20 20  p->fplp==0 );.  
9d40: 20 20 61 73 73 65 72 74 28 20 63 66 70 2d 3e 62    assert( cfp->b
9d50: 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  plp==0 );.    if
9d60: 28 20 63 66 70 2d 3e 66 77 73 20 29 20 53 65 74  ( cfp->fws ) Set
9d70: 46 72 65 65 28 63 66 70 2d 3e 66 77 73 29 3b 0a  Free(cfp->fws);.
9d80: 20 20 20 20 64 65 6c 65 74 65 63 6f 6e 66 69 67      deleteconfig
9d90: 28 63 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  (cfp);.  }.  ret
9da0: 75 72 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  urn;.}./********
9db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
9dc0: 68 65 20 66 69 6c 65 20 22 65 72 72 6f 72 2e 63  he file "error.c
9dd0: 22 20 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 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20  ***/./*.** Code 
9e00: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 65 72 72  for printing err
9e10: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 0a  or message..*/..
9e20: 2f 2a 20 46 69 6e 64 20 61 20 67 6f 6f 64 20 70  /* Find a good p
9e30: 6c 61 63 65 20 74 6f 20 62 72 65 61 6b 20 22 6d  lace to break "m
9e40: 73 67 22 20 73 6f 20 74 68 61 74 20 69 74 73 20  sg" so that its 
9e50: 6c 65 6e 67 74 68 20 69 73 20 61 74 20 6c 65 61  length is at lea
9e60: 73 74 20 22 6d 69 6e 22 0a 2a 2a 20 62 75 74 20  st "min".** but 
9e70: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 22 6d 61  no more than "ma
9e80: 78 22 2e 20 20 4d 61 6b 65 20 74 68 65 20 70 6f  x".  Make the po
9e90: 69 6e 74 20 61 73 20 63 6c 6f 73 65 20 74 6f 20  int as close to 
9ea0: 6d 61 78 20 61 73 20 70 6f 73 73 69 62 6c 65 2e  max as possible.
9eb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
9ec0: 69 6e 64 62 72 65 61 6b 28 6d 73 67 2c 6d 69 6e  indbreak(msg,min
9ed0: 2c 6d 61 78 29 0a 63 68 61 72 20 2a 6d 73 67 3b  ,max).char *msg;
9ee0: 0a 69 6e 74 20 6d 69 6e 3b 0a 69 6e 74 20 6d 61  .int min;.int ma
9ef0: 78 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 73 70 6f  x;.{.  int i,spo
9f00: 74 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 66  t;.  char c;.  f
9f10: 6f 72 28 69 3d 73 70 6f 74 3d 6d 69 6e 3b 20 69  or(i=spot=min; i
9f20: 3c 3d 6d 61 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  <=max; i++){.   
9f30: 20 63 20 3d 20 6d 73 67 5b 69 5d 3b 0a 20 20 20   c = msg[i];.   
9f40: 20 69 66 28 20 63 3d 3d 27 5c 74 27 20 29 20 6d   if( c=='\t' ) m
9f50: 73 67 5b 69 5d 20 3d 20 27 20 27 3b 0a 20 20 20  sg[i] = ' ';.   
9f60: 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 20   if( c=='\n' ){ 
9f70: 6d 73 67 5b 69 5d 20 3d 20 27 20 27 3b 20 73 70  msg[i] = ' '; sp
9f80: 6f 74 20 3d 20 69 3b 20 62 72 65 61 6b 3b 20 7d  ot = i; break; }
9f90: 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b  .    if( c==0 ){
9fa0: 20 73 70 6f 74 20 3d 20 69 3b 20 62 72 65 61 6b   spot = i; break
9fb0: 3b 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27  ; }.    if( c=='
9fc0: 2d 27 20 26 26 20 69 3c 6d 61 78 2d 31 20 29 20  -' && i<max-1 ) 
9fd0: 73 70 6f 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20  spot = i+1;.    
9fe0: 69 66 28 20 63 3d 3d 27 20 27 20 29 20 73 70 6f  if( c==' ' ) spo
9ff0: 74 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74  t = i;.  }.  ret
a000: 75 72 6e 20 73 70 6f 74 3b 0a 7d 0a 0a 2f 2a 0a  urn spot;.}../*.
a010: 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 6d 65 73  ** The error mes
a020: 73 61 67 65 20 69 73 20 73 70 6c 69 74 20 61 63  sage is split ac
a030: 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 20 6c 69  ross multiple li
a040: 6e 65 73 20 69 66 20 6e 65 63 65 73 73 61 72 79  nes if necessary
a050: 2e 20 20 54 68 65 0a 2a 2a 20 73 70 6c 69 74 73  .  The.** splits
a060: 20 6f 63 63 75 72 20 61 74 20 61 20 73 70 61 63   occur at a spac
a070: 65 2c 20 69 66 20 74 68 65 72 65 20 69 73 20 61  e, if there is a
a080: 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
a090: 20 6e 65 61 72 20 74 68 65 20 65 6e 64 0a 2a 2a   near the end.**
a0a0: 20 6f 66 20 74 68 65 20 6c 69 6e 65 2e 0a 2a 2f   of the line..*/
a0b0: 0a 23 64 65 66 69 6e 65 20 45 52 52 4d 53 47 53  .#define ERRMSGS
a0c0: 49 5a 45 20 20 31 30 30 30 30 20 2f 2a 20 48 6f  IZE  10000 /* Ho
a0d0: 70 65 20 74 68 69 73 20 69 73 20 62 69 67 20 65  pe this is big e
a0e0: 6e 6f 75 67 68 2e 20 20 4e 6f 20 77 61 79 20 74  nough.  No way t
a0f0: 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 20 2a 2f  o error check */
a100: 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45 57 49 44  .#define LINEWID
a110: 54 48 20 20 20 20 20 20 37 39 20 2f 2a 20 4d 61  TH      79 /* Ma
a120: 78 20 77 69 64 74 68 20 6f 66 20 61 6e 79 20 6f  x width of any o
a130: 75 74 70 75 74 20 6c 69 6e 65 20 2a 2f 0a 23 64  utput line */.#d
a140: 65 66 69 6e 65 20 50 52 45 46 49 58 4c 49 4d 49  efine PREFIXLIMI
a150: 54 20 20 20 20 33 30 20 2f 2a 20 4d 61 78 20 77  T    30 /* Max w
a160: 69 64 74 68 20 6f 66 20 74 68 65 20 70 72 65 66  idth of the pref
a170: 69 78 20 6f 6e 20 65 61 63 68 20 6c 69 6e 65 20  ix on each line 
a180: 2a 2f 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67  */.void ErrorMsg
a190: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c  (const char *fil
a1a0: 65 6e 61 6d 65 2c 20 69 6e 74 20 6c 69 6e 65 6e  ename, int linen
a1b0: 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  o, const char *f
a1c0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63  ormat, ...){.  c
a1d0: 68 61 72 20 65 72 72 6d 73 67 5b 45 52 52 4d 53  har errmsg[ERRMS
a1e0: 47 53 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70  GSIZE];.  char p
a1f0: 72 65 66 69 78 5b 50 52 45 46 49 58 4c 49 4d 49  refix[PREFIXLIMI
a200: 54 2b 31 30 5d 3b 0a 20 20 69 6e 74 20 65 72 72  T+10];.  int err
a210: 6d 73 67 73 69 7a 65 3b 0a 20 20 69 6e 74 20 70  msgsize;.  int p
a220: 72 65 66 69 78 73 69 7a 65 3b 0a 20 20 69 6e 74  refixsize;.  int
a230: 20 61 76 61 69 6c 61 62 6c 65 77 69 64 74 68 3b   availablewidth;
a240: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
a250: 20 69 6e 74 20 65 6e 64 2c 20 72 65 73 74 61 72   int end, restar
a260: 74 2c 20 62 61 73 65 3b 0a 0a 20 20 76 61 5f 73  t, base;..  va_s
a270: 74 61 72 74 28 61 70 2c 20 66 6f 72 6d 61 74 29  tart(ap, format)
a280: 3b 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 61  ;.  /* Prepare a
a290: 20 70 72 65 66 69 78 20 74 6f 20 62 65 20 70 72   prefix to be pr
a2a0: 65 70 65 6e 64 65 64 20 74 6f 20 65 76 65 72 79  epended to every
a2b0: 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 2a 2f 0a   output line */.
a2c0: 20 20 69 66 28 20 6c 69 6e 65 6e 6f 3e 30 20 29    if( lineno>0 )
a2d0: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 70 72  {.    sprintf(pr
a2e0: 65 66 69 78 2c 22 25 2e 2a 73 3a 25 64 3a 20 22  efix,"%.*s:%d: "
a2f0: 2c 50 52 45 46 49 58 4c 49 4d 49 54 2d 31 30 2c  ,PREFIXLIMIT-10,
a300: 66 69 6c 65 6e 61 6d 65 2c 6c 69 6e 65 6e 6f 29  filename,lineno)
a310: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
a320: 70 72 69 6e 74 66 28 70 72 65 66 69 78 2c 22 25  printf(prefix,"%
a330: 2e 2a 73 3a 20 22 2c 50 52 45 46 49 58 4c 49 4d  .*s: ",PREFIXLIM
a340: 49 54 2d 31 30 2c 66 69 6c 65 6e 61 6d 65 29 3b  IT-10,filename);
a350: 0a 20 20 7d 0a 20 20 70 72 65 66 69 78 73 69 7a  .  }.  prefixsiz
a360: 65 20 3d 20 73 74 72 6c 65 6e 28 70 72 65 66 69  e = strlen(prefi
a370: 78 29 3b 0a 20 20 61 76 61 69 6c 61 62 6c 65 77  x);.  availablew
a380: 69 64 74 68 20 3d 20 4c 49 4e 45 57 49 44 54 48  idth = LINEWIDTH
a390: 20 2d 20 70 72 65 66 69 78 73 69 7a 65 3b 0a 0a   - prefixsize;..
a3a0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
a3b0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
a3c0: 2a 2f 0a 20 20 76 73 70 72 69 6e 74 66 28 65 72  */.  vsprintf(er
a3d0: 72 6d 73 67 2c 66 6f 72 6d 61 74 2c 61 70 29 3b  rmsg,format,ap);
a3e0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
a3f0: 20 65 72 72 6d 73 67 73 69 7a 65 20 3d 20 73 74   errmsgsize = st
a400: 72 6c 65 6e 28 65 72 72 6d 73 67 29 3b 0a 20 20  rlen(errmsg);.  
a410: 2f 2a 20 52 65 6d 6f 76 65 20 74 72 61 69 6c 69  /* Remove traili
a420: 6e 67 20 27 5c 6e 27 73 20 66 72 6f 6d 20 74 68  ng '\n's from th
a430: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
a440: 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 65 72 72   */.  while( err
a450: 6d 73 67 73 69 7a 65 3e 30 20 26 26 20 65 72 72  msgsize>0 && err
a460: 6d 73 67 5b 65 72 72 6d 73 67 73 69 7a 65 2d 31  msg[errmsgsize-1
a470: 5d 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  ]=='\n' ){.     
a480: 65 72 72 6d 73 67 5b 2d 2d 65 72 72 6d 73 67 73  errmsg[--errmsgs
a490: 69 7a 65 5d 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  ize] = 0;.  }.. 
a4a0: 20 2f 2a 20 50 72 69 6e 74 20 74 68 65 20 65 72   /* Print the er
a4b0: 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20  ror message */. 
a4c0: 20 62 61 73 65 20 3d 20 30 3b 0a 20 20 77 68 69   base = 0;.  whi
a4d0: 6c 65 28 20 65 72 72 6d 73 67 5b 62 61 73 65 5d  le( errmsg[base]
a4e0: 21 3d 30 20 29 7b 0a 20 20 20 20 65 6e 64 20 3d  !=0 ){.    end =
a4f0: 20 72 65 73 74 61 72 74 20 3d 20 66 69 6e 64 62   restart = findb
a500: 72 65 61 6b 28 26 65 72 72 6d 73 67 5b 62 61 73  reak(&errmsg[bas
a510: 65 5d 2c 30 2c 61 76 61 69 6c 61 62 6c 65 77 69  e],0,availablewi
a520: 64 74 68 29 3b 0a 20 20 20 20 72 65 73 74 61 72  dth);.    restar
a530: 74 20 2b 3d 20 62 61 73 65 3b 0a 20 20 20 20 77  t += base;.    w
a540: 68 69 6c 65 28 20 65 72 72 6d 73 67 5b 72 65 73  hile( errmsg[res
a550: 74 61 72 74 5d 3d 3d 27 20 27 20 29 20 72 65 73  tart]==' ' ) res
a560: 74 61 72 74 2b 2b 3b 0a 20 20 20 20 66 70 72 69  tart++;.    fpri
a570: 6e 74 66 28 73 74 64 6f 75 74 2c 22 25 73 25 2e  ntf(stdout,"%s%.
a580: 2a 73 5c 6e 22 2c 70 72 65 66 69 78 2c 65 6e 64  *s\n",prefix,end
a590: 2c 26 65 72 72 6d 73 67 5b 62 61 73 65 5d 29 3b  ,&errmsg[base]);
a5a0: 0a 20 20 20 20 62 61 73 65 20 3d 20 72 65 73 74  .    base = rest
a5b0: 61 72 74 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a  art;.  }.}./****
a5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
a5d0: 6d 20 74 68 65 20 66 69 6c 65 20 22 6d 61 69 6e  m the file "main
a5e0: 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
a5f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a600: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
a610: 4d 61 69 6e 20 70 72 6f 67 72 61 6d 20 66 69 6c  Main program fil
a620: 65 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20  e for the LEMON 
a630: 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
a640: 2e 0a 2a 2f 0a 0a 2f 2a 20 52 65 70 6f 72 74 20  ..*/../* Report 
a650: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
a660: 20 63 6f 6e 64 69 74 69 6f 6e 20 61 6e 64 20 61   condition and a
a670: 62 6f 72 74 2e 20 20 54 68 69 73 20 66 75 6e 63  bort.  This func
a680: 74 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20  tion.** is used 
a690: 6d 6f 73 74 6c 79 20 62 79 20 74 68 65 20 22 4d  mostly by the "M
a6a0: 65 6d 6f 72 79 43 68 65 63 6b 22 20 6d 61 63 72  emoryCheck" macr
a6b0: 6f 20 69 6e 20 73 74 72 75 63 74 2e 68 0a 2a 2f  o in struct.h.*/
a6c0: 0a 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72  .void memory_err
a6d0: 6f 72 28 29 7b 0a 20 20 66 70 72 69 6e 74 66 28  or(){.  fprintf(
a6e0: 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d  stderr,"Out of m
a6f0: 65 6d 6f 72 79 2e 20 20 41 62 6f 72 74 69 6e 67  emory.  Aborting
a700: 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 65 78 69 74 28  ...\n");.  exit(
a710: 31 29 3b 0a 7d 0a 0a 0a 2f 2a 20 54 68 65 20 6d  1);.}.../* The m
a720: 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 20 50 61  ain program.  Pa
a730: 72 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  rse the command 
a740: 6c 69 6e 65 20 61 6e 64 20 64 6f 20 69 74 2e 2e  line and do it..
a750: 2e 20 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28 61 72  . */.int main(ar
a760: 67 63 2c 61 72 67 76 29 0a 69 6e 74 20 61 72 67  gc,argv).int arg
a770: 63 3b 0a 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a  c;.char **argv;.
a780: 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 76  {.  static int v
a790: 65 72 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73 74  ersion = 0;.  st
a7a0: 61 74 69 63 20 69 6e 74 20 72 70 66 6c 61 67 20  atic int rpflag 
a7b0: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  = 0;.  static in
a7c0: 74 20 62 61 73 69 73 66 6c 61 67 20 3d 20 30 3b  t basisflag = 0;
a7d0: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6f  .  static int co
a7e0: 6d 70 72 65 73 73 20 3d 20 30 3b 0a 20 20 73 74  mpress = 0;.  st
a7f0: 61 74 69 63 20 69 6e 74 20 71 75 69 65 74 20 3d  atic int quiet =
a800: 20 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   0;.  static int
a810: 20 73 74 61 74 69 73 74 69 63 73 20 3d 20 30 3b   statistics = 0;
a820: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6d 68  .  static int mh
a830: 66 6c 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74  flag = 0;.  stat
a840: 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69  ic struct s_opti
a850: 6f 6e 73 20 6f 70 74 69 6f 6e 73 5b 5d 20 3d 20  ons options[] = 
a860: 7b 0a 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c  {.    {OPT_FLAG,
a870: 20 22 62 22 2c 20 28 63 68 61 72 2a 29 26 62 61   "b", (char*)&ba
a880: 73 69 73 66 6c 61 67 2c 20 22 50 72 69 6e 74 20  sisflag, "Print 
a890: 6f 6e 6c 79 20 74 68 65 20 62 61 73 69 73 20 69  only the basis i
a8a0: 6e 20 72 65 70 6f 72 74 2e 22 7d 2c 0a 20 20 20  n report."},.   
a8b0: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 63 22 2c   {OPT_FLAG, "c",
a8c0: 20 28 63 68 61 72 2a 29 26 63 6f 6d 70 72 65 73   (char*)&compres
a8d0: 73 2c 20 22 44 6f 6e 27 74 20 63 6f 6d 70 72 65  s, "Don't compre
a8e0: 73 73 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  ss the action ta
a8f0: 62 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ble."},.    {OPT
a900: 5f 46 4c 41 47 2c 20 22 67 22 2c 20 28 63 68 61  _FLAG, "g", (cha
a910: 72 2a 29 26 72 70 66 6c 61 67 2c 20 22 50 72 69  r*)&rpflag, "Pri
a920: 6e 74 20 67 72 61 6d 6d 61 72 20 77 69 74 68 6f  nt grammar witho
a930: 75 74 20 61 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20  ut actions."},. 
a940: 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 6d     {OPT_FLAG, "m
a950: 22 2c 20 28 63 68 61 72 2a 29 26 6d 68 66 6c 61  ", (char*)&mhfla
a960: 67 2c 20 22 4f 75 74 70 75 74 20 61 20 6d 61 6b  g, "Output a mak
a970: 65 68 65 61 64 65 72 73 20 63 6f 6d 70 61 74 69  eheaders compati
a980: 62 6c 65 20 66 69 6c 65 22 7d 2c 0a 20 20 20 20  ble file"},.    
a990: 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 71 22 2c 20  {OPT_FLAG, "q", 
a9a0: 28 63 68 61 72 2a 29 26 71 75 69 65 74 2c 20 22  (char*)&quiet, "
a9b0: 28 51 75 69 65 74 29 20 44 6f 6e 27 74 20 70 72  (Quiet) Don't pr
a9c0: 69 6e 74 20 74 68 65 20 72 65 70 6f 72 74 20 66  int the report f
a9d0: 69 6c 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54  ile."},.    {OPT
a9e0: 5f 46 4c 41 47 2c 20 22 73 22 2c 20 28 63 68 61  _FLAG, "s", (cha
a9f0: 72 2a 29 26 73 74 61 74 69 73 74 69 63 73 2c 20  r*)&statistics, 
aa00: 22 50 72 69 6e 74 20 70 61 72 73 65 72 20 73 74  "Print parser st
aa10: 61 74 73 20 74 6f 20 73 74 61 6e 64 61 72 64 20  ats to standard 
aa20: 6f 75 74 70 75 74 2e 22 7d 2c 0a 20 20 20 20 7b  output."},.    {
aa30: 4f 50 54 5f 46 4c 41 47 2c 20 22 78 22 2c 20 28  OPT_FLAG, "x", (
aa40: 63 68 61 72 2a 29 26 76 65 72 73 69 6f 6e 2c 20  char*)&version, 
aa50: 22 50 72 69 6e 74 20 74 68 65 20 76 65 72 73 69  "Print the versi
aa60: 6f 6e 20 6e 75 6d 62 65 72 2e 22 7d 2c 0a 20 20  on number."},.  
aa70: 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 30 2c 30 2c    {OPT_FLAG,0,0,
aa80: 30 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  0}.  };.  int i;
aa90: 0a 20 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  .  struct lemon 
aaa0: 6c 65 6d 3b 0a 0a 20 20 4f 70 74 49 6e 69 74 28  lem;..  OptInit(
aab0: 61 72 67 76 2c 6f 70 74 69 6f 6e 73 2c 73 74 64  argv,options,std
aac0: 65 72 72 29 3b 0a 20 20 69 66 28 20 76 65 72 73  err);.  if( vers
aad0: 69 6f 6e 20 29 7b 0a 20 20 20 20 20 70 72 69 6e  ion ){.     prin
aae0: 74 66 28 22 4c 65 6d 6f 6e 20 76 65 72 73 69 6f  tf("Lemon versio
aaf0: 6e 20 31 2e 30 5c 6e 22 29 3b 0a 20 20 20 20 20  n 1.0\n");.     
ab00: 65 78 69 74 28 30 29 3b 20 0a 20 20 7d 0a 20 20  exit(0); .  }.  
ab10: 69 66 28 20 4f 70 74 4e 41 72 67 73 28 29 21 3d  if( OptNArgs()!=
ab20: 31 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  1 ){.    fprintf
ab30: 28 73 74 64 65 72 72 2c 22 45 78 61 63 74 6c 79  (stderr,"Exactly
ab40: 20 6f 6e 65 20 66 69 6c 65 6e 61 6d 65 20 61 72   one filename ar
ab50: 67 75 6d 65 6e 74 20 69 73 20 72 65 71 75 69 72  gument is requir
ab60: 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  ed.\n");.    exi
ab70: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d 2e  t(1);.  }.  lem.
ab80: 65 72 72 6f 72 63 6e 74 20 3d 20 30 3b 0a 0a 20  errorcnt = 0;.. 
ab90: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
aba0: 68 65 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20  he machine */.  
abb0: 53 74 72 73 61 66 65 5f 69 6e 69 74 28 29 3b 0a  Strsafe_init();.
abc0: 20 20 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 29 3b    Symbol_init();
abd0: 0a 20 20 53 74 61 74 65 5f 69 6e 69 74 28 29 3b  .  State_init();
abe0: 0a 20 20 6c 65 6d 2e 61 72 67 76 30 20 3d 20 61  .  lem.argv0 = a
abf0: 72 67 76 5b 30 5d 3b 0a 20 20 6c 65 6d 2e 66 69  rgv[0];.  lem.fi
ac00: 6c 65 6e 61 6d 65 20 3d 20 4f 70 74 41 72 67 28  lename = OptArg(
ac10: 30 29 3b 0a 20 20 6c 65 6d 2e 62 61 73 69 73 66  0);.  lem.basisf
ac20: 6c 61 67 20 3d 20 62 61 73 69 73 66 6c 61 67 3b  lag = basisflag;
ac30: 0a 20 20 6c 65 6d 2e 68 61 73 5f 66 61 6c 6c 62  .  lem.has_fallb
ac40: 61 63 6b 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 6e  ack = 0;.  lem.n
ac50: 63 6f 6e 66 6c 69 63 74 20 3d 20 30 3b 0a 20 20  conflict = 0;.  
ac60: 6c 65 6d 2e 6e 61 6d 65 20 3d 20 6c 65 6d 2e 69  lem.name = lem.i
ac70: 6e 63 6c 75 64 65 20 3d 20 6c 65 6d 2e 61 72 67  nclude = lem.arg
ac80: 20 3d 20 6c 65 6d 2e 74 6f 6b 65 6e 74 79 70 65   = lem.tokentype
ac90: 20 3d 20 6c 65 6d 2e 73 74 61 72 74 20 3d 20 30   = lem.start = 0
aca0: 3b 0a 20 20 6c 65 6d 2e 76 61 72 74 79 70 65 20  ;.  lem.vartype 
acb0: 3d 20 30 3b 0a 20 20 6c 65 6d 2e 73 74 61 63 6b  = 0;.  lem.stack
acc0: 73 69 7a 65 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e  size = 0;.  lem.
acd0: 65 72 72 6f 72 20 3d 20 6c 65 6d 2e 6f 76 65 72  error = lem.over
ace0: 66 6c 6f 77 20 3d 20 6c 65 6d 2e 66 61 69 6c 75  flow = lem.failu
acf0: 72 65 20 3d 20 6c 65 6d 2e 61 63 63 65 70 74 20  re = lem.accept 
ad00: 3d 20 6c 65 6d 2e 74 6f 6b 65 6e 64 65 73 74 20  = lem.tokendest 
ad10: 3d 0a 20 20 20 20 20 6c 65 6d 2e 74 6f 6b 65 6e  =.     lem.token
ad20: 70 72 65 66 69 78 20 3d 20 6c 65 6d 2e 6f 75 74  prefix = lem.out
ad30: 6e 61 6d 65 20 3d 20 6c 65 6d 2e 65 78 74 72 61  name = lem.extra
ad40: 63 6f 64 65 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e  code = 0;.  lem.
ad50: 76 61 72 64 65 73 74 20 3d 20 30 3b 0a 20 20 6c  vardest = 0;.  l
ad60: 65 6d 2e 74 61 62 6c 65 73 69 7a 65 20 3d 20 30  em.tablesize = 0
ad70: 3b 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22  ;.  Symbol_new("
ad80: 24 22 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79  $");.  lem.errsy
ad90: 6d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22  m = Symbol_new("
ada0: 65 72 72 6f 72 22 29 3b 0a 0a 20 20 2f 2a 20 50  error");..  /* P
adb0: 61 72 73 65 20 74 68 65 20 69 6e 70 75 74 20 66  arse the input f
adc0: 69 6c 65 20 2a 2f 0a 20 20 50 61 72 73 65 28 26  ile */.  Parse(&
add0: 6c 65 6d 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e  lem);.  if( lem.
ade0: 65 72 72 6f 72 63 6e 74 20 29 20 65 78 69 74 28  errorcnt ) exit(
adf0: 6c 65 6d 2e 65 72 72 6f 72 63 6e 74 29 3b 0a 20  lem.errorcnt);. 
ae00: 20 69 66 28 20 6c 65 6d 2e 72 75 6c 65 3d 3d 30   if( lem.rule==0
ae10: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
ae20: 73 74 64 65 72 72 2c 22 45 6d 70 74 79 20 67 72  stderr,"Empty gr
ae30: 61 6d 6d 61 72 2e 5c 6e 22 29 3b 0a 20 20 20 20  ammar.\n");.    
ae40: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20  exit(1);.  }..  
ae50: 2f 2a 20 43 6f 75 6e 74 20 61 6e 64 20 69 6e 64  /* Count and ind
ae60: 65 78 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 6f  ex the symbols o
ae70: 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f  f the grammar */
ae80: 0a 20 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d  .  lem.nsymbol =
ae90: 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b   Symbol_count();
aea0: 0a 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b  .  Symbol_new("{
aeb0: 64 65 66 61 75 6c 74 7d 22 29 3b 0a 20 20 6c 65  default}");.  le
aec0: 6d 2e 73 79 6d 62 6f 6c 73 20 3d 20 53 79 6d 62  m.symbols = Symb
aed0: 6f 6c 5f 61 72 72 61 79 6f 66 28 29 3b 0a 20 20  ol_arrayof();.  
aee0: 71 73 6f 72 74 28 6c 65 6d 2e 73 79 6d 62 6f 6c  qsort(lem.symbol
aef0: 73 2c 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 2b 31 2c  s,lem.nsymbol+1,
af00: 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79  sizeof(struct sy
af10: 6d 62 6f 6c 2a 29 2c 0a 20 20 20 20 20 20 20 20  mbol*),.        
af20: 28 69 6e 74 28 2a 29 28 29 29 53 79 6d 62 6f 6c  (int(*)())Symbol
af30: 63 6d 70 70 29 3b 0a 20 20 66 6f 72 28 69 3d 30  cmpp);.  for(i=0
af40: 3b 20 69 3c 3d 6c 65 6d 2e 6e 73 79 6d 62 6f 6c  ; i<=lem.nsymbol
af50: 3b 20 69 2b 2b 29 20 6c 65 6d 2e 73 79 6d 62 6f  ; i++) lem.symbo
af60: 6c 73 5b 69 5d 2d 3e 69 6e 64 65 78 20 3d 20 69  ls[i]->index = i
af70: 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 73 75  ;.  for(i=1; isu
af80: 70 70 65 72 28 6c 65 6d 2e 73 79 6d 62 6f 6c 73  pper(lem.symbols
af90: 5b 69 5d 2d 3e 6e 61 6d 65 5b 30 5d 29 3b 20 69  [i]->name[0]); i
afa0: 2b 2b 29 3b 0a 20 20 6c 65 6d 2e 6e 74 65 72 6d  ++);.  lem.nterm
afb0: 69 6e 61 6c 20 3d 20 69 3b 0a 0a 20 20 2f 2a 20  inal = i;..  /* 
afc0: 47 65 6e 65 72 61 74 65 20 61 20 72 65 70 72 69  Generate a repri
afd0: 6e 74 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61  nt of the gramma
afe0: 72 2c 20 69 66 20 72 65 71 75 65 73 74 65 64 20  r, if requested 
aff0: 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  on the command l
b000: 69 6e 65 20 2a 2f 0a 20 20 69 66 28 20 72 70 66  ine */.  if( rpf
b010: 6c 61 67 20 29 7b 0a 20 20 20 20 52 65 70 72 69  lag ){.    Repri
b020: 6e 74 28 26 6c 65 6d 29 3b 0a 20 20 7d 65 6c 73  nt(&lem);.  }els
b030: 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  e{.    /* Initia
b040: 6c 69 7a 65 20 74 68 65 20 73 69 7a 65 20 66 6f  lize the size fo
b050: 72 20 61 6c 6c 20 66 6f 6c 6c 6f 77 20 61 6e 64  r all follow and
b060: 20 66 69 72 73 74 20 73 65 74 73 20 2a 2f 0a 20   first sets */. 
b070: 20 20 20 53 65 74 53 69 7a 65 28 6c 65 6d 2e 6e     SetSize(lem.n
b080: 74 65 72 6d 69 6e 61 6c 29 3b 0a 0a 20 20 20 20  terminal);..    
b090: 2f 2a 20 46 69 6e 64 20 74 68 65 20 70 72 65 63  /* Find the prec
b0a0: 65 64 65 6e 63 65 20 66 6f 72 20 65 76 65 72 79  edence for every
b0b0: 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65   production rule
b0c0: 20 28 74 68 61 74 20 68 61 73 20 6f 6e 65 29 20   (that has one) 
b0d0: 2a 2f 0a 20 20 20 20 46 69 6e 64 52 75 6c 65 50  */.    FindRuleP
b0e0: 72 65 63 65 64 65 6e 63 65 73 28 26 6c 65 6d 29  recedences(&lem)
b0f0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74  ;..    /* Comput
b100: 65 20 74 68 65 20 6c 61 6d 62 64 61 2d 6e 6f 6e  e the lambda-non
b110: 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64 20 74 68  terminals and th
b120: 65 20 66 69 72 73 74 2d 73 65 74 73 20 66 6f 72  e first-sets for
b130: 20 65 76 65 72 79 0a 20 20 20 20 2a 2a 20 6e 6f   every.    ** no
b140: 6e 74 65 72 6d 69 6e 61 6c 20 2a 2f 0a 20 20 20  nterminal */.   
b150: 20 46 69 6e 64 46 69 72 73 74 53 65 74 73 28 26   FindFirstSets(&
b160: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  lem);..    /* Co
b170: 6d 70 75 74 65 20 61 6c 6c 20 4c 52 28 30 29 20  mpute all LR(0) 
b180: 73 74 61 74 65 73 2e 20 20 41 6c 73 6f 20 72 65  states.  Also re
b190: 63 6f 72 64 20 66 6f 6c 6c 6f 77 2d 73 65 74 20  cord follow-set 
b1a0: 70 72 6f 70 61 67 61 74 69 6f 6e 0a 20 20 20 20  propagation.    
b1b0: 2a 2a 20 6c 69 6e 6b 73 20 73 6f 20 74 68 61 74  ** links so that
b1c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20   the follow-set 
b1d0: 63 61 6e 20 62 65 20 63 6f 6d 70 75 74 65 64 20  can be computed 
b1e0: 6c 61 74 65 72 20 2a 2f 0a 20 20 20 20 6c 65 6d  later */.    lem
b1f0: 2e 6e 73 74 61 74 65 20 3d 20 30 3b 0a 20 20 20  .nstate = 0;.   
b200: 20 46 69 6e 64 53 74 61 74 65 73 28 26 6c 65 6d   FindStates(&lem
b210: 29 3b 0a 20 20 20 20 6c 65 6d 2e 73 6f 72 74 65  );.    lem.sorte
b220: 64 20 3d 20 53 74 61 74 65 5f 61 72 72 61 79 6f  d = State_arrayo
b230: 66 28 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 69 65  f();..    /* Tie
b240: 20 75 70 20 6c 6f 6f 73 65 20 65 6e 64 73 20 6f   up loose ends o
b250: 6e 20 74 68 65 20 70 72 6f 70 61 67 61 74 69 6f  n the propagatio
b260: 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 20 20 46  n links */.    F
b270: 69 6e 64 4c 69 6e 6b 73 28 26 6c 65 6d 29 3b 0a  indLinks(&lem);.
b280: 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  .    /* Compute 
b290: 74 68 65 20 66 6f 6c 6c 6f 77 20 73 65 74 20 6f  the follow set o
b2a0: 66 20 65 76 65 72 79 20 72 65 64 75 63 69 62 6c  f every reducibl
b2b0: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
b2c0: 2a 2f 0a 20 20 20 20 46 69 6e 64 46 6f 6c 6c 6f  */.    FindFollo
b2d0: 77 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a 20 20  wSets(&lem);..  
b2e0: 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
b2f0: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a   action tables *
b300: 2f 0a 20 20 20 20 46 69 6e 64 41 63 74 69 6f 6e  /.    FindAction
b310: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
b320: 20 43 6f 6d 70 72 65 73 73 20 74 68 65 20 61 63   Compress the ac
b330: 74 69 6f 6e 20 74 61 62 6c 65 73 20 2a 2f 0a 20  tion tables */. 
b340: 20 20 20 69 66 28 20 63 6f 6d 70 72 65 73 73 3d     if( compress=
b350: 3d 30 20 29 20 43 6f 6d 70 72 65 73 73 54 61 62  =0 ) CompressTab
b360: 6c 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  les(&lem);..    
b370: 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 72 65  /* Generate a re
b380: 70 6f 72 74 20 6f 66 20 74 68 65 20 70 61 72 73  port of the pars
b390: 65 72 20 67 65 6e 65 72 61 74 65 64 2e 20 20 28  er generated.  (
b3a0: 74 68 65 20 22 79 2e 6f 75 74 70 75 74 22 20 66  the "y.output" f
b3b0: 69 6c 65 29 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile) */.    if( 
b3c0: 21 71 75 69 65 74 20 29 20 52 65 70 6f 72 74 4f  !quiet ) ReportO
b3d0: 75 74 70 75 74 28 26 6c 65 6d 29 3b 0a 0a 20 20  utput(&lem);..  
b3e0: 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68    /* Generate th
b3f0: 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f  e source code fo
b400: 72 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a  r the parser */.
b410: 20 20 20 20 52 65 70 6f 72 74 54 61 62 6c 65 28      ReportTable(
b420: 26 6c 65 6d 2c 20 6d 68 66 6c 61 67 29 3b 0a 0a  &lem, mhflag);..
b430: 20 20 20 20 2f 2a 20 50 72 6f 64 75 63 65 20 61      /* Produce a
b440: 20 68 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72   header file for
b450: 20 75 73 65 20 62 79 20 74 68 65 20 73 63 61 6e   use by the scan
b460: 6e 65 72 2e 20 20 28 54 68 69 73 20 73 74 65 70  ner.  (This step
b470: 20 69 73 0a 20 20 20 20 2a 2a 20 6f 6d 69 74 74   is.    ** omitt
b480: 65 64 20 69 66 20 74 68 65 20 22 2d 6d 22 20 6f  ed if the "-m" o
b490: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 62 65  ption is used be
b4a0: 63 61 75 73 65 20 6d 61 6b 65 68 65 61 64 65 72  cause makeheader
b4b0: 73 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 67 65  s will.    ** ge
b4c0: 6e 65 72 61 74 65 20 74 68 65 20 66 69 6c 65 20  nerate the file 
b4d0: 66 6f 72 20 75 73 2e 29 20 2a 2f 0a 20 20 20 20  for us.) */.    
b4e0: 69 66 28 20 21 6d 68 66 6c 61 67 20 29 20 52 65  if( !mhflag ) Re
b4f0: 70 6f 72 74 48 65 61 64 65 72 28 26 6c 65 6d 29  portHeader(&lem)
b500: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74  ;.  }.  if( stat
b510: 69 73 74 69 63 73 20 29 7b 0a 20 20 20 20 70 72  istics ){.    pr
b520: 69 6e 74 66 28 22 50 61 72 73 65 72 20 73 74 61  intf("Parser sta
b530: 74 69 73 74 69 63 73 3a 20 25 64 20 74 65 72 6d  tistics: %d term
b540: 69 6e 61 6c 73 2c 20 25 64 20 6e 6f 6e 74 65 72  inals, %d nonter
b550: 6d 69 6e 61 6c 73 2c 20 25 64 20 72 75 6c 65 73  minals, %d rules
b560: 5c 6e 22 2c 0a 20 20 20 20 20 20 6c 65 6d 2e 6e  \n",.      lem.n
b570: 74 65 72 6d 69 6e 61 6c 2c 20 6c 65 6d 2e 6e 73  terminal, lem.ns
b580: 79 6d 62 6f 6c 20 2d 20 6c 65 6d 2e 6e 74 65 72  ymbol - lem.nter
b590: 6d 69 6e 61 6c 2c 20 6c 65 6d 2e 6e 72 75 6c 65  minal, lem.nrule
b5a0: 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20  );.    printf(" 
b5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5c0: 20 20 25 64 20 73 74 61 74 65 73 2c 20 25 64 20    %d states, %d 
b5d0: 70 61 72 73 65 72 20 74 61 62 6c 65 20 65 6e 74  parser table ent
b5e0: 72 69 65 73 2c 20 25 64 20 63 6f 6e 66 6c 69 63  ries, %d conflic
b5f0: 74 73 5c 6e 22 2c 0a 20 20 20 20 20 20 6c 65 6d  ts\n",.      lem
b600: 2e 6e 73 74 61 74 65 2c 20 6c 65 6d 2e 74 61 62  .nstate, lem.tab
b610: 6c 65 73 69 7a 65 2c 20 6c 65 6d 2e 6e 63 6f 6e  lesize, lem.ncon
b620: 66 6c 69 63 74 29 3b 0a 20 20 7d 0a 20 20 69 66  flict);.  }.  if
b630: 28 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 20  ( lem.nconflict 
b640: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
b650: 74 64 65 72 72 2c 22 25 64 20 70 61 72 73 69 6e  tderr,"%d parsin
b660: 67 20 63 6f 6e 66 6c 69 63 74 73 2e 5c 6e 22 2c  g conflicts.\n",
b670: 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b 0a  lem.nconflict);.
b680: 20 20 7d 0a 20 20 65 78 69 74 28 6c 65 6d 2e 65    }.  exit(lem.e
b690: 72 72 6f 72 63 6e 74 20 2b 20 6c 65 6d 2e 6e 63  rrorcnt + lem.nc
b6a0: 6f 6e 66 6c 69 63 74 29 3b 0a 7d 0a 2f 2a 2a 2a  onflict);.}./***
b6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b6c0: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
b6d0: 22 6d 73 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  "msort.c" ******
b6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
b700: 20 41 20 67 65 6e 65 72 69 63 20 6d 65 72 67 65   A generic merge
b710: 2d 73 6f 72 74 20 70 72 6f 67 72 61 6d 2e 0a 2a  -sort program..*
b720: 2a 0a 2a 2a 20 55 53 41 47 45 3a 0a 2a 2a 20 4c  *.** USAGE:.** L
b730: 65 74 20 22 70 74 72 22 20 62 65 20 61 20 70 6f  et "ptr" be a po
b740: 69 6e 74 65 72 20 74 6f 20 73 6f 6d 65 20 73 74  inter to some st
b750: 72 75 63 74 75 72 65 20 77 68 69 63 68 20 69 73  ructure which is
b760: 20 61 74 20 74 68 65 20 68 65 61 64 20 6f 66 0a   at the head of.
b770: 2a 2a 20 61 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e  ** a null-termin
b780: 61 74 65 64 20 6c 69 73 74 2e 20 20 54 68 65 6e  ated list.  Then
b790: 20 74 6f 20 73 6f 72 74 20 74 68 65 20 6c 69 73   to sort the lis
b7a0: 74 20 63 61 6c 6c 3a 0a 2a 2a 0a 2a 2a 20 20 20  t call:.**.**   
b7b0: 20 20 70 74 72 20 3d 20 6d 73 6f 72 74 28 70 74    ptr = msort(pt
b7c0: 72 2c 26 28 70 74 72 2d 3e 6e 65 78 74 29 2c 63  r,&(ptr->next),c
b7d0: 6d 70 66 6e 63 29 3b 0a 2a 2a 0a 2a 2a 20 49 6e  mpfnc);.**.** In
b7e0: 20 74 68 65 20 61 62 6f 76 65 2c 20 22 63 6d 70   the above, "cmp
b7f0: 66 6e 63 22 20 69 73 20 61 20 70 6f 69 6e 74 65  fnc" is a pointe
b800: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
b810: 77 68 69 63 68 20 63 6f 6d 70 61 72 65 73 0a 2a  which compares.*
b820: 2a 20 74 77 6f 20 69 6e 73 74 61 6e 63 65 73 20  * two instances 
b830: 6f 66 20 74 68 65 20 73 74 72 75 63 74 75 72 65  of the structure
b840: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 6e 20   and returns an 
b850: 69 6e 74 65 67 65 72 2c 20 61 73 20 69 6e 0a 2a  integer, as in.*
b860: 2a 20 73 74 72 63 6d 70 2e 20 20 54 68 65 20 73  * strcmp.  The s
b870: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
b880: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
b890: 68 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  he pointer to th
b8a0: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 65 6c 65 6d  e.** second elem
b8b0: 65 6e 74 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65  ent of the linke
b8c0: 64 20 6c 69 73 74 2e 20 20 54 68 69 73 20 61 64  d list.  This ad
b8d0: 64 72 65 73 73 20 69 73 20 75 73 65 64 20 74 6f  dress is used to
b8e0: 20 63 6f 6d 70 75 74 65 0a 2a 2a 20 74 68 65 20   compute.** the 
b8f0: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 22 6e  offset to the "n
b900: 65 78 74 22 20 66 69 65 6c 64 20 77 69 74 68 69  ext" field withi
b910: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 2e  n the structure.
b920: 20 20 54 68 65 20 6f 66 66 73 65 74 20 74 6f 0a    The offset to.
b930: 2a 2a 20 74 68 65 20 22 6e 65 78 74 22 20 66 69  ** the "next" fi
b940: 65 6c 64 20 6d 75 73 74 20 62 65 20 63 6f 6e 73  eld must be cons
b950: 74 61 6e 74 20 66 6f 72 20 61 6c 6c 20 73 74 72  tant for all str
b960: 75 63 74 75 72 65 73 20 69 6e 20 74 68 65 20 6c  uctures in the l
b970: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ist..**.** The f
b980: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
b990: 61 20 6e 65 77 20 70 6f 69 6e 74 65 72 20 77 68  a new pointer wh
b9a0: 69 63 68 20 69 73 20 74 68 65 20 68 65 61 64 20  ich is the head 
b9b0: 6f 66 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 61  of the list.** a
b9c0: 66 74 65 72 20 73 6f 72 74 69 6e 67 2e 0a 2a 2a  fter sorting..**
b9d0: 0a 2a 2a 20 41 4c 47 4f 52 49 54 48 4d 3a 0a 2a  .** ALGORITHM:.*
b9e0: 2a 20 4d 65 72 67 65 2d 73 6f 72 74 2e 0a 2a 2f  * Merge-sort..*/
b9f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
ba00: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
ba10: 6e 65 78 74 20 73 74 72 75 63 74 75 72 65 20 69  next structure i
ba20: 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  n the linked lis
ba30: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 45  t..*/.#define NE
ba40: 58 54 28 41 29 20 28 2a 28 63 68 61 72 2a 2a 29  XT(A) (*(char**)
ba50: 28 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  (((unsigned long
ba60: 29 41 29 2b 6f 66 66 73 65 74 29 29 0a 0a 2f 2a  )A)+offset))../*
ba70: 0a 2a 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20  .** Inputs:.**  
ba80: 20 61 3a 20 20 20 20 20 20 20 41 20 73 6f 72 74   a:       A sort
ba90: 65 64 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61  ed, null-termina
baa0: 74 65 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  ted linked list.
bab0: 20 20 28 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e    (May be null).
bac0: 0a 2a 2a 20 20 20 62 3a 20 20 20 20 20 20 20 41  .**   b:       A
bad0: 20 73 6f 72 74 65 64 2c 20 6e 75 6c 6c 2d 74 65   sorted, null-te
bae0: 72 6d 69 6e 61 74 65 64 20 6c 69 6e 6b 65 64 20  rminated linked 
baf0: 6c 69 73 74 2e 20 20 28 4d 61 79 20 62 65 20 6e  list.  (May be n
bb00: 75 6c 6c 29 2e 0a 2a 2a 20 20 20 63 6d 70 3a 20  ull)..**   cmp: 
bb10: 20 20 20 20 41 20 70 6f 69 6e 74 65 72 20 74 6f      A pointer to
bb20: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
bb30: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 20 20 6f  function..**   o
bb40: 66 66 73 65 74 3a 20 20 4f 66 66 73 65 74 20 69  ffset:  Offset i
bb50: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
bb60: 74 6f 20 74 68 65 20 22 6e 65 78 74 22 20 66 69  to the "next" fi
bb70: 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eld..**.** Retur
bb80: 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41 20  n Value:.**   A 
bb90: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
bba0: 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65 64 20  ead of a sorted 
bbb0: 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  list containing 
bbc0: 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20  the elements.** 
bbd0: 20 20 6f 66 20 62 6f 74 68 20 61 20 61 6e 64 20    of both a and 
bbe0: 62 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65 20 65 66  b..**.** Side ef
bbf0: 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54 68 65 20  fects:.**   The 
bc00: 22 6e 65 78 74 22 20 70 6f 69 6e 74 65 72 73 20  "next" pointers 
bc10: 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  for elements in 
bc20: 74 68 65 20 6c 69 73 74 73 20 61 20 61 6e 64 20  the lists a and 
bc30: 62 20 61 72 65 0a 2a 2a 20 20 20 63 68 61 6e 67  b are.**   chang
bc40: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ed..*/.static ch
bc50: 61 72 20 2a 6d 65 72 67 65 28 61 2c 62 2c 63 6d  ar *merge(a,b,cm
bc60: 70 2c 6f 66 66 73 65 74 29 0a 63 68 61 72 20 2a  p,offset).char *
bc70: 61 3b 0a 63 68 61 72 20 2a 62 3b 0a 69 6e 74 20  a;.char *b;.int 
bc80: 28 2a 63 6d 70 29 28 29 3b 0a 69 6e 74 20 6f 66  (*cmp)();.int of
bc90: 66 73 65 74 3b 0a 7b 0a 20 20 63 68 61 72 20 2a  fset;.{.  char *
bca0: 70 74 72 2c 20 2a 68 65 61 64 3b 0a 0a 20 20 69  ptr, *head;..  i
bcb0: 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20 68  f( a==0 ){.    h
bcc0: 65 61 64 20 3d 20 62 3b 0a 20 20 7d 65 6c 73 65  ead = b;.  }else
bcd0: 20 69 66 28 20 62 3d 3d 30 20 29 7b 0a 20 20 20   if( b==0 ){.   
bce0: 20 68 65 61 64 20 3d 20 61 3b 0a 20 20 7d 65 6c   head = a;.  }el
bcf0: 73 65 7b 0a 20 20 20 20 69 66 28 20 28 2a 63 6d  se{.    if( (*cm
bd00: 70 29 28 61 2c 62 29 3c 30 20 29 7b 0a 20 20 20  p)(a,b)<0 ){.   
bd10: 20 20 20 70 74 72 20 3d 20 61 3b 0a 20 20 20 20     ptr = a;.    
bd20: 20 20 61 20 3d 20 4e 45 58 54 28 61 29 3b 0a 20    a = NEXT(a);. 
bd30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bd40: 70 74 72 20 3d 20 62 3b 0a 20 20 20 20 20 20 62  ptr = b;.      b
bd50: 20 3d 20 4e 45 58 54 28 62 29 3b 0a 20 20 20 20   = NEXT(b);.    
bd60: 7d 0a 20 20 20 20 68 65 61 64 20 3d 20 70 74 72  }.    head = ptr
bd70: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 61 20 26  ;.    while( a &
bd80: 26 20 62 20 29 7b 0a 20 20 20 20 20 20 69 66 28  & b ){.      if(
bd90: 20 28 2a 63 6d 70 29 28 61 2c 62 29 3c 30 20 29   (*cmp)(a,b)<0 )
bda0: 7b 0a 20 20 20 20 20 20 20 20 4e 45 58 54 28 70  {.        NEXT(p
bdb0: 74 72 29 20 3d 20 61 3b 0a 20 20 20 20 20 20 20  tr) = a;.       
bdc0: 20 70 74 72 20 3d 20 61 3b 0a 20 20 20 20 20 20   ptr = a;.      
bdd0: 20 20 61 20 3d 20 4e 45 58 54 28 61 29 3b 0a 20    a = NEXT(a);. 
bde0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
bdf0: 20 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20      NEXT(ptr) = 
be00: 62 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d  b;.        ptr =
be10: 20 62 3b 0a 20 20 20 20 20 20 20 20 62 20 3d 20   b;.        b = 
be20: 4e 45 58 54 28 62 29 3b 0a 20 20 20 20 20 20 7d  NEXT(b);.      }
be30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 61  .    }.    if( a
be40: 20 29 20 4e 45 58 54 28 70 74 72 29 20 3d 20 61   ) NEXT(ptr) = a
be50: 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20 4e 45  ;.    else    NE
be60: 58 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 7d  XT(ptr) = b;.  }
be70: 0a 20 20 72 65 74 75 72 6e 20 68 65 61 64 3b 0a  .  return head;.
be80: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 73 3a  }../*.** Inputs:
be90: 0a 2a 2a 20 20 20 6c 69 73 74 3a 20 20 20 20 20  .**   list:     
bea0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 69   Pointer to a si
beb0: 6e 67 6c 79 2d 6c 69 6e 6b 65 64 20 6c 69 73 74  ngly-linked list
bec0: 20 6f 66 20 73 74 72 75 63 74 75 72 65 73 2e 0a   of structures..
bed0: 2a 2a 20 20 20 6e 65 78 74 3a 20 20 20 20 20 20  **   next:      
bee0: 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74  Pointer to point
bef0: 65 72 20 74 6f 20 74 68 65 20 73 65 63 6f 6e 64  er to the second
bf00: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
bf10: 6c 69 73 74 2e 0a 2a 2a 20 20 20 63 6d 70 3a 20  list..**   cmp: 
bf20: 20 20 20 20 20 20 41 20 63 6f 6d 70 61 72 69 73        A comparis
bf30: 6f 6e 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  on function..**.
bf40: 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65 3a  ** Return Value:
bf50: 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72 20  .**   A pointer 
bf60: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 61  to the head of a
bf70: 20 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f 6e   sorted list con
bf80: 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65 6d  taining the elem
bf90: 65 6e 74 73 0a 2a 2a 20 20 20 6f 72 67 69 6e 61  ents.**   orgina
bfa0: 6c 6c 79 20 69 6e 20 6c 69 73 74 2e 0a 2a 2a 0a  lly in list..**.
bfb0: 2a 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a  ** Side effects:
bfc0: 0a 2a 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22  .**   The "next"
bfd0: 20 70 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c   pointers for el
bfe0: 65 6d 65 6e 74 73 20 69 6e 20 6c 69 73 74 20 61  ements in list a
bff0: 72 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 23  re changed..*/.#
c000: 64 65 66 69 6e 65 20 4c 49 53 54 53 49 5a 45 20  define LISTSIZE 
c010: 33 30 0a 63 68 61 72 20 2a 6d 73 6f 72 74 28 6c  30.char *msort(l
c020: 69 73 74 2c 6e 65 78 74 2c 63 6d 70 29 0a 63 68  ist,next,cmp).ch
c030: 61 72 20 2a 6c 69 73 74 3b 0a 63 68 61 72 20 2a  ar *list;.char *
c040: 2a 6e 65 78 74 3b 0a 69 6e 74 20 28 2a 63 6d 70  *next;.int (*cmp
c050: 29 28 29 3b 0a 7b 0a 20 20 75 6e 73 69 67 6e 65  )();.{.  unsigne
c060: 64 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 0a 20  d long offset;. 
c070: 20 63 68 61 72 20 2a 65 70 3b 0a 20 20 63 68 61   char *ep;.  cha
c080: 72 20 2a 73 65 74 5b 4c 49 53 54 53 49 5a 45 5d  r *set[LISTSIZE]
c090: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6f 66 66  ;.  int i;.  off
c0a0: 73 65 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  set = (unsigned 
c0b0: 6c 6f 6e 67 29 6e 65 78 74 20 2d 20 28 75 6e 73  long)next - (uns
c0c0: 69 67 6e 65 64 20 6c 6f 6e 67 29 6c 69 73 74 3b  igned long)list;
c0d0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49  .  for(i=0; i<LI
c0e0: 53 54 53 49 5a 45 3b 20 69 2b 2b 29 20 73 65 74  STSIZE; i++) set
c0f0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  [i] = 0;.  while
c100: 28 20 6c 69 73 74 20 29 7b 0a 20 20 20 20 65 70  ( list ){.    ep
c110: 20 3d 20 6c 69 73 74 3b 0a 20 20 20 20 6c 69 73   = list;.    lis
c120: 74 20 3d 20 4e 45 58 54 28 6c 69 73 74 29 3b 0a  t = NEXT(list);.
c130: 20 20 20 20 4e 45 58 54 28 65 70 29 20 3d 20 30      NEXT(ep) = 0
c140: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
c150: 3c 4c 49 53 54 53 49 5a 45 2d 31 20 26 26 20 73  <LISTSIZE-1 && s
c160: 65 74 5b 69 5d 21 3d 30 3b 20 69 2b 2b 29 7b 0a  et[i]!=0; i++){.
c170: 20 20 20 20 20 20 65 70 20 3d 20 6d 65 72 67 65        ep = merge
c180: 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70 2c 6f  (ep,set[i],cmp,o
c190: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 73 65  ffset);.      se
c1a0: 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  t[i] = 0;.    }.
c1b0: 20 20 20 20 73 65 74 5b 69 5d 20 3d 20 65 70 3b      set[i] = ep;
c1c0: 0a 20 20 7d 0a 20 20 65 70 20 3d 20 30 3b 0a 20  .  }.  ep = 0;. 
c1d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54   for(i=0; i<LIST
c1e0: 53 49 5a 45 3b 20 69 2b 2b 29 20 69 66 28 20 73  SIZE; i++) if( s
c1f0: 65 74 5b 69 5d 20 29 20 65 70 20 3d 20 6d 65 72  et[i] ) ep = mer
c200: 67 65 28 65 70 2c 73 65 74 5b 69 5d 2c 63 6d 70  ge(ep,set[i],cmp
c210: 2c 6f 66 66 73 65 74 29 3b 0a 20 20 72 65 74 75  ,offset);.  retu
c220: 72 6e 20 65 70 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  rn ep;.}./******
c230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c240: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
c250: 20 22 6f 70 74 69 6f 6e 2e 63 22 20 2a 2a 2a 2a   "option.c" ****
c260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c270: 2a 2a 2a 2a 2a 2a 2f 0a 73 74 61 74 69 63 20 63  ******/.static c
c280: 68 61 72 20 2a 2a 61 72 67 76 3b 0a 73 74 61 74  har **argv;.stat
c290: 69 63 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69  ic struct s_opti
c2a0: 6f 6e 73 20 2a 6f 70 3b 0a 73 74 61 74 69 63 20  ons *op;.static 
c2b0: 46 49 4c 45 20 2a 65 72 72 73 74 72 65 61 6d 3b  FILE *errstream;
c2c0: 0a 0a 23 64 65 66 69 6e 65 20 49 53 4f 50 54 28  ..#define ISOPT(
c2d0: 58 29 20 28 28 58 29 5b 30 5d 3d 3d 27 2d 27 7c  X) ((X)[0]=='-'|
c2e0: 7c 28 58 29 5b 30 5d 3d 3d 27 2b 27 7c 7c 73 74  |(X)[0]=='+'||st
c2f0: 72 63 68 72 28 28 58 29 2c 27 3d 27 29 21 3d 30  rchr((X),'=')!=0
c300: 29 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  )../*.** Print t
c310: 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
c320: 77 69 74 68 20 61 20 63 61 72 72 6f 74 20 70 6f  with a carrot po
c330: 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 6b 2d  inting to the k-
c340: 74 68 20 63 68 61 72 61 63 74 65 72 0a 2a 2a 20  th character.** 
c350: 6f 66 20 74 68 65 20 6e 2d 74 68 20 66 69 65 6c  of the n-th fiel
c360: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
c370: 64 20 65 72 72 6c 69 6e 65 28 6e 2c 6b 2c 65 72  d errline(n,k,er
c380: 72 29 0a 69 6e 74 20 6e 3b 0a 69 6e 74 20 6b 3b  r).int n;.int k;
c390: 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20  .FILE *err;.{.  
c3a0: 69 6e 74 20 73 70 63 6e 74 2c 20 69 3b 0a 20 20  int spcnt, i;.  
c3b0: 73 70 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28  spcnt = 0;.  if(
c3c0: 20 61 72 67 76 5b 30 5d 20 29 20 66 70 72 69 6e   argv[0] ) fprin
c3d0: 74 66 28 65 72 72 2c 22 25 73 22 2c 61 72 67 76  tf(err,"%s",argv
c3e0: 5b 30 5d 29 3b 0a 20 20 73 70 63 6e 74 20 3d 20  [0]);.  spcnt = 
c3f0: 73 74 72 6c 65 6e 28 61 72 67 76 5b 30 5d 29 20  strlen(argv[0]) 
c400: 2b 20 31 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20  + 1;.  for(i=1; 
c410: 69 3c 6e 20 26 26 20 61 72 67 76 5b 69 5d 3b 20  i<n && argv[i]; 
c420: 69 2b 2b 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  i++){.    fprint
c430: 66 28 65 72 72 2c 22 20 25 73 22 2c 61 72 67 76  f(err," %s",argv
c440: 5b 69 5d 29 3b 0a 20 20 20 20 73 70 63 6e 74 20  [i]);.    spcnt 
c450: 2b 3d 20 73 74 72 6c 65 6e 28 61 72 67 76 5b 69  += strlen(argv[i
c460: 5d 2b 31 29 3b 0a 20 20 7d 0a 20 20 73 70 63 6e  ]+1);.  }.  spcn
c470: 74 20 2b 3d 20 6b 3b 0a 20 20 66 6f 72 28 3b 20  t += k;.  for(; 
c480: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 20 66 70  argv[i]; i++) fp
c490: 72 69 6e 74 66 28 65 72 72 2c 22 20 25 73 22 2c  rintf(err," %s",
c4a0: 61 72 67 76 5b 69 5d 29 3b 0a 20 20 69 66 28 20  argv[i]);.  if( 
c4b0: 73 70 63 6e 74 3c 32 30 20 29 7b 0a 20 20 20 20  spcnt<20 ){.    
c4c0: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25  fprintf(err,"\n%
c4d0: 2a 73 5e 2d 2d 20 68 65 72 65 5c 6e 22 2c 73 70  *s^-- here\n",sp
c4e0: 63 6e 74 2c 22 22 29 3b 0a 20 20 7d 65 6c 73 65  cnt,"");.  }else
c4f0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65 72  {.    fprintf(er
c500: 72 2c 22 5c 6e 25 2a 73 68 65 72 65 20 2d 2d 5e  r,"\n%*shere --^
c510: 5c 6e 22 2c 73 70 63 6e 74 2d 37 2c 22 22 29 3b  \n",spcnt-7,"");
c520: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
c530: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
c540: 66 20 74 68 65 20 4e 2d 74 68 20 6e 6f 6e 2d 73  f the N-th non-s
c550: 77 69 74 63 68 20 61 72 67 75 6d 65 6e 74 2e 20  witch argument. 
c560: 20 52 65 74 75 72 6e 20 2d 31 0a 2a 2a 20 69 66   Return -1.** if
c570: 20 4e 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e   N is out of ran
c580: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
c590: 74 20 61 72 67 69 6e 64 65 78 28 6e 29 0a 69 6e  t argindex(n).in
c5a0: 74 20 6e 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  t n;.{.  int i;.
c5b0: 20 20 69 6e 74 20 64 61 73 68 64 61 73 68 20 3d    int dashdash =
c5c0: 20 30 3b 0a 20 20 69 66 28 20 61 72 67 76 21 3d   0;.  if( argv!=
c5d0: 30 20 26 26 20 2a 61 72 67 76 21 3d 30 20 29 7b  0 && *argv!=0 ){
c5e0: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72  .    for(i=1; ar
c5f0: 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  gv[i]; i++){.   
c600: 20 20 20 69 66 28 20 64 61 73 68 64 61 73 68 20     if( dashdash 
c610: 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b 69  || !ISOPT(argv[i
c620: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]) ){.        if
c630: 28 20 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( n==0 ) return 
c640: 69 3b 0a 20 20 20 20 20 20 20 20 6e 2d 2d 3b 0a  i;.        n--;.
c650: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
c660: 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d  ( strcmp(argv[i]
c670: 2c 22 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73 68  ,"--")==0 ) dash
c680: 64 61 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  dash = 1;.    }.
c690: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 3b    }.  return -1;
c6a0: 0a 7d 0a 0a 73 74 61 74 69 63 20 63 68 61 72 20  .}..static char 
c6b0: 65 6d 73 67 5b 5d 20 3d 20 22 43 6f 6d 6d 61 6e  emsg[] = "Comman
c6c0: 64 20 6c 69 6e 65 20 73 79 6e 74 61 78 20 65 72  d line syntax er
c6d0: 72 6f 72 3a 20 22 3b 0a 0a 2f 2a 0a 2a 2a 20 50  ror: ";../*.** P
c6e0: 72 6f 63 65 73 73 20 61 20 66 6c 61 67 20 63 6f  rocess a flag co
c6f0: 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 72 67 75 6d  mmand line argum
c700: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
c710: 6e 74 20 68 61 6e 64 6c 65 66 6c 61 67 73 28 69  nt handleflags(i
c720: 2c 65 72 72 29 0a 69 6e 74 20 69 3b 0a 46 49 4c  ,err).int i;.FIL
c730: 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20  E *err;.{.  int 
c740: 76 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20  v;.  int errcnt 
c750: 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  = 0;.  int j;.  
c760: 66 6f 72 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c  for(j=0; op[j].l
c770: 61 62 65 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  abel; j++){.    
c780: 69 66 28 20 73 74 72 63 6d 70 28 26 61 72 67 76  if( strcmp(&argv
c790: 5b 69 5d 5b 31 5d 2c 6f 70 5b 6a 5d 2e 6c 61 62  [i][1],op[j].lab
c7a0: 65 6c 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  el)==0 ) break;.
c7b0: 20 20 7d 0a 20 20 76 20 3d 20 61 72 67 76 5b 69    }.  v = argv[i
c7c0: 5d 5b 30 5d 3d 3d 27 2d 27 20 3f 20 31 20 3a 20  ][0]=='-' ? 1 : 
c7d0: 30 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c  0;.  if( op[j].l
c7e0: 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  abel==0 ){.    i
c7f0: 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
c800: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 75  fprintf(err,"%su
c810: 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e  ndefined option.
c820: 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20  \n",emsg);.     
c830: 20 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72   errline(i,1,err
c840: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72  );.    }.    err
c850: 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69  cnt++;.  }else i
c860: 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f  f( op[j].type==O
c870: 50 54 5f 46 4c 41 47 20 29 7b 0a 20 20 20 20 2a  PT_FLAG ){.    *
c880: 28 28 69 6e 74 2a 29 6f 70 5b 6a 5d 2e 61 72 67  ((int*)op[j].arg
c890: 29 20 3d 20 76 3b 0a 20 20 7d 65 6c 73 65 20 69  ) = v;.  }else i
c8a0: 66 28 20 6f 70 5b 6a 5d 2e 74 79 70 65 3d 3d 4f  f( op[j].type==O
c8b0: 50 54 5f 46 46 4c 41 47 20 29 7b 0a 20 20 20 20  PT_FFLAG ){.    
c8c0: 28 2a 28 76 6f 69 64 28 2a 29 28 29 29 28 6f 70  (*(void(*)())(op
c8d0: 5b 6a 5d 2e 61 72 67 29 29 28 76 29 3b 0a 20 20  [j].arg))(v);.  
c8e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 65  }else{.    if( e
c8f0: 72 72 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69  rr ){.      fpri
c900: 6e 74 66 28 65 72 72 2c 22 25 73 6d 69 73 73 69  ntf(err,"%smissi
c910: 6e 67 20 61 72 67 75 6d 65 6e 74 20 6f 6e 20 73  ng argument on s
c920: 77 69 74 63 68 2e 5c 6e 22 2c 65 6d 73 67 29 3b  witch.\n",emsg);
c930: 0a 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69  .      errline(i
c940: 2c 31 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a 20  ,1,err);.    }. 
c950: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 7d     errcnt++;.  }
c960: 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74  .  return errcnt
c970: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65  ;.}../*.** Proce
c980: 73 73 20 61 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  ss a command lin
c990: 65 20 73 77 69 74 63 68 20 77 68 69 63 68 20 68  e switch which h
c9a0: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  as an argument..
c9b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
c9c0: 6e 64 6c 65 73 77 69 74 63 68 28 69 2c 65 72 72  ndleswitch(i,err
c9d0: 29 0a 69 6e 74 20 69 3b 0a 46 49 4c 45 20 2a 65  ).int i;.FILE *e
c9e0: 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 6c 76 20 3d  rr;.{.  int lv =
c9f0: 20 30 3b 0a 20 20 64 6f 75 62 6c 65 20 64 76 20   0;.  double dv 
ca00: 3d 20 30 2e 30 3b 0a 20 20 63 68 61 72 20 2a 73  = 0.0;.  char *s
ca10: 76 20 3d 20 30 2c 20 2a 65 6e 64 3b 0a 20 20 63  v = 0, *end;.  c
ca20: 68 61 72 20 2a 63 70 3b 0a 20 20 69 6e 74 20 6a  har *cp;.  int j
ca30: 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74 20 3d  ;.  int errcnt =
ca40: 20 30 3b 0a 20 20 63 70 20 3d 20 73 74 72 63 68   0;.  cp = strch
ca50: 72 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 3b 0a  r(argv[i],'=');.
ca60: 20 20 2a 63 70 20 3d 20 30 3b 0a 20 20 66 6f 72    *cp = 0;.  for
ca70: 28 6a 3d 30 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65  (j=0; op[j].labe
ca80: 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28  l; j++){.    if(
ca90: 20 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c   strcmp(argv[i],
caa0: 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d 3d 30 20  op[j].label)==0 
cab0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 2a  ) break;.  }.  *
cac0: 63 70 20 3d 20 27 3d 27 3b 0a 20 20 69 66 28 20  cp = '=';.  if( 
cad0: 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30 20 29  op[j].label==0 )
cae0: 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20 29 7b  {.    if( err ){
caf0: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65  .      fprintf(e
cb00: 72 72 2c 22 25 73 75 6e 64 65 66 69 6e 65 64 20  rr,"%sundefined 
cb10: 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73 67 29  option.\n",emsg)
cb20: 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28  ;.      errline(
cb30: 69 2c 30 2c 65 72 72 29 3b 0a 20 20 20 20 7d 0a  i,0,err);.    }.
cb40: 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20      errcnt++;.  
cb50: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 70 2b 2b 3b  }else{.    cp++;
cb60: 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b  .    switch( op[
cb70: 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20  j].type ){.     
cb80: 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a   case OPT_FLAG:.
cb90: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
cba0: 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 69 66  FLAG:.        if
cbb0: 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20  ( err ){.       
cbc0: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
cbd0: 25 73 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65  %soption require
cbe0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 5c 6e  s an argument.\n
cbf0: 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  ",emsg);.       
cc00: 20 20 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65     errline(i,0,e
cc10: 72 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rr);.        }. 
cc20: 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b         errcnt++;
cc30: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
cc40: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44        case OPT_D
cc50: 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  BL:.      case O
cc60: 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20  PT_FDBL:.       
cc70: 20 64 76 20 3d 20 73 74 72 74 6f 64 28 63 70 2c   dv = strtod(cp,
cc80: 26 65 6e 64 29 3b 0a 20 20 20 20 20 20 20 20 69  &end);.        i
cc90: 66 28 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20  f( *end ){.     
cca0: 20 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a       if( err ){.
ccb0: 20 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69              fpri
ccc0: 6e 74 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67  ntf(err,"%silleg
ccd0: 61 6c 20 63 68 61 72 61 63 74 65 72 20 69 6e 20  al character in 
cce0: 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 20 61  floating-point a
ccf0: 72 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67  rgument.\n",emsg
cd00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  );.            e
cd10: 72 72 6c 69 6e 65 28 69 2c 28 28 75 6e 73 69 67  rrline(i,((unsig
cd20: 6e 65 64 20 6c 6f 6e 67 29 65 6e 64 29 2d 28 75  ned long)end)-(u
cd30: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 61 72 67  nsigned long)arg
cd40: 76 5b 69 5d 2c 65 72 72 29 3b 0a 20 20 20 20 20  v[i],err);.     
cd50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
cd60: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20   errcnt++;.     
cd70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
cd80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ak;.      case O
cd90: 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63 61  PT_INT:.      ca
cda0: 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20  se OPT_FINT:.   
cdb0: 20 20 20 20 20 6c 76 20 3d 20 73 74 72 74 6f 6c       lv = strtol
cdc0: 28 63 70 2c 26 65 6e 64 2c 30 29 3b 0a 20 20 20  (cp,&end,0);.   
cdd0: 20 20 20 20 20 69 66 28 20 2a 65 6e 64 20 29 7b       if( *end ){
cde0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
cdf0: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rr ){.          
ce00: 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25    fprintf(err,"%
ce10: 73 69 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74  sillegal charact
ce20: 65 72 20 69 6e 20 69 6e 74 65 67 65 72 20 61 72  er in integer ar
ce30: 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29  gument.\n",emsg)
ce40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 72  ;.            er
ce50: 72 6c 69 6e 65 28 69 2c 28 28 75 6e 73 69 67 6e  rline(i,((unsign
ce60: 65 64 20 6c 6f 6e 67 29 65 6e 64 29 2d 28 75 6e  ed long)end)-(un
ce70: 73 69 67 6e 65 64 20 6c 6f 6e 67 29 61 72 67 76  signed long)argv
ce80: 5b 69 5d 2c 65 72 72 29 3b 0a 20 20 20 20 20 20  [i],err);.      
ce90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
cea0: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  errcnt++;.      
ceb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
cec0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
ced0: 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73  T_STR:.      cas
cee0: 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20  e OPT_FSTR:.    
cef0: 20 20 20 20 73 76 20 3d 20 63 70 3b 0a 20 20 20      sv = cp;.   
cf00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cf10: 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70  }.    switch( op
cf20: 5b 6a 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20  [j].type ){.    
cf30: 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a    case OPT_FLAG:
cf40: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
cf50: 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 62  FFLAG:.        b
cf60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
cf70: 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20 20 20   OPT_DBL:.      
cf80: 20 20 2a 28 64 6f 75 62 6c 65 2a 29 28 6f 70 5b    *(double*)(op[
cf90: 6a 5d 2e 61 72 67 29 20 3d 20 64 76 3b 0a 20 20  j].arg) = dv;.  
cfa0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cfb0: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c     case OPT_FDBL
cfc0: 3a 0a 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69  :.        (*(voi
cfd0: 64 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72  d(*)())(op[j].ar
cfe0: 67 29 29 28 64 76 29 3b 0a 20 20 20 20 20 20 20  g))(dv);.       
cff0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
d000: 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20  se OPT_INT:.    
d010: 20 20 20 20 2a 28 69 6e 74 2a 29 28 6f 70 5b 6a      *(int*)(op[j
d020: 5d 2e 61 72 67 29 20 3d 20 6c 76 3b 0a 20 20 20  ].arg) = lv;.   
d030: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d040: 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a    case OPT_FINT:
d050: 0a 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64  .        (*(void
d060: 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67  (*)())(op[j].arg
d070: 29 29 28 28 69 6e 74 29 6c 76 29 3b 0a 20 20 20  ))((int)lv);.   
d080: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d090: 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a    case OPT_STR:.
d0a0: 20 20 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a          *(char**
d0b0: 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 73  )(op[j].arg) = s
d0c0: 76 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  v;.        break
d0d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  ;.      case OPT
d0e0: 5f 46 53 54 52 3a 0a 20 20 20 20 20 20 20 20 28  _FSTR:.        (
d0f0: 2a 28 76 6f 69 64 28 2a 29 28 29 29 28 6f 70 5b  *(void(*)())(op[
d100: 6a 5d 2e 61 72 67 29 29 28 73 76 29 3b 0a 20 20  j].arg))(sv);.  
d110: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d120: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
d130: 65 72 72 63 6e 74 3b 0a 7d 0a 0a 69 6e 74 20 4f  errcnt;.}..int O
d140: 70 74 49 6e 69 74 28 61 2c 6f 2c 65 72 72 29 0a  ptInit(a,o,err).
d150: 63 68 61 72 20 2a 2a 61 3b 0a 73 74 72 75 63 74  char **a;.struct
d160: 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f 3b 0a 46   s_options *o;.F
d170: 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20 20 69 6e  ILE *err;.{.  in
d180: 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20  t errcnt = 0;.  
d190: 61 72 67 76 20 3d 20 61 3b 0a 20 20 6f 70 20 3d  argv = a;.  op =
d1a0: 20 6f 3b 0a 20 20 65 72 72 73 74 72 65 61 6d 20   o;.  errstream 
d1b0: 3d 20 65 72 72 3b 0a 20 20 69 66 28 20 61 72 67  = err;.  if( arg
d1c0: 76 20 26 26 20 2a 61 72 67 76 20 26 26 20 6f 70  v && *argv && op
d1d0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
d1e0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 72 67 76     for(i=1; argv
d1f0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
d200: 20 69 66 28 20 61 72 67 76 5b 69 5d 5b 30 5d 3d   if( argv[i][0]=
d210: 3d 27 2b 27 20 7c 7c 20 61 72 67 76 5b 69 5d 5b  ='+' || argv[i][
d220: 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]=='-' ){.     
d230: 20 20 20 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e     errcnt += han
d240: 64 6c 65 66 6c 61 67 73 28 69 2c 65 72 72 29 3b  dleflags(i,err);
d250: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
d260: 20 73 74 72 63 68 72 28 61 72 67 76 5b 69 5d 2c   strchr(argv[i],
d270: 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '=') ){.        
d280: 65 72 72 63 6e 74 20 2b 3d 20 68 61 6e 64 6c 65  errcnt += handle
d290: 73 77 69 74 63 68 28 69 2c 65 72 72 29 3b 0a 20  switch(i,err);. 
d2a0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d2b0: 0a 20 20 69 66 28 20 65 72 72 63 6e 74 3e 30 20  .  if( errcnt>0 
d2c0: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 65  ){.    fprintf(e
d2d0: 72 72 2c 22 56 61 6c 69 64 20 63 6f 6d 6d 61 6e  rr,"Valid comman
d2e0: 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 73 20 66  d line options f
d2f0: 6f 72 20 5c 22 25 73 5c 22 20 61 72 65 3a 5c 6e  or \"%s\" are:\n
d300: 22 2c 2a 61 29 3b 0a 20 20 20 20 4f 70 74 50 72  ",*a);.    OptPr
d310: 69 6e 74 28 29 3b 0a 20 20 20 20 65 78 69 74 28  int();.    exit(
d320: 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
d330: 20 30 3b 0a 7d 0a 0a 69 6e 74 20 4f 70 74 4e 41   0;.}..int OptNA
d340: 72 67 73 28 29 7b 0a 20 20 69 6e 74 20 63 6e 74  rgs(){.  int cnt
d350: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 64 61 73 68   = 0;.  int dash
d360: 64 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  dash = 0;.  int 
d370: 69 3b 0a 20 20 69 66 28 20 61 72 67 76 21 3d 30  i;.  if( argv!=0
d380: 20 26 26 20 61 72 67 76 5b 30 5d 21 3d 30 20 29   && argv[0]!=0 )
d390: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61  {.    for(i=1; a
d3a0: 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  rgv[i]; i++){.  
d3b0: 20 20 20 20 69 66 28 20 64 61 73 68 64 61 73 68      if( dashdash
d3c0: 20 7c 7c 20 21 49 53 4f 50 54 28 61 72 67 76 5b   || !ISOPT(argv[
d3d0: 69 5d 29 20 29 20 63 6e 74 2b 2b 3b 0a 20 20 20  i]) ) cnt++;.   
d3e0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72     if( strcmp(ar
d3f0: 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d 3d 30 20 29  gv[i],"--")==0 )
d400: 20 64 61 73 68 64 61 73 68 20 3d 20 31 3b 0a 20   dashdash = 1;. 
d410: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
d420: 6e 20 63 6e 74 3b 0a 7d 0a 0a 63 68 61 72 20 2a  n cnt;.}..char *
d430: 4f 70 74 41 72 67 28 6e 29 0a 69 6e 74 20 6e 3b  OptArg(n).int n;
d440: 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 20  .{.  int i;.  i 
d450: 3d 20 61 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20  = argindex(n);. 
d460: 20 72 65 74 75 72 6e 20 69 3e 3d 30 20 3f 20 61   return i>=0 ? a
d470: 72 67 76 5b 69 5d 20 3a 20 30 3b 0a 7d 0a 0a 76  rgv[i] : 0;.}..v
d480: 6f 69 64 20 4f 70 74 45 72 72 28 6e 29 0a 69 6e  oid OptErr(n).in
d490: 74 20 6e 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a  t n;.{.  int i;.
d4a0: 20 20 69 20 3d 20 61 72 67 69 6e 64 65 78 28 6e    i = argindex(n
d4b0: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 30 20 29 20  );.  if( i>=0 ) 
d4c0: 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72 73  errline(i,0,errs
d4d0: 74 72 65 61 6d 29 3b 0a 7d 0a 0a 76 6f 69 64 20  tream);.}..void 
d4e0: 4f 70 74 50 72 69 6e 74 28 29 7b 0a 20 20 69 6e  OptPrint(){.  in
d4f0: 74 20 69 3b 0a 20 20 69 6e 74 20 6d 61 78 2c 20  t i;.  int max, 
d500: 6c 65 6e 3b 0a 20 20 6d 61 78 20 3d 20 30 3b 0a  len;.  max = 0;.
d510: 20 20 66 6f 72 28 69 3d 30 3b 20 6f 70 5b 69 5d    for(i=0; op[i]
d520: 2e 6c 61 62 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20  .label; i++){.  
d530: 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 6f    len = strlen(o
d540: 70 5b 69 5d 2e 6c 61 62 65 6c 29 20 2b 20 31 3b  p[i].label) + 1;
d550: 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 5b  .    switch( op[
d560: 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20 20 20  i].type ){.     
d570: 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47 3a 0a   case OPT_FLAG:.
d580: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
d590: 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20 62 72  FLAG:.        br
d5a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
d5b0: 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20 20 20 63  OPT_INT:.      c
d5c0: 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a 0a 20 20  ase OPT_FINT:.  
d5d0: 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 39 3b 20        len += 9; 
d5e0: 20 20 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20        /* length 
d5f0: 6f 66 20 22 3c 69 6e 74 65 67 65 72 3e 22 20 2a  of "<integer>" *
d600: 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  /.        break;
d610: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
d620: 44 42 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20  DBL:.      case 
d630: 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20  OPT_FDBL:.      
d640: 20 20 6c 65 6e 20 2b 3d 20 36 3b 20 20 20 20 20    len += 6;     
d650: 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22    /* length of "
d660: 3c 72 65 61 6c 3e 22 20 2a 2f 0a 20 20 20 20 20  <real>" */.     
d670: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d680: 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a 20 20  case OPT_STR:.  
d690: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 53 54      case OPT_FST
d6a0: 52 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b  R:.        len +
d6b0: 3d 20 38 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65  = 8;       /* le
d6c0: 6e 67 74 68 20 6f 66 20 22 3c 73 74 72 69 6e 67  ngth of "<string
d6d0: 3e 22 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72  >" */.        br
d6e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
d6f0: 66 28 20 6c 65 6e 3e 6d 61 78 20 29 20 6d 61 78  f( len>max ) max
d700: 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 66 6f   = len;.  }.  fo
d710: 72 28 69 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62  r(i=0; op[i].lab
d720: 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 77  el; i++){.    sw
d730: 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70 65  itch( op[i].type
d740: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
d750: 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63  PT_FLAG:.      c
d760: 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20  ase OPT_FFLAG:. 
d770: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 65         fprintf(e
d780: 72 72 73 74 72 65 61 6d 2c 22 20 20 2d 25 2d 2a  rrstream,"  -%-*
d790: 73 20 20 25 73 5c 6e 22 2c 6d 61 78 2c 6f 70 5b  s  %s\n",max,op[
d7a0: 69 5d 2e 6c 61 62 65 6c 2c 6f 70 5b 69 5d 2e 6d  i].label,op[i].m
d7b0: 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20  essage);.       
d7c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
d7d0: 73 65 20 4f 50 54 5f 49 4e 54 3a 0a 20 20 20 20  se OPT_INT:.    
d7e0: 20 20 63 61 73 65 20 4f 50 54 5f 46 49 4e 54 3a    case OPT_FINT:
d7f0: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
d800: 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 25 73  (errstream,"  %s
d810: 3d 3c 69 6e 74 65 67 65 72 3e 25 2a 73 20 20 25  =<integer>%*s  %
d820: 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c  s\n",op[i].label
d830: 2c 0a 20 20 20 20 20 20 20 20 20 20 28 69 6e 74  ,.          (int
d840: 29 28 6d 61 78 2d 73 74 72 6c 65 6e 28 6f 70 5b  )(max-strlen(op[
d850: 69 5d 2e 6c 61 62 65 6c 29 2d 39 29 2c 22 22 2c  i].label)-9),"",
d860: 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a  op[i].message);.
d870: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
d880: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42       case OPT_DB
d890: 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  L:.      case OP
d8a0: 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20 20 20 20  T_FDBL:.        
d8b0: 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61  fprintf(errstrea
d8c0: 6d 2c 22 20 20 25 73 3d 3c 72 65 61 6c 3e 25 2a  m,"  %s=<real>%*
d8d0: 73 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c  s  %s\n",op[i].l
d8e0: 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  abel,.          
d8f0: 28 69 6e 74 29 28 6d 61 78 2d 73 74 72 6c 65 6e  (int)(max-strlen
d900: 28 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 36 29  (op[i].label)-6)
d910: 2c 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67  ,"",op[i].messag
d920: 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  e);.        brea
d930: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
d940: 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73  T_STR:.      cas
d950: 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20  e OPT_FSTR:.    
d960: 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 73      fprintf(errs
d970: 74 72 65 61 6d 2c 22 20 20 25 73 3d 3c 73 74 72  tream,"  %s=<str
d980: 69 6e 67 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f  ing>%*s  %s\n",o
d990: 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20  p[i].label,.    
d9a0: 20 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d        (int)(max-
d9b0: 73 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62  strlen(op[i].lab
d9c0: 65 6c 29 2d 38 29 2c 22 22 2c 6f 70 5b 69 5d 2e  el)-8),"",op[i].
d9d0: 6d 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20  message);.      
d9e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d9f0: 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   }.}./**********
da00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
da10: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 70 61 72  om the file "par
da20: 73 65 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  se.c" **********
da30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
da40: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 49 6e 70 75 74 20  **/./*.** Input 
da50: 66 69 6c 65 20 70 61 72 73 65 72 20 66 6f 72 20  file parser for 
da60: 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72  the LEMON parser
da70: 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a   generator..*/..
da80: 2f 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66 20  /* The state of 
da90: 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 73 74  the parser */.st
daa0: 72 75 63 74 20 70 73 74 61 74 65 20 7b 0a 20 20  ruct pstate {.  
dab0: 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20  char *filename; 
dac0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
dad0: 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20   the input file 
dae0: 2a 2f 0a 20 20 69 6e 74 20 74 6f 6b 65 6e 6c 69  */.  int tokenli
daf0: 6e 65 6e 6f 3b 20 20 20 20 20 20 2f 2a 20 4c 69  neno;      /* Li
db00: 6e 65 6e 75 6d 62 65 72 20 61 74 20 77 68 69 63  nenumber at whic
db10: 68 20 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e 20  h current token 
db20: 73 74 61 72 74 73 20 2a 2f 0a 20 20 69 6e 74 20  starts */.  int 
db30: 65 72 72 6f 72 63 6e 74 3b 20 20 20 20 20 20 20  errorcnt;       
db40: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
db50: 72 72 6f 72 73 20 73 6f 20 66 61 72 20 2a 2f 0a  rrors so far */.
db60: 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 73 74 61    char *tokensta
db70: 72 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20  rt;     /* Text 
db80: 6f 66 20 63 75 72 72 65 6e 74 20 74 6f 6b 65 6e  of current token
db90: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 65 6d   */.  struct lem
dba0: 6f 6e 20 2a 67 70 3b 20 20 20 20 20 2f 2a 20 47  on *gp;     /* G
dbb0: 6c 6f 62 61 6c 20 73 74 61 74 65 20 76 65 63 74  lobal state vect
dbc0: 6f 72 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 73  or */.  enum e_s
dbd0: 74 61 74 65 20 7b 0a 20 20 20 20 49 4e 49 54 49  tate {.    INITI
dbe0: 41 4c 49 5a 45 2c 0a 20 20 20 20 57 41 49 54 49  ALIZE,.    WAITI
dbf0: 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52  NG_FOR_DECL_OR_R
dc00: 55 4c 45 2c 0a 20 20 20 20 57 41 49 54 49 4e 47  ULE,.    WAITING
dc10: 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52  _FOR_DECL_KEYWOR
dc20: 44 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46  D,.    WAITING_F
dc30: 4f 52 5f 44 45 43 4c 5f 41 52 47 2c 0a 20 20 20  OR_DECL_ARG,.   
dc40: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45   WAITING_FOR_PRE
dc50: 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 2c 0a  CEDENCE_SYMBOL,.
dc60: 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f      WAITING_FOR_
dc70: 41 52 52 4f 57 2c 0a 20 20 20 20 49 4e 5f 52 48  ARROW,.    IN_RH
dc80: 53 2c 0a 20 20 20 20 4c 48 53 5f 41 4c 49 41 53  S,.    LHS_ALIAS
dc90: 5f 31 2c 0a 20 20 20 20 4c 48 53 5f 41 4c 49 41  _1,.    LHS_ALIA
dca0: 53 5f 32 2c 0a 20 20 20 20 4c 48 53 5f 41 4c 49  S_2,.    LHS_ALI
dcb0: 41 53 5f 33 2c 0a 20 20 20 20 52 48 53 5f 41 4c  AS_3,.    RHS_AL
dcc0: 49 41 53 5f 31 2c 0a 20 20 20 20 52 48 53 5f 41  IAS_1,.    RHS_A
dcd0: 4c 49 41 53 5f 32 2c 0a 20 20 20 20 50 52 45 43  LIAS_2,.    PREC
dce0: 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31 2c 0a 20  EDENCE_MARK_1,. 
dcf0: 20 20 20 50 52 45 43 45 44 45 4e 43 45 5f 4d 41     PRECEDENCE_MA
dd00: 52 4b 5f 32 2c 0a 20 20 20 20 52 45 53 59 4e 43  RK_2,.    RESYNC
dd10: 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f  _AFTER_RULE_ERRO
dd20: 52 2c 0a 20 20 20 20 52 45 53 59 4e 43 5f 41 46  R,.    RESYNC_AF
dd30: 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 2c 0a  TER_DECL_ERROR,.
dd40: 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f      WAITING_FOR_
dd50: 44 45 53 54 52 55 43 54 4f 52 5f 53 59 4d 42 4f  DESTRUCTOR_SYMBO
dd60: 4c 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f 46  L,.    WAITING_F
dd70: 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d 42  OR_DATATYPE_SYMB
dd80: 4f 4c 2c 0a 20 20 20 20 57 41 49 54 49 4e 47 5f  OL,.    WAITING_
dd90: 46 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 0a  FOR_FALLBACK_ID.
dda0: 20 20 7d 20 73 74 61 74 65 3b 20 20 20 20 20 20    } state;      
ddb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ddc0: 54 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  The state of the
ddd0: 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 73 74 72   parser */.  str
dde0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c  uct symbol *fall
ddf0: 62 61 63 6b 3b 20 20 20 2f 2a 20 54 68 65 20 66  back;   /* The f
de00: 61 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 20 2a 2f  allback token */
de10: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
de20: 20 2a 6c 68 73 3b 20 20 20 20 20 20 20 20 2f 2a   *lhs;        /*
de30: 20 4c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   Left-hand side 
de40: 6f 66 20 63 75 72 72 65 6e 74 20 72 75 6c 65 20  of current rule 
de50: 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 68 73 61 6c  */.  char *lhsal
de60: 69 61 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ias;            
de70: 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74 68 65  /* Alias for the
de80: 20 4c 48 53 20 2a 2f 0a 20 20 69 6e 74 20 6e 72   LHS */.  int nr
de90: 68 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hs;             
dea0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
deb0: 66 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64  f right-hand sid
dec0: 65 20 73 79 6d 62 6f 6c 73 20 73 65 65 6e 20 2a  e symbols seen *
ded0: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
dee0: 6c 20 2a 72 68 73 5b 4d 41 58 52 48 53 5d 3b 20  l *rhs[MAXRHS]; 
def0: 20 2f 2a 20 52 48 53 20 73 79 6d 62 6f 6c 73 20   /* RHS symbols 
df00: 2a 2f 0a 20 20 63 68 61 72 20 2a 61 6c 69 61 73  */.  char *alias
df10: 5b 4d 41 58 52 48 53 5d 3b 20 20 20 20 20 20 20  [MAXRHS];       
df20: 2f 2a 20 41 6c 69 61 73 65 73 20 66 6f 72 20 65  /* Aliases for e
df30: 61 63 68 20 52 48 53 20 73 79 6d 62 6f 6c 20 28  ach RHS symbol (
df40: 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 73 74  or NULL) */.  st
df50: 72 75 63 74 20 72 75 6c 65 20 2a 70 72 65 76 72  ruct rule *prevr
df60: 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 72 65 76  ule;     /* Prev
df70: 69 6f 75 73 20 72 75 6c 65 20 70 61 72 73 65 64  ious rule parsed
df80: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 65 63 6c   */.  char *decl
df90: 6b 65 79 77 6f 72 64 3b 20 20 20 20 20 20 20 20  keyword;        
dfa0: 20 2f 2a 20 4b 65 79 77 6f 72 64 20 6f 66 20 61   /* Keyword of a
dfb0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a   declaration */.
dfc0: 20 20 63 68 61 72 20 2a 2a 64 65 63 6c 61 72 67    char **declarg
dfd0: 73 6c 6f 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  slot;        /* 
dfe0: 57 68 65 72 65 20 74 68 65 20 64 65 63 6c 61 72  Where the declar
dff0: 61 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 20 73  ation argument s
e000: 68 6f 75 6c 64 20 62 65 20 70 75 74 20 2a 2f 0a  hould be put */.
e010: 20 20 69 6e 74 20 2a 64 65 63 6c 6c 6e 73 6c 6f    int *decllnslo
e020: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
e030: 57 68 65 72 65 20 74 68 65 20 64 65 63 6c 61 72  Where the declar
e040: 61 74 69 6f 6e 20 6c 69 6e 65 6e 75 6d 62 65 72  ation linenumber
e050: 20 69 73 20 70 75 74 20 2a 2f 0a 20 20 65 6e 75   is put */.  enu
e060: 6d 20 65 5f 61 73 73 6f 63 20 64 65 63 6c 61 73  m e_assoc declas
e070: 73 6f 63 3b 20 20 20 20 2f 2a 20 41 73 73 69 67  soc;    /* Assig
e080: 6e 20 74 68 69 73 20 61 73 73 6f 63 69 61 74 69  n this associati
e090: 6f 6e 20 74 6f 20 64 65 63 6c 20 61 72 67 75 6d  on to decl argum
e0a0: 65 6e 74 73 20 2a 2f 0a 20 20 69 6e 74 20 70 72  ents */.  int pr
e0b0: 65 63 63 6f 75 6e 74 65 72 3b 20 20 20 20 20 20  eccounter;      
e0c0: 20 20 20 20 20 2f 2a 20 41 73 73 69 67 6e 20 74       /* Assign t
e0d0: 68 69 73 20 70 72 65 63 65 64 65 6e 63 65 20 74  his precedence t
e0e0: 6f 20 64 65 63 6c 20 61 72 67 75 6d 65 6e 74 73  o decl arguments
e0f0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75 6c   */.  struct rul
e100: 65 20 2a 66 69 72 73 74 72 75 6c 65 3b 20 20 20  e *firstrule;   
e110: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 66   /* Pointer to f
e120: 69 72 73 74 20 72 75 6c 65 20 69 6e 20 74 68 65  irst rule in the
e130: 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20 20 73 74   grammar */.  st
e140: 72 75 63 74 20 72 75 6c 65 20 2a 6c 61 73 74 72  ruct rule *lastr
e150: 75 6c 65 3b 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ule;     /* Poin
e160: 74 65 72 20 74 6f 20 74 68 65 20 6d 6f 73 74 20  ter to the most 
e170: 72 65 63 65 6e 74 6c 79 20 70 61 72 73 65 64 20  recently parsed 
e180: 72 75 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 50  rule */.};../* P
e190: 61 72 73 65 20 61 20 73 69 6e 67 6c 65 20 74 6f  arse a single to
e1a0: 6b 65 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ken */.static vo
e1b0: 69 64 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e  id parseonetoken
e1c0: 28 70 73 70 29 0a 73 74 72 75 63 74 20 70 73 74  (psp).struct pst
e1d0: 61 74 65 20 2a 70 73 70 3b 0a 7b 0a 20 20 63 68  ate *psp;.{.  ch
e1e0: 61 72 20 2a 78 3b 0a 20 20 78 20 3d 20 53 74 72  ar *x;.  x = Str
e1f0: 73 61 66 65 28 70 73 70 2d 3e 74 6f 6b 65 6e 73  safe(psp->tokens
e200: 74 61 72 74 29 3b 20 20 20 20 20 2f 2a 20 53 61  tart);     /* Sa
e210: 76 65 20 74 68 65 20 74 6f 6b 65 6e 20 70 65 72  ve the token per
e220: 6d 61 6e 65 6e 74 6c 79 20 2a 2f 0a 23 69 66 20  manently */.#if 
e230: 30 0a 20 20 70 72 69 6e 74 66 28 22 25 73 3a 25  0.  printf("%s:%
e240: 64 3a 20 54 6f 6b 65 6e 3d 5b 25 73 5d 20 73 74  d: Token=[%s] st
e250: 61 74 65 3d 25 64 5c 6e 22 2c 70 73 70 2d 3e 66  ate=%d\n",psp->f
e260: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
e270: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 78 2c  enlineno,.    x,
e280: 70 73 70 2d 3e 73 74 61 74 65 29 3b 0a 23 65 6e  psp->state);.#en
e290: 64 69 66 0a 20 20 73 77 69 74 63 68 28 20 70 73  dif.  switch( ps
e2a0: 70 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20  p->state ){.    
e2b0: 63 61 73 65 20 49 4e 49 54 49 41 4c 49 5a 45 3a  case INITIALIZE:
e2c0: 0a 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76  .      psp->prev
e2d0: 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  rule = 0;.      
e2e0: 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72  psp->preccounter
e2f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 73 70 2d   = 0;.      psp-
e300: 3e 66 69 72 73 74 72 75 6c 65 20 3d 20 70 73 70  >firstrule = psp
e310: 2d 3e 6c 61 73 74 72 75 6c 65 20 3d 20 30 3b 0a  ->lastrule = 0;.
e320: 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d 3e 6e        psp->gp->n
e330: 72 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  rule = 0;.      
e340: 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 74 6f 20  /* Fall thru to 
e350: 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20  next case */.   
e360: 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f   case WAITING_FO
e370: 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3a 0a  R_DECL_OR_RULE:.
e380: 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
e390: 27 25 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '%' ){.        p
e3a0: 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
e3b0: 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b 45 59  ING_FOR_DECL_KEY
e3c0: 57 4f 52 44 3b 0a 20 20 20 20 20 20 7d 65 6c 73  WORD;.      }els
e3d0: 65 20 69 66 28 20 69 73 6c 6f 77 65 72 28 78 5b  e if( islower(x[
e3e0: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  0]) ){.        p
e3f0: 73 70 2d 3e 6c 68 73 20 3d 20 53 79 6d 62 6f 6c  sp->lhs = Symbol
e400: 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
e410: 20 70 73 70 2d 3e 6e 72 68 73 20 3d 20 30 3b 0a   psp->nrhs = 0;.
e420: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73          psp->lhs
e430: 61 6c 69 61 73 20 3d 20 30 3b 0a 20 20 20 20 20  alias = 0;.     
e440: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
e450: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f  WAITING_FOR_ARRO
e460: 57 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  W;.      }else i
e470: 66 28 20 78 5b 30 5d 3d 3d 27 7b 27 20 29 7b 0a  f( x[0]=='{' ){.
e480: 20 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d          if( psp-
e490: 3e 70 72 65 76 72 75 6c 65 3d 3d 30 20 29 7b 0a  >prevrule==0 ){.
e4a0: 20 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d            ErrorM
e4b0: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
e4c0: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
e4d0: 6f 2c 0a 22 54 68 65 72 65 20 69 73 20 6e 6f 74  o,."There is not
e4e0: 20 70 72 69 6f 72 20 72 75 6c 65 20 6f 70 6f 6e   prior rule opon
e4f0: 20 77 68 69 63 68 20 74 6f 20 61 74 74 61 63 68   which to attach
e500: 20 74 68 65 20 63 6f 64 65 20 5c 0a 66 72 61 67   the code \.frag
e510: 6d 65 6e 74 20 77 68 69 63 68 20 62 65 67 69 6e  ment which begin
e520: 73 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 2e 22  s on this line."
e530: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
e540: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 09 7d  ->errorcnt++;..}
e550: 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72  else if( psp->pr
e560: 65 76 72 75 6c 65 2d 3e 63 6f 64 65 21 3d 30 20  evrule->code!=0 
e570: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
e580: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
e590: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
e5a0: 6e 65 6e 6f 2c 0a 22 43 6f 64 65 20 66 72 61 67  neno,."Code frag
e5b0: 6d 65 6e 74 20 62 65 67 69 6e 6e 69 6e 67 20 6f  ment beginning o
e5c0: 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20 6e  n this line is n
e5d0: 6f 74 20 74 68 65 20 66 69 72 73 74 20 5c 0a 74  ot the first \.t
e5e0: 6f 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 72 65  o follow the pre
e5f0: 76 69 6f 75 73 20 72 75 6c 65 2e 22 29 3b 0a 20  vious rule.");. 
e600: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72           psp->er
e610: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
e620: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e630: 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65     psp->prevrule
e640: 2d 3e 6c 69 6e 65 20 3d 20 70 73 70 2d 3e 74 6f  ->line = psp->to
e650: 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20  kenlineno;.     
e660: 20 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75       psp->prevru
e670: 6c 65 2d 3e 63 6f 64 65 20 3d 20 26 78 5b 31 5d  le->code = &x[1]
e680: 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65  ;..}.      }else
e690: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 5b 27 20 29   if( x[0]=='[' )
e6a0: 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  {.        psp->s
e6b0: 74 61 74 65 20 3d 20 50 52 45 43 45 44 45 4e 43  tate = PRECEDENC
e6c0: 45 5f 4d 41 52 4b 5f 31 3b 0a 20 20 20 20 20 20  E_MARK_1;.      
e6d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
e6e0: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
e6f0: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
e700: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
e710: 20 20 22 54 6f 6b 65 6e 20 5c 22 25 73 5c 22 20    "Token \"%s\" 
e720: 73 68 6f 75 6c 64 20 62 65 20 65 69 74 68 65 72  should be either
e730: 20 5c 22 25 25 5c 22 20 6f 72 20 61 20 6e 6f 6e   \"%%\" or a non
e740: 74 65 72 6d 69 6e 61 6c 20 6e 61 6d 65 2e 22 2c  terminal name.",
e750: 0a 20 20 20 20 20 20 20 20 20 20 78 29 3b 0a 20  .          x);. 
e760: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
e770: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
e780: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e790: 20 63 61 73 65 20 50 52 45 43 45 44 45 4e 43 45   case PRECEDENCE
e7a0: 5f 4d 41 52 4b 5f 31 3a 0a 20 20 20 20 20 20 69  _MARK_1:.      i
e7b0: 66 28 20 21 69 73 75 70 70 65 72 28 78 5b 30 5d  f( !isupper(x[0]
e7c0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72  ) ){.        Err
e7d0: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
e7e0: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
e7f0: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
e800: 22 54 68 65 20 70 72 65 63 65 64 65 6e 63 65 20  "The precedence 
e810: 73 79 6d 62 6f 6c 20 6d 75 73 74 20 62 65 20 61  symbol must be a
e820: 20 74 65 72 6d 69 6e 61 6c 2e 22 29 3b 0a 20 20   terminal.");.  
e830: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
e840: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c  cnt++;.      }el
e850: 73 65 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76  se if( psp->prev
e860: 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rule==0 ){.     
e870: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
e880: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
e890: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
e8a0: 20 20 20 20 20 20 22 54 68 65 72 65 20 69 73 20        "There is 
e8b0: 6e 6f 20 70 72 69 6f 72 20 72 75 6c 65 20 74 6f  no prior rule to
e8c0: 20 61 73 73 69 67 6e 20 70 72 65 63 65 64 65 6e   assign preceden
e8d0: 63 65 20 5c 22 5b 25 73 5d 5c 22 2e 22 2c 78 29  ce \"[%s]\".",x)
e8e0: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
e8f0: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
e900: 20 7d 65 6c 73 65 20 69 66 28 20 70 73 70 2d 3e   }else if( psp->
e910: 70 72 65 76 72 75 6c 65 2d 3e 70 72 65 63 73 79  prevrule->precsy
e920: 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m!=0 ){.        
e930: 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
e940: 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
e950: 6e 6c 69 6e 65 6e 6f 2c 0a 22 50 72 65 63 65 64  nlineno,."Preced
e960: 65 6e 63 65 20 6d 61 72 6b 20 6f 6e 20 74 68 69  ence mark on thi
e970: 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 68  s line is not th
e980: 65 20 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c  e first \.to fol
e990: 6c 6f 77 20 74 68 65 20 70 72 65 76 69 6f 75 73  low the previous
e9a0: 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20   rule.");.      
e9b0: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
e9c0: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  +;.      }else{.
e9d0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65          psp->pre
e9e0: 76 72 75 6c 65 2d 3e 70 72 65 63 73 79 6d 20 3d  vrule->precsym =
e9f0: 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
ea00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 73        }.      ps
ea10: 70 2d 3e 73 74 61 74 65 20 3d 20 50 52 45 43 45  p->state = PRECE
ea20: 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3b 0a 20 20  DENCE_MARK_2;.  
ea30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
ea40: 61 73 65 20 50 52 45 43 45 44 45 4e 43 45 5f 4d  ase PRECEDENCE_M
ea50: 41 52 4b 5f 32 3a 0a 20 20 20 20 20 20 69 66 28  ARK_2:.      if(
ea60: 20 78 5b 30 5d 21 3d 27 5d 27 20 29 7b 0a 20 20   x[0]!=']' ){.  
ea70: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
ea80: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
ea90: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
eaa0: 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e           "Missin
eab0: 67 20 5c 22 5d 5c 22 20 6f 6e 20 70 72 65 63 65  g \"]\" on prece
eac0: 64 65 6e 63 65 20 6d 61 72 6b 2e 22 29 3b 0a 20  dence mark.");. 
ead0: 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
eae0: 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  rcnt++;.      }.
eaf0: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
eb00: 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
eb10: 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20  ECL_OR_RULE;.   
eb20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
eb30: 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 41  se WAITING_FOR_A
eb40: 52 52 4f 57 3a 0a 20 20 20 20 20 20 69 66 28 20  RROW:.      if( 
eb50: 78 5b 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31  x[0]==':' && x[1
eb60: 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d  ]==':' && x[2]==
eb70: 27 3d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '=' ){.        p
eb80: 73 70 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52  sp->state = IN_R
eb90: 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  HS;.      }else 
eba0: 69 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 29 7b  if( x[0]=='(' ){
ebb0: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
ebc0: 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f  ate = LHS_ALIAS_
ebd0: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
ebe0: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
ebf0: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
ec00: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
ec10: 0a 20 20 20 20 20 20 20 20 20 20 22 45 78 70 65  .          "Expe
ec20: 63 74 65 64 20 74 6f 20 73 65 65 20 61 20 5c 22  cted to see a \"
ec30: 3a 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  :\" following th
ec40: 65 20 4c 48 53 20 73 79 6d 62 6f 6c 20 5c 22 25  e LHS symbol \"%
ec50: 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20 20 20  s\".",.         
ec60: 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29   psp->lhs->name)
ec70: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
ec80: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
ec90: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
eca0: 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
ecb0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
ecc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ecd0: 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53    case LHS_ALIAS
ece0: 5f 31 3a 0a 20 20 20 20 20 20 69 66 28 20 69 73  _1:.      if( is
ecf0: 61 6c 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20  alpha(x[0]) ){. 
ed00: 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 61         psp->lhsa
ed10: 6c 69 61 73 20 3d 20 78 3b 0a 20 20 20 20 20 20  lias = x;.      
ed20: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c    psp->state = L
ed30: 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20 20 20  HS_ALIAS_2;.    
ed40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ed50: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
ed60: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
ed70: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
ed80: 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73 20 6e      "\"%s\" is n
ed90: 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69 61 73  ot a valid alias
eda0: 20 66 6f 72 20 74 68 65 20 4c 48 53 20 5c 22 25   for the LHS \"%
edb0: 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  s\"\n",.        
edc0: 20 20 78 2c 70 73 70 2d 3e 6c 68 73 2d 3e 6e 61    x,psp->lhs->na
edd0: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70  me);.        psp
ede0: 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
edf0: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
ee00: 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f   = RESYNC_AFTER_
ee10: 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RULE_ERROR;.    
ee20: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
ee30: 0a 20 20 20 20 63 61 73 65 20 4c 48 53 5f 41 4c  .    case LHS_AL
ee40: 49 41 53 5f 32 3a 0a 20 20 20 20 20 20 69 66 28  IAS_2:.      if(
ee50: 20 78 5b 30 5d 3d 3d 27 29 27 20 29 7b 0a 20 20   x[0]==')' ){.  
ee60: 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
ee70: 20 3d 20 4c 48 53 5f 41 4c 49 41 53 5f 33 3b 0a   = LHS_ALIAS_3;.
ee80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ee90: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
eea0: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
eeb0: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
eec0: 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67          "Missing
eed0: 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67   \")\" following
eee0: 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d 65 20   LHS alias name 
eef0: 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68  \"%s\".",psp->lh
ef00: 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20  salias);.       
ef10: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
ef20: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
ef30: 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
ef40: 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
ef50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
ef60: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 4c 48  eak;.    case LH
ef70: 53 5f 41 4c 49 41 53 5f 33 3a 0a 20 20 20 20 20  S_ALIAS_3:.     
ef80: 20 69 66 28 20 78 5b 30 5d 3d 3d 27 3a 27 20 26   if( x[0]==':' &
ef90: 26 20 78 5b 31 5d 3d 3d 27 3a 27 20 26 26 20 78  & x[1]==':' && x
efa0: 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a 20 20 20 20  [2]=='=' ){.    
efb0: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
efc0: 20 49 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d   IN_RHS;.      }
efd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
efe0: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
eff0: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
f000: 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
f010: 20 22 4d 69 73 73 69 6e 67 20 5c 22 2d 3e 5c 22   "Missing \"->\"
f020: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 20 5c 22 25 73   following: \"%s
f030: 28 25 73 29 5c 22 2e 22 2c 0a 20 20 20 20 20 20  (%s)\".",.      
f040: 20 20 20 20 20 70 73 70 2d 3e 6c 68 73 2d 3e 6e       psp->lhs->n
f050: 61 6d 65 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61  ame,psp->lhsalia
f060: 73 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  s);.        psp-
f070: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
f080: 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
f090: 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52  = RESYNC_AFTER_R
f0a0: 55 4c 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ULE_ERROR;.     
f0b0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
f0c0: 20 20 20 20 63 61 73 65 20 49 4e 5f 52 48 53 3a      case IN_RHS:
f0d0: 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d  .      if( x[0]=
f0e0: 3d 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='.' ){.        
f0f0: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
f100: 0a 20 20 20 20 20 20 20 20 72 70 20 3d 20 28 73  .        rp = (s
f110: 74 72 75 63 74 20 72 75 6c 65 20 2a 29 6d 61 6c  truct rule *)mal
f120: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75  loc( sizeof(stru
f130: 63 74 20 72 75 6c 65 29 20 2b 20 0a 20 20 20 20  ct rule) + .    
f140: 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28           sizeof(
f150: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2a  struct symbol*)*
f160: 70 73 70 2d 3e 6e 72 68 73 20 2b 20 73 69 7a 65  psp->nrhs + size
f170: 6f 66 28 63 68 61 72 2a 29 2a 70 73 70 2d 3e 6e  of(char*)*psp->n
f180: 72 68 73 20 29 3b 0a 20 20 20 20 20 20 20 20 69  rhs );.        i
f190: 66 28 20 72 70 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rp==0 ){.    
f1a0: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
f1b0: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
f1c0: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
f1d0: 20 20 20 20 20 20 20 20 20 20 20 22 43 61 6e 27             "Can'
f1e0: 74 20 61 6c 6c 6f 63 61 74 65 20 65 6e 6f 75 67  t allocate enoug
f1f0: 68 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 69  h memory for thi
f200: 73 20 72 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20  s rule.");.     
f210: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
f220: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
f230: 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20  psp->prevrule = 
f240: 30 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20  0;..}else{.     
f250: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
f260: 20 20 20 20 20 20 72 70 2d 3e 72 75 6c 65 6c 69        rp->ruleli
f270: 6e 65 20 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c  ne = psp->tokenl
f280: 69 6e 65 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  ineno;.         
f290: 20 72 70 2d 3e 72 68 73 20 3d 20 28 73 74 72 75   rp->rhs = (stru
f2a0: 63 74 20 73 79 6d 62 6f 6c 2a 2a 29 26 72 70 5b  ct symbol**)&rp[
f2b0: 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  1];.          rp
f2c0: 2d 3e 72 68 73 61 6c 69 61 73 20 3d 20 28 63 68  ->rhsalias = (ch
f2d0: 61 72 2a 2a 29 26 28 72 70 2d 3e 72 68 73 5b 70  ar**)&(rp->rhs[p
f2e0: 73 70 2d 3e 6e 72 68 73 5d 29 3b 0a 20 20 20 20  sp->nrhs]);.    
f2f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
f300: 3c 70 73 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29  <psp->nrhs; i++)
f310: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 70  {.            rp
f320: 2d 3e 72 68 73 5b 69 5d 20 3d 20 70 73 70 2d 3e  ->rhs[i] = psp->
f330: 72 68 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  rhs[i];.        
f340: 20 20 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73      rp->rhsalias
f350: 5b 69 5d 20 3d 20 70 73 70 2d 3e 61 6c 69 61 73  [i] = psp->alias
f360: 5b 69 5d 3b 0a 09 20 20 7d 0a 20 20 20 20 20 20  [i];..  }.      
f370: 20 20 20 20 72 70 2d 3e 6c 68 73 20 3d 20 70 73      rp->lhs = ps
f380: 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20 20 20  p->lhs;.        
f390: 20 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d    rp->lhsalias =
f3a0: 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 3b 0a   psp->lhsalias;.
f3b0: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 72            rp->nr
f3c0: 68 73 20 3d 20 70 73 70 2d 3e 6e 72 68 73 3b 0a  hs = psp->nrhs;.
f3d0: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 63 6f            rp->co
f3e0: 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
f3f0: 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d 20    rp->precsym = 
f400: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  0;.          rp-
f410: 3e 69 6e 64 65 78 20 3d 20 70 73 70 2d 3e 67 70  >index = psp->gp
f420: 2d 3e 6e 72 75 6c 65 2b 2b 3b 0a 20 20 20 20 20  ->nrule++;.     
f430: 20 20 20 20 20 72 70 2d 3e 6e 65 78 74 6c 68 73       rp->nextlhs
f440: 20 3d 20 72 70 2d 3e 6c 68 73 2d 3e 72 75 6c 65   = rp->lhs->rule
f450: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e  ;.          rp->
f460: 6c 68 73 2d 3e 72 75 6c 65 20 3d 20 72 70 3b 0a  lhs->rule = rp;.
f470: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6e 65            rp->ne
f480: 78 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  xt = 0;.        
f490: 20 20 69 66 28 20 70 73 70 2d 3e 66 69 72 73 74    if( psp->first
f4a0: 72 75 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  rule==0 ){.     
f4b0: 20 20 20 20 20 20 20 70 73 70 2d 3e 66 69 72 73         psp->firs
f4c0: 74 72 75 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73  trule = psp->las
f4d0: 74 72 75 6c 65 20 3d 20 72 70 3b 0a 09 20 20 7d  trule = rp;..  }
f4e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
f4f0: 20 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 2d    psp->lastrule-
f500: 3e 6e 65 78 74 20 3d 20 72 70 3b 0a 20 20 20 20  >next = rp;.    
f510: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 61 73          psp->las
f520: 74 72 75 6c 65 20 3d 20 72 70 3b 0a 09 20 20 7d  trule = rp;..  }
f530: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
f540: 70 72 65 76 72 75 6c 65 20 3d 20 72 70 3b 0a 09  prevrule = rp;..
f550: 7d 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  }.        psp->s
f560: 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
f570: 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b  OR_DECL_OR_RULE;
f580: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
f590: 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29   isalpha(x[0]) )
f5a0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73  {.        if( ps
f5b0: 70 2d 3e 6e 72 68 73 3e 3d 4d 41 58 52 48 53 20  p->nrhs>=MAXRHS 
f5c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72  ){.          Err
f5d0: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
f5e0: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
f5f0: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
f600: 20 20 22 54 6f 6f 20 6d 61 6e 79 20 73 79 6d 62    "Too many symb
f610: 6f 6c 20 6f 6e 20 52 48 53 20 6f 72 20 72 75 6c  ol on RHS or rul
f620: 65 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 5c  e beginning at \
f630: 22 25 73 5c 22 2e 22 2c 0a 20 20 20 20 20 20 20  "%s\".",.       
f640: 20 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20       x);.       
f650: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
f660: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ++;.          ps
f670: 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
f680: 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
f690: 4f 52 3b 0a 09 7d 65 6c 73 65 7b 0a 20 20 20 20  OR;..}else{.    
f6a0: 20 20 20 20 20 20 70 73 70 2d 3e 72 68 73 5b 70        psp->rhs[p
f6b0: 73 70 2d 3e 6e 72 68 73 5d 20 3d 20 53 79 6d 62  sp->nrhs] = Symb
f6c0: 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
f6d0: 20 20 20 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b       psp->alias[
f6e0: 70 73 70 2d 3e 6e 72 68 73 5d 20 3d 20 30 3b 0a  psp->nrhs] = 0;.
f6f0: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6e            psp->n
f700: 72 68 73 2b 2b 3b 0a 09 7d 0a 20 20 20 20 20 20  rhs++;..}.      
f710: 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d 3d 3d  }else if( x[0]==
f720: 27 28 27 20 26 26 20 70 73 70 2d 3e 6e 72 68 73  '(' && psp->nrhs
f730: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  >0 ){.        ps
f740: 70 2d 3e 73 74 61 74 65 20 3d 20 52 48 53 5f 41  p->state = RHS_A
f750: 4c 49 41 53 5f 31 3b 0a 20 20 20 20 20 20 7d 65  LIAS_1;.      }e
f760: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
f770: 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
f780: 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
f790: 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
f7a0: 22 49 6c 6c 65 67 61 6c 20 63 68 61 72 61 63 74  "Illegal charact
f7b0: 65 72 20 6f 6e 20 52 48 53 20 6f 66 20 72 75 6c  er on RHS of rul
f7c0: 65 3a 20 5c 22 25 73 5c 22 2e 22 2c 78 29 3b 0a  e: \"%s\".",x);.
f7d0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
f7e0: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
f7f0: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
f800: 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
f810: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
f820: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f830: 63 61 73 65 20 52 48 53 5f 41 4c 49 41 53 5f 31  case RHS_ALIAS_1
f840: 3a 0a 20 20 20 20 20 20 69 66 28 20 69 73 61 6c  :.      if( isal
f850: 70 68 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  pha(x[0]) ){.   
f860: 20 20 20 20 20 70 73 70 2d 3e 61 6c 69 61 73 5b       psp->alias[
f870: 70 73 70 2d 3e 6e 72 68 73 2d 31 5d 20 3d 20 78  psp->nrhs-1] = x
f880: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
f890: 74 61 74 65 20 3d 20 52 48 53 5f 41 4c 49 41 53  tate = RHS_ALIAS
f8a0: 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  _2;.      }else{
f8b0: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
f8c0: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
f8d0: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
f8e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22 25  ,.          "\"%
f8f0: 73 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61 6c  s\" is not a val
f900: 69 64 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65  id alias for the
f910: 20 52 48 53 20 73 79 6d 62 6f 6c 20 5c 22 25 73   RHS symbol \"%s
f920: 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  \"\n",.         
f930: 20 78 2c 70 73 70 2d 3e 72 68 73 5b 70 73 70 2d   x,psp->rhs[psp-
f940: 3e 6e 72 68 73 2d 31 5d 2d 3e 6e 61 6d 65 29 3b  >nrhs-1]->name);
f950: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
f960: 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
f970: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
f980: 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45  ESYNC_AFTER_RULE
f990: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
f9a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f9b0: 20 63 61 73 65 20 52 48 53 5f 41 4c 49 41 53 5f   case RHS_ALIAS_
f9c0: 32 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b 30  2:.      if( x[0
f9d0: 5d 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20  ]==')' ){.      
f9e0: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 49    psp->state = I
f9f0: 4e 5f 52 48 53 3b 0a 20 20 20 20 20 20 7d 65 6c  N_RHS;.      }el
fa00: 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f  se{.        Erro
fa10: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
fa20: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
fa30: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
fa40: 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22 20 66 6f  Missing \")\" fo
fa50: 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c 69 61  llowing LHS alia
fa60: 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e 22 2c  s name \"%s\".",
fa70: 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a  psp->lhsalias);.
fa80: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72          psp->err
fa90: 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
faa0: 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
fab0: 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f  SYNC_AFTER_RULE_
fac0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
fad0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
fae0: 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46 4f 52  case WAITING_FOR
faf0: 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3a 0a 20  _DECL_KEYWORD:. 
fb00: 20 20 20 20 20 69 66 28 20 69 73 61 6c 70 68 61       if( isalpha
fb10: 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  (x[0]) ){.      
fb20: 20 20 70 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f    psp->declkeywo
fb30: 72 64 20 3d 20 78 3b 0a 20 20 20 20 20 20 20 20  rd = x;.        
fb40: 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
fb50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73   = 0;.        ps
fb60: 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20  p->decllnslot = 
fb70: 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  0;.        psp->
fb80: 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
fb90: 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20  FOR_DECL_ARG;.  
fba0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
fbb0: 28 78 2c 22 6e 61 6d 65 22 29 3d 3d 30 20 29 7b  (x,"name")==0 ){
fbc0: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
fbd0: 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
fbe0: 70 73 70 2d 3e 67 70 2d 3e 6e 61 6d 65 29 3b 0a  psp->gp->name);.
fbf0: 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d  .}else if( strcm
fc00: 70 28 78 2c 22 69 6e 63 6c 75 64 65 22 29 3d 3d  p(x,"include")==
fc10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
fc20: 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
fc30: 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 69 6e 63  = &(psp->gp->inc
fc40: 6c 75 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20  lude);.         
fc50: 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74   psp->decllnslot
fc60: 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 69 6e 63   = &psp->gp->inc
fc70: 6c 75 64 65 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69  ludeln;..}else i
fc80: 66 28 20 73 74 72 63 6d 70 28 78 2c 22 63 6f 64  f( strcmp(x,"cod
fc90: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
fca0: 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
fcb0: 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
fcc0: 2d 3e 65 78 74 72 61 63 6f 64 65 29 3b 0a 20 20  ->extracode);.  
fcd0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
fce0: 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e  llnslot = &psp->
fcf0: 67 70 2d 3e 65 78 74 72 61 63 6f 64 65 6c 6e 3b  gp->extracodeln;
fd00: 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63  ..}else if( strc
fd10: 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f 64 65 73 74  mp(x,"token_dest
fd20: 72 75 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20  ructor")==0 ){. 
fd30: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
fd40: 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70  clargslot = &psp
fd50: 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b  ->gp->tokendest;
fd60: 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
fd70: 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73  decllnslot = &ps
fd80: 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 64 65 73 74  p->gp->tokendest
fd90: 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73  ln;..}else if( s
fda0: 74 72 63 6d 70 28 78 2c 22 64 65 66 61 75 6c 74  trcmp(x,"default
fdb0: 5f 64 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30  _destructor")==0
fdc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
fdd0: 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
fde0: 20 26 70 73 70 2d 3e 67 70 2d 3e 76 61 72 64 65   &psp->gp->varde
fdf0: 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  st;.          ps
fe00: 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20  p->decllnslot = 
fe10: 26 70 73 70 2d 3e 67 70 2d 3e 76 61 72 64 65 73  &psp->gp->vardes
fe20: 74 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  tln;..}else if( 
fe30: 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65 6e 5f  strcmp(x,"token_
fe40: 70 72 65 66 69 78 22 29 3d 3d 30 20 29 7b 0a 20  prefix")==0 ){. 
fe50: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
fe60: 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70  clargslot = &psp
fe70: 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69  ->gp->tokenprefi
fe80: 78 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74  x;..}else if( st
fe90: 72 63 6d 70 28 78 2c 22 73 79 6e 74 61 78 5f 65  rcmp(x,"syntax_e
fea0: 72 72 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  rror")==0 ){.   
feb0: 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
fec0: 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d  argslot = &(psp-
fed0: 3e 67 70 2d 3e 65 72 72 6f 72 29 3b 0a 20 20 20  >gp->error);.   
fee0: 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
fef0: 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67  lnslot = &psp->g
ff00: 70 2d 3e 65 72 72 6f 72 6c 6e 3b 0a 09 7d 65 6c  p->errorln;..}el
ff10: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
ff20: 22 70 61 72 73 65 5f 61 63 63 65 70 74 22 29 3d  "parse_accept")=
ff30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
ff40: 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
ff50: 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 61 63   = &(psp->gp->ac
ff60: 63 65 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20  cept);.         
ff70: 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74   psp->decllnslot
ff80: 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 61 63 63   = &psp->gp->acc
ff90: 65 70 74 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66  eptln;..}else if
ffa0: 28 20 73 74 72 63 6d 70 28 78 2c 22 70 61 72 73  ( strcmp(x,"pars
ffb0: 65 5f 66 61 69 6c 75 72 65 22 29 3d 3d 30 20 29  e_failure")==0 )
ffc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
ffd0: 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
ffe0: 28 70 73 70 2d 3e 67 70 2d 3e 66 61 69 6c 75 72  (psp->gp->failur
fff0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  e);.          ps
10000 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20  p->decllnslot = 
10010 26 70 73 70 2d 3e 67 70 2d 3e 66 61 69 6c 75 72  &psp->gp->failur
10020 65 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  eln;..}else if( 
10030 73 74 72 63 6d 70 28 78 2c 22 73 74 61 63 6b 5f  strcmp(x,"stack_
10040 6f 76 65 72 66 6c 6f 77 22 29 3d 3d 30 20 29 7b  overflow")==0 ){
10050 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10060 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
10070 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72 66 6c 6f  psp->gp->overflo
10080 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  w);.          ps
10090 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20  p->decllnslot = 
100a0 26 70 73 70 2d 3e 67 70 2d 3e 6f 76 65 72 66 6c  &psp->gp->overfl
100b0 6f 77 6c 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65  owln;.        }e
100c0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
100d0 2c 22 65 78 74 72 61 5f 61 72 67 75 6d 65 6e 74  ,"extra_argument
100e0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
100f0 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73     psp->declargs
10100 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d  lot = &(psp->gp-
10110 3e 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  >arg);.        }
10120 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10130 78 2c 22 74 6f 6b 65 6e 5f 74 79 70 65 22 29 3d  x,"token_type")=
10140 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10150 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
10160 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 74 6f   = &(psp->gp->to
10170 6b 65 6e 74 79 70 65 29 3b 0a 20 20 20 20 20 20  kentype);.      
10180 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
10190 6d 70 28 78 2c 22 64 65 66 61 75 6c 74 5f 74 79  mp(x,"default_ty
101a0 70 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pe")==0 ){.     
101b0 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
101c0 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
101d0 70 2d 3e 76 61 72 74 79 70 65 29 3b 0a 20 20 20  p->vartype);.   
101e0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
101f0 74 72 63 6d 70 28 78 2c 22 73 74 61 63 6b 5f 73  trcmp(x,"stack_s
10200 69 7a 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ize")==0 ){.    
10210 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
10220 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e  rgslot = &(psp->
10230 67 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b 0a  gp->stacksize);.
10240 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
10250 28 20 73 74 72 63 6d 70 28 78 2c 22 73 74 61 72  ( strcmp(x,"star
10260 74 5f 73 79 6d 62 6f 6c 22 29 3d 3d 30 20 29 7b  t_symbol")==0 ){
10270 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10280 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28  declargslot = &(
10290 70 73 70 2d 3e 67 70 2d 3e 73 74 61 72 74 29 3b  psp->gp->start);
102a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
102b0 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6c 65 66  f( strcmp(x,"lef
102c0 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
102d0 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75      psp->preccou
102e0 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nter++;.        
102f0 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63    psp->declassoc
10300 20 3d 20 4c 45 46 54 3b 0a 20 20 20 20 20 20 20   = LEFT;.       
10310 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
10320 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43  WAITING_FOR_PREC
10330 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20  EDENCE_SYMBOL;. 
10340 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
10350 20 73 74 72 63 6d 70 28 78 2c 22 72 69 67 68 74   strcmp(x,"right
10360 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
10370 20 20 20 70 73 70 2d 3e 70 72 65 63 63 6f 75 6e     psp->preccoun
10380 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  ter++;.         
10390 20 70 73 70 2d 3e 64 65 63 6c 61 73 73 6f 63 20   psp->declassoc 
103a0 3d 20 52 49 47 48 54 3b 0a 20 20 20 20 20 20 20  = RIGHT;.       
103b0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
103c0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43  WAITING_FOR_PREC
103d0 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b 0a 20  EDENCE_SYMBOL;. 
103e0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
103f0 20 73 74 72 63 6d 70 28 78 2c 22 6e 6f 6e 61 73   strcmp(x,"nonas
10400 73 6f 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  soc")==0 ){.    
10410 20 20 20 20 20 20 70 73 70 2d 3e 70 72 65 63 63        psp->precc
10420 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 20 20  ounter++;.      
10430 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 73 73      psp->declass
10440 6f 63 20 3d 20 4e 4f 4e 45 3b 0a 20 20 20 20 20  oc = NONE;.     
10450 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10460 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 50 52  = WAITING_FOR_PR
10470 45 43 45 44 45 4e 43 45 5f 53 59 4d 42 4f 4c 3b  ECEDENCE_SYMBOL;
10480 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63  ..}else if( strc
10490 6d 70 28 78 2c 22 64 65 73 74 72 75 63 74 6f 72  mp(x,"destructor
104a0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
104b0 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
104c0 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54  WAITING_FOR_DEST
104d0 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 3b 0a 09  RUCTOR_SYMBOL;..
104e0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
104f0 28 78 2c 22 74 79 70 65 22 29 3d 3d 30 20 29 7b  (x,"type")==0 ){
10500 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10510 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f  state = WAITING_
10520 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59 4d  FOR_DATATYPE_SYM
10530 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  BOL;.        }el
10540 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
10550 22 66 61 6c 6c 62 61 63 6b 22 29 3d 3d 30 20 29  "fallback")==0 )
10560 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
10570 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  >fallback = 0;. 
10580 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74           psp->st
10590 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f  ate = WAITING_FO
105a0 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3b 0a 20  R_FALLBACK_ID;. 
105b0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
105c0 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
105d0 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
105e0 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
105f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 55 6e  .            "Un
10600 6b 6e 6f 77 6e 20 64 65 63 6c 61 72 61 74 69 6f  known declaratio
10610 6e 20 6b 65 79 77 6f 72 64 3a 20 5c 22 25 25 25  n keyword: \"%%%
10620 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20  s\".",x);.      
10630 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e      psp->errorcn
10640 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t++;.          p
10650 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
10660 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45 52  NC_AFTER_DECL_ER
10670 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65  ROR;..}.      }e
10680 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
10690 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
106a0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
106b0 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
106c0 22 49 6c 6c 65 67 61 6c 20 64 65 63 6c 61 72 61  "Illegal declara
106d0 74 69 6f 6e 20 6b 65 79 77 6f 72 64 3a 20 5c 22  tion keyword: \"
106e0 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20  %s\".",x);.     
106f0 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
10700 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
10710 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
10720 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
10730 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10740 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
10750 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54  WAITING_FOR_DEST
10760 52 55 43 54 4f 52 5f 53 59 4d 42 4f 4c 3a 0a 20  RUCTOR_SYMBOL:. 
10770 20 20 20 20 20 69 66 28 20 21 69 73 61 6c 70 68       if( !isalph
10780 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  a(x[0]) ){.     
10790 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
107a0 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
107b0 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
107c0 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61        "Symbol na
107d0 6d 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72  me missing after
107e0 20 25 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79   %destructor key
107f0 77 6f 72 64 22 29 3b 0a 20 20 20 20 20 20 20 20  word");.        
10800 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
10810 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
10820 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
10830 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20  ER_DECL_ERROR;. 
10840 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10850 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
10860 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e  l *sp = Symbol_n
10870 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ew(x);.        p
10880 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
10890 3d 20 26 73 70 2d 3e 64 65 73 74 72 75 63 74 6f  = &sp->destructo
108a0 72 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  r;.        psp->
108b0 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 73 70  decllnslot = &sp
108c0 2d 3e 64 65 73 74 72 75 63 74 6f 72 6c 6e 3b 0a  ->destructorln;.
108d0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
108e0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
108f0 5f 44 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20  _DECL_ARG;.     
10900 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
10910 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
10920 5f 46 4f 52 5f 44 41 54 41 54 59 50 45 5f 53 59  _FOR_DATATYPE_SY
10930 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20  MBOL:.      if( 
10940 21 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20 29  !isalpha(x[0]) )
10950 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
10960 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
10970 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
10980 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 53 79  o,.          "Sy
10990 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73 69 6e  mbol name missin
109a0 67 20 61 66 74 65 72 20 25 64 65 73 74 72 75 63  g after %destruc
109b0 74 6f 72 20 6b 65 79 77 6f 72 64 22 29 3b 0a 20  tor keyword");. 
109c0 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f         psp->erro
109d0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  rcnt++;.        
109e0 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53  psp->state = RES
109f0 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f 45  YNC_AFTER_DECL_E
10a00 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RROR;.      }els
10a10 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  e{.        struc
10a20 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 53  t symbol *sp = S
10a30 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20  ymbol_new(x);.  
10a40 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61        psp->decla
10a50 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 61  rgslot = &sp->da
10a60 74 61 74 79 70 65 3b 0a 20 20 20 20 20 20 20 20  tatype;.        
10a70 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20  psp->decllnslot 
10a80 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70  = 0;.        psp
10a90 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
10aa0 47 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3b 0a  G_FOR_DECL_ARG;.
10ab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
10ac0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
10ad0 49 54 49 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44  ITING_FOR_PRECED
10ae0 45 4e 43 45 5f 53 59 4d 42 4f 4c 3a 0a 20 20 20  ENCE_SYMBOL:.   
10af0 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27     if( x[0]=='.'
10b00 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   ){.        psp-
10b10 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
10b20 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
10b30 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
10b40 66 28 20 69 73 75 70 70 65 72 28 78 5b 30 5d 29  f( isupper(x[0])
10b50 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72 75   ){.        stru
10b60 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20  ct symbol *sp;. 
10b70 20 20 20 20 20 20 20 73 70 20 3d 20 53 79 6d 62         sp = Symb
10b80 6f 6c 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20  ol_new(x);.     
10b90 20 20 20 69 66 28 20 73 70 2d 3e 70 72 65 63 3e     if( sp->prec>
10ba0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10bb0 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
10bc0 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
10bd0 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
10be0 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 5c 22 25       "Symbol \"%
10bf0 73 5c 22 20 68 61 73 20 61 6c 72 65 61 64 79 20  s\" has already 
10c00 62 65 20 67 69 76 65 6e 20 61 20 70 72 65 63 65  be given a prece
10c10 64 65 6e 63 65 2e 22 2c 78 29 3b 0a 20 20 20 20  dence.",x);.    
10c20 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
10c30 63 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65 7b 0a 20  cnt++;..}else{. 
10c40 20 20 20 20 20 20 20 20 20 73 70 2d 3e 70 72 65           sp->pre
10c50 63 20 3d 20 70 73 70 2d 3e 70 72 65 63 63 6f 75  c = psp->preccou
10c60 6e 74 65 72 3b 0a 20 20 20 20 20 20 20 20 20 20  nter;.          
10c70 73 70 2d 3e 61 73 73 6f 63 20 3d 20 70 73 70 2d  sp->assoc = psp-
10c80 3e 64 65 63 6c 61 73 73 6f 63 3b 0a 09 7d 0a 20  >declassoc;..}. 
10c90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10ca0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
10cb0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
10cc0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
10cd0 20 20 20 20 20 20 20 22 43 61 6e 27 74 20 61 73         "Can't as
10ce0 73 69 67 6e 20 61 20 70 72 65 63 65 64 65 6e 63  sign a precedenc
10cf0 65 20 74 6f 20 5c 22 25 73 5c 22 2e 22 2c 78 29  e to \"%s\".",x)
10d00 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
10d10 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
10d20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
10d30 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
10d40 5f 46 4f 52 5f 44 45 43 4c 5f 41 52 47 3a 0a 20  _FOR_DECL_ARG:. 
10d50 20 20 20 20 20 69 66 28 20 28 78 5b 30 5d 3d 3d       if( (x[0]==
10d60 27 7b 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 5c 22  '{' || x[0]=='\"
10d70 27 20 7c 7c 20 69 73 61 6c 6e 75 6d 28 78 5b 30  ' || isalnum(x[0
10d80 5d 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ])) ){.        i
10d90 66 28 20 2a 28 70 73 70 2d 3e 64 65 63 6c 61 72  f( *(psp->declar
10da0 67 73 6c 6f 74 29 21 3d 30 20 29 7b 0a 20 20 20  gslot)!=0 ){.   
10db0 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
10dc0 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
10dd0 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
10de0 20 20 20 20 20 20 20 20 20 20 20 20 22 54 68 65              "The
10df0 20 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22   argument \"%s\"
10e00 20 74 6f 20 64 65 63 6c 61 72 61 74 69 6f 6e 20   to declaration 
10e10 5c 22 25 25 25 73 5c 22 20 69 73 20 6e 6f 74 20  \"%%%s\" is not 
10e20 74 68 65 20 66 69 72 73 74 2e 22 2c 0a 20 20 20  the first.",.   
10e30 20 20 20 20 20 20 20 20 20 78 5b 30 5d 3d 3d 27           x[0]=='
10e40 5c 22 27 20 3f 20 26 78 5b 31 5d 20 3a 20 78 2c  \"' ? &x[1] : x,
10e50 70 73 70 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64  psp->declkeyword
10e60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
10e70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
10e80 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
10e90 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
10ea0 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  R_DECL_ERROR;..}
10eb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
10ec0 2a 28 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c  *(psp->declargsl
10ed0 6f 74 29 20 3d 20 28 78 5b 30 5d 3d 3d 27 5c 22  ot) = (x[0]=='\"
10ee0 27 20 7c 7c 20 78 5b 30 5d 3d 3d 27 7b 27 29 20  ' || x[0]=='{') 
10ef0 3f 20 26 78 5b 31 5d 20 3a 20 78 3b 0a 20 20 20  ? &x[1] : x;.   
10f00 20 20 20 20 20 20 20 69 66 28 20 70 73 70 2d 3e         if( psp->
10f10 64 65 63 6c 6c 6e 73 6c 6f 74 20 29 20 2a 70 73  decllnslot ) *ps
10f20 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20  p->decllnslot = 
10f30 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
10f40 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
10f50 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
10f60 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
10f70 45 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73  E;..}.      }els
10f80 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72  e{.        Error
10f90 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d  Msg(psp->filenam
10fa0 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  e,psp->tokenline
10fb0 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 49  no,.          "I
10fc0 6c 6c 65 67 61 6c 20 61 72 67 75 6d 65 6e 74 20  llegal argument 
10fd0 74 6f 20 25 25 25 73 3a 20 25 73 22 2c 70 73 70  to %%%s: %s",psp
10fe0 2d 3e 64 65 63 6c 6b 65 79 77 6f 72 64 2c 78 29  ->declkeyword,x)
10ff0 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
11000 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
11010 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
11020 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
11030 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  L_ERROR;.      }
11040 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11050 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
11060 4f 52 5f 46 41 4c 4c 42 41 43 4b 5f 49 44 3a 0a  OR_FALLBACK_ID:.
11070 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
11080 27 2e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  '.' ){.        p
11090 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
110a0 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
110b0 52 55 4c 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RULE;.      }els
110c0 65 20 69 66 28 20 21 69 73 75 70 70 65 72 28 78  e if( !isupper(x
110d0 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
110e0 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
110f0 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b  lename, psp->tok
11100 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
11110 20 20 20 20 22 25 25 66 61 6c 6c 62 61 63 6b 20      "%%fallback 
11120 61 72 67 75 6d 65 6e 74 20 5c 22 25 73 5c 22 20  argument \"%s\" 
11130 73 68 6f 75 6c 64 20 62 65 20 61 20 74 6f 6b 65  should be a toke
11140 6e 22 2c 20 78 29 3b 0a 20 20 20 20 20 20 20 20  n", x);.        
11150 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
11160 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11170 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
11180 62 6f 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c  bol *sp = Symbol
11190 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20  _new(x);.       
111a0 20 69 66 28 20 70 73 70 2d 3e 66 61 6c 6c 62 61   if( psp->fallba
111b0 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ck==0 ){.       
111c0 20 20 20 70 73 70 2d 3e 66 61 6c 6c 62 61 63 6b     psp->fallback
111d0 20 3d 20 73 70 3b 0a 20 20 20 20 20 20 20 20 7d   = sp;.        }
111e0 65 6c 73 65 20 69 66 28 20 73 70 2d 3e 66 61 6c  else if( sp->fal
111f0 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lback ){.       
11200 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
11210 3e 66 69 6c 65 6e 61 6d 65 2c 20 70 73 70 2d 3e  >filename, psp->
11220 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
11230 20 20 20 20 20 20 20 20 20 22 4d 6f 72 65 20 74           "More t
11240 68 61 6e 20 6f 6e 65 20 66 61 6c 6c 62 61 63 6b  han one fallback
11250 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 6f 6b   assigned to tok
11260 65 6e 20 25 73 22 2c 20 78 29 3b 0a 20 20 20 20  en %s", x);.    
11270 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
11280 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  cnt++;.        }
11290 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
112a0 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 70  sp->fallback = p
112b0 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 3b 0a 20 20  sp->fallback;.  
112c0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 67 70 2d          psp->gp-
112d0 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 3d 20  >has_fallback = 
112e0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
112f0 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
11300 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 59 4e  ;.    case RESYN
11310 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
11320 4f 52 3a 0a 2f 2a 20 20 20 20 20 20 69 66 28 20  OR:./*      if( 
11330 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70 2d  x[0]=='.' ) psp-
11340 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
11350 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c  _FOR_DECL_OR_RUL
11360 45 3b 0a 2a 2a 20 20 20 20 20 20 62 72 65 61 6b  E;.**      break
11370 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 52 45  ; */.    case RE
11380 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
11390 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 69 66 28  ERROR:.      if(
113a0 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 20 70 73 70   x[0]=='.' ) psp
113b0 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e  ->state = WAITIN
113c0 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f 52 55  G_FOR_DECL_OR_RU
113d0 4c 45 3b 0a 20 20 20 20 20 20 69 66 28 20 78 5b  LE;.      if( x[
113e0 30 5d 3d 3d 27 25 27 20 29 20 70 73 70 2d 3e 73  0]=='%' ) psp->s
113f0 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46  tate = WAITING_F
11400 4f 52 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b  OR_DECL_KEYWORD;
11410 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11420 7d 0a 7d 0a 0a 2f 2a 20 49 6e 20 73 70 69 74 65  }.}../* In spite
11430 20 6f 66 20 69 74 73 20 6e 61 6d 65 2c 20 74 68   of its name, th
11440 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  is function is r
11450 65 61 6c 6c 79 20 61 20 73 63 61 6e 6e 65 72 2e  eally a scanner.
11460 20 20 49 74 20 72 65 61 64 0a 2a 2a 20 69 6e 20    It read.** in 
11470 74 68 65 20 65 6e 74 69 72 65 20 69 6e 70 75 74  the entire input
11480 20 66 69 6c 65 20 28 61 6c 6c 20 61 74 20 6f 6e   file (all at on
11490 63 65 29 20 74 68 65 6e 20 74 6f 6b 65 6e 69 7a  ce) then tokeniz
114a0 65 73 20 69 74 2e 20 20 45 61 63 68 0a 2a 2a 20  es it.  Each.** 
114b0 74 6f 6b 65 6e 20 69 73 20 70 61 73 73 65 64 20  token is passed 
114c0 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
114d0 22 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 22 20  "parseonetoken" 
114e0 77 68 69 63 68 20 62 75 69 6c 64 73 20 61 6c 6c  which builds all
114f0 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69  .** the appropri
11500 61 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ate data structu
11510 72 65 73 20 69 6e 20 74 68 65 20 67 6c 6f 62 61  res in the globa
11520 6c 20 73 74 61 74 65 20 76 65 63 74 6f 72 20 22  l state vector "
11530 67 70 22 2e 0a 2a 2f 0a 76 6f 69 64 20 50 61 72  gp"..*/.void Par
11540 73 65 28 67 70 29 0a 73 74 72 75 63 74 20 6c 65  se(gp).struct le
11550 6d 6f 6e 20 2a 67 70 3b 0a 7b 0a 20 20 73 74 72  mon *gp;.{.  str
11560 75 63 74 20 70 73 74 61 74 65 20 70 73 3b 0a 20  uct pstate ps;. 
11570 20 46 49 4c 45 20 2a 66 70 3b 0a 20 20 63 68 61   FILE *fp;.  cha
11580 72 20 2a 66 69 6c 65 62 75 66 3b 0a 20 20 69 6e  r *filebuf;.  in
11590 74 20 66 69 6c 65 73 69 7a 65 3b 0a 20 20 69 6e  t filesize;.  in
115a0 74 20 6c 69 6e 65 6e 6f 3b 0a 20 20 69 6e 74 20  t lineno;.  int 
115b0 63 3b 0a 20 20 63 68 61 72 20 2a 63 70 2c 20 2a  c;.  char *cp, *
115c0 6e 65 78 74 63 70 3b 0a 20 20 69 6e 74 20 73 74  nextcp;.  int st
115d0 61 72 74 6c 69 6e 65 20 3d 20 30 3b 0a 0a 20 20  artline = 0;..  
115e0 70 73 2e 67 70 20 3d 20 67 70 3b 0a 20 20 70 73  ps.gp = gp;.  ps
115f0 2e 66 69 6c 65 6e 61 6d 65 20 3d 20 67 70 2d 3e  .filename = gp->
11600 66 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 73 2e 65  filename;.  ps.e
11610 72 72 6f 72 63 6e 74 20 3d 20 30 3b 0a 20 20 70  rrorcnt = 0;.  p
11620 73 2e 73 74 61 74 65 20 3d 20 49 4e 49 54 49 41  s.state = INITIA
11630 4c 49 5a 45 3b 0a 0a 20 20 2f 2a 20 42 65 67 69  LIZE;..  /* Begi
11640 6e 20 62 79 20 72 65 61 64 69 6e 67 20 74 68 65  n by reading the
11650 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
11660 20 66 70 20 3d 20 66 6f 70 65 6e 28 70 73 2e 66   fp = fopen(ps.f
11670 69 6c 65 6e 61 6d 65 2c 22 72 62 22 29 3b 0a 20  ilename,"rb");. 
11680 20 69 66 28 20 66 70 3d 3d 30 20 29 7b 0a 20 20   if( fp==0 ){.  
11690 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69    ErrorMsg(ps.fi
116a0 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20  lename,0,"Can't 
116b0 6f 70 65 6e 20 74 68 69 73 20 66 69 6c 65 20 66  open this file f
116c0 6f 72 20 72 65 61 64 69 6e 67 2e 22 29 3b 0a 20  or reading.");. 
116d0 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 2b     gp->errorcnt+
116e0 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  +;.    return;. 
116f0 20 7d 0a 20 20 66 73 65 65 6b 28 66 70 2c 30 2c   }.  fseek(fp,0,
11700 32 29 3b 0a 20 20 66 69 6c 65 73 69 7a 65 20 3d  2);.  filesize =
11710 20 66 74 65 6c 6c 28 66 70 29 3b 0a 20 20 72 65   ftell(fp);.  re
11720 77 69 6e 64 28 66 70 29 3b 0a 20 20 66 69 6c 65  wind(fp);.  file
11730 62 75 66 20 3d 20 28 63 68 61 72 20 2a 29 6d 61  buf = (char *)ma
11740 6c 6c 6f 63 28 20 66 69 6c 65 73 69 7a 65 2b 31  lloc( filesize+1
11750 20 29 3b 0a 20 20 69 66 28 20 66 69 6c 65 62 75   );.  if( filebu
11760 66 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f  f==0 ){.    Erro
11770 72 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65  rMsg(ps.filename
11780 2c 30 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63 61  ,0,"Can't alloca
11790 74 65 20 25 64 20 6f 66 20 6d 65 6d 6f 72 79 20  te %d of memory 
117a0 74 6f 20 68 6f 6c 64 20 74 68 69 73 20 66 69 6c  to hold this fil
117b0 65 2e 22 2c 0a 20 20 20 20 20 20 66 69 6c 65 73  e.",.      files
117c0 69 7a 65 2b 31 29 3b 0a 20 20 20 20 67 70 2d 3e  ize+1);.    gp->
117d0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
117e0 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
117f0 28 20 66 72 65 61 64 28 66 69 6c 65 62 75 66 2c  ( fread(filebuf,
11800 31 2c 66 69 6c 65 73 69 7a 65 2c 66 70 29 21 3d  1,filesize,fp)!=
11810 66 69 6c 65 73 69 7a 65 20 29 7b 0a 20 20 20 20  filesize ){.    
11820 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c 65  ErrorMsg(ps.file
11830 6e 61 6d 65 2c 30 2c 22 43 61 6e 27 74 20 72 65  name,0,"Can't re
11840 61 64 20 69 6e 20 61 6c 6c 20 25 64 20 62 79 74  ad in all %d byt
11850 65 73 20 6f 66 20 74 68 69 73 20 66 69 6c 65 2e  es of this file.
11860 22 2c 0a 20 20 20 20 20 20 66 69 6c 65 73 69 7a  ",.      filesiz
11870 65 29 3b 0a 20 20 20 20 66 72 65 65 28 66 69 6c  e);.    free(fil
11880 65 62 75 66 29 3b 0a 20 20 20 20 67 70 2d 3e 65  ebuf);.    gp->e
11890 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72  rrorcnt++;.    r
118a0 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 63 6c  eturn;.  }.  fcl
118b0 6f 73 65 28 66 70 29 3b 0a 20 20 66 69 6c 65 62  ose(fp);.  fileb
118c0 75 66 5b 66 69 6c 65 73 69 7a 65 5d 20 3d 20 30  uf[filesize] = 0
118d0 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 73 63 61 6e  ;..  /* Now scan
118e0 20 74 68 65 20 74 65 78 74 20 6f 66 20 74 68 65   the text of the
118f0 20 69 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20   input file */. 
11900 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 66   lineno = 1;.  f
11910 6f 72 28 63 70 3d 66 69 6c 65 62 75 66 3b 20 28  or(cp=filebuf; (
11920 63 3d 20 2a 63 70 29 21 3d 30 3b 20 29 7b 0a 20  c= *cp)!=0; ){. 
11930 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
11940 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 20 20 20 20 20   lineno++;      
11950 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 65 70 20          /* Keep 
11960 74 72 61 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e  track of the lin
11970 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20  e number */.    
11980 69 66 28 20 69 73 73 70 61 63 65 28 63 29 20 29  if( isspace(c) )
11990 7b 20 63 70 2b 2b 3b 20 63 6f 6e 74 69 6e 75 65  { cp++; continue
119a0 3b 20 7d 20 20 2f 2a 20 53 6b 69 70 20 61 6c 6c  ; }  /* Skip all
119b0 20 77 68 69 74 65 20 73 70 61 63 65 20 2a 2f 0a   white space */.
119c0 20 20 20 20 69 66 28 20 63 3d 3d 27 2f 27 20 26      if( c=='/' &
119d0 26 20 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20  & cp[1]=='/' ){ 
119e0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70           /* Skip
119f0 20 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65   C++ style comme
11a00 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b  nts */.      cp+
11a10 3d 32 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  =2;.      while(
11a20 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
11a30 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b 0a  c!='\n' ) cp++;.
11a40 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
11a50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d      }.    if( c=
11a60 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d 27  ='/' && cp[1]=='
11a70 2a 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 2f  *' ){          /
11a80 2a 20 53 6b 69 70 20 43 20 73 74 79 6c 65 20 63  * Skip C style c
11a90 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  omments */.     
11aa0 20 63 70 2b 3d 32 3b 0a 20 20 20 20 20 20 77 68   cp+=2;.      wh
11ab0 69 6c 65 28 20 28 63 3d 20 2a 63 70 29 21 3d 30  ile( (c= *cp)!=0
11ac0 20 26 26 20 28 63 21 3d 27 2f 27 20 7c 7c 20 63   && (c!='/' || c
11ad0 70 5b 2d 31 5d 21 3d 27 2a 27 29 20 29 7b 0a 20  p[-1]!='*') ){. 
11ae0 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c         if( c=='\
11af0 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n' ) lineno++;. 
11b00 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20         cp++;.   
11b10 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
11b20 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63   ) cp++;.      c
11b30 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
11b40 20 20 20 70 73 2e 74 6f 6b 65 6e 73 74 61 72 74     ps.tokenstart
11b50 20 3d 20 63 70 3b 20 20 20 20 20 20 20 20 20 20   = cp;          
11b60 20 20 20 20 20 20 2f 2a 20 4d 61 72 6b 20 74 68        /* Mark th
11b70 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
11b80 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20  he token */.    
11b90 70 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 20 3d  ps.tokenlineno =
11ba0 20 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20 20 20   lineno;        
11bb0 20 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65 72     /* Linenumber
11bc0 20 6f 6e 20 77 68 69 63 68 20 74 6f 6b 65 6e 20   on which token 
11bd0 62 65 67 69 6e 73 20 2a 2f 0a 20 20 20 20 69 66  begins */.    if
11be0 28 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20 20  ( c=='\"' ){    
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c00 20 2f 2a 20 53 74 72 69 6e 67 20 6c 69 74 65 72   /* String liter
11c10 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b  als */.      cp+
11c20 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  +;.      while( 
11c30 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 63  (c= *cp)!=0 && c
11c40 21 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20  !='\"' ){.      
11c50 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
11c60 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
11c70 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a    cp++;.      }.
11c80 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
11c90 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
11ca0 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 73  sg(ps.filename,s
11cb0 74 61 72 74 6c 69 6e 65 2c 0a 22 53 74 72 69 6e  tartline,."Strin
11cc0 67 20 73 74 61 72 74 69 6e 67 20 6f 6e 20 74 68  g starting on th
11cd0 69 73 20 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74  is line is not t
11ce0 65 72 6d 69 6e 61 74 65 64 20 62 65 66 6f 72 65  erminated before
11cf0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
11d00 66 69 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20  file.");.       
11d10 20 70 73 2e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a   ps.errorcnt++;.
11d20 20 20 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d          nextcp =
11d30 20 63 70 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   cp;.      }else
11d40 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 63 70  {.        nextcp
11d50 20 3d 20 63 70 2b 31 3b 0a 20 20 20 20 20 20 7d   = cp+1;.      }
11d60 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
11d70 3d 3d 27 7b 27 20 29 7b 20 20 20 20 20 20 20 20  =='{' ){        
11d80 20 20 20 20 20 20 20 2f 2a 20 41 20 62 6c 6f 63         /* A bloc
11d90 6b 20 6f 66 20 43 20 63 6f 64 65 20 2a 2f 0a 20  k of C code */. 
11da0 20 20 20 20 20 69 6e 74 20 6c 65 76 65 6c 3b 0a       int level;.
11db0 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20        cp++;.    
11dc0 20 20 66 6f 72 28 6c 65 76 65 6c 3d 31 3b 20 28    for(level=1; (
11dd0 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 6c  c= *cp)!=0 && (l
11de0 65 76 65 6c 3e 31 20 7c 7c 20 63 21 3d 27 7d 27  evel>1 || c!='}'
11df0 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ); cp++){.      
11e00 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20    if( c=='\n' ) 
11e10 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20  lineno++;.      
11e20 20 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b    else if( c=='{
11e30 27 20 29 20 6c 65 76 65 6c 2b 2b 3b 0a 20 20 20  ' ) level++;.   
11e40 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 63 3d       else if( c=
11e50 3d 27 7d 27 20 29 20 6c 65 76 65 6c 2d 2d 3b 0a  ='}' ) level--;.
11e60 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28          else if(
11e70 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d   c=='/' && cp[1]
11e80 3d 3d 27 2a 27 20 29 7b 20 20 2f 2a 20 53 6b 69  =='*' ){  /* Ski
11e90 70 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a 20 20  p comments */.  
11ea0 20 20 20 20 20 20 20 20 69 6e 74 20 70 72 65 76          int prev
11eb0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 63 70 20  c;.          cp 
11ec0 3d 20 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20  = &cp[2];.      
11ed0 20 20 20 20 70 72 65 76 63 20 3d 20 30 3b 0a 20      prevc = 0;. 
11ee0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
11ef0 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28  (c= *cp)!=0 && (
11f00 63 21 3d 27 2f 27 20 7c 7c 20 70 72 65 76 63 21  c!='/' || prevc!
11f10 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20 20 20 20  ='*') ){.       
11f20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
11f30 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20   ) lineno++;.   
11f40 20 20 20 20 20 20 20 20 20 70 72 65 76 63 20 3d           prevc =
11f50 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   c;.            
11f60 63 70 2b 2b 3b 0a 09 20 20 7d 0a 09 7d 65 6c 73  cp++;..  }..}els
11f70 65 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26 20  e if( c=='/' && 
11f80 63 70 5b 31 5d 3d 3d 27 2f 27 20 29 7b 20 20 2f  cp[1]=='/' ){  /
11f90 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74 79 6c 65  * Skip C++ style
11fa0 20 63 6f 6d 6d 65 6e 74 73 20 74 6f 6f 20 2a 2f   comments too */
11fb0 0a 20 20 20 20 20 20 20 20 20 20 63 70 20 3d 20  .          cp = 
11fc0 26 63 70 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20  &cp[2];.        
11fd0 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70    while( (c= *cp
11fe0 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20  )!=0 && c!='\n' 
11ff0 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 20 20  ) cp++;.        
12000 20 20 69 66 28 20 63 20 29 20 6c 69 6e 65 6e 6f    if( c ) lineno
12010 2b 2b 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20 63  ++;..}else if( c
12020 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 5c 22  =='\'' || c=='\"
12030 27 20 29 7b 20 20 20 20 2f 2a 20 53 74 72 69 6e  ' ){    /* Strin
12040 67 20 61 20 63 68 61 72 61 63 74 65 72 20 6c 69  g a character li
12050 74 65 72 61 6c 73 20 2a 2f 0a 20 20 20 20 20 20  terals */.      
12060 20 20 20 20 69 6e 74 20 73 74 61 72 74 63 68 61      int startcha
12070 72 2c 20 70 72 65 76 63 3b 0a 20 20 20 20 20 20  r, prevc;.      
12080 20 20 20 20 73 74 61 72 74 63 68 61 72 20 3d 20      startchar = 
12090 63 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65  c;.          pre
120a0 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  vc = 0;.        
120b0 20 20 66 6f 72 28 63 70 2b 2b 3b 20 28 63 3d 20    for(cp++; (c= 
120c0 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21 3d 73  *cp)!=0 && (c!=s
120d0 74 61 72 74 63 68 61 72 20 7c 7c 20 70 72 65 76  tartchar || prev
120e0 63 3d 3d 27 5c 5c 27 29 3b 20 63 70 2b 2b 29 7b  c=='\\'); cp++){
120f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
12100 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e   c=='\n' ) linen
12110 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  o++;.           
12120 20 69 66 28 20 70 72 65 76 63 3d 3d 27 5c 5c 27   if( prevc=='\\'
12130 20 29 20 70 72 65 76 63 20 3d 20 30 3b 0a 20 20   ) prevc = 0;.  
12140 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 20            else  
12150 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 76              prev
12160 63 20 3d 20 63 3b 0a 09 20 20 7d 0a 09 7d 0a 20  c = c;..  }..}. 
12170 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12180 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
12190 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66 69 6c   ErrorMsg(ps.fil
121a0 65 6e 61 6d 65 2c 70 73 2e 74 6f 6b 65 6e 6c 69  ename,ps.tokenli
121b0 6e 65 6e 6f 2c 0a 22 43 20 63 6f 64 65 20 73 74  neno,."C code st
121c0 61 72 74 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c  arting on this l
121d0 69 6e 65 20 69 73 20 6e 6f 74 20 74 65 72 6d 69  ine is not termi
121e0 6e 61 74 65 64 20 62 65 66 6f 72 65 20 74 68 65  nated before the
121f0 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
12200 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70 73 2e  .");.        ps.
12210 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
12220 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b      nextcp = cp;
12230 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
12240 20 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63        nextcp = c
12250 70 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p+1;.      }.   
12260 20 7d 65 6c 73 65 20 69 66 28 20 69 73 61 6c 6e   }else if( isaln
12270 75 6d 28 63 29 20 29 7b 20 20 20 20 20 20 20 20  um(c) ){        
12280 20 20 2f 2a 20 49 64 65 6e 74 69 66 69 65 72 73    /* Identifiers
12290 20 2a 2f 0a 20 20 20 20 20 20 77 68 69 6c 65 28   */.      while(
122a0 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26 20   (c= *cp)!=0 && 
122b0 28 69 73 61 6c 6e 75 6d 28 63 29 20 7c 7c 20 63  (isalnum(c) || c
122c0 3d 3d 27 5f 27 29 20 29 20 63 70 2b 2b 3b 0a 20  =='_') ) cp++;. 
122d0 20 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70       nextcp = cp
122e0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
122f0 63 3d 3d 27 3a 27 20 26 26 20 63 70 5b 31 5d 3d  c==':' && cp[1]=
12300 3d 27 3a 27 20 26 26 20 63 70 5b 32 5d 3d 3d 27  =':' && cp[2]=='
12310 3d 27 20 29 7b 20 2f 2a 20 54 68 65 20 6f 70 65  =' ){ /* The ope
12320 72 61 74 6f 72 20 22 3a 3a 3d 22 20 2a 2f 0a 20  rator "::=" */. 
12330 20 20 20 20 20 63 70 20 2b 3d 20 33 3b 0a 20 20       cp += 3;.  
12340 20 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 3b      nextcp = cp;
12350 0a 20 20 20 20 7d 65 6c 73 65 7b 20 20 20 20 20  .    }else{     
12360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12370 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6f 74 68 65       /* All othe
12380 72 20 28 6f 6e 65 20 63 68 61 72 61 63 74 65 72  r (one character
12390 29 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20  ) operators */. 
123a0 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 20       cp++;.     
123b0 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20   nextcp = cp;.  
123c0 20 20 7d 0a 20 20 20 20 63 20 3d 20 2a 63 70 3b    }.    c = *cp;
123d0 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b 20 20 20  .    *cp = 0;   
123e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123f0 20 20 20 20 20 2f 2a 20 4e 75 6c 6c 20 74 65 72       /* Null ter
12400 6d 69 6e 61 74 65 20 74 68 65 20 74 6f 6b 65 6e  minate the token
12410 20 2a 2f 0a 20 20 20 20 70 61 72 73 65 6f 6e 65   */.    parseone
12420 74 6f 6b 65 6e 28 26 70 73 29 3b 20 20 20 20 20  token(&ps);     
12430 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65          /* Parse
12440 20 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20   the token */.  
12450 20 20 2a 63 70 20 3d 20 63 3b 20 20 20 20 20 20    *cp = c;      
12460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12470 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65    /* Restore the
12480 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 63   buffer */.    c
12490 70 20 3d 20 6e 65 78 74 63 70 3b 0a 20 20 7d 0a  p = nextcp;.  }.
124a0 20 20 66 72 65 65 28 66 69 6c 65 62 75 66 29 3b    free(filebuf);
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124c0 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
124d0 68 65 20 62 75 66 66 65 72 20 61 66 74 65 72 20  he buffer after 
124e0 70 61 72 73 69 6e 67 20 2a 2f 0a 20 20 67 70 2d  parsing */.  gp-
124f0 3e 72 75 6c 65 20 3d 20 70 73 2e 66 69 72 73 74  >rule = ps.first
12500 72 75 6c 65 3b 0a 20 20 67 70 2d 3e 65 72 72 6f  rule;.  gp->erro
12510 72 63 6e 74 20 3d 20 70 73 2e 65 72 72 6f 72 63  rcnt = ps.errorc
12520 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  nt;.}./*********
12530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12540 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
12550 20 22 70 6c 69 6e 6b 2e 63 22 20 2a 2a 2a 2a 2a   "plink.c" *****
12560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12570 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 73  /./*.** Routines
12580 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 6e 66   processing conf
12590 69 67 75 72 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77  iguration follow
125a0 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e  -set propagation
125b0 20 6c 69 6e 6b 73 0a 2a 2a 20 69 6e 20 74 68 65   links.** in the
125c0 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
125d0 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  nerator..*/.stat
125e0 69 63 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20  ic struct plink 
125f0 2a 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20  *plink_freelist 
12600 3d 20 30 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  = 0;../* Allocat
12610 65 20 61 20 6e 65 77 20 70 6c 69 6e 6b 20 2a 2f  e a new plink */
12620 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 50  .struct plink *P
12630 6c 69 6e 6b 5f 6e 65 77 28 29 7b 0a 20 20 73 74  link_new(){.  st
12640 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 3b  ruct plink *new;
12650 0a 0a 20 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72  ..  if( plink_fr
12660 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20  eelist==0 ){.   
12670 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
12680 61 6d 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 70  amt = 100;.    p
12690 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20  link_freelist = 
126a0 28 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 29  (struct plink *)
126b0 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
126c0 74 72 75 63 74 20 70 6c 69 6e 6b 29 2a 61 6d 74  truct plink)*amt
126d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 6c 69 6e   );.    if( plin
126e0 6b 5f 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b  k_freelist==0 ){
126f0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
12700 74 64 65 72 72 2c 0a 20 20 20 20 20 20 22 55 6e  tderr,.      "Un
12710 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
12720 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 20 6e 65   memory for a ne
12730 77 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72 6f  w follow-set pro
12740 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 2e 5c 6e  pagation link.\n
12750 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  ");.      exit(1
12760 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
12770 28 69 3d 30 3b 20 69 3c 61 6d 74 2d 31 3b 20 69  (i=0; i<amt-1; i
12780 2b 2b 29 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  ++) plink_freeli
12790 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 70 6c  st[i].next = &pl
127a0 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 2b 31  ink_freelist[i+1
127b0 5d 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72 65  ];.    plink_fre
127c0 65 6c 69 73 74 5b 61 6d 74 2d 31 5d 2e 6e 65 78  elist[amt-1].nex
127d0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 65 77  t = 0;.  }.  new
127e0 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73   = plink_freelis
127f0 74 3b 0a 20 20 70 6c 69 6e 6b 5f 66 72 65 65 6c  t;.  plink_freel
12800 69 73 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65  ist = plink_free
12810 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20 20 72 65  list->next;.  re
12820 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20  turn new;.}../* 
12830 41 64 64 20 61 20 70 6c 69 6e 6b 20 74 6f 20 61  Add a plink to a
12840 20 70 6c 69 6e 6b 20 6c 69 73 74 20 2a 2f 0a 76   plink list */.v
12850 6f 69 64 20 50 6c 69 6e 6b 5f 61 64 64 28 70 6c  oid Plink_add(pl
12860 70 70 2c 63 66 70 29 0a 73 74 72 75 63 74 20 70  pp,cfp).struct p
12870 6c 69 6e 6b 20 2a 2a 70 6c 70 70 3b 0a 73 74 72  link **plpp;.str
12880 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
12890 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  .{.  struct plin
128a0 6b 20 2a 6e 65 77 3b 0a 20 20 6e 65 77 20 3d 20  k *new;.  new = 
128b0 50 6c 69 6e 6b 5f 6e 65 77 28 29 3b 0a 20 20 6e  Plink_new();.  n
128c0 65 77 2d 3e 6e 65 78 74 20 3d 20 2a 70 6c 70 70  ew->next = *plpp
128d0 3b 0a 20 20 2a 70 6c 70 70 20 3d 20 6e 65 77 3b  ;.  *plpp = new;
128e0 0a 20 20 6e 65 77 2d 3e 63 66 70 20 3d 20 63 66  .  new->cfp = cf
128f0 70 3b 0a 7d 0a 0a 2f 2a 20 54 72 61 6e 73 66 65  p;.}../* Transfe
12900 72 20 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f 6e  r every plink on
12910 20 74 68 65 20 6c 69 73 74 20 22 66 72 6f 6d 22   the list "from"
12920 20 74 6f 20 74 68 65 20 6c 69 73 74 20 22 74 6f   to the list "to
12930 22 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  " */.void Plink_
12940 63 6f 70 79 28 74 6f 2c 66 72 6f 6d 29 0a 73 74  copy(to,from).st
12950 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 74 6f 3b  ruct plink **to;
12960 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 66  .struct plink *f
12970 72 6f 6d 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  rom;.{.  struct 
12980 70 6c 69 6e 6b 20 2a 6e 65 78 74 70 6c 3b 0a 20  plink *nextpl;. 
12990 20 77 68 69 6c 65 28 20 66 72 6f 6d 20 29 7b 0a   while( from ){.
129a0 20 20 20 20 6e 65 78 74 70 6c 20 3d 20 66 72 6f      nextpl = fro
129b0 6d 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 66 72 6f  m->next;.    fro
129c0 6d 2d 3e 6e 65 78 74 20 3d 20 2a 74 6f 3b 0a 20  m->next = *to;. 
129d0 20 20 20 2a 74 6f 20 3d 20 66 72 6f 6d 3b 0a 20     *to = from;. 
129e0 20 20 20 66 72 6f 6d 20 3d 20 6e 65 78 74 70 6c     from = nextpl
129f0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 44 65 6c 65  ;.  }.}../* Dele
12a00 74 65 20 65 76 65 72 79 20 70 6c 69 6e 6b 20 6f  te every plink o
12a10 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 76 6f  n the list */.vo
12a20 69 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28  id Plink_delete(
12a30 70 6c 70 29 0a 73 74 72 75 63 74 20 70 6c 69 6e  plp).struct plin
12a40 6b 20 2a 70 6c 70 3b 0a 7b 0a 20 20 73 74 72 75  k *plp;.{.  stru
12a50 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 78 74 70 6c  ct plink *nextpl
12a60 3b 0a 0a 20 20 77 68 69 6c 65 28 20 70 6c 70 20  ;..  while( plp 
12a70 29 7b 0a 20 20 20 20 6e 65 78 74 70 6c 20 3d 20  ){.    nextpl = 
12a80 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 70  plp->next;.    p
12a90 6c 70 2d 3e 6e 65 78 74 20 3d 20 70 6c 69 6e 6b  lp->next = plink
12aa0 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 20 20 70  _freelist;.    p
12ab0 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20  link_freelist = 
12ac0 70 6c 70 3b 0a 20 20 20 20 70 6c 70 20 3d 20 6e  plp;.    plp = n
12ad0 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a  extpl;.  }.}./**
12ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12af0 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
12b00 69 6c 65 20 22 72 65 70 6f 72 74 2e 63 22 20 2a  ile "report.c" *
12b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
12b30 20 50 72 6f 63 65 64 75 72 65 73 20 66 6f 72 20   Procedures for 
12b40 67 65 6e 65 72 61 74 69 6e 67 20 72 65 70 6f 72  generating repor
12b50 74 73 20 61 6e 64 20 74 61 62 6c 65 73 20 69 6e  ts and tables in
12b60 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65   the LEMON parse
12b70 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a  r generator..*/.
12b80 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 66  ./* Generate a f
12b90 69 6c 65 6e 61 6d 65 20 77 69 74 68 20 74 68 65  ilename with the
12ba0 20 67 69 76 65 6e 20 73 75 66 66 69 78 2e 20 20   given suffix.  
12bb0 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
12bc0 65 0a 2a 2a 20 6e 61 6d 65 20 63 6f 6d 65 73 20  e.** name comes 
12bd0 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  from malloc() an
12be0 64 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20  d must be freed 
12bf0 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 0a 2a  by the calling.*
12c00 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 50  * function..*/.P
12c10 52 49 56 41 54 45 20 63 68 61 72 20 2a 66 69 6c  RIVATE char *fil
12c20 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d 70 2c  e_makename(lemp,
12c30 73 75 66 66 69 78 29 0a 73 74 72 75 63 74 20 6c  suffix).struct l
12c40 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 63 68 61 72  emon *lemp;.char
12c50 20 2a 73 75 66 66 69 78 3b 0a 7b 0a 20 20 63 68   *suffix;.{.  ch
12c60 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 63 68 61 72  ar *name;.  char
12c70 20 2a 63 70 3b 0a 0a 20 20 6e 61 6d 65 20 3d 20   *cp;..  name = 
12c80 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 6c  malloc( strlen(l
12c90 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 20 2b  emp->filename) +
12ca0 20 73 74 72 6c 65 6e 28 73 75 66 66 69 78 29 20   strlen(suffix) 
12cb0 2b 20 35 20 29 3b 0a 20 20 69 66 28 20 6e 61 6d  + 5 );.  if( nam
12cc0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  e==0 ){.    fpri
12cd0 6e 74 66 28 73 74 64 65 72 72 2c 22 43 61 6e 27  ntf(stderr,"Can'
12ce0 74 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  t allocate space
12cf0 20 66 6f 72 20 61 20 66 69 6c 65 6e 61 6d 65 2e   for a filename.
12d00 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
12d10 29 3b 0a 20 20 7d 0a 20 20 73 74 72 63 70 79 28  );.  }.  strcpy(
12d20 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  name,lemp->filen
12d30 61 6d 65 29 3b 0a 20 20 63 70 20 3d 20 73 74 72  ame);.  cp = str
12d40 72 63 68 72 28 6e 61 6d 65 2c 27 2e 27 29 3b 0a  rchr(name,'.');.
12d50 20 20 69 66 28 20 63 70 20 29 20 2a 63 70 20 3d    if( cp ) *cp =
12d60 20 30 3b 0a 20 20 73 74 72 63 61 74 28 6e 61 6d   0;.  strcat(nam
12d70 65 2c 73 75 66 66 69 78 29 3b 0a 20 20 72 65 74  e,suffix);.  ret
12d80 75 72 6e 20 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 20  urn name;.}../* 
12d90 4f 70 65 6e 20 61 20 66 69 6c 65 20 77 69 74 68  Open a file with
12da0 20 61 20 6e 61 6d 65 20 62 61 73 65 64 20 6f 6e   a name based on
12db0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
12dc0 20 69 6e 70 75 74 20 66 69 6c 65 2c 0a 2a 2a 20   input file,.** 
12dd0 62 75 74 20 77 69 74 68 20 61 20 64 69 66 66 65  but with a diffe
12de0 72 65 6e 74 20 28 73 70 65 63 69 66 69 65 64 29  rent (specified)
12df0 20 73 75 66 66 69 78 2c 20 61 6e 64 20 72 65 74   suffix, and ret
12e00 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
12e10 20 74 6f 20 74 68 65 20 73 74 72 65 61 6d 20 2a   to the stream *
12e20 2f 0a 50 52 49 56 41 54 45 20 46 49 4c 45 20 2a  /.PRIVATE FILE *
12e30 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 73  file_open(lemp,s
12e40 75 66 66 69 78 2c 6d 6f 64 65 29 0a 73 74 72 75  uffix,mode).stru
12e50 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
12e60 63 68 61 72 20 2a 73 75 66 66 69 78 3b 0a 63 68  char *suffix;.ch
12e70 61 72 20 2a 6d 6f 64 65 3b 0a 7b 0a 20 20 46 49  ar *mode;.{.  FI
12e80 4c 45 20 2a 66 70 3b 0a 0a 20 20 69 66 28 20 6c  LE *fp;..  if( l
12e90 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20 29 20 66  emp->outname ) f
12ea0 72 65 65 28 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  ree(lemp->outnam
12eb0 65 29 3b 0a 20 20 6c 65 6d 70 2d 3e 6f 75 74 6e  e);.  lemp->outn
12ec0 61 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e  ame = file_maken
12ed0 61 6d 65 28 6c 65 6d 70 2c 20 73 75 66 66 69 78  ame(lemp, suffix
12ee0 29 3b 0a 20 20 66 70 20 3d 20 66 6f 70 65 6e 28  );.  fp = fopen(
12ef0 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 2c 6d 6f  lemp->outname,mo
12f00 64 65 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d 30  de);.  if( fp==0
12f10 20 26 26 20 2a 6d 6f 64 65 3d 3d 27 77 27 20 29   && *mode=='w' )
12f20 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
12f30 64 65 72 72 2c 22 43 61 6e 27 74 20 6f 70 65 6e  derr,"Can't open
12f40 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22   file \"%s\".\n"
12f50 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b  ,lemp->outname);
12f60 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72  .    lemp->error
12f70 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72  cnt++;.    retur
12f80 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
12f90 6e 20 66 70 3b 0a 7d 0a 0a 2f 2a 20 44 75 70 6c  n fp;.}../* Dupl
12fa0 69 63 61 74 65 20 74 68 65 20 69 6e 70 75 74 20  icate the input 
12fb0 66 69 6c 65 20 77 69 74 68 6f 75 74 20 63 6f 6d  file without com
12fc0 6d 65 6e 74 73 20 61 6e 64 20 77 69 74 68 6f 75  ments and withou
12fd0 74 20 61 63 74 69 6f 6e 73 20 0a 2a 2a 20 6f 6e  t actions .** on
12fe0 20 72 75 6c 65 73 20 2a 2f 0a 76 6f 69 64 20 52   rules */.void R
12ff0 65 70 72 69 6e 74 28 6c 65 6d 70 29 0a 73 74 72  eprint(lemp).str
13000 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
13010 0a 7b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65  .{.  struct rule
13020 20 2a 72 70 3b 0a 20 20 73 74 72 75 63 74 20 73   *rp;.  struct s
13030 79 6d 62 6f 6c 20 2a 73 70 3b 0a 20 20 69 6e 74  ymbol *sp;.  int
13040 20 69 2c 20 6a 2c 20 6d 61 78 6c 65 6e 2c 20 6c   i, j, maxlen, l
13050 65 6e 2c 20 6e 63 6f 6c 75 6d 6e 73 2c 20 73 6b  en, ncolumns, sk
13060 69 70 3b 0a 20 20 70 72 69 6e 74 66 28 22 2f 2f  ip;.  printf("//
13070 20 52 65 70 72 69 6e 74 20 6f 66 20 69 6e 70 75   Reprint of inpu
13080 74 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e  t file \"%s\".\n
13090 2f 2f 20 53 79 6d 62 6f 6c 73 3a 5c 6e 22 2c 6c  // Symbols:\n",l
130a0 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a  emp->filename);.
130b0 20 20 6d 61 78 6c 65 6e 20 3d 20 31 30 3b 0a 20    maxlen = 10;. 
130c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
130d0 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b  ->nsymbol; i++){
130e0 0a 20 20 20 20 73 70 20 3d 20 6c 65 6d 70 2d 3e  .    sp = lemp->
130f0 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20  symbols[i];.    
13100 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 73 70 2d  len = strlen(sp-
13110 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  >name);.    if( 
13120 6c 65 6e 3e 6d 61 78 6c 65 6e 20 29 20 6d 61 78  len>maxlen ) max
13130 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20  len = len;.  }. 
13140 20 6e 63 6f 6c 75 6d 6e 73 20 3d 20 37 36 2f 28   ncolumns = 76/(
13150 6d 61 78 6c 65 6e 2b 35 29 3b 0a 20 20 69 66 28  maxlen+5);.  if(
13160 20 6e 63 6f 6c 75 6d 6e 73 3c 31 20 29 20 6e 63   ncolumns<1 ) nc
13170 6f 6c 75 6d 6e 73 20 3d 20 31 3b 0a 20 20 73 6b  olumns = 1;.  sk
13180 69 70 20 3d 20 28 6c 65 6d 70 2d 3e 6e 73 79 6d  ip = (lemp->nsym
13190 62 6f 6c 20 2b 20 6e 63 6f 6c 75 6d 6e 73 20 2d  bol + ncolumns -
131a0 20 31 29 2f 6e 63 6f 6c 75 6d 6e 73 3b 0a 20 20   1)/ncolumns;.  
131b0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 6b 69 70 3b  for(i=0; i<skip;
131c0 20 69 2b 2b 29 7b 0a 20 20 20 20 70 72 69 6e 74   i++){.    print
131d0 66 28 22 2f 2f 22 29 3b 0a 20 20 20 20 66 6f 72  f("//");.    for
131e0 28 6a 3d 69 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 73  (j=i; j<lemp->ns
131f0 79 6d 62 6f 6c 3b 20 6a 2b 3d 73 6b 69 70 29 7b  ymbol; j+=skip){
13200 0a 20 20 20 20 20 20 73 70 20 3d 20 6c 65 6d 70  .      sp = lemp
13210 2d 3e 73 79 6d 62 6f 6c 73 5b 6a 5d 3b 0a 20 20  ->symbols[j];.  
13220 20 20 20 20 61 73 73 65 72 74 28 20 73 70 2d 3e      assert( sp->
13230 69 6e 64 65 78 3d 3d 6a 20 29 3b 0a 20 20 20 20  index==j );.    
13240 20 20 70 72 69 6e 74 66 28 22 20 25 33 64 20 25    printf(" %3d %
13250 2d 2a 2e 2a 73 22 2c 6a 2c 6d 61 78 6c 65 6e 2c  -*.*s",j,maxlen,
13260 6d 61 78 6c 65 6e 2c 73 70 2d 3e 6e 61 6d 65 29  maxlen,sp->name)
13270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e  ;.    }.    prin
13280 74 66 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  tf("\n");.  }.  
13290 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c  for(rp=lemp->rul
132a0 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65  e; rp; rp=rp->ne
132b0 78 74 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28  xt){.    printf(
132c0 22 25 73 22 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61  "%s",rp->lhs->na
132d0 6d 65 29 3b 0a 2f 2a 20 20 20 20 69 66 28 20 72  me);./*    if( r
132e0 70 2d 3e 6c 68 73 61 6c 69 61 73 20 29 20 70 72  p->lhsalias ) pr
132f0 69 6e 74 66 28 22 28 25 73 29 22 2c 72 70 2d 3e  intf("(%s)",rp->
13300 6c 68 73 61 6c 69 61 73 29 3b 20 2a 2f 0a 20 20  lhsalias); */.  
13310 20 20 70 72 69 6e 74 66 28 22 20 3a 3a 3d 22 29    printf(" ::=")
13320 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
13330 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
13340 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20  .      printf(" 
13350 25 73 22 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e  %s",rp->rhs[i]->
13360 6e 61 6d 65 29 3b 0a 2f 2a 20 20 20 20 20 20 69  name);./*      i
13370 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  f( rp->rhsalias[
13380 69 5d 20 29 20 70 72 69 6e 74 66 28 22 28 25 73  i] ) printf("(%s
13390 29 22 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  )",rp->rhsalias[
133a0 69 5d 29 3b 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  i]); */.    }.  
133b0 20 20 70 72 69 6e 74 66 28 22 2e 22 29 3b 0a 20    printf(".");. 
133c0 20 20 20 69 66 28 20 72 70 2d 3e 70 72 65 63 73     if( rp->precs
133d0 79 6d 20 29 20 70 72 69 6e 74 66 28 22 20 5b 25  ym ) printf(" [%
133e0 73 5d 22 2c 72 70 2d 3e 70 72 65 63 73 79 6d 2d  s]",rp->precsym-
133f0 3e 6e 61 6d 65 29 3b 0a 2f 2a 20 20 20 20 69 66  >name);./*    if
13400 28 20 72 70 2d 3e 63 6f 64 65 20 29 20 70 72 69  ( rp->code ) pri
13410 6e 74 66 28 22 5c 6e 20 20 20 20 25 73 22 2c 72  ntf("\n    %s",r
13420 70 2d 3e 63 6f 64 65 29 3b 20 2a 2f 0a 20 20 20  p->code); */.   
13430 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
13440 20 7d 0a 7d 0a 0a 76 6f 69 64 20 43 6f 6e 66 69   }.}..void Confi
13450 67 50 72 69 6e 74 28 66 70 2c 63 66 70 29 0a 46  gPrint(fp,cfp).F
13460 49 4c 45 20 2a 66 70 3b 0a 73 74 72 75 63 74 20  ILE *fp;.struct 
13470 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a 7b 0a 20  config *cfp;.{. 
13480 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70   struct rule *rp
13490 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 72 70 20  ;.  int i;.  rp 
134a0 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20 66 70 72  = cfp->rp;.  fpr
134b0 69 6e 74 66 28 66 70 2c 22 25 73 20 3a 3a 3d 22  intf(fp,"%s ::="
134c0 2c 72 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b  ,rp->lhs->name);
134d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 72  .  for(i=0; i<=r
134e0 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b 0a 20  p->nrhs; i++){. 
134f0 20 20 20 69 66 28 20 69 3d 3d 63 66 70 2d 3e 64     if( i==cfp->d
13500 6f 74 20 29 20 66 70 72 69 6e 74 66 28 66 70 2c  ot ) fprintf(fp,
13510 22 20 2a 22 29 3b 0a 20 20 20 20 69 66 28 20 69  " *");.    if( i
13520 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 62 72 65  ==rp->nrhs ) bre
13530 61 6b 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  ak;.    fprintf(
13540 66 70 2c 22 20 25 73 22 2c 72 70 2d 3e 72 68 73  fp," %s",rp->rhs
13550 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a  [i]->name);.  }.
13560 7d 0a 0a 2f 2a 20 23 64 65 66 69 6e 65 20 54 45  }../* #define TE
13570 53 54 20 2a 2f 0a 23 69 66 64 65 66 20 54 45 53  ST */.#ifdef TES
13580 54 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 65 74  T./* Print a set
13590 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69 64   */.PRIVATE void
135a0 20 53 65 74 50 72 69 6e 74 28 6f 75 74 2c 73 65   SetPrint(out,se
135b0 74 2c 6c 65 6d 70 29 0a 46 49 4c 45 20 2a 6f 75  t,lemp).FILE *ou
135c0 74 3b 0a 63 68 61 72 20 2a 73 65 74 3b 0a 73 74  t;.char *set;.st
135d0 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
135e0 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  ;.{.  int i;.  c
135f0 68 61 72 20 2a 73 70 61 63 65 72 3b 0a 20 20 73  har *spacer;.  s
13600 70 61 63 65 72 20 3d 20 22 22 3b 0a 20 20 66 70  pacer = "";.  fp
13610 72 69 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 5b  rintf(out,"%12s[
13620 22 2c 22 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ","");.  for(i=0
13630 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; i<lemp->ntermi
13640 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nal; i++){.    i
13650 66 28 20 53 65 74 46 69 6e 64 28 73 65 74 2c 69  f( SetFind(set,i
13660 29 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e  ) ){.      fprin
13670 74 66 28 6f 75 74 2c 22 25 73 25 73 22 2c 73 70  tf(out,"%s%s",sp
13680 61 63 65 72 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  acer,lemp->symbo
13690 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ls[i]->name);.  
136a0 20 20 20 20 73 70 61 63 65 72 20 3d 20 22 20 22      spacer = " "
136b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
136c0 72 69 6e 74 66 28 6f 75 74 2c 22 5d 5c 6e 22 29  rintf(out,"]\n")
136d0 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 20  ;.}../* Print a 
136e0 70 6c 69 6e 6b 20 63 68 61 69 6e 20 2a 2f 0a 50  plink chain */.P
136f0 52 49 56 41 54 45 20 76 6f 69 64 20 50 6c 69 6e  RIVATE void Plin
13700 6b 50 72 69 6e 74 28 6f 75 74 2c 70 6c 70 2c 74  kPrint(out,plp,t
13710 61 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73  ag).FILE *out;.s
13720 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70  truct plink *plp
13730 3b 0a 63 68 61 72 20 2a 74 61 67 3b 0a 7b 0a 20  ;.char *tag;.{. 
13740 20 77 68 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20   while( plp ){. 
13750 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
13760 25 31 32 73 25 73 20 28 73 74 61 74 65 20 25 32  %12s%s (state %2
13770 64 29 20 22 2c 22 22 2c 74 61 67 2c 70 6c 70 2d  d) ","",tag,plp-
13780 3e 63 66 70 2d 3e 73 74 70 2d 3e 69 6e 64 65 78  >cfp->stp->index
13790 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67 50 72 69  );.    ConfigPri
137a0 6e 74 28 6f 75 74 2c 70 6c 70 2d 3e 63 66 70 29  nt(out,plp->cfp)
137b0 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
137c0 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 70 6c 70  t,"\n");.    plp
137d0 20 3d 20 70 6c 70 2d 3e 6e 65 78 74 3b 0a 20 20   = plp->next;.  
137e0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 50  }.}.#endif../* P
137f0 72 69 6e 74 20 61 6e 20 61 63 74 69 6f 6e 20 74  rint an action t
13800 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  o the given file
13810 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65   descriptor.  Re
13820 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a 2a 2a  turn FALSE if.**
13830 20 6e 6f 74 68 69 6e 67 20 77 61 73 20 61 63 74   nothing was act
13840 75 61 6c 6c 79 20 70 72 69 6e 74 65 64 2e 0a 2a  ually printed..*
13850 2f 0a 69 6e 74 20 50 72 69 6e 74 41 63 74 69 6f  /.int PrintActio
13860 6e 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  n(struct action 
13870 2a 61 70 2c 20 46 49 4c 45 20 2a 66 70 2c 20 69  *ap, FILE *fp, i
13880 6e 74 20 69 6e 64 65 6e 74 29 7b 0a 20 20 69 6e  nt indent){.  in
13890 74 20 72 65 73 75 6c 74 20 3d 20 31 3b 0a 20 20  t result = 1;.  
138a0 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70 65  switch( ap->type
138b0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48 49   ){.    case SHI
138c0 46 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74  FT:.      fprint
138d0 66 28 66 70 2c 22 25 2a 73 20 73 68 69 66 74 20  f(fp,"%*s shift 
138e0 20 25 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e   %d",indent,ap->
138f0 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 73  sp->name,ap->x.s
13900 74 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  tp->index);.    
13910 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
13920 65 20 52 45 44 55 43 45 3a 0a 20 20 20 20 20 20  e REDUCE:.      
13930 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20  fprintf(fp,"%*s 
13940 72 65 64 75 63 65 20 25 64 22 2c 69 6e 64 65 6e  reduce %d",inden
13950 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65 2c 61  t,ap->sp->name,a
13960 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 29 3b  p->x.rp->index);
13970 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
13980 20 20 63 61 73 65 20 41 43 43 45 50 54 3a 0a 20    case ACCEPT:. 
13990 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
139a0 22 25 2a 73 20 61 63 63 65 70 74 22 2c 69 6e 64  "%*s accept",ind
139b0 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
139c0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
139d0 20 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a 0a      case ERROR:.
139e0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
139f0 2c 22 25 2a 73 20 65 72 72 6f 72 22 2c 69 6e 64  ,"%*s error",ind
13a00 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d 65  ent,ap->sp->name
13a10 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
13a20 20 20 20 20 63 61 73 65 20 43 4f 4e 46 4c 49 43      case CONFLIC
13a30 54 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  T:.      fprintf
13a40 28 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20  (fp,"%*s reduce 
13a50 25 2d 33 64 20 2a 2a 20 50 61 72 73 69 6e 67 20  %-3d ** Parsing 
13a60 63 6f 6e 66 6c 69 63 74 20 2a 2a 22 2c 0a 20 20  conflict **",.  
13a70 20 20 20 20 20 20 69 6e 64 65 6e 74 2c 61 70 2d        indent,ap-
13a80 3e 73 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e  >sp->name,ap->x.
13a90 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  rp->index);.    
13aa0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
13ab0 65 20 53 48 5f 52 45 53 4f 4c 56 45 44 3a 0a 20  e SH_RESOLVED:. 
13ac0 20 20 20 63 61 73 65 20 52 44 5f 52 45 53 4f 4c     case RD_RESOL
13ad0 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20 4e 4f  VED:.    case NO
13ae0 54 5f 55 53 45 44 3a 0a 20 20 20 20 20 20 72 65  T_USED:.      re
13af0 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sult = 0;.      
13b00 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
13b10 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0a 2f  urn result;.}../
13b20 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 22  * Generate the "
13b30 79 2e 6f 75 74 70 75 74 22 20 6c 6f 67 20 66 69  y.output" log fi
13b40 6c 65 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f 72  le */.void Repor
13b50 74 4f 75 74 70 75 74 28 6c 65 6d 70 29 0a 73 74  tOutput(lemp).st
13b60 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70  ruct lemon *lemp
13b70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  ;.{.  int i;.  s
13b80 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
13b90 3b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  ;.  struct confi
13ba0 67 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74  g *cfp;.  struct
13bb0 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 46   action *ap;.  F
13bc0 49 4c 45 20 2a 66 70 3b 0a 0a 20 20 66 70 20 3d  ILE *fp;..  fp =
13bd0 20 66 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c   file_open(lemp,
13be0 22 2e 6f 75 74 22 2c 22 77 22 29 3b 0a 20 20 69  ".out","w");.  i
13bf0 66 28 20 66 70 3d 3d 30 20 29 20 72 65 74 75 72  f( fp==0 ) retur
13c00 6e 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70 2c  n;.  fprintf(fp,
13c10 22 20 5c 62 22 29 3b 0a 20 20 66 6f 72 28 69 3d  " \b");.  for(i=
13c20 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
13c30 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  e; i++){.    stp
13c40 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
13c50 69 5d 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i];.    fprintf(
13c60 66 70 2c 22 53 74 61 74 65 20 25 64 3a 5c 6e 22  fp,"State %d:\n"
13c70 2c 73 74 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20  ,stp->index);.  
13c80 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62 61 73 69    if( lemp->basi
13c90 73 66 6c 61 67 20 29 20 63 66 70 3d 73 74 70 2d  sflag ) cfp=stp-
13ca0 3e 62 70 3b 0a 20 20 20 20 65 6c 73 65 20 20 20  >bp;.    else   
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
13cc0 66 70 3d 73 74 70 2d 3e 63 66 70 3b 0a 20 20 20  fp=stp->cfp;.   
13cd0 20 77 68 69 6c 65 28 20 63 66 70 20 29 7b 0a 20   while( cfp ){. 
13ce0 20 20 20 20 20 63 68 61 72 20 62 75 66 5b 32 30       char buf[20
13cf0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63 66 70  ];.      if( cfp
13d00 2d 3e 64 6f 74 3d 3d 63 66 70 2d 3e 72 70 2d 3e  ->dot==cfp->rp->
13d10 6e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  nrhs ){.        
13d20 73 70 72 69 6e 74 66 28 62 75 66 2c 22 28 25 64  sprintf(buf,"(%d
13d30 29 22 2c 63 66 70 2d 3e 72 70 2d 3e 69 6e 64 65  )",cfp->rp->inde
13d40 78 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69  x);.        fpri
13d50 6e 74 66 28 66 70 2c 22 20 20 20 20 25 35 73 20  ntf(fp,"    %5s 
13d60 22 2c 62 75 66 29 3b 0a 20 20 20 20 20 20 7d 65  ",buf);.      }e
13d70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70 72  lse{.        fpr
13d80 69 6e 74 66 28 66 70 2c 22 20 20 20 20 20 20 20  intf(fp,"       
13d90 20 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20     ");.      }. 
13da0 20 20 20 20 20 43 6f 6e 66 69 67 50 72 69 6e 74       ConfigPrint
13db0 28 66 70 2c 63 66 70 29 3b 0a 20 20 20 20 20 20  (fp,cfp);.      
13dc0 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29  fprintf(fp,"\n")
13dd0 3b 0a 23 69 66 64 65 66 20 54 45 53 54 0a 20 20  ;.#ifdef TEST.  
13de0 20 20 20 20 53 65 74 50 72 69 6e 74 28 66 70 2c      SetPrint(fp,
13df0 63 66 70 2d 3e 66 77 73 2c 6c 65 6d 70 29 3b 0a  cfp->fws,lemp);.
13e00 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e 74        PlinkPrint
13e10 28 66 70 2c 63 66 70 2d 3e 66 70 6c 70 2c 22 54  (fp,cfp->fplp,"T
13e20 6f 20 20 22 29 3b 0a 20 20 20 20 20 20 50 6c 69  o  ");.      Pli
13e30 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e  nkPrint(fp,cfp->
13e40 62 70 6c 70 2c 22 46 72 6f 6d 22 29 3b 0a 23 65  bplp,"From");.#e
13e50 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 6c  ndif.      if( l
13e60 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29  emp->basisflag )
13e70 20 63 66 70 3d 63 66 70 2d 3e 62 70 3b 0a 20 20   cfp=cfp->bp;.  
13e80 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20      else        
13e90 20 20 20 20 20 20 20 20 20 20 63 66 70 3d 63 66            cfp=cf
13ea0 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  p->next;.    }. 
13eb0 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c     fprintf(fp,"\
13ec0 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d  n");.    for(ap=
13ed0 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d  stp->ap; ap; ap=
13ee0 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20  ap->next){.     
13ef0 20 69 66 28 20 50 72 69 6e 74 41 63 74 69 6f 6e   if( PrintAction
13f00 28 61 70 2c 66 70 2c 33 30 29 20 29 20 66 70 72  (ap,fp,30) ) fpr
13f10 69 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20  intf(fp,"\n");. 
13f20 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
13f30 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  (fp,"\n");.  }. 
13f40 20 66 63 6c 6f 73 65 28 66 70 29 3b 0a 20 20 72   fclose(fp);.  r
13f50 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 65 61  eturn;.}../* Sea
13f60 72 63 68 20 66 6f 72 20 74 68 65 20 66 69 6c 65  rch for the file
13f70 20 22 6e 61 6d 65 22 20 77 68 69 63 68 20 69 73   "name" which is
13f80 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72   in the same dir
13f90 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65  ectory as.** the
13fa0 20 65 78 61 63 75 74 61 62 6c 65 20 2a 2f 0a 50   exacutable */.P
13fb0 52 49 56 41 54 45 20 63 68 61 72 20 2a 70 61 74  RIVATE char *pat
13fc0 68 73 65 61 72 63 68 28 61 72 67 76 30 2c 6e 61  hsearch(argv0,na
13fd0 6d 65 2c 6d 6f 64 65 6d 61 73 6b 29 0a 63 68 61  me,modemask).cha
13fe0 72 20 2a 61 72 67 76 30 3b 0a 63 68 61 72 20 2a  r *argv0;.char *
13ff0 6e 61 6d 65 3b 0a 69 6e 74 20 6d 6f 64 65 6d 61  name;.int modema
14000 73 6b 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 70 61  sk;.{.  char *pa
14010 74 68 6c 69 73 74 3b 0a 20 20 63 68 61 72 20 2a  thlist;.  char *
14020 70 61 74 68 2c 2a 63 70 3b 0a 20 20 63 68 61 72  path,*cp;.  char
14030 20 63 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74   c;.  extern int
14040 20 61 63 63 65 73 73 28 29 3b 0a 0a 23 69 66 64   access();..#ifd
14050 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 20 20 63  ef __WIN32__.  c
14060 70 20 3d 20 73 74 72 72 63 68 72 28 61 72 67 76  p = strrchr(argv
14070 30 2c 27 5c 5c 27 29 3b 0a 23 65 6c 73 65 0a 20  0,'\\');.#else. 
14080 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 61 72   cp = strrchr(ar
14090 67 76 30 2c 27 2f 27 29 3b 0a 23 65 6e 64 69 66  gv0,'/');.#endif
140a0 0a 20 20 69 66 28 20 63 70 20 29 7b 0a 20 20 20  .  if( cp ){.   
140b0 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63   c = *cp;.    *c
140c0 70 20 3d 20 30 3b 0a 20 20 20 20 70 61 74 68 20  p = 0;.    path 
140d0 3d 20 28 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63  = (char *)malloc
140e0 28 20 73 74 72 6c 65 6e 28 61 72 67 76 30 29 20  ( strlen(argv0) 
140f0 2b 20 73 74 72 6c 65 6e 28 6e 61 6d 65 29 20 2b  + strlen(name) +
14100 20 32 20 29 3b 0a 20 20 20 20 69 66 28 20 70 61   2 );.    if( pa
14110 74 68 20 29 20 73 70 72 69 6e 74 66 28 70 61 74  th ) sprintf(pat
14120 68 2c 22 25 73 2f 25 73 22 2c 61 72 67 76 30 2c  h,"%s/%s",argv0,
14130 6e 61 6d 65 29 3b 0a 20 20 20 20 2a 63 70 20 3d  name);.    *cp =
14140 20 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   c;.  }else{.   
14150 20 65 78 74 65 72 6e 20 63 68 61 72 20 2a 67 65   extern char *ge
14160 74 65 6e 76 28 29 3b 0a 20 20 20 20 70 61 74 68  tenv();.    path
14170 6c 69 73 74 20 3d 20 67 65 74 65 6e 76 28 22 50  list = getenv("P
14180 41 54 48 22 29 3b 0a 20 20 20 20 69 66 28 20 70  ATH");.    if( p
14190 61 74 68 6c 69 73 74 3d 3d 30 20 29 20 70 61 74  athlist==0 ) pat
141a0 68 6c 69 73 74 20 3d 20 22 2e 3a 2f 62 69 6e 3a  hlist = ".:/bin:
141b0 2f 75 73 72 2f 62 69 6e 22 3b 0a 20 20 20 20 70  /usr/bin";.    p
141c0 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 6d 61  ath = (char *)ma
141d0 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 70 61 74  lloc( strlen(pat
141e0 68 6c 69 73 74 29 2b 73 74 72 6c 65 6e 28 6e 61  hlist)+strlen(na
141f0 6d 65 29 2b 32 20 29 3b 0a 20 20 20 20 69 66 28  me)+2 );.    if(
14200 20 70 61 74 68 21 3d 30 20 29 7b 0a 20 20 20 20   path!=0 ){.    
14210 20 20 77 68 69 6c 65 28 20 2a 70 61 74 68 6c 69    while( *pathli
14220 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 63 70  st ){.        cp
14230 20 3d 20 73 74 72 63 68 72 28 70 61 74 68 6c 69   = strchr(pathli
14240 73 74 2c 27 3a 27 29 3b 0a 20 20 20 20 20 20 20  st,':');.       
14250 20 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20   if( cp==0 ) cp 
14260 3d 20 26 70 61 74 68 6c 69 73 74 5b 73 74 72 6c  = &pathlist[strl
14270 65 6e 28 70 61 74 68 6c 69 73 74 29 5d 3b 0a 20  en(pathlist)];. 
14280 20 20 20 20 20 20 20 63 20 3d 20 2a 63 70 3b 0a         c = *cp;.
14290 20 20 20 20 20 20 20 20 2a 63 70 20 3d 20 30 3b          *cp = 0;
142a0 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
142b0 28 70 61 74 68 2c 22 25 73 2f 25 73 22 2c 70 61  (path,"%s/%s",pa
142c0 74 68 6c 69 73 74 2c 6e 61 6d 65 29 3b 0a 20 20  thlist,name);.  
142d0 20 20 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20        *cp = c;. 
142e0 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20         if( c==0 
142f0 29 20 70 61 74 68 6c 69 73 74 20 3d 20 22 22 3b  ) pathlist = "";
14300 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 70 61  .        else pa
14310 74 68 6c 69 73 74 20 3d 20 26 63 70 5b 31 5d 3b  thlist = &cp[1];
14320 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 63 63  .        if( acc
14330 65 73 73 28 70 61 74 68 2c 6d 6f 64 65 6d 61 73  ess(path,modemas
14340 6b 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  k)==0 ) break;. 
14350 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
14360 0a 20 20 72 65 74 75 72 6e 20 70 61 74 68 3b 0a  .  return path;.
14370 7d 0a 0a 2f 2a 20 47 69 76 65 6e 20 61 6e 20 61  }../* Given an a
14380 63 74 69 6f 6e 2c 20 63 6f 6d 70 75 74 65 20 74  ction, compute t
14390 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
143a0 20 66 6f 72 20 74 68 61 74 20 61 63 74 69 6f 6e   for that action
143b0 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 74 6f 20  .** which is to 
143c0 62 65 20 70 75 74 20 69 6e 20 74 68 65 20 61 63  be put in the ac
143d0 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66 20 74 68  tion table of th
143e0 65 20 67 65 6e 65 72 61 74 65 64 20 6d 61 63 68  e generated mach
143f0 69 6e 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 6e  ine..** Return n
14400 65 67 61 74 69 76 65 20 69 66 20 6e 6f 20 61 63  egative if no ac
14410 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 67  tion should be g
14420 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 50 52 49  enerated..*/.PRI
14430 56 41 54 45 20 69 6e 74 20 63 6f 6d 70 75 74 65  VATE int compute
14440 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70 29  _action(lemp,ap)
14450 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
14460 65 6d 70 3b 0a 73 74 72 75 63 74 20 61 63 74 69  emp;.struct acti
14470 6f 6e 20 2a 61 70 3b 0a 7b 0a 20 20 69 6e 74 20  on *ap;.{.  int 
14480 61 63 74 3b 0a 20 20 73 77 69 74 63 68 28 20 61  act;.  switch( a
14490 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20 20 20 63  p->type ){.    c
144a0 61 73 65 20 53 48 49 46 54 3a 20 20 61 63 74 20  ase SHIFT:  act 
144b0 3d 20 61 70 2d 3e 78 2e 73 74 70 2d 3e 69 6e 64  = ap->x.stp->ind
144c0 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
144d0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
144e0 65 20 52 45 44 55 43 45 3a 20 61 63 74 20 3d 20  e REDUCE: act = 
144f0 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64 65 78 20  ap->x.rp->index 
14500 2b 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20  + lemp->nstate; 
14510 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
14520 45 52 52 4f 52 3a 20 20 61 63 74 20 3d 20 6c 65  ERROR:  act = le
14530 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d  mp->nstate + lem
14540 70 2d 3e 6e 72 75 6c 65 3b 20 20 20 20 20 62 72  p->nrule;     br
14550 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 43  eak;.    case AC
14560 43 45 50 54 3a 20 61 63 74 20 3d 20 6c 65 6d 70  CEPT: act = lemp
14570 2d 3e 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d  ->nstate + lemp-
14580 3e 6e 72 75 6c 65 20 2b 20 31 3b 20 62 72 65 61  >nrule + 1; brea
14590 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
145a0 20 20 20 20 61 63 74 20 3d 20 2d 31 3b 20 62 72      act = -1; br
145b0 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
145c0 6e 20 61 63 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e  n act;.}..#defin
145d0 65 20 4c 49 4e 45 53 49 5a 45 20 31 30 30 30 0a  e LINESIZE 1000.
145e0 2f 2a 20 54 68 65 20 6e 65 78 74 20 63 6c 75 73  /* The next clus
145f0 74 65 72 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  ter of routines 
14600 61 72 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20  are for reading 
14610 74 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c  the template fil
14620 65 0a 2a 2a 20 61 6e 64 20 77 72 69 74 69 6e 67  e.** and writing
14630 20 74 68 65 20 72 65 73 75 6c 74 73 20 74 6f 20   the results to 
14640 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 70 61  the generated pa
14650 72 73 65 72 20 2a 2f 0a 2f 2a 20 54 68 65 20 66  rser */./* The f
14660 69 72 73 74 20 66 75 6e 63 74 69 6f 6e 20 74 72  irst function tr
14670 61 6e 73 66 65 72 73 20 64 61 74 61 20 66 72 6f  ansfers data fro
14680 6d 20 22 69 6e 22 20 74 6f 20 22 6f 75 74 22 20  m "in" to "out" 
14690 75 6e 74 69 6c 0a 2a 2a 20 61 20 6c 69 6e 65 20  until.** a line 
146a0 69 73 20 73 65 65 6e 20 77 68 69 63 68 20 62 65  is seen which be
146b0 67 69 6e 73 20 77 69 74 68 20 22 25 25 22 2e 20  gins with "%%". 
146c0 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72   The line number
146d0 20 69 73 0a 2a 2a 20 74 72 61 63 6b 65 64 2e 0a   is.** tracked..
146e0 2a 2a 0a 2a 2a 20 69 66 20 6e 61 6d 65 21 3d 30  **.** if name!=0
146f0 2c 20 74 68 65 6e 20 61 6e 79 20 77 6f 72 64 20  , then any word 
14700 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68 20  that begin with 
14710 22 50 61 72 73 65 22 20 69 73 20 63 68 61 6e 67  "Parse" is chang
14720 65 64 20 74 6f 0a 2a 2a 20 62 65 67 69 6e 20 77  ed to.** begin w
14730 69 74 68 20 2a 6e 61 6d 65 20 69 6e 73 74 65 61  ith *name instea
14740 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f  d..*/.PRIVATE vo
14750 69 64 20 74 70 6c 74 5f 78 66 65 72 28 6e 61 6d  id tplt_xfer(nam
14760 65 2c 69 6e 2c 6f 75 74 2c 6c 69 6e 65 6e 6f 29  e,in,out,lineno)
14770 0a 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 46 49 4c  .char *name;.FIL
14780 45 20 2a 69 6e 3b 0a 46 49 4c 45 20 2a 6f 75 74  E *in;.FILE *out
14790 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b  ;.int *lineno;.{
147a0 0a 20 20 69 6e 74 20 69 2c 20 69 53 74 61 72 74  .  int i, iStart
147b0 3b 0a 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49  ;.  char line[LI
147c0 4e 45 53 49 5a 45 5d 3b 0a 20 20 77 68 69 6c 65  NESIZE];.  while
147d0 28 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c 49 4e  ( fgets(line,LIN
147e0 45 53 49 5a 45 2c 69 6e 29 20 26 26 20 28 6c 69  ESIZE,in) && (li
147f0 6e 65 5b 30 5d 21 3d 27 25 27 20 7c 7c 20 6c 69  ne[0]!='%' || li
14800 6e 65 5b 31 5d 21 3d 27 25 27 29 20 29 7b 0a 20  ne[1]!='%') ){. 
14810 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a     (*lineno)++;.
14820 20 20 20 20 69 53 74 61 72 74 20 3d 20 30 3b 0a      iStart = 0;.
14830 20 20 20 20 69 66 28 20 6e 61 6d 65 20 29 7b 0a      if( name ){.
14840 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6c        for(i=0; l
14850 69 6e 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ine[i]; i++){.  
14860 20 20 20 20 20 20 69 66 28 20 6c 69 6e 65 5b 69        if( line[i
14870 5d 3d 3d 27 50 27 20 26 26 20 73 74 72 6e 63 6d  ]=='P' && strncm
14880 70 28 26 6c 69 6e 65 5b 69 5d 2c 22 50 61 72 73  p(&line[i],"Pars
14890 65 22 2c 35 29 3d 3d 30 0a 20 20 20 20 20 20 20  e",5)==0.       
148a0 20 20 20 26 26 20 28 69 3d 3d 30 20 7c 7c 20 21     && (i==0 || !
148b0 69 73 61 6c 70 68 61 28 6c 69 6e 65 5b 69 2d 31  isalpha(line[i-1
148c0 5d 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ])).        ){. 
148d0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 69           if( i>i
148e0 53 74 61 72 74 20 29 20 66 70 72 69 6e 74 66 28  Start ) fprintf(
148f0 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2d 69 53 74  out,"%.*s",i-iSt
14900 61 72 74 2c 26 6c 69 6e 65 5b 69 53 74 61 72 74  art,&line[iStart
14910 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 70  ]);.          fp
14920 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 6e  rintf(out,"%s",n
14930 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
14940 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  i += 4;.        
14950 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a    iStart = i+1;.
14960 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
14970 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  }.    }.    fpri
14980 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 26 6c 69  ntf(out,"%s",&li
14990 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 7d  ne[iStart]);.  }
149a0 0a 7d 0a 0a 2f 2a 20 54 68 65 20 6e 65 78 74 20  .}../* The next 
149b0 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74  function finds t
149c0 68 65 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65  he template file
149d0 20 61 6e 64 20 6f 70 65 6e 73 20 69 74 2c 20 72   and opens it, r
149e0 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 61 20 70 6f  eturning.** a po
149f0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6f 70 65  inter to the ope
14a00 6e 65 64 20 66 69 6c 65 2e 20 2a 2f 0a 50 52 49  ned file. */.PRI
14a10 56 41 54 45 20 46 49 4c 45 20 2a 74 70 6c 74 5f  VATE FILE *tplt_
14a20 6f 70 65 6e 28 6c 65 6d 70 29 0a 73 74 72 75 63  open(lemp).struc
14a30 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
14a40 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20 74  .  static char t
14a50 65 6d 70 6c 61 74 65 6e 61 6d 65 5b 5d 20 3d 20  emplatename[] = 
14a60 22 6c 65 6d 70 61 72 2e 63 22 3b 0a 20 20 63 68  "lempar.c";.  ch
14a70 61 72 20 62 75 66 5b 31 30 30 30 5d 3b 0a 20 20  ar buf[1000];.  
14a80 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72  FILE *in;.  char
14a90 20 2a 74 70 6c 74 6e 61 6d 65 3b 0a 20 20 63 68   *tpltname;.  ch
14aa0 61 72 20 2a 63 70 3b 0a 0a 20 20 63 70 20 3d 20  ar *cp;..  cp = 
14ab0 73 74 72 72 63 68 72 28 6c 65 6d 70 2d 3e 66 69  strrchr(lemp->fi
14ac0 6c 65 6e 61 6d 65 2c 27 2e 27 29 3b 0a 20 20 69  lename,'.');.  i
14ad0 66 28 20 63 70 20 29 7b 0a 20 20 20 20 73 70 72  f( cp ){.    spr
14ae0 69 6e 74 66 28 62 75 66 2c 22 25 2e 2a 73 2e 6c  intf(buf,"%.*s.l
14af0 74 22 2c 28 69 6e 74 29 28 63 70 2d 6c 65 6d 70  t",(int)(cp-lemp
14b00 2d 3e 66 69 6c 65 6e 61 6d 65 29 2c 6c 65 6d 70  ->filename),lemp
14b10 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  ->filename);.  }
14b20 65 6c 73 65 7b 0a 20 20 20 20 73 70 72 69 6e 74  else{.    sprint
14b30 66 28 62 75 66 2c 22 25 73 2e 6c 74 22 2c 6c 65  f(buf,"%s.lt",le
14b40 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
14b50 20 7d 0a 20 20 69 66 28 20 61 63 63 65 73 73 28   }.  if( access(
14b60 62 75 66 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20  buf,004)==0 ){. 
14b70 20 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 62 75     tpltname = bu
14b80 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61  f;.  }else if( a
14b90 63 63 65 73 73 28 74 65 6d 70 6c 61 74 65 6e 61  ccess(templatena
14ba0 6d 65 2c 30 30 34 29 3d 3d 30 20 29 7b 0a 20 20  me,004)==0 ){.  
14bb0 20 20 74 70 6c 74 6e 61 6d 65 20 3d 20 74 65 6d    tpltname = tem
14bc0 70 6c 61 74 65 6e 61 6d 65 3b 0a 20 20 7d 65 6c  platename;.  }el
14bd0 73 65 7b 0a 20 20 20 20 74 70 6c 74 6e 61 6d 65  se{.    tpltname
14be0 20 3d 20 70 61 74 68 73 65 61 72 63 68 28 6c 65   = pathsearch(le
14bf0 6d 70 2d 3e 61 72 67 76 30 2c 74 65 6d 70 6c 61  mp->argv0,templa
14c00 74 65 6e 61 6d 65 2c 30 29 3b 0a 20 20 7d 0a 20  tename,0);.  }. 
14c10 20 69 66 28 20 74 70 6c 74 6e 61 6d 65 3d 3d 30   if( tpltname==0
14c20 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
14c30 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 66 69  stderr,"Can't fi
14c40 6e 64 20 74 68 65 20 70 61 72 73 65 72 20 64 72  nd the parser dr
14c50 69 76 65 72 20 74 65 6d 70 6c 61 74 65 20 66 69  iver template fi
14c60 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22 2c 0a 20  le \"%s\".\n",. 
14c70 20 20 20 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29     templatename)
14c80 3b 0a 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f  ;.    lemp->erro
14c90 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75  rcnt++;.    retu
14ca0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 6e 20 3d  rn 0;.  }.  in =
14cb0 20 66 6f 70 65 6e 28 74 70 6c 74 6e 61 6d 65 2c   fopen(tpltname,
14cc0 22 72 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d  "r");.  if( in==
14cd0 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
14ce0 28 73 74 64 65 72 72 2c 22 43 61 6e 27 74 20 6f  (stderr,"Can't o
14cf0 70 65 6e 20 74 68 65 20 74 65 6d 70 6c 61 74 65  pen the template
14d00 20 66 69 6c 65 20 5c 22 25 73 5c 22 2e 5c 6e 22   file \"%s\".\n"
14d10 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 29 3b 0a  ,templatename);.
14d20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
14d30 6e 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  nt++;.    return
14d40 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
14d50 20 69 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74   in;.}../* Print
14d60 20 61 20 73 74 72 69 6e 67 20 74 6f 20 74 68 65   a string to the
14d70 20 66 69 6c 65 20 61 6e 64 20 6b 65 65 70 20 74   file and keep t
14d80 68 65 20 6c 69 6e 65 6e 75 6d 62 65 72 20 75 70  he linenumber up
14d90 20 74 6f 20 64 61 74 65 20 2a 2f 0a 50 52 49 56   to date */.PRIV
14da0 41 54 45 20 76 6f 69 64 20 74 70 6c 74 5f 70 72  ATE void tplt_pr
14db0 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 73 74 72  int(out,lemp,str
14dc0 2c 73 74 72 6c 6e 2c 6c 69 6e 65 6e 6f 29 0a 46  ,strln,lineno).F
14dd0 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74  ILE *out;.struct
14de0 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 63 68   lemon *lemp;.ch
14df0 61 72 20 2a 73 74 72 3b 0a 69 6e 74 20 73 74 72  ar *str;.int str
14e00 6c 6e 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b  ln;.int *lineno;
14e10 0a 7b 0a 20 20 69 66 28 20 73 74 72 3d 3d 30 20  .{.  if( str==0 
14e20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 70 72 69  ) return;.  fpri
14e30 6e 74 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25  ntf(out,"#line %
14e40 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 73 74 72 6c  d \"%s\"\n",strl
14e50 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  n,lemp->filename
14e60 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a  ); (*lineno)++;.
14e70 20 20 77 68 69 6c 65 28 20 2a 73 74 72 20 29 7b    while( *str ){
14e80 0a 20 20 20 20 69 66 28 20 2a 73 74 72 3d 3d 27  .    if( *str=='
14e90 5c 6e 27 20 29 20 28 2a 6c 69 6e 65 6e 6f 29 2b  \n' ) (*lineno)+
14ea0 2b 3b 0a 20 20 20 20 70 75 74 63 28 2a 73 74 72  +;.    putc(*str
14eb0 2c 6f 75 74 29 3b 0a 20 20 20 20 73 74 72 2b 2b  ,out);.    str++
14ec0 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  ;.  }.  fprintf(
14ed0 6f 75 74 2c 22 5c 6e 23 6c 69 6e 65 20 25 64 20  out,"\n#line %d 
14ee0 5c 22 25 73 5c 22 5c 6e 22 2c 2a 6c 69 6e 65 6e  \"%s\"\n",*linen
14ef0 6f 2b 32 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61 6d  o+2,lemp->outnam
14f00 65 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 3d 32  e); (*lineno)+=2
14f10 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
14f20 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
14f30 6e 67 20 72 6f 75 74 69 6e 65 20 65 6d 69 74 73  ng routine emits
14f40 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 64 65   code for the de
14f50 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 65  structor for the
14f60 0a 2a 2a 20 73 79 6d 62 6f 6c 20 73 70 0a 2a 2f  .** symbol sp.*/
14f70 0a 76 6f 69 64 20 65 6d 69 74 5f 64 65 73 74 72  .void emit_destr
14f80 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c 73  uctor_code(out,s
14f90 70 2c 6c 65 6d 70 2c 6c 69 6e 65 6e 6f 29 0a 46  p,lemp,lineno).F
14fa0 49 4c 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74  ILE *out;.struct
14fb0 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 73 74 72   symbol *sp;.str
14fc0 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
14fd0 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a  .int *lineno;.{.
14fe0 20 63 68 61 72 20 2a 63 70 3b 0a 0a 20 69 6e 74   char *cp;.. int
14ff0 20 6c 69 6e 65 63 6e 74 20 3d 20 30 3b 0a 20 69   linecnt = 0;. i
15000 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52  f( sp->type==TER
15010 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 63 70 20 3d  MINAL ){.   cp =
15020 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74   lemp->tokendest
15030 3b 0a 20 20 20 69 66 28 20 63 70 3d 3d 30 20 29  ;.   if( cp==0 )
15040 20 72 65 74 75 72 6e 3b 0a 20 20 20 66 70 72 69   return;.   fpri
15050 6e 74 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25  ntf(out,"#line %
15060 64 20 5c 22 25 73 5c 22 5c 6e 7b 22 2c 6c 65 6d  d \"%s\"\n{",lem
15070 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 6c 6e 2c 6c  p->tokendestln,l
15080 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a  emp->filename);.
15090 20 7d 65 6c 73 65 20 69 66 28 20 73 70 2d 3e 64   }else if( sp->d
150a0 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
150b0 63 70 20 3d 20 73 70 2d 3e 64 65 73 74 72 75 63  cp = sp->destruc
150c0 74 6f 72 3b 0a 20 20 20 66 70 72 69 6e 74 66 28  tor;.   fprintf(
150d0 6f 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22  out,"#line %d \"
150e0 25 73 5c 22 5c 6e 7b 22 2c 73 70 2d 3e 64 65 73  %s\"\n{",sp->des
150f0 74 72 75 63 74 6f 72 6c 6e 2c 6c 65 6d 70 2d 3e  tructorln,lemp->
15100 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 7d 65 6c 73  filename);. }els
15110 65 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64  e if( lemp->vard
15120 65 73 74 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c  est ){.   cp = l
15130 65 6d 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20  emp->vardest;.  
15140 20 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65 74   if( cp==0 ) ret
15150 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66 28  urn;.   fprintf(
15160 6f 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22  out,"#line %d \"
15170 25 73 5c 22 5c 6e 7b 22 2c 6c 65 6d 70 2d 3e 76  %s\"\n{",lemp->v
15180 61 72 64 65 73 74 6c 6e 2c 6c 65 6d 70 2d 3e 66  ardestln,lemp->f
15190 69 6c 65 6e 61 6d 65 29 3b 0a 20 7d 0a 20 66 6f  ilename);. }. fo
151a0 72 28 3b 20 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a  r(; *cp; cp++){.
151b0 20 20 20 69 66 28 20 2a 63 70 3d 3d 27 24 27 20     if( *cp=='$' 
151c0 26 26 20 63 70 5b 31 5d 3d 3d 27 24 27 20 29 7b  && cp[1]=='$' ){
151d0 0a 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  .     fprintf(ou
151e0 74 2c 22 28 79 79 70 6d 69 6e 6f 72 2d 3e 79 79  t,"(yypminor->yy
151f0 25 64 29 22 2c 73 70 2d 3e 64 74 6e 75 6d 29 3b  %d)",sp->dtnum);
15200 0a 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20  .     cp++;.    
15210 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 7d 0a   continue;.   }.
15220 20 20 20 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27     if( *cp=='\n'
15230 20 29 20 6c 69 6e 65 63 6e 74 2b 2b 3b 0a 20 20   ) linecnt++;.  
15240 20 66 70 75 74 63 28 2a 63 70 2c 6f 75 74 29 3b   fputc(*cp,out);
15250 0a 20 7d 0a 20 28 2a 6c 69 6e 65 6e 6f 29 20 2b  . }. (*lineno) +
15260 3d 20 33 20 2b 20 6c 69 6e 65 63 6e 74 3b 0a 20  = 3 + linecnt;. 
15270 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e  fprintf(out,"}\n
15280 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c  #line %d \"%s\"\
15290 6e 22 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d  n",*lineno,lemp-
152a0 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 72 65 74 75  >outname);. retu
152b0 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rn;.}../*.** Ret
152c0 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65  urn TRUE (non-ze
152d0 72 6f 29 20 69 66 20 74 68 65 20 67 69 76 65 6e  ro) if the given
152e0 20 73 79 6d 62 6f 6c 20 68 61 73 20 61 20 64 65   symbol has a de
152f0 73 74 72 75 63 74 6f 72 2e 0a 2a 2f 0a 69 6e 74  structor..*/.int
15300 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72 28   has_destructor(
15310 73 70 2c 20 6c 65 6d 70 29 0a 73 74 72 75 63 74  sp, lemp).struct
15320 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 73 74 72   symbol *sp;.str
15330 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
15340 0a 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  .{.  int ret;.  
15350 69 66 28 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45  if( sp->type==TE
15360 52 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 72 65  RMINAL ){.    re
15370 74 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64  t = lemp->tokend
15380 65 73 74 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b  est!=0;.  }else{
15390 0a 20 20 20 20 72 65 74 20 3d 20 6c 65 6d 70 2d  .    ret = lemp-
153a0 3e 76 61 72 64 65 73 74 21 3d 30 20 7c 7c 20 73  >vardest!=0 || s
153b0 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21 3d 30  p->destructor!=0
153c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
153d0 65 74 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 47 65  et;.}../* .** Ge
153e0 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69 63  nerate code whic
153f0 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e 20  h executes when 
15400 74 68 65 20 72 75 6c 65 20 22 72 70 22 20 69 73  the rule "rp" is
15410 20 72 65 64 75 63 65 64 2e 20 20 57 72 69 74 65   reduced.  Write
15420 0a 2a 2a 20 74 68 65 20 63 6f 64 65 20 74 6f 20  .** the code to 
15430 22 6f 75 74 22 2e 20 20 4d 61 6b 65 20 73 75 72  "out".  Make sur
15440 65 20 6c 69 6e 65 6e 6f 20 73 74 61 79 73 20 75  e lineno stays u
15450 70 2d 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 50 52  p-to-date..*/.PR
15460 49 56 41 54 45 20 76 6f 69 64 20 65 6d 69 74 5f  IVATE void emit_
15470 63 6f 64 65 28 6f 75 74 2c 72 70 2c 6c 65 6d 70  code(out,rp,lemp
15480 2c 6c 69 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a 6f  ,lineno).FILE *o
15490 75 74 3b 0a 73 74 72 75 63 74 20 72 75 6c 65 20  ut;.struct rule 
154a0 2a 72 70 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f  *rp;.struct lemo
154b0 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20 2a 6c 69  n *lemp;.int *li
154c0 6e 65 6e 6f 3b 0a 7b 0a 20 63 68 61 72 20 2a 63  neno;.{. char *c
154d0 70 2c 20 2a 78 70 3b 0a 20 69 6e 74 20 6c 69 6e  p, *xp;. int lin
154e0 65 63 6e 74 20 3d 20 30 3b 0a 20 69 6e 74 20 69  ecnt = 0;. int i
154f0 3b 0a 20 63 68 61 72 20 6c 68 73 75 73 65 64 20  ;. char lhsused 
15500 3d 20 30 3b 20 20 20 20 2f 2a 20 54 72 75 65 20  = 0;    /* True 
15510 69 66 20 74 68 65 20 4c 48 53 20 65 6c 65 6d 65  if the LHS eleme
15520 6e 74 20 68 61 73 20 62 65 65 6e 20 75 73 65 64  nt has been used
15530 20 2a 2f 0a 20 63 68 61 72 20 75 73 65 64 5b 4d   */. char used[M
15540 41 58 52 48 53 5d 3b 20 20 20 2f 2a 20 54 72 75  AXRHS];   /* Tru
15550 65 20 66 6f 72 20 65 61 63 68 20 52 48 53 20 65  e for each RHS e
15560 6c 65 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  lement which is 
15570 75 73 65 64 20 2a 2f 0a 0a 20 66 6f 72 28 69 3d  used */.. for(i=
15580 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69  0; i<rp->nrhs; i
15590 2b 2b 29 20 75 73 65 64 5b 69 5d 20 3d 20 30 3b  ++) used[i] = 0;
155a0 0a 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 0a 0a  . lhsused = 0;..
155b0 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   /* Generate cod
155c0 65 20 74 6f 20 64 6f 20 74 68 65 20 72 65 64 75  e to do the redu
155d0 63 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 69 66  ce action */. if
155e0 28 20 72 70 2d 3e 63 6f 64 65 20 29 7b 0a 20 20  ( rp->code ){.  
155f0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 6c   fprintf(out,"#l
15600 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c 6e 7b  ine %d \"%s\"\n{
15610 22 2c 72 70 2d 3e 6c 69 6e 65 2c 6c 65 6d 70 2d  ",rp->line,lemp-
15620 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 66  >filename);.   f
15630 6f 72 28 63 70 3d 72 70 2d 3e 63 6f 64 65 3b 20  or(cp=rp->code; 
15640 2a 63 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20  *cp; cp++){.    
15650 20 69 66 28 20 69 73 61 6c 70 68 61 28 2a 63 70   if( isalpha(*cp
15660 29 20 26 26 20 28 63 70 3d 3d 72 70 2d 3e 63 6f  ) && (cp==rp->co
15670 64 65 20 7c 7c 20 28 21 69 73 61 6c 6e 75 6d 28  de || (!isalnum(
15680 63 70 5b 2d 31 5d 29 20 26 26 20 63 70 5b 2d 31  cp[-1]) && cp[-1
15690 5d 21 3d 27 5f 27 29 29 20 29 7b 0a 20 20 20 20  ]!='_')) ){.    
156a0 20 20 20 63 68 61 72 20 73 61 76 65 64 3b 0a 20     char saved;. 
156b0 20 20 20 20 20 20 66 6f 72 28 78 70 3d 20 26 63        for(xp= &c
156c0 70 5b 31 5d 3b 20 69 73 61 6c 6e 75 6d 28 2a 78  p[1]; isalnum(*x
156d0 70 29 20 7c 7c 20 2a 78 70 3d 3d 27 5f 27 3b 20  p) || *xp=='_'; 
156e0 78 70 2b 2b 29 3b 0a 20 20 20 20 20 20 20 73 61  xp++);.       sa
156f0 76 65 64 20 3d 20 2a 78 70 3b 0a 20 20 20 20 20  ved = *xp;.     
15700 20 20 2a 78 70 20 3d 20 30 3b 0a 20 20 20 20 20    *xp = 0;.     
15710 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61 6c 69    if( rp->lhsali
15720 61 73 20 26 26 20 73 74 72 63 6d 70 28 63 70 2c  as && strcmp(cp,
15730 72 70 2d 3e 6c 68 73 61 6c 69 61 73 29 3d 3d 30  rp->lhsalias)==0
15740 20 29 7b 0a 20 20 20 20 20 20 20 20 20 66 70 72   ){.         fpr
15750 69 6e 74 66 28 6f 75 74 2c 22 79 79 67 6f 74 6f  intf(out,"yygoto
15760 6d 69 6e 6f 72 2e 79 79 25 64 22 2c 72 70 2d 3e  minor.yy%d",rp->
15770 6c 68 73 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20  lhs->dtnum);.   
15780 20 20 20 20 20 20 63 70 20 3d 20 78 70 3b 0a 20        cp = xp;. 
15790 20 20 20 20 20 20 20 20 6c 68 73 75 73 65 64 20          lhsused 
157a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 7d 65 6c 73  = 1;.       }els
157b0 65 7b 0a 20 20 20 20 20 20 20 20 20 66 6f 72 28  e{.         for(
157c0 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b  i=0; i<rp->nrhs;
157d0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
157e0 20 20 69 66 28 20 72 70 2d 3e 72 68 73 61 6c 69    if( rp->rhsali
157f0 61 73 5b 69 5d 20 26 26 20 73 74 72 63 6d 70 28  as[i] && strcmp(
15800 63 70 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  cp,rp->rhsalias[
15810 69 5d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  i])==0 ){.      
15820 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
15830 75 74 2c 22 79 79 6d 73 70 5b 25 64 5d 2e 6d 69  ut,"yymsp[%d].mi
15840 6e 6f 72 2e 79 79 25 64 22 2c 69 2d 72 70 2d 3e  nor.yy%d",i-rp->
15850 6e 72 68 73 2b 31 2c 72 70 2d 3e 72 68 73 5b 69  nrhs+1,rp->rhs[i
15860 5d 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20  ]->dtnum);.     
15870 20 20 20 20 20 20 20 20 63 70 20 3d 20 78 70 3b          cp = xp;
15880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73  .             us
15890 65 64 5b 69 5d 20 3d 20 31 3b 0a 20 20 20 20 20  ed[i] = 1;.     
158a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
158b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
158c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 7d 0a       }.       }.
158d0 20 20 20 20 20 20 20 2a 78 70 20 3d 20 73 61 76         *xp = sav
158e0 65 64 3b 0a 20 20 20 20 20 7d 0a 20 20 20 20 20  ed;.     }.     
158f0 69 66 28 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20  if( *cp=='\n' ) 
15900 6c 69 6e 65 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  linecnt++;.     
15910 66 70 75 74 63 28 2a 63 70 2c 6f 75 74 29 3b 0a  fputc(*cp,out);.
15920 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70     } /* End loop
15930 20 2a 2f 0a 20 20 20 28 2a 6c 69 6e 65 6e 6f 29   */.   (*lineno)
15940 20 2b 3d 20 33 20 2b 20 6c 69 6e 65 63 6e 74 3b   += 3 + linecnt;
15950 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  .   fprintf(out,
15960 22 7d 5c 6e 23 6c 69 6e 65 20 25 64 20 5c 22 25  "}\n#line %d \"%
15970 73 5c 22 5c 6e 22 2c 2a 6c 69 6e 65 6e 6f 2c 6c  s\"\n",*lineno,l
15980 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20  emp->outname);. 
15990 7d 20 2f 2a 20 45 6e 64 20 69 66 28 20 72 70 2d  } /* End if( rp-
159a0 3e 63 6f 64 65 20 29 20 2a 2f 0a 0a 20 2f 2a 20  >code ) */.. /* 
159b0 43 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75  Check to make su
159c0 72 65 20 74 68 65 20 4c 48 53 20 68 61 73 20 62  re the LHS has b
159d0 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20 69 66 28  een used */. if(
159e0 20 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26   rp->lhsalias &&
159f0 20 21 6c 68 73 75 73 65 64 20 29 7b 0a 20 20 20   !lhsused ){.   
15a00 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66  ErrorMsg(lemp->f
15a10 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65  ilename,rp->rule
15a20 6c 69 6e 65 2c 0a 20 20 20 20 20 22 4c 61 62 65  line,.     "Labe
15a30 6c 20 5c 22 25 73 5c 22 20 66 6f 72 20 5c 22 25  l \"%s\" for \"%
15a40 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76 65 72  s(%s)\" is never
15a50 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20 20 20   used.",.       
15a60 72 70 2d 3e 6c 68 73 61 6c 69 61 73 2c 72 70 2d  rp->lhsalias,rp-
15a70 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 72 70 2d 3e 6c  >lhs->name,rp->l
15a80 68 73 61 6c 69 61 73 29 3b 0a 20 20 20 6c 65 6d  hsalias);.   lem
15a90 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
15aa0 7d 0a 0a 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  }.. /* Generate 
15ab0 64 65 73 74 72 75 63 74 6f 72 20 63 6f 64 65 20  destructor code 
15ac0 66 6f 72 20 52 48 53 20 73 79 6d 62 6f 6c 73 20  for RHS symbols 
15ad0 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 75 73  which are not us
15ae0 65 64 20 69 6e 20 74 68 65 0a 20 2a 2a 20 72 65  ed in the. ** re
15af0 64 75 63 65 20 63 6f 64 65 20 2a 2f 0a 20 66 6f  duce code */. fo
15b00 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68  r(i=0; i<rp->nrh
15b10 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 69 66 28 20  s; i++){.   if( 
15b20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20  rp->rhsalias[i] 
15b30 26 26 20 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20  && !used[i] ){. 
15b40 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d      ErrorMsg(lem
15b50 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e  p->filename,rp->
15b60 72 75 6c 65 6c 69 6e 65 2c 0a 20 20 20 20 20 20  ruleline,.      
15b70 20 22 4c 61 62 65 6c 20 25 73 20 66 6f 72 20 5c   "Label %s for \
15b80 22 25 73 28 25 73 29 5c 22 20 69 73 20 6e 65 76  "%s(%s)\" is nev
15b90 65 72 20 75 73 65 64 2e 22 2c 0a 20 20 20 20 20  er used.",.     
15ba0 20 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69    rp->rhsalias[i
15bb0 5d 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61  ],rp->rhs[i]->na
15bc0 6d 65 2c 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  me,rp->rhsalias[
15bd0 69 5d 29 3b 0a 20 20 20 20 20 6c 65 6d 70 2d 3e  i]);.     lemp->
15be0 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 7d  errorcnt++;.   }
15bf0 65 6c 73 65 20 69 66 28 20 72 70 2d 3e 72 68 73  else if( rp->rhs
15c00 61 6c 69 61 73 5b 69 5d 3d 3d 30 20 29 7b 0a 20  alias[i]==0 ){. 
15c10 20 20 20 20 69 66 28 20 68 61 73 5f 64 65 73 74      if( has_dest
15c20 72 75 63 74 6f 72 28 72 70 2d 3e 72 68 73 5b 69  ructor(rp->rhs[i
15c30 5d 2c 6c 65 6d 70 29 20 29 7b 0a 20 20 20 20 20  ],lemp) ){.     
15c40 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
15c50 20 79 79 5f 64 65 73 74 72 75 63 74 6f 72 28 25   yy_destructor(%
15c60 64 2c 26 79 79 6d 73 70 5b 25 64 5d 2e 6d 69 6e  d,&yymsp[%d].min
15c70 6f 72 29 3b 5c 6e 22 2c 0a 20 20 20 20 20 20 20  or);\n",.       
15c80 20 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 69     rp->rhs[i]->i
15c90 6e 64 65 78 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b  ndex,i-rp->nrhs+
15ca0 31 29 3b 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b  1); (*lineno)++;
15cb0 0a 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  .     }else{.   
15cc0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
15cd0 22 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20 64  "        /* No d
15ce0 65 73 74 72 75 63 74 6f 72 20 64 65 66 69 6e 65  estructor define
15cf0 64 20 66 6f 72 20 25 73 20 2a 2f 5c 6e 22 2c 0a  d for %s */\n",.
15d00 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b          rp->rhs[
15d10 69 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  i]->name);.     
15d20 20 20 20 28 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a     (*lineno)++;.
15d30 20 20 20 20 20 7d 0a 20 20 20 7d 0a 20 7d 0a 20       }.   }. }. 
15d40 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  return;.}../*.**
15d50 20 50 72 69 6e 74 20 74 68 65 20 64 65 66 69 6e   Print the defin
15d60 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 75 6e 69  ition of the uni
15d70 6f 6e 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  on used for the 
15d80 70 61 72 73 65 72 27 73 20 64 61 74 61 20 73 74  parser's data st
15d90 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 75 6e 69  ack..** This uni
15da0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 66 69 65 6c  on contains fiel
15db0 64 73 20 66 6f 72 20 65 76 65 72 79 20 70 6f 73  ds for every pos
15dc0 73 69 62 6c 65 20 64 61 74 61 20 74 79 70 65 20  sible data type 
15dd0 66 6f 72 20 74 6f 6b 65 6e 73 0a 2a 2a 20 61 6e  for tokens.** an
15de0 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2e 20  d nonterminals. 
15df0 20 49 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20   In the process 
15e00 6f 66 20 63 6f 6d 70 75 74 69 6e 67 20 61 6e 64  of computing and
15e10 20 70 72 69 6e 74 69 6e 67 20 74 68 69 73 0a 2a   printing this.*
15e20 2a 20 75 6e 69 6f 6e 2c 20 61 6c 73 6f 20 73 65  * union, also se
15e30 74 20 74 68 65 20 22 2e 64 74 6e 75 6d 22 20 66  t the ".dtnum" f
15e40 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 74 65  ield of every te
15e50 72 6d 69 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65  rminal and nonte
15e60 72 6d 69 6e 61 6c 0a 2a 2a 20 73 79 6d 62 6f 6c  rminal.** symbol
15e70 2e 0a 2a 2f 0a 76 6f 69 64 20 70 72 69 6e 74 5f  ..*/.void print_
15e80 73 74 61 63 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c  stack_union(out,
15e90 6c 65 6d 70 2c 70 6c 69 6e 65 6e 6f 2c 6d 68 66  lemp,plineno,mhf
15ea0 6c 61 67 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 20  lag).FILE *out; 
15eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ec0 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 73   /* The output s
15ed0 74 72 65 61 6d 20 2a 2f 0a 73 74 72 75 63 74 20  tream */.struct 
15ee0 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 20 20 20 20  lemon *lemp;    
15ef0 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
15f00 20 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20   info structure 
15f10 66 6f 72 20 74 68 69 73 20 70 61 72 73 65 72 20  for this parser 
15f20 2a 2f 0a 69 6e 74 20 2a 70 6c 69 6e 65 6e 6f 3b  */.int *plineno;
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15f40 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  * Pointer to the
15f50 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
15f60 69 6e 74 20 6d 68 66 6c 61 67 3b 20 20 20 20 20  int mhflag;     
15f70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15f80 72 75 65 20 69 66 20 67 65 6e 65 72 61 74 69 6e  rue if generatin
15f90 67 20 6d 61 6b 65 68 65 61 64 65 72 73 20 6f 75  g makeheaders ou
15fa0 74 70 75 74 20 2a 2f 0a 7b 0a 20 20 69 6e 74 20  tput */.{.  int 
15fb0 6c 69 6e 65 6e 6f 20 3d 20 2a 70 6c 69 6e 65 6e  lineno = *plinen
15fc0 6f 3b 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 6e  o;    /* The lin
15fd0 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
15fe0 6f 75 74 70 75 74 20 2a 2f 0a 20 20 63 68 61 72  output */.  char
15ff0 20 2a 2a 74 79 70 65 73 3b 20 20 20 20 20 20 20   **types;       
16000 20 20 20 20 20 20 2f 2a 20 41 20 68 61 73 68 20        /* A hash 
16010 74 61 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70  table of datatyp
16020 65 73 20 2a 2f 0a 20 20 69 6e 74 20 61 72 72 61  es */.  int arra
16030 79 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  ysize;          
16040 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
16050 20 22 74 79 70 65 73 22 20 61 72 72 61 79 20 2a   "types" array *
16060 2f 0a 20 20 69 6e 74 20 6d 61 78 64 74 6c 65 6e  /.  int maxdtlen
16070 67 74 68 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  gth;          /*
16080 20 4d 61 78 69 6d 75 6d 20 6c 65 6e 67 74 68 20   Maximum length 
16090 6f 66 20 61 6e 79 20 22 2e 64 61 74 61 74 79 70  of any ".datatyp
160a0 65 22 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 63  e" field. */.  c
160b0 68 61 72 20 2a 73 74 64 64 74 3b 20 20 20 20 20  har *stddt;     
160c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 6e           /* Stan
160d0 64 61 72 64 69 7a 65 64 20 6e 61 6d 65 20 66 6f  dardized name fo
160e0 72 20 61 20 64 61 74 61 74 79 70 65 20 2a 2f 0a  r a datatype */.
160f0 20 20 69 6e 74 20 69 2c 6a 3b 20 20 20 20 20 20    int i,j;      
16100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
16110 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
16120 20 20 69 6e 74 20 68 61 73 68 3b 20 20 20 20 20    int hash;     
16130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
16140 6f 72 20 68 61 73 68 69 6e 67 20 74 68 65 20 6e  or hashing the n
16150 61 6d 65 20 6f 66 20 61 20 74 79 70 65 20 2a 2f  ame of a type */
16160 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65 3b 20 20  .  char *name;  
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16180 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72 73  Name of the pars
16190 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  er */..  /* Allo
161a0 63 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c  cate and initial
161b0 69 7a 65 20 74 79 70 65 73 5b 5d 20 61 6e 64 20  ize types[] and 
161c0 61 6c 6c 6f 63 61 74 65 20 73 74 64 64 74 5b 5d  allocate stddt[]
161d0 20 2a 2f 0a 20 20 61 72 72 61 79 73 69 7a 65 20   */.  arraysize 
161e0 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20  = lemp->nsymbol 
161f0 2a 20 32 3b 0a 20 20 74 79 70 65 73 20 3d 20 28  * 2;.  types = (
16200 63 68 61 72 2a 2a 29 6d 61 6c 6c 6f 63 28 20 61  char**)malloc( a
16210 72 72 61 79 73 69 7a 65 20 2a 20 73 69 7a 65 6f  rraysize * sizeo
16220 66 28 63 68 61 72 2a 29 20 29 3b 0a 20 20 66 6f  f(char*) );.  fo
16230 72 28 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69  r(i=0; i<arraysi
16240 7a 65 3b 20 69 2b 2b 29 20 74 79 70 65 73 5b 69  ze; i++) types[i
16250 5d 20 3d 20 30 3b 0a 20 20 6d 61 78 64 74 6c 65  ] = 0;.  maxdtle
16260 6e 67 74 68 20 3d 20 30 3b 0a 20 20 69 66 28 20  ngth = 0;.  if( 
16270 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 20 29 7b  lemp->vartype ){
16280 0a 20 20 20 20 6d 61 78 64 74 6c 65 6e 67 74 68  .    maxdtlength
16290 20 3d 20 73 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e   = strlen(lemp->
162a0 76 61 72 74 79 70 65 29 3b 0a 20 20 7d 0a 20 20  vartype);.  }.  
162b0 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
162c0 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
162d0 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
162e0 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
162f0 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
16300 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73  ls[i];.    if( s
16310 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d 30 20 29  p->datatype==0 )
16320 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 6c   continue;.    l
16330 65 6e 20 3d 20 73 74 72 6c 65 6e 28 73 70 2d 3e  en = strlen(sp->
16340 64 61 74 61 74 79 70 65 29 3b 0a 20 20 20 20 69  datatype);.    i
16350 66 28 20 6c 65 6e 3e 6d 61 78 64 74 6c 65 6e 67  f( len>maxdtleng
16360 74 68 20 29 20 6d 61 78 64 74 6c 65 6e 67 74 68  th ) maxdtlength
16370 20 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 73 74   = len;.  }.  st
16380 64 64 74 20 3d 20 28 63 68 61 72 2a 29 6d 61 6c  ddt = (char*)mal
16390 6c 6f 63 28 20 6d 61 78 64 74 6c 65 6e 67 74 68  loc( maxdtlength
163a0 2a 32 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  *2 + 1 );.  if( 
163b0 74 79 70 65 73 3d 3d 30 20 7c 7c 20 73 74 64 64  types==0 || stdd
163c0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69  t==0 ){.    fpri
163d0 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75 74 20  ntf(stderr,"Out 
163e0 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29 3b 0a  of memory.\n");.
163f0 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
16400 0a 0a 20 20 2f 2a 20 42 75 69 6c 64 20 61 20 68  ..  /* Build a h
16410 61 73 68 20 74 61 62 6c 65 20 6f 66 20 64 61 74  ash table of dat
16420 61 74 79 70 65 73 2e 20 54 68 65 20 22 2e 64 74  atypes. The ".dt
16430 6e 75 6d 22 20 66 69 65 6c 64 20 6f 66 20 65 61  num" field of ea
16440 63 68 20 73 79 6d 62 6f 6c 0a 20 20 2a 2a 20 69  ch symbol.  ** i
16450 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68  s filled in with
16460 20 74 68 65 20 68 61 73 68 20 69 6e 64 65 78 20   the hash index 
16470 70 6c 75 73 20 31 2e 20 20 41 20 22 2e 64 74 6e  plus 1.  A ".dtn
16480 75 6d 22 20 76 61 6c 75 65 20 6f 66 20 30 20 69  um" value of 0 i
16490 73 0a 20 20 2a 2a 20 75 73 65 64 20 66 6f 72 20  s.  ** used for 
164a0 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c 73  terminal symbols
164b0 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  .  If there is n
164c0 6f 20 25 64 65 66 61 75 6c 74 5f 74 79 70 65 20  o %default_type 
164d0 64 65 66 69 6e 65 64 20 74 68 65 6e 0a 20 20 2a  defined then.  *
164e0 2a 20 30 20 69 73 20 61 6c 73 6f 20 75 73 65 64  * 0 is also used
164f0 20 61 73 20 74 68 65 20 2e 64 74 6e 75 6d 20 76   as the .dtnum v
16500 61 6c 75 65 20 66 6f 72 20 6e 6f 6e 74 65 72 6d  alue for nonterm
16510 69 6e 61 6c 73 20 77 68 69 63 68 20 64 6f 20 6e  inals which do n
16520 6f 74 20 73 70 65 63 69 66 79 0a 20 20 2a 2a 20  ot specify.  ** 
16530 61 20 64 61 74 61 74 79 70 65 20 75 73 69 6e 67  a datatype using
16540 20 74 68 65 20 25 74 79 70 65 20 64 69 72 65 63   the %type direc
16550 74 69 76 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  tive..  */.  for
16560 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
16570 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
16580 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
16590 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
165a0 6c 73 5b 69 5d 3b 0a 20 20 20 20 63 68 61 72 20  ls[i];.    char 
165b0 2a 63 70 3b 0a 20 20 20 20 69 66 28 20 73 70 3d  *cp;.    if( sp=
165c0 3d 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 20 29 7b  =lemp->errsym ){
165d0 0a 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d  .      sp->dtnum
165e0 20 3d 20 61 72 72 61 79 73 69 7a 65 2b 31 3b 0a   = arraysize+1;.
165f0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
16600 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 70      }.    if( sp
16610 2d 3e 74 79 70 65 21 3d 4e 4f 4e 54 45 52 4d 49  ->type!=NONTERMI
16620 4e 41 4c 20 7c 7c 20 28 73 70 2d 3e 64 61 74 61  NAL || (sp->data
16630 74 79 70 65 3d 3d 30 20 26 26 20 6c 65 6d 70 2d  type==0 && lemp-
16640 3e 76 61 72 74 79 70 65 3d 3d 30 29 20 29 7b 0a  >vartype==0) ){.
16650 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20        sp->dtnum 
16660 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69  = 0;.      conti
16670 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  nue;.    }.    c
16680 70 20 3d 20 73 70 2d 3e 64 61 74 61 74 79 70 65  p = sp->datatype
16690 3b 0a 20 20 20 20 69 66 28 20 63 70 3d 3d 30 20  ;.    if( cp==0 
166a0 29 20 63 70 20 3d 20 6c 65 6d 70 2d 3e 76 61 72  ) cp = lemp->var
166b0 74 79 70 65 3b 0a 20 20 20 20 6a 20 3d 20 30 3b  type;.    j = 0;
166c0 0a 20 20 20 20 77 68 69 6c 65 28 20 69 73 73 70  .    while( issp
166d0 61 63 65 28 2a 63 70 29 20 29 20 63 70 2b 2b 3b  ace(*cp) ) cp++;
166e0 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 63 70 20  .    while( *cp 
166f0 29 20 73 74 64 64 74 5b 6a 2b 2b 5d 20 3d 20 2a  ) stddt[j++] = *
16700 63 70 2b 2b 3b 0a 20 20 20 20 77 68 69 6c 65 28  cp++;.    while(
16710 20 6a 3e 30 20 26 26 20 69 73 73 70 61 63 65 28   j>0 && isspace(
16720 73 74 64 64 74 5b 6a 2d 31 5d 29 20 29 20 6a 2d  stddt[j-1]) ) j-
16730 2d 3b 0a 20 20 20 20 73 74 64 64 74 5b 6a 5d 20  -;.    stddt[j] 
16740 3d 20 30 3b 0a 20 20 20 20 68 61 73 68 20 3d 20  = 0;.    hash = 
16750 30 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  0;.    for(j=0; 
16760 73 74 64 64 74 5b 6a 5d 3b 20 6a 2b 2b 29 7b 0a  stddt[j]; j++){.
16770 20 20 20 20 20 20 68 61 73 68 20 3d 20 68 61 73        hash = has
16780 68 2a 35 33 20 2b 20 73 74 64 64 74 5b 6a 5d 3b  h*53 + stddt[j];
16790 0a 20 20 20 20 7d 0a 20 20 20 20 68 61 73 68 20  .    }.    hash 
167a0 3d 20 28 68 61 73 68 20 26 20 30 78 37 66 66 66  = (hash & 0x7fff
167b0 66 66 66 66 29 25 61 72 72 61 79 73 69 7a 65 3b  ffff)%arraysize;
167c0 0a 20 20 20 20 77 68 69 6c 65 28 20 74 79 70 65  .    while( type
167d0 73 5b 68 61 73 68 5d 20 29 7b 0a 20 20 20 20 20  s[hash] ){.     
167e0 20 69 66 28 20 73 74 72 63 6d 70 28 74 79 70 65   if( strcmp(type
167f0 73 5b 68 61 73 68 5d 2c 73 74 64 64 74 29 3d 3d  s[hash],stddt)==
16800 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 70 2d  0 ){.        sp-
16810 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b 20  >dtnum = hash + 
16820 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
16830 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
16840 68 61 73 68 2b 2b 3b 0a 20 20 20 20 20 20 69 66  hash++;.      if
16850 28 20 68 61 73 68 3e 3d 61 72 72 61 79 73 69 7a  ( hash>=arraysiz
16860 65 20 29 20 68 61 73 68 20 3d 20 30 3b 0a 20 20  e ) hash = 0;.  
16870 20 20 7d 0a 20 20 20 20 69 66 28 20 74 79 70 65    }.    if( type
16880 73 5b 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20  s[hash]==0 ){.  
16890 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20      sp->dtnum = 
168a0 68 61 73 68 20 2b 20 31 3b 0a 20 20 20 20 20 20  hash + 1;.      
168b0 74 79 70 65 73 5b 68 61 73 68 5d 20 3d 20 28 63  types[hash] = (c
168c0 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 73 74 72  har*)malloc( str
168d0 6c 65 6e 28 73 74 64 64 74 29 2b 31 20 29 3b 0a  len(stddt)+1 );.
168e0 20 20 20 20 20 20 69 66 28 20 74 79 70 65 73 5b        if( types[
168f0 68 61 73 68 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  hash]==0 ){.    
16900 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
16910 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d 6f 72  rr,"Out of memor
16920 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  y.\n");.        
16930 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20 7d  exit(1);.      }
16940 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 74 79  .      strcpy(ty
16950 70 65 73 5b 68 61 73 68 5d 2c 73 74 64 64 74 29  pes[hash],stddt)
16960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16970 2a 20 50 72 69 6e 74 20 6f 75 74 20 74 68 65 20  * Print out the 
16980 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 59 59  definition of YY
16990 54 4f 4b 45 4e 54 59 50 45 20 61 6e 64 20 59 59  TOKENTYPE and YY
169a0 4d 49 4e 4f 52 54 59 50 45 20 2a 2f 0a 20 20 6e  MINORTYPE */.  n
169b0 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61 6d 65  ame = lemp->name
169c0 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3a 20   ? lemp->name : 
169d0 22 50 61 72 73 65 22 3b 0a 20 20 6c 69 6e 65 6e  "Parse";.  linen
169e0 6f 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 0a 20 20  o = *plineno;.  
169f0 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70  if( mhflag ){ fp
16a00 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49  rintf(out,"#if I
16a10 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69  NTERFACE\n"); li
16a20 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69  neno++; }.  fpri
16a30 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
16a40 20 25 73 54 4f 4b 45 4e 54 59 50 45 20 25 73 5c   %sTOKENTYPE %s\
16a50 6e 22 2c 6e 61 6d 65 2c 0a 20 20 20 20 6c 65 6d  n",name,.    lem
16a60 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3f 6c 65 6d  p->tokentype?lem
16a70 70 2d 3e 74 6f 6b 65 6e 74 79 70 65 3a 22 76 6f  p->tokentype:"vo
16a80 69 64 2a 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b  id*");  lineno++
16a90 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20 29  ;.  if( mhflag )
16aa0 7b 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23  { fprintf(out,"#
16ab0 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e  endif\n"); linen
16ac0 6f 2b 2b 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66  o++; }.  fprintf
16ad0 28 6f 75 74 2c 22 74 79 70 65 64 65 66 20 75 6e  (out,"typedef un
16ae0 69 6f 6e 20 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ion {\n"); linen
16af0 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
16b00 75 74 2c 22 20 20 25 73 54 4f 4b 45 4e 54 59 50  ut,"  %sTOKENTYP
16b10 45 20 79 79 30 3b 5c 6e 22 2c 6e 61 6d 65 29 3b  E yy0;\n",name);
16b20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72   lineno++;.  for
16b30 28 69 3d 30 3b 20 69 3c 61 72 72 61 79 73 69 7a  (i=0; i<arraysiz
16b40 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  e; i++){.    if(
16b50 20 74 79 70 65 73 5b 69 5d 3d 3d 30 20 29 20 63   types[i]==0 ) c
16b60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 66 70 72  ontinue;.    fpr
16b70 69 6e 74 66 28 6f 75 74 2c 22 20 20 25 73 20 79  intf(out,"  %s y
16b80 79 25 64 3b 5c 6e 22 2c 74 79 70 65 73 5b 69 5d  y%d;\n",types[i]
16b90 2c 69 2b 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ,i+1); lineno++;
16ba0 0a 20 20 20 20 66 72 65 65 28 74 79 70 65 73 5b  .    free(types[
16bb0 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  i]);.  }.  fprin
16bc0 74 66 28 6f 75 74 2c 22 20 20 69 6e 74 20 79 79  tf(out,"  int yy
16bd0 25 64 3b 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72  %d;\n",lemp->err
16be0 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b 20 6c 69 6e  sym->dtnum); lin
16bf0 65 6e 6f 2b 2b 3b 0a 20 20 66 72 65 65 28 73 74  eno++;.  free(st
16c00 64 64 74 29 3b 0a 20 20 66 72 65 65 28 74 79 70  ddt);.  free(typ
16c10 65 73 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  es);.  fprintf(o
16c20 75 74 2c 22 7d 20 59 59 4d 49 4e 4f 52 54 59 50  ut,"} YYMINORTYP
16c30 45 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  E;\n"); lineno++
16c40 3b 0a 20 20 2a 70 6c 69 6e 65 6e 6f 20 3d 20 6c  ;.  *plineno = l
16c50 69 6e 65 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ineno;.}../*.** 
16c60 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
16c70 6f 66 20 61 20 43 20 64 61 74 61 74 79 70 65 20  of a C datatype 
16c80 61 62 6c 65 20 74 6f 20 72 65 70 72 65 73 65 6e  able to represen
16c90 74 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e  t values between
16ca0 0a 2a 2a 20 6c 77 72 20 61 6e 64 20 75 70 72 2c  .** lwr and upr,
16cb0 20 69 6e 63 6c 75 73 69 76 65 2e 0a 2a 2f 0a 73   inclusive..*/.s
16cc0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
16cd0 20 2a 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74   *minimum_size_t
16ce0 79 70 65 28 69 6e 74 20 6c 77 72 2c 20 69 6e 74  ype(int lwr, int
16cf0 20 75 70 72 29 7b 0a 20 20 69 66 28 20 6c 77 72   upr){.  if( lwr
16d00 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 75  >=0 ){.    if( u
16d10 70 72 3c 3d 32 35 35 20 29 7b 0a 20 20 20 20 20  pr<=255 ){.     
16d20 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67 6e 65   return "unsigne
16d30 64 20 63 68 61 72 22 3b 0a 20 20 20 20 7d 65 6c  d char";.    }el
16d40 73 65 20 69 66 28 20 75 70 72 3c 36 35 35 33 35  se if( upr<65535
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 73 68 6f 72 74   "unsigned short
16d70 20 69 6e 74 22 3b 0a 20 20 20 20 7d 65 6c 73 65   int";.    }else
16d80 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 22  {.      return "
16d90 75 6e 73 69 67 6e 65 64 20 69 6e 74 22 3b 0a 20  unsigned int";. 
16da0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
16db0 20 6c 77 72 3e 3d 2d 31 32 37 20 26 26 20 75 70   lwr>=-127 && up
16dc0 72 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 72 65  r<=127 ){.    re
16dd0 74 75 72 6e 20 22 73 69 67 6e 65 64 20 63 68 61  turn "signed cha
16de0 72 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r";.  }else if( 
16df0 6c 77 72 3e 3d 2d 33 32 37 36 37 20 26 26 20 75  lwr>=-32767 && u
16e00 70 72 3c 33 32 37 36 37 20 29 7b 0a 20 20 20 20  pr<32767 ){.    
16e10 72 65 74 75 72 6e 20 22 73 68 6f 72 74 22 3b 0a  return "short";.
16e20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
16e30 75 72 6e 20 22 69 6e 74 22 3b 0a 20 20 7d 0a 7d  urn "int";.  }.}
16e40 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 73 74 61  ../*.** Each sta
16e50 74 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 73 65  te contains a se
16e60 74 20 6f 66 20 74 6f 6b 65 6e 20 74 72 61 6e 73  t of token trans
16e70 61 63 74 69 6f 6e 20 61 6e 64 20 61 20 73 65 74  action and a set
16e80 20 6f 66 0a 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e   of.** nontermin
16e90 61 6c 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e  al transactions.
16ea0 20 20 45 61 63 68 20 6f 66 20 74 68 65 73 65 20    Each of these 
16eb0 73 65 74 73 20 6d 61 6b 65 73 20 61 6e 20 69 6e  sets makes an in
16ec0 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 65  stance.** of the
16ed0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
16ee0 74 75 72 65 2e 20 20 41 6e 20 61 72 72 61 79 20  ture.  An array 
16ef0 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75  of these structu
16f00 72 65 73 20 69 73 20 75 73 65 64 0a 2a 2a 20 74  res is used.** t
16f10 6f 20 6f 72 64 65 72 20 74 68 65 20 63 72 65 61  o order the crea
16f20 74 69 6f 6e 20 6f 66 20 65 6e 74 72 69 65 73 20  tion of entries 
16f30 69 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e  in the yy_action
16f40 5b 5d 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72  [] table..*/.str
16f50 75 63 74 20 61 78 73 65 74 20 7b 0a 20 20 73 74  uct axset {.  st
16f60 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
16f70 20 20 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72 20     /* A pointer 
16f80 74 6f 20 61 20 73 74 61 74 65 20 2a 2f 0a 20 20  to a state */.  
16f90 69 6e 74 20 69 73 54 6b 6e 3b 20 20 20 20 20 20  int isTkn;      
16fa0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
16fb0 75 73 65 20 74 6f 6b 65 6e 73 2e 20 20 46 61 6c  use tokens.  Fal
16fc0 73 65 20 66 6f 72 20 6e 6f 6e 2d 74 65 72 6d 69  se for non-termi
16fd0 6e 61 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  nals */.  int nA
16fe0 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 2f  ction;         /
16ff0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 63 74 69  * Number of acti
17000 6f 6e 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ons */.};../*.**
17010 20 43 6f 6d 70 61 72 65 20 74 6f 20 61 78 73 65   Compare to axse
17020 74 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  t structures for
17030 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 65   sorting purpose
17040 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
17050 61 78 73 65 74 5f 63 6f 6d 70 61 72 65 28 63 6f  axset_compare(co
17060 6e 73 74 20 76 6f 69 64 20 2a 61 2c 20 63 6f 6e  nst void *a, con
17070 73 74 20 76 6f 69 64 20 2a 62 29 7b 0a 20 20 73  st void *b){.  s
17080 74 72 75 63 74 20 61 78 73 65 74 20 2a 70 31 20  truct axset *p1 
17090 3d 20 28 73 74 72 75 63 74 20 61 78 73 65 74 2a  = (struct axset*
170a0 29 61 3b 0a 20 20 73 74 72 75 63 74 20 61 78 73  )a;.  struct axs
170b0 65 74 20 2a 70 32 20 3d 20 28 73 74 72 75 63 74  et *p2 = (struct
170c0 20 61 78 73 65 74 2a 29 62 3b 0a 20 20 72 65 74   axset*)b;.  ret
170d0 75 72 6e 20 70 32 2d 3e 6e 41 63 74 69 6f 6e 20  urn p2->nAction 
170e0 2d 20 70 31 2d 3e 6e 41 63 74 69 6f 6e 3b 0a 7d  - p1->nAction;.}
170f0 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 43 20  ../* Generate C 
17100 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72 20  source code for 
17110 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f  the parser */.vo
17120 69 64 20 52 65 70 6f 72 74 54 61 62 6c 65 28 6c  id ReportTable(l
17130 65 6d 70 2c 20 6d 68 66 6c 61 67 29 0a 73 74 72  emp, mhflag).str
17140 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b  uct lemon *lemp;
17150 0a 69 6e 74 20 6d 68 66 6c 61 67 3b 20 20 20 20  .int mhflag;    
17160 20 2f 2a 20 4f 75 74 70 75 74 20 69 6e 20 6d 61   /* Output in ma
17170 6b 65 68 65 61 64 65 72 73 20 66 6f 72 6d 61 74  keheaders format
17180 20 69 66 20 74 72 75 65 20 2a 2f 0a 7b 0a 20 20   if true */.{.  
17190 46 49 4c 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a  FILE *out, *in;.
171a0 20 20 63 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45    char line[LINE
171b0 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 20 6c 69  SIZE];.  int  li
171c0 6e 65 6e 6f 3b 0a 20 20 73 74 72 75 63 74 20 73  neno;.  struct s
171d0 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72  tate *stp;.  str
171e0 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a  uct action *ap;.
171f0 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
17200 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 74  p;.  struct actt
17210 61 62 20 2a 70 41 63 74 74 61 62 3b 0a 20 20 69  ab *pActtab;.  i
17220 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 63 68  nt i, j, n;.  ch
17230 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 69 6e 74 20  ar *name;.  int 
17240 6d 6e 54 6b 6e 4f 66 73 74 2c 20 6d 78 54 6b 6e  mnTknOfst, mxTkn
17250 4f 66 73 74 3b 0a 20 20 69 6e 74 20 6d 6e 4e 74  Ofst;.  int mnNt
17260 4f 66 73 74 2c 20 6d 78 4e 74 4f 66 73 74 3b 0a  Ofst, mxNtOfst;.
17270 20 20 73 74 72 75 63 74 20 61 78 73 65 74 20 2a    struct axset *
17280 61 78 3b 0a 0a 20 20 69 6e 20 3d 20 74 70 6c 74  ax;..  in = tplt
17290 5f 6f 70 65 6e 28 6c 65 6d 70 29 3b 0a 20 20 69  _open(lemp);.  i
172a0 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72  f( in==0 ) retur
172b0 6e 3b 0a 20 20 6f 75 74 20 3d 20 66 69 6c 65 5f  n;.  out = file_
172c0 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 63 22 2c 22  open(lemp,".c","
172d0 77 22 29 3b 0a 20 20 69 66 28 20 6f 75 74 3d 3d  w");.  if( out==
172e0 30 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28  0 ){.    fclose(
172f0 69 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  in);.    return;
17300 0a 20 20 7d 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20  .  }.  lineno = 
17310 31 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  1;.  tplt_xfer(l
17320 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
17330 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
17340 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 69 6e   Generate the in
17350 63 6c 75 64 65 20 63 6f 64 65 2c 20 69 66 20 61  clude code, if a
17360 6e 79 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  ny */.  tplt_pri
17370 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
17380 2d 3e 69 6e 63 6c 75 64 65 2c 6c 65 6d 70 2d 3e  ->include,lemp->
17390 69 6e 63 6c 75 64 65 6c 6e 2c 26 6c 69 6e 65 6e  includeln,&linen
173a0 6f 29 3b 0a 20 20 69 66 28 20 6d 68 66 6c 61 67  o);.  if( mhflag
173b0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 6e 61   ){.    char *na
173c0 6d 65 20 3d 20 66 69 6c 65 5f 6d 61 6b 65 6e 61  me = file_makena
173d0 6d 65 28 6c 65 6d 70 2c 20 22 2e 68 22 29 3b 0a  me(lemp, ".h");.
173e0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
173f0 22 23 69 6e 63 6c 75 64 65 20 5c 22 25 73 5c 22  "#include \"%s\"
17400 5c 6e 22 2c 20 6e 61 6d 65 29 3b 20 6c 69 6e 65  \n", name); line
17410 6e 6f 2b 2b 3b 0a 20 20 20 20 66 72 65 65 28 6e  no++;.    free(n
17420 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 74 70 6c 74  ame);.  }.  tplt
17430 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
17440 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
17450 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
17460 20 23 64 65 66 69 6e 65 73 20 66 6f 72 20 61 6c   #defines for al
17470 6c 20 74 6f 6b 65 6e 73 20 2a 2f 0a 20 20 69 66  l tokens */.  if
17480 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( mhflag ){.    
17490 63 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20  char *prefix;.  
174a0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
174b0 69 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29  if INTERFACE\n")
174c0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20  ; lineno++;.    
174d0 69 66 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70  if( lemp->tokenp
174e0 72 65 66 69 78 20 29 20 70 72 65 66 69 78 20 3d  refix ) prefix =
174f0 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66   lemp->tokenpref
17500 69 78 3b 0a 20 20 20 20 65 6c 73 65 20 20 20 20  ix;.    else    
17510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17520 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20  prefix = "";.   
17530 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70   for(i=1; i<lemp
17540 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b  ->nterminal; i++
17550 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
17560 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73  (out,"#define %s
17570 25 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65  %-30s %2d\n",pre
17580 66 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c  fix,lemp->symbol
17590 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20  s[i]->name,i);. 
175a0 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20       lineno++;. 
175b0 20 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66     }.    fprintf
175c0 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22 29  (out,"#endif\n")
175d0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a  ; lineno++;.  }.
175e0 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70    tplt_xfer(lemp
175f0 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c  ->name,in,out,&l
17600 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65  ineno);..  /* Ge
17610 6e 65 72 61 74 65 20 74 68 65 20 64 65 66 69 6e  nerate the defin
17620 65 73 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  es */.  fprintf(
17630 6f 75 74 2c 22 2f 2a 20 5c 30 30 31 20 2a 2f 5c  out,"/* \001 */\
17640 6e 22 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  n");.  fprintf(o
17650 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 43 4f  ut,"#define YYCO
17660 44 45 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20  DETYPE %s\n",.  
17670 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74    minimum_size_t
17680 79 70 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 79  ype(0, lemp->nsy
17690 6d 62 6f 6c 2b 35 29 29 3b 20 6c 69 6e 65 6e 6f  mbol+5)); lineno
176a0 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ++;.  fprintf(ou
176b0 74 2c 22 23 64 65 66 69 6e 65 20 59 59 4e 4f 43  t,"#define YYNOC
176c0 4f 44 45 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e  ODE %d\n",lemp->
176d0 6e 73 79 6d 62 6f 6c 2b 31 29 3b 20 20 6c 69 6e  nsymbol+1);  lin
176e0 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
176f0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
17700 41 43 54 49 4f 4e 54 59 50 45 20 25 73 5c 6e 22  ACTIONTYPE %s\n"
17710 2c 0a 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73 69  ,.    minimum_si
17720 7a 65 5f 74 79 70 65 28 30 2c 20 6c 65 6d 70 2d  ze_type(0, lemp-
17730 3e 6e 73 74 61 74 65 2b 6c 65 6d 70 2d 3e 6e 72  >nstate+lemp->nr
17740 75 6c 65 2b 35 29 29 3b 20 20 6c 69 6e 65 6e 6f  ule+5));  lineno
17750 2b 2b 3b 0a 20 20 70 72 69 6e 74 5f 73 74 61 63  ++;.  print_stac
17760 6b 5f 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70  k_union(out,lemp
17770 2c 26 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29  ,&lineno,mhflag)
17780 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74  ;.  if( lemp->st
17790 61 63 6b 73 69 7a 65 20 29 7b 0a 20 20 20 20 69  acksize ){.    i
177a0 66 28 20 61 74 6f 69 28 6c 65 6d 70 2d 3e 73 74  f( atoi(lemp->st
177b0 61 63 6b 73 69 7a 65 29 3c 3d 30 20 29 7b 0a 20  acksize)<=0 ){. 
177c0 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
177d0 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a  mp->filename,0,.
177e0 22 49 6c 6c 65 67 61 6c 20 73 74 61 63 6b 20 73  "Illegal stack s
177f0 69 7a 65 3a 20 5b 25 73 5d 2e 20 20 54 68 65 20  ize: [%s].  The 
17800 73 74 61 63 6b 20 73 69 7a 65 20 73 68 6f 75 6c  stack size shoul
17810 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20  d be an integer 
17820 63 6f 6e 73 74 61 6e 74 2e 22 2c 0a 20 20 20 20  constant.",.    
17830 20 20 20 20 6c 65 6d 70 2d 3e 73 74 61 63 6b 73      lemp->stacks
17840 69 7a 65 29 3b 0a 20 20 20 20 20 20 6c 65 6d 70  ize);.      lemp
17850 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
17860 20 20 20 20 6c 65 6d 70 2d 3e 73 74 61 63 6b 73      lemp->stacks
17870 69 7a 65 20 3d 20 22 31 30 30 22 3b 0a 20 20 20  ize = "100";.   
17880 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f   }.    fprintf(o
17890 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 53 54  ut,"#define YYST
178a0 41 43 4b 44 45 50 54 48 20 25 73 5c 6e 22 2c 6c  ACKDEPTH %s\n",l
178b0 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b  emp->stacksize);
178c0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65    lineno++;.  }e
178d0 6c 73 65 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  lse{.    fprintf
178e0 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
178f0 53 54 41 43 4b 44 45 50 54 48 20 31 30 30 5c 6e  STACKDEPTH 100\n
17900 22 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  ");  lineno++;. 
17910 20 7d 0a 20 20 69 66 28 20 6d 68 66 6c 61 67 20   }.  if( mhflag 
17920 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
17930 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41 43  ut,"#if INTERFAC
17940 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  E\n"); lineno++;
17950 0a 20 20 7d 0a 20 20 6e 61 6d 65 20 3d 20 6c 65  .  }.  name = le
17960 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d 70 2d  mp->name ? lemp-
17970 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65 22 3b  >name : "Parse";
17980 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 61 72 67  .  if( lemp->arg
17990 20 26 26 20 6c 65 6d 70 2d 3e 61 72 67 5b 30 5d   && lemp->arg[0]
179a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
179b0 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 6c 65     i = strlen(le
179c0 6d 70 2d 3e 61 72 67 29 3b 0a 20 20 20 20 77 68  mp->arg);.    wh
179d0 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 69 73 73  ile( i>=1 && iss
179e0 70 61 63 65 28 6c 65 6d 70 2d 3e 61 72 67 5b 69  pace(lemp->arg[i
179f0 2d 31 5d 29 20 29 20 69 2d 2d 3b 0a 20 20 20 20  -1]) ) i--;.    
17a00 77 68 69 6c 65 28 20 69 3e 3d 31 20 26 26 20 28  while( i>=1 && (
17a10 69 73 61 6c 6e 75 6d 28 6c 65 6d 70 2d 3e 61 72  isalnum(lemp->ar
17a20 67 5b 69 2d 31 5d 29 20 7c 7c 20 6c 65 6d 70 2d  g[i-1]) || lemp-
17a30 3e 61 72 67 5b 69 2d 31 5d 3d 3d 27 5f 27 29 20  >arg[i-1]=='_') 
17a40 29 20 69 2d 2d 3b 0a 20 20 20 20 66 70 72 69 6e  ) i--;.    fprin
17a50 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
17a60 25 73 41 52 47 5f 53 44 45 43 4c 20 25 73 3b 5c  %sARG_SDECL %s;\
17a70 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61 72  n",name,lemp->ar
17a80 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  g);  lineno++;. 
17a90 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
17aa0 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 50 44  #define %sARG_PD
17ab0 45 43 4c 20 2c 25 73 5c 6e 22 2c 6e 61 6d 65 2c  ECL ,%s\n",name,
17ac0 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c 69 6e  lemp->arg);  lin
17ad0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e  eno++;.    fprin
17ae0 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20  tf(out,"#define 
17af0 25 73 41 52 47 5f 46 45 54 43 48 20 25 73 20 3d  %sARG_FETCH %s =
17b00 20 79 79 70 50 61 72 73 65 72 2d 3e 25 73 5c 6e   yypParser->%s\n
17b10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
17b20 20 20 20 20 6e 61 6d 65 2c 6c 65 6d 70 2d 3e 61      name,lemp->a
17b30 72 67 2c 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d  rg,&lemp->arg[i]
17b40 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
17b50 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
17b60 64 65 66 69 6e 65 20 25 73 41 52 47 5f 53 54 4f  define %sARG_STO
17b70 52 45 20 79 79 70 50 61 72 73 65 72 2d 3e 25 73  RE yypParser->%s
17b80 20 3d 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20   = %s\n",.      
17b90 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d 65 2c             name,
17ba0 26 6c 65 6d 70 2d 3e 61 72 67 5b 69 5d 2c 26 6c  &lemp->arg[i],&l
17bb0 65 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c  emp->arg[i]);  l
17bc0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65  ineno++;.  }else
17bd0 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
17be0 74 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47  t,"#define %sARG
17bf0 5f 53 44 45 43 4c 5c 6e 22 2c 6e 61 6d 65 29 3b  _SDECL\n",name);
17c00 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
17c10 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
17c20 66 69 6e 65 20 25 73 41 52 47 5f 50 44 45 43 4c  fine %sARG_PDECL
17c30 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65  \n",name);  line
17c40 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
17c50 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
17c60 73 41 52 47 5f 46 45 54 43 48 5c 6e 22 2c 6e 61  sARG_FETCH\n",na
17c70 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  me); 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 53 54  #define %sARG_ST
17ca0 4f 52 45 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69  ORE\n",name); li
17cb0 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  neno++;.  }.  if
17cc0 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20 20  ( mhflag ){.    
17cd0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 65 6e  fprintf(out,"#en
17ce0 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  dif\n"); lineno+
17cf0 2b 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66  +;.  }.  fprintf
17d00 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
17d10 4e 53 54 41 54 45 20 25 64 5c 6e 22 2c 6c 65 6d  NSTATE %d\n",lem
17d20 70 2d 3e 6e 73 74 61 74 65 29 3b 20 20 6c 69 6e  p->nstate);  lin
17d30 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66  eno++;.  fprintf
17d40 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59  (out,"#define YY
17d50 4e 52 55 4c 45 20 25 64 5c 6e 22 2c 6c 65 6d 70  NRULE %d\n",lemp
17d60 2d 3e 6e 72 75 6c 65 29 3b 20 20 6c 69 6e 65 6e  ->nrule);  linen
17d70 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
17d80 75 74 2c 22 23 64 65 66 69 6e 65 20 59 59 45 52  ut,"#define YYER
17d90 52 4f 52 53 59 4d 42 4f 4c 20 25 64 5c 6e 22 2c  RORSYMBOL %d\n",
17da0 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 69 6e  lemp->errsym->in
17db0 64 65 78 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  dex);  lineno++;
17dc0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
17dd0 23 64 65 66 69 6e 65 20 59 59 45 52 52 53 59 4d  #define YYERRSYM
17de0 44 54 20 79 79 25 64 5c 6e 22 2c 6c 65 6d 70 2d  DT yy%d\n",lemp-
17df0 3e 65 72 72 73 79 6d 2d 3e 64 74 6e 75 6d 29 3b  >errsym->dtnum);
17e00 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66    lineno++;.  if
17e10 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61 6c 6c  ( lemp->has_fall
17e20 62 61 63 6b 20 29 7b 0a 20 20 20 20 66 70 72 69  back ){.    fpri
17e30 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
17e40 20 59 59 46 41 4c 4c 42 41 43 4b 20 31 5c 6e 22   YYFALLBACK 1\n"
17e50 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
17e60 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65  }.  tplt_xfer(le
17e70 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c  mp->name,in,out,
17e80 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20  &lineno);..  /* 
17e90 47 65 6e 65 72 61 74 65 20 74 68 65 20 61 63 74  Generate the act
17ea0 69 6f 6e 20 74 61 62 6c 65 20 61 6e 64 20 69 74  ion table and it
17eb0 73 20 61 73 73 6f 63 69 61 74 65 73 3a 0a 20 20  s associates:.  
17ec0 2a 2a 0a 20 20 2a 2a 20 20 79 79 5f 61 63 74 69  **.  **  yy_acti
17ed0 6f 6e 5b 5d 20 20 20 20 20 20 20 20 41 20 73 69  on[]        A si
17ee0 6e 67 6c 65 20 74 61 62 6c 65 20 63 6f 6e 74 61  ngle table conta
17ef0 69 6e 69 6e 67 20 61 6c 6c 20 61 63 74 69 6f 6e  ining all action
17f00 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 6c 6f 6f 6b  s..  **  yy_look
17f10 61 68 65 61 64 5b 5d 20 20 20 20 20 41 20 74 61  ahead[]     A ta
17f20 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ble containing t
17f30 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 66 6f 72  he lookahead for
17f40 20 65 61 63 68 20 65 6e 74 72 79 20 69 6e 0a 20   each entry in. 
17f50 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
17f60 20 20 20 20 20 20 20 20 79 79 5f 61 63 74 69 6f          yy_actio
17f70 6e 2e 20 20 55 73 65 64 20 74 6f 20 64 65 74 65  n.  Used to dete
17f80 63 74 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f  ct hash collisio
17f90 6e 73 2e 0a 20 20 2a 2a 20 20 79 79 5f 73 68 69  ns..  **  yy_shi
17fa0 66 74 5f 6f 66 73 74 5b 5d 20 20 20 20 46 6f 72  ft_ofst[]    For
17fb0 20 65 61 63 68 20 73 74 61 74 65 2c 20 74 68 65   each state, the
17fc0 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f   offset into yy_
17fd0 61 63 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20  action for.  ** 
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ff0 20 20 20 20 73 68 69 66 74 69 6e 67 20 74 65 72      shifting ter
18000 6d 69 6e 61 6c 73 2e 0a 20 20 2a 2a 20 20 79 79  minals..  **  yy
18010 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 20  _reduce_ofst[]  
18020 20 46 6f 72 20 65 61 63 68 20 73 74 61 74 65 2c   For each state,
18030 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e 74 6f   the offset into
18040 20 79 79 5f 61 63 74 69 6f 6e 20 66 6f 72 0a 20   yy_action for. 
18050 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
18060 20 20 20 20 20 20 20 20 73 68 69 66 74 69 6e 67          shifting
18070 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 61   non-terminals a
18080 66 74 65 72 20 61 20 72 65 64 75 63 65 2e 0a 20  fter a reduce.. 
18090 20 2a 2a 20 20 79 79 5f 64 65 66 61 75 6c 74 5b   **  yy_default[
180a0 5d 20 20 20 20 20 20 20 44 65 66 61 75 6c 74 20  ]       Default 
180b0 61 63 74 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  action for each 
180c0 73 74 61 74 65 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  state..  */..  /
180d0 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 61 63  * Compute the ac
180e0 74 69 6f 6e 73 20 6f 6e 20 61 6c 6c 20 73 74 61  tions on all sta
180f0 74 65 73 20 61 6e 64 20 63 6f 75 6e 74 20 74 68  tes and count th
18100 65 6d 20 75 70 20 2a 2f 0a 20 20 61 78 20 3d 20  em up */.  ax = 
18110 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 61  malloc( sizeof(a
18120 78 5b 30 5d 29 2a 6c 65 6d 70 2d 3e 6e 73 74 61  x[0])*lemp->nsta
18130 74 65 2a 32 20 29 3b 0a 20 20 69 66 28 20 61 78  te*2 );.  if( ax
18140 3d 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  ==0 ){.    fprin
18150 74 66 28 73 74 64 65 72 72 2c 22 6d 61 6c 6c 6f  tf(stderr,"mallo
18160 63 20 66 61 69 6c 65 64 5c 6e 22 29 3b 0a 20 20  c failed\n");.  
18170 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20    exit(1);.  }. 
18180 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
18190 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a  ->nstate; i++){.
181a0 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e      stp = lemp->
181b0 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 73  sorted[i];.    s
181c0 74 70 2d 3e 6e 54 6b 6e 41 63 74 20 3d 20 73 74  tp->nTknAct = st
181d0 70 2d 3e 6e 4e 74 41 63 74 20 3d 20 30 3b 0a 20  p->nNtAct = 0;. 
181e0 20 20 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20     stp->iDflt = 
181f0 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 20 2b 20 6c  lemp->nstate + l
18200 65 6d 70 2d 3e 6e 72 75 6c 65 3b 0a 20 20 20 20  emp->nrule;.    
18210 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20  stp->iTknOfst = 
18220 4e 4f 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20 73  NO_OFFSET;.    s
18230 74 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 4e 4f  tp->iNtOfst = NO
18240 5f 4f 46 46 53 45 54 3b 0a 20 20 20 20 66 6f 72  _OFFSET;.    for
18250 28 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b  (ap=stp->ap; ap;
18260 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
18270 20 20 20 20 20 69 66 28 20 63 6f 6d 70 75 74 65       if( compute
18280 5f 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 61 70 29  _action(lemp,ap)
18290 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  >=0 ){.        i
182a0 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  f( ap->sp->index
182b0 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
182c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
182d0 70 2d 3e 6e 54 6b 6e 41 63 74 2b 2b 3b 0a 20 20  p->nTknAct++;.  
182e0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
182f0 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65  ap->sp->index<le
18300 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 7b 0a 20  mp->nsymbol ){. 
18310 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 4e           stp->nN
18320 74 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  tAct++;.        
18330 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
18340 20 73 74 70 2d 3e 69 44 66 6c 74 20 3d 20 63 6f   stp->iDflt = co
18350 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d  mpute_action(lem
18360 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20  p, ap);.        
18370 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
18380 20 20 20 20 61 78 5b 69 2a 32 5d 2e 73 74 70 20      ax[i*2].stp 
18390 3d 20 73 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a  = stp;.    ax[i*
183a0 32 5d 2e 69 73 54 6b 6e 20 3d 20 31 3b 0a 20 20  2].isTkn = 1;.  
183b0 20 20 61 78 5b 69 2a 32 5d 2e 6e 41 63 74 69 6f    ax[i*2].nActio
183c0 6e 20 3d 20 73 74 70 2d 3e 6e 54 6b 6e 41 63 74  n = stp->nTknAct
183d0 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31 5d 2e  ;.    ax[i*2+1].
183e0 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 61  stp = stp;.    a
183f0 78 5b 69 2a 32 2b 31 5d 2e 69 73 54 6b 6e 20 3d  x[i*2+1].isTkn =
18400 20 30 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b 31   0;.    ax[i*2+1
18410 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74 70 2d  ].nAction = stp-
18420 3e 6e 4e 74 41 63 74 3b 0a 20 20 7d 0a 20 20 6d  >nNtAct;.  }.  m
18430 78 54 6b 6e 4f 66 73 74 20 3d 20 6d 6e 54 6b 6e  xTknOfst = mnTkn
18440 4f 66 73 74 20 3d 20 30 3b 0a 20 20 6d 78 4e 74  Ofst = 0;.  mxNt
18450 4f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20  Ofst = mnNtOfst 
18460 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  = 0;..  /* Compu
18470 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  te the action ta
18480 62 6c 65 2e 20 20 49 6e 20 6f 72 64 65 72 20 74  ble.  In order t
18490 6f 20 74 72 79 20 74 6f 20 6b 65 65 70 20 74 68  o try to keep th
184a0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 20 20  e size of the.  
184b0 2a 2a 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  ** action table 
184c0 74 6f 20 61 20 6d 69 6e 69 6d 75 6d 2c 20 74 68  to a minimum, th
184d0 65 20 68 65 75 72 69 73 74 69 63 20 6f 66 20 70  e heuristic of p
184e0 6c 61 63 69 6e 67 20 74 68 65 20 6c 61 72 67 65  lacing the large
184f0 73 74 20 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 73  st action.  ** s
18500 65 74 73 20 66 69 72 73 74 20 69 73 20 75 73 65  ets first is use
18510 64 2e 0a 20 20 2a 2f 0a 20 20 71 73 6f 72 74 28  d..  */.  qsort(
18520 61 78 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ax, lemp->nstate
18530 2a 32 2c 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d  *2, sizeof(ax[0]
18540 29 2c 20 61 78 73 65 74 5f 63 6f 6d 70 61 72 65  ), axset_compare
18550 29 3b 0a 20 20 70 41 63 74 74 61 62 20 3d 20 61  );.  pActtab = a
18560 63 74 74 61 62 5f 61 6c 6c 6f 63 28 29 3b 0a 20  cttab_alloc();. 
18570 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70   for(i=0; i<lemp
18580 2d 3e 6e 73 74 61 74 65 2a 32 20 26 26 20 61 78  ->nstate*2 && ax
18590 5b 69 5d 2e 6e 41 63 74 69 6f 6e 3e 30 3b 20 69  [i].nAction>0; i
185a0 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 61  ++){.    stp = a
185b0 78 5b 69 5d 2e 73 74 70 3b 0a 20 20 20 20 69 66  x[i].stp;.    if
185c0 28 20 61 78 5b 69 5d 2e 69 73 54 6b 6e 20 29 7b  ( ax[i].isTkn ){
185d0 0a 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74  .      for(ap=st
185e0 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
185f0 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
18600 20 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20   int action;.   
18610 20 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d       if( ap->sp-
18620 3e 69 6e 64 65 78 3e 3d 6c 65 6d 70 2d 3e 6e 74  >index>=lemp->nt
18630 65 72 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e  erminal ) contin
18640 75 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 69  ue;.        acti
18650 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f 61 63 74  on = compute_act
18660 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29 3b 0a 20  ion(lemp, ap);. 
18670 20 20 20 20 20 20 20 69 66 28 20 61 63 74 69 6f         if( actio
18680 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  n<0 ) continue;.
18690 20 20 20 20 20 20 20 20 61 63 74 74 61 62 5f 61          acttab_a
186a0 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 61  ction(pActtab, a
186b0 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c 20 61 63  p->sp->index, ac
186c0 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tion);.      }. 
186d0 20 20 20 20 20 73 74 70 2d 3e 69 54 6b 6e 4f 66       stp->iTknOf
186e0 73 74 20 3d 20 61 63 74 74 61 62 5f 69 6e 73 65  st = acttab_inse
186f0 72 74 28 70 41 63 74 74 61 62 29 3b 0a 20 20 20  rt(pActtab);.   
18700 20 20 20 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e     if( stp->iTkn
18710 4f 66 73 74 3c 6d 6e 54 6b 6e 4f 66 73 74 20 29  Ofst<mnTknOfst )
18720 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70   mnTknOfst = stp
18730 2d 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20  ->iTknOfst;.    
18740 20 20 69 66 28 20 73 74 70 2d 3e 69 54 6b 6e 4f    if( stp->iTknO
18750 66 73 74 3e 6d 78 54 6b 6e 4f 66 73 74 20 29 20  fst>mxTknOfst ) 
18760 6d 78 54 6b 6e 4f 66 73 74 20 3d 20 73 74 70 2d  mxTknOfst = stp-
18770 3e 69 54 6b 6e 4f 66 73 74 3b 0a 20 20 20 20 7d  >iTknOfst;.    }
18780 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28  else{.      for(
18790 61 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20  ap=stp->ap; ap; 
187a0 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  ap=ap->next){.  
187b0 20 20 20 20 20 20 69 6e 74 20 61 63 74 69 6f 6e        int action
187c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  ;.        if( ap
187d0 2d 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70  ->sp->index<lemp
187e0 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 20 63 6f  ->nterminal ) co
187f0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
18800 69 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65  if( ap->sp->inde
18810 78 3d 3d 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c  x==lemp->nsymbol
18820 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
18830 20 20 20 20 20 61 63 74 69 6f 6e 20 3d 20 63 6f       action = co
18840 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65 6d  mpute_action(lem
18850 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20 20  p, ap);.        
18860 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20 63  if( action<0 ) c
18870 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
18880 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28 70   acttab_action(p
18890 41 63 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d 3e  Acttab, ap->sp->
188a0 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b 0a  index, action);.
188b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 74        }.      st
188c0 70 2d 3e 69 4e 74 4f 66 73 74 20 3d 20 61 63 74  p->iNtOfst = act
188d0 74 61 62 5f 69 6e 73 65 72 74 28 70 41 63 74 74  tab_insert(pActt
188e0 61 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ab);.      if( s
188f0 74 70 2d 3e 69 4e 74 4f 66 73 74 3c 6d 6e 4e 74  tp->iNtOfst<mnNt
18900 4f 66 73 74 20 29 20 6d 6e 4e 74 4f 66 73 74 20  Ofst ) mnNtOfst 
18910 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74 3b 0a  = stp->iNtOfst;.
18920 20 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69        if( stp->i
18930 4e 74 4f 66 73 74 3e 6d 78 4e 74 4f 66 73 74 20  NtOfst>mxNtOfst 
18940 29 20 6d 78 4e 74 4f 66 73 74 20 3d 20 73 74 70  ) mxNtOfst = stp
18950 2d 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 7d  ->iNtOfst;.    }
18960 0a 20 20 7d 0a 20 20 66 72 65 65 28 61 78 29 3b  .  }.  free(ax);
18970 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68  ..  /* Output th
18980 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62 6c  e yy_action tabl
18990 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  e */.  fprintf(o
189a0 75 74 2c 22 73 74 61 74 69 63 20 59 59 41 43 54  ut,"static YYACT
189b0 49 4f 4e 54 59 50 45 20 79 79 5f 61 63 74 69 6f  IONTYPE yy_actio
189c0 6e 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69 6e  n[] = {\n"); lin
189d0 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 61 63 74  eno++;.  n = act
189e0 74 61 62 5f 73 69 7a 65 28 70 41 63 74 74 61 62  tab_size(pActtab
189f0 29 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20  );.  for(i=j=0; 
18a00 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
18a10 6e 74 20 61 63 74 69 6f 6e 20 3d 20 61 63 74 74  nt action = actt
18a20 61 62 5f 79 79 61 63 74 69 6f 6e 28 70 41 63 74  ab_yyaction(pAct
18a30 74 61 62 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  tab, i);.    if(
18a40 20 61 63 74 69 6f 6e 3c 30 20 29 20 61 63 74 69   action<0 ) acti
18a50 6f 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62  on = lemp->nsymb
18a60 6f 6c 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65  ol + lemp->nrule
18a70 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 6a 3d   + 2;.    if( j=
18a80 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  =0 ) fprintf(out
18a90 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20  ," /* %5d */ ", 
18aa0 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i);.    fprintf(
18ab0 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 61 63  out, " %4d,", ac
18ac0 74 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 6a  tion);.    if( j
18ad0 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b  ==9 || i==n-1 ){
18ae0 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
18af0 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ut, "\n"); linen
18b00 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30  o++;.      j = 0
18b10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18b20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     j++;.    }.  
18b30 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
18b40 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   "};\n"); lineno
18b50 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  ++;..  /* Output
18b60 20 74 68 65 20 79 79 5f 6c 6f 6f 6b 61 68 65 61   the yy_lookahea
18b70 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72  d table */.  fpr
18b80 69 6e 74 66 28 6f 75 74 2c 22 73 74 61 74 69 63  intf(out,"static
18b90 20 59 59 43 4f 44 45 54 59 50 45 20 79 79 5f 6c   YYCODETYPE yy_l
18ba0 6f 6f 6b 61 68 65 61 64 5b 5d 20 3d 20 7b 5c 6e  ookahead[] = {\n
18bb0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
18bc0 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
18bd0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 61  i++){.    int la
18be0 20 3d 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b   = acttab_yylook
18bf0 61 68 65 61 64 28 70 41 63 74 74 61 62 2c 20 69  ahead(pActtab, i
18c00 29 3b 0a 20 20 20 20 69 66 28 20 6c 61 3c 30 20  );.    if( la<0 
18c10 29 20 6c 61 20 3d 20 6c 65 6d 70 2d 3e 6e 73 79  ) la = lemp->nsy
18c20 6d 62 6f 6c 3b 0a 20 20 20 20 69 66 28 20 6a 3d  mbol;.    if( j=
18c30 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74  =0 ) fprintf(out
18c40 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c 20  ," /* %5d */ ", 
18c50 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  i);.    fprintf(
18c60 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6c 61  out, " %4d,", la
18c70 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20  );.    if( j==9 
18c80 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20  || i==n-1 ){.   
18c90 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
18ca0 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  "\n"); lineno++;
18cb0 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20  .      j = 0;.  
18cc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a    }else{.      j
18cd0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
18ce0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b  fprintf(out, "};
18cf0 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  \n"); lineno++;.
18d00 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65  .  /* Output the
18d10 20 79 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d   yy_shift_ofst[]
18d20 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69   table */.  fpri
18d30 6e 74 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e  ntf(out, "#defin
18d40 65 20 59 59 5f 53 48 49 46 54 5f 55 53 45 5f 44  e YY_SHIFT_USE_D
18d50 46 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 54  FLT (%d)\n", mnT
18d60 6b 6e 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e  knOfst-1); linen
18d70 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f  o++;.  fprintf(o
18d80 75 74 2c 20 22 73 74 61 74 69 63 20 25 73 20 79  ut, "static %s y
18d90 79 5f 73 68 69 66 74 5f 6f 66 73 74 5b 5d 20 3d  y_shift_ofst[] =
18da0 20 7b 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20   {\n", .        
18db0 20 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74    minimum_size_t
18dc0 79 70 65 28 6d 6e 54 6b 6e 4f 66 73 74 2d 31 2c  ype(mnTknOfst-1,
18dd0 20 6d 78 54 6b 6e 4f 66 73 74 29 29 3b 20 6c 69   mxTknOfst)); li
18de0 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65  neno++;.  n = le
18df0 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20 20 66 6f  mp->nstate;.  fo
18e00 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b  r(i=j=0; i<n; i+
18e10 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66 73 74  +){.    int ofst
18e20 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  ;.    stp = lemp
18e30 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
18e40 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b   ofst = stp->iTk
18e50 6e 4f 66 73 74 3b 0a 20 20 20 20 69 66 28 20 6f  nOfst;.    if( o
18e60 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54 20 29  fst==NO_OFFSET )
18e70 20 6f 66 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73   ofst = mnTknOfs
18e80 74 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 6a  t - 1;.    if( j
18e90 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f 75  ==0 ) fprintf(ou
18ea0 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22 2c  t," /* %5d */ ",
18eb0 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66   i);.    fprintf
18ec0 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20 6f  (out, " %4d,", o
18ed0 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a 3d  fst);.    if( j=
18ee0 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b 0a  =9 || i==n-1 ){.
18ef0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
18f00 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f  t, "\n"); lineno
18f10 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ++;.      j = 0;
18f20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18f30 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d    j++;.    }.  }
18f40 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20  .  fprintf(out, 
18f50 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  "};\n"); lineno+
18f60 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20  +;..  /* Output 
18f70 74 68 65 20 79 79 5f 72 65 64 75 63 65 5f 6f 66  the yy_reduce_of
18f80 73 74 5b 5d 20 74 61 62 6c 65 20 2a 2f 0a 20 20  st[] table */.  
18f90 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 23 64  fprintf(out, "#d
18fa0 65 66 69 6e 65 20 59 59 5f 52 45 44 55 43 45 5f  efine YY_REDUCE_
18fb0 55 53 45 5f 44 46 4c 54 20 28 25 64 29 5c 6e 22  USE_DFLT (%d)\n"
18fc0 2c 20 6d 6e 4e 74 4f 66 73 74 2d 31 29 3b 20 6c  , mnNtOfst-1); l
18fd0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72 69 6e  ineno++;.  fprin
18fe0 74 66 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20  tf(out, "static 
18ff0 25 73 20 79 79 5f 72 65 64 75 63 65 5f 6f 66 73  %s yy_reduce_ofs
19000 74 5b 5d 20 3d 20 7b 5c 6e 22 2c 20 0a 20 20 20  t[] = {\n", .   
19010 20 20 20 20 20 20 20 6d 69 6e 69 6d 75 6d 5f 73         minimum_s
19020 69 7a 65 5f 74 79 70 65 28 6d 6e 4e 74 4f 66 73  ize_type(mnNtOfs
19030 74 2d 31 2c 20 6d 78 4e 74 4f 66 73 74 29 29 3b  t-1, mxNtOfst));
19040 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d   lineno++;.  n =
19050 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20   lemp->nstate;. 
19060 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
19070 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f   i++){.    int o
19080 66 73 74 3b 0a 20 20 20 20 73 74 70 20 3d 20 6c  fst;.    stp = l
19090 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a  emp->sorted[i];.
190a0 20 20 20 20 6f 66 73 74 20 3d 20 73 74 70 2d 3e      ofst = stp->
190b0 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 69 66 28  iNtOfst;.    if(
190c0 20 6f 66 73 74 3d 3d 4e 4f 5f 4f 46 46 53 45 54   ofst==NO_OFFSET
190d0 20 29 20 6f 66 73 74 20 3d 20 6d 6e 4e 74 4f 66   ) ofst = mnNtOf
190e0 73 74 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20  st - 1;.    if( 
190f0 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f  j==0 ) fprintf(o
19100 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22  ut," /* %5d */ "
19110 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , i);.    fprint
19120 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20  f(out, " %4d,", 
19130 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 6a  ofst);.    if( j
19140 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b  ==9 || i==n-1 ){
19150 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
19160 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ut, "\n"); linen
19170 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30  o++;.      j = 0
19180 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19190 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     j++;.    }.  
191a0 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
191b0 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   "};\n"); lineno
191c0 2b 2b 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74  ++;..  /* Output
191d0 20 74 68 65 20 64 65 66 61 75 6c 74 20 61 63 74   the default act
191e0 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20 20 66  ion table */.  f
191f0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73 74 61  printf(out, "sta
19200 74 69 63 20 59 59 41 43 54 49 4f 4e 54 59 50 45  tic YYACTIONTYPE
19210 20 79 79 5f 64 65 66 61 75 6c 74 5b 5d 20 3d 20   yy_default[] = 
19220 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  {\n"); lineno++;
19230 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74  .  n = lemp->nst
19240 61 74 65 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  ate;.  for(i=j=0
19250 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
19260 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72   stp = lemp->sor
19270 74 65 64 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ted[i];.    if( 
19280 6a 3d 3d 30 20 29 20 66 70 72 69 6e 74 66 28 6f  j==0 ) fprintf(o
19290 75 74 2c 22 20 2f 2a 20 25 35 64 20 2a 2f 20 22  ut," /* %5d */ "
192a0 2c 20 69 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  , i);.    fprint
192b0 66 28 6f 75 74 2c 20 22 20 25 34 64 2c 22 2c 20  f(out, " %4d,", 
192c0 73 74 70 2d 3e 69 44 66 6c 74 29 3b 0a 20 20 20  stp->iDflt);.   
192d0 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d   if( j==9 || i==
192e0 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  n-1 ){.      fpr
192f0 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
19300 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
19310 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   j = 0;.    }els
19320 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  e{.      j++;.  
19330 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
19340 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20  f(out, "};\n"); 
19350 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 74 70 6c 74  lineno++;.  tplt
19360 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
19370 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
19380 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
19390 20 74 68 65 20 74 61 62 6c 65 20 6f 66 20 66 61   the table of fa
193a0 6c 6c 62 61 63 6b 20 74 6f 6b 65 6e 73 2e 0a 20  llback tokens.. 
193b0 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   */.  if( lemp->
193c0 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29 7b 0a  has_fallback ){.
193d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c      for(i=0; i<l
193e0 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20  emp->nterminal; 
193f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
19400 63 74 20 73 79 6d 62 6f 6c 20 2a 70 20 3d 20 6c  ct symbol *p = l
19410 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
19420 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 61  .      if( p->fa
19430 6c 6c 62 61 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  llback==0 ){.   
19440 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
19450 2c 20 22 20 20 20 20 30 2c 20 20 2f 2a 20 25 31  , "    0,  /* %1
19460 30 73 20 3d 3e 20 6e 6f 74 68 69 6e 67 20 2a 2f  0s => nothing */
19470 5c 6e 22 2c 20 70 2d 3e 6e 61 6d 65 29 3b 0a 20  \n", p->name);. 
19480 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19490 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
194a0 20 22 20 20 25 33 64 2c 20 20 2f 2a 20 25 31 30   "  %3d,  /* %10
194b0 73 20 3d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 20 70  s => %s */\n", p
194c0 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 69 6e 64 65  ->fallback->inde
194d0 78 2c 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  x,.          p->
194e0 6e 61 6d 65 2c 20 70 2d 3e 66 61 6c 6c 62 61 63  name, p->fallbac
194f0 6b 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  k->name);.      
19500 7d 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b  }.      lineno++
19510 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 74 70  ;.    }.  }.  tp
19520 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
19530 6d 65 2c 20 69 6e 2c 20 6f 75 74 2c 20 26 6c 69  me, in, out, &li
19540 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
19550 65 72 61 74 65 20 61 20 74 61 62 6c 65 20 63 6f  erate a table co
19560 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 79 6d  ntaining the sym
19570 62 6f 6c 69 63 20 6e 61 6d 65 20 6f 66 20 65 76  bolic name of ev
19580 65 72 79 20 73 79 6d 62 6f 6c 0a 20 20 2a 2f 0a  ery symbol.  */.
19590 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
195a0 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
195b0 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 6c 69  {.    sprintf(li
195c0 6e 65 2c 22 5c 22 25 73 5c 22 2c 22 2c 6c 65 6d  ne,"\"%s\",",lem
195d0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
195e0 61 6d 65 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  ame);.    fprint
195f0 66 28 6f 75 74 2c 22 20 20 25 2d 31 35 73 22 2c  f(out,"  %-15s",
19600 6c 69 6e 65 29 3b 0a 20 20 20 20 69 66 28 20 28  line);.    if( (
19610 69 26 33 29 3d 3d 33 20 29 7b 20 66 70 72 69 6e  i&3)==3 ){ fprin
19620 74 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69  tf(out,"\n"); li
19630 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 7d 0a 20 20  neno++; }.  }.  
19640 69 66 28 20 28 69 26 33 29 21 3d 30 20 29 7b 20  if( (i&3)!=0 ){ 
19650 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22  fprintf(out,"\n"
19660 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d 0a 20  ); lineno++; }. 
19670 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d   tplt_xfer(lemp-
19680 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69  >name,in,out,&li
19690 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e  neno);..  /* Gen
196a0 65 72 61 74 65 20 61 20 74 61 62 6c 65 20 63 6f  erate a table co
196b0 6e 74 61 69 6e 69 6e 67 20 61 20 74 65 78 74 20  ntaining a text 
196c0 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
196d0 72 69 62 65 73 20 65 76 65 72 79 0a 20 20 2a 2a  ribes every.  **
196e0 20 72 75 6c 65 20 69 6e 20 74 68 65 20 72 75 6c   rule in the rul
196f0 65 20 73 65 74 20 6f 66 20 74 68 65 20 67 72 61  e set of the gra
19700 6d 6d 65 72 2e 20 20 54 68 69 73 20 69 6e 66 6f  mmer.  This info
19710 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 0a  rmation is used.
19720 20 20 2a 2a 20 77 68 65 6e 20 74 72 61 63 69 6e    ** when tracin
19730 67 20 52 45 44 55 43 45 20 61 63 74 69 6f 6e 73  g REDUCE actions
19740 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
19750 2c 20 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  , rp=lemp->rule;
19760 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
19770 2c 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  , i++){.    asse
19780 72 74 28 20 72 70 2d 3e 69 6e 64 65 78 3d 3d 69  rt( rp->index==i
19790 20 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   );.    fprintf(
197a0 6f 75 74 2c 22 20 2f 2a 20 25 33 64 20 2a 2f 20  out," /* %3d */ 
197b0 5c 22 25 73 20 3a 3a 3d 22 2c 20 69 2c 20 72 70  \"%s ::=", i, rp
197c0 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ->lhs->name);.  
197d0 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 72 70 2d    for(j=0; j<rp-
197e0 3e 6e 72 68 73 3b 20 6a 2b 2b 29 20 66 70 72 69  >nrhs; j++) fpri
197f0 6e 74 66 28 6f 75 74 2c 22 20 25 73 22 2c 72 70  ntf(out," %s",rp
19800 2d 3e 72 68 73 5b 6a 5d 2d 3e 6e 61 6d 65 29 3b  ->rhs[j]->name);
19810 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
19820 2c 22 5c 22 2c 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ,"\",\n"); linen
19830 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f  o++;.  }.  tplt_
19840 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
19850 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
19860 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
19870 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63 75  code which execu
19880 74 65 73 20 65 76 65 72 79 20 74 69 6d 65 20 61  tes every time a
19890 20 73 79 6d 62 6f 6c 20 69 73 20 70 6f 70 70 65   symbol is poppe
198a0 64 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20  d from.  ** the 
198b0 73 74 61 63 6b 20 77 68 69 6c 65 20 70 72 6f 63  stack while proc
198c0 65 73 73 69 6e 67 20 65 72 72 6f 72 73 20 6f 72  essing errors or
198d0 20 77 68 69 6c 65 20 64 65 73 74 72 6f 79 69 6e   while destroyin
198e0 67 20 74 68 65 20 70 61 72 73 65 72 2e 20 0a 20  g the parser. . 
198f0 20 2a 2a 20 28 49 6e 20 6f 74 68 65 72 20 77 6f   ** (In other wo
19900 72 64 73 2c 20 67 65 6e 65 72 61 74 65 20 74 68  rds, generate th
19910 65 20 25 64 65 73 74 72 75 63 74 6f 72 20 61 63  e %destructor ac
19920 74 69 6f 6e 73 29 0a 20 20 2a 2f 0a 20 20 69 66  tions).  */.  if
19930 28 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73  ( lemp->tokendes
19940 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t ){.    for(i=0
19950 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  ; i<lemp->nsymbo
19960 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
19970 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
19980 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
19990 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73  [i];.      if( s
199a0 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65  p==0 || sp->type
199b0 21 3d 54 45 52 4d 49 4e 41 4c 20 29 20 63 6f 6e  !=TERMINAL ) con
199c0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66 70 72  tinue;.      fpr
199d0 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 63 61  intf(out,"    ca
199e0 73 65 20 25 64 3a 5c 6e 22 2c 73 70 2d 3e 69 6e  se %d:\n",sp->in
199f0 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  dex); lineno++;.
19a00 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
19a10 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
19a20 6f 6c 20 26 26 20 6c 65 6d 70 2d 3e 73 79 6d 62  ol && lemp->symb
19a30 6f 6c 73 5b 69 5d 2d 3e 74 79 70 65 21 3d 54 45  ols[i]->type!=TE
19a40 52 4d 49 4e 41 4c 3b 20 69 2b 2b 29 3b 0a 20 20  RMINAL; i++);.  
19a50 20 20 69 66 28 20 69 3c 6c 65 6d 70 2d 3e 6e 73    if( i<lemp->ns
19a60 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 65  ymbol ){.      e
19a70 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63  mit_destructor_c
19a80 6f 64 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79  ode(out,lemp->sy
19a90 6d 62 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c  mbols[i],lemp,&l
19aa0 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 66 70  ineno);.      fp
19ab0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
19ac0 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e   break;\n"); lin
19ad0 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  eno++;.    }.  }
19ae0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
19af0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
19b00 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 79  ){.    struct sy
19b10 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70 2d  mbol *sp = lemp-
19b20 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20  >symbols[i];.   
19b30 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70   if( sp==0 || sp
19b40 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
19b50 20 7c 7c 20 73 70 2d 3e 64 65 73 74 72 75 63 74   || sp->destruct
19b60 6f 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  or==0 ) continue
19b70 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  ;.    fprintf(ou
19b80 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 5c  t,"    case %d:\
19b90 6e 22 2c 73 70 2d 3e 69 6e 64 65 78 29 3b 20 6c  n",sp->index); l
19ba0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 65 6d 69  ineno++;.    emi
19bb0 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f 64  t_destructor_cod
19bc0 65 28 6f 75 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62  e(out,lemp->symb
19bd0 6f 6c 73 5b 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e  ols[i],lemp,&lin
19be0 65 6e 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e 74  eno);.    fprint
19bf0 66 28 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65  f(out,"      bre
19c00 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ak;\n"); lineno+
19c10 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d  +;.  }.  if( lem
19c20 70 2d 3e 76 61 72 64 65 73 74 20 29 7b 0a 20 20  p->vardest ){.  
19c30 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
19c40 2a 64 66 6c 74 5f 73 70 20 3d 20 30 3b 0a 20 20  *dflt_sp = 0;.  
19c50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
19c60 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29  p->nsymbol; i++)
19c70 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
19c80 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d 70  ymbol *sp = lemp
19c90 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20  ->symbols[i];.  
19ca0 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c 7c      if( sp==0 ||
19cb0 20 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49   sp->type==TERMI
19cc0 4e 41 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  NAL ||.         
19cd0 20 73 70 2d 3e 69 6e 64 65 78 3c 3d 30 20 7c 7c   sp->index<=0 ||
19ce0 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 21   sp->destructor!
19cf0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
19d00 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
19d10 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a 5c 6e  ,"    case %d:\n
19d20 22 2c 73 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69  ",sp->index); li
19d30 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 64 66  neno++;.      df
19d40 6c 74 5f 73 70 20 3d 20 73 70 3b 0a 20 20 20 20  lt_sp = sp;.    
19d50 7d 0a 20 20 20 20 69 66 28 20 64 66 6c 74 5f 73  }.    if( dflt_s
19d60 70 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 65 6d  p!=0 ){.      em
19d70 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63 6f  it_destructor_co
19d80 64 65 28 6f 75 74 2c 64 66 6c 74 5f 73 70 2c 6c  de(out,dflt_sp,l
19d90 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  emp,&lineno);.  
19da0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
19db0 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22  "      break;\n"
19dc0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20  ); lineno++;.   
19dd0 20 7d 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66   }.  }.  tplt_xf
19de0 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
19df0 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
19e00 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
19e10 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
19e20 73 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 70  s whenever the p
19e30 61 72 73 65 72 20 73 74 61 63 6b 20 6f 76 65 72  arser stack over
19e40 66 6c 6f 77 73 20 2a 2f 0a 20 20 74 70 6c 74 5f  flows */.  tplt_
19e50 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c  print(out,lemp,l
19e60 65 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77 2c 6c 65  emp->overflow,le
19e70 6d 70 2d 3e 6f 76 65 72 66 6c 6f 77 6c 6e 2c 26  mp->overflowln,&
19e80 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f  lineno);.  tplt_
19e90 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
19ea0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
19eb0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
19ec0 74 68 65 20 74 61 62 6c 65 20 6f 66 20 72 75 6c  the table of rul
19ed0 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 0a 20  e information . 
19ee0 20 2a 2a 0a 20 20 2a 2a 20 4e 6f 74 65 3a 20 54   **.  ** Note: T
19ef0 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73  his code depends
19f00 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61   on the fact tha
19f10 74 20 72 75 6c 65 73 20 61 72 65 20 6e 75 6d 62  t rules are numb
19f20 65 72 0a 20 20 2a 2a 20 73 65 71 75 65 6e 74 75  er.  ** sequentu
19f30 61 6c 6c 79 20 62 65 67 69 6e 6e 69 6e 67 20 77  ally beginning w
19f40 69 74 68 20 30 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ith 0..  */.  fo
19f50 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b  r(rp=lemp->rule;
19f60 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74   rp; rp=rp->next
19f70 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  ){.    fprintf(o
19f80 75 74 2c 22 20 20 7b 20 25 64 2c 20 25 64 20 7d  ut,"  { %d, %d }
19f90 2c 5c 6e 22 2c 72 70 2d 3e 6c 68 73 2d 3e 69 6e  ,\n",rp->lhs->in
19fa0 64 65 78 2c 72 70 2d 3e 6e 72 68 73 29 3b 20 6c  dex,rp->nrhs); l
19fb0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74  ineno++;.  }.  t
19fc0 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
19fd0 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
19fe0 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
19ff0 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
1a000 78 65 63 75 74 69 6f 6e 20 64 75 72 69 6e 67 20  xecution during 
1a010 65 61 63 68 20 52 45 44 55 43 45 20 61 63 74 69  each REDUCE acti
1a020 6f 6e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c  on */.  for(rp=l
1a030 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
1a040 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
1a050 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
1a060 20 20 20 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c      case %d:\n",
1a070 72 70 2d 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65  rp->index); line
1a080 6e 6f 2b 2b 3b 0a 20 20 20 20 65 6d 69 74 5f 63  no++;.    emit_c
1a090 6f 64 65 28 6f 75 74 2c 72 70 2c 6c 65 6d 70 2c  ode(out,rp,lemp,
1a0a0 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 66 70  &lineno);.    fp
1a0b0 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
1a0c0 20 20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c     break;\n"); l
1a0d0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74  ineno++;.  }.  t
1a0e0 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1a0f0 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1a100 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1a110 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
1a120 78 65 63 75 74 65 73 20 69 66 20 61 20 70 61 72  xecutes if a par
1a130 73 65 20 66 61 69 6c 73 20 2a 2f 0a 20 20 74 70  se fails */.  tp
1a140 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65 6d  lt_print(out,lem
1a150 70 2c 6c 65 6d 70 2d 3e 66 61 69 6c 75 72 65 2c  p,lemp->failure,
1a160 6c 65 6d 70 2d 3e 66 61 69 6c 75 72 65 6c 6e 2c  lemp->failureln,
1a170 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74  &lineno);.  tplt
1a180 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
1a190 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
1a1a0 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
1a1b0 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   code which exec
1a1c0 75 74 65 73 20 77 68 65 6e 20 61 20 73 79 6e 74  utes when a synt
1a1d0 61 78 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  ax error occurs 
1a1e0 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
1a1f0 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 65  out,lemp,lemp->e
1a200 72 72 6f 72 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72  rror,lemp->error
1a210 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74  ln,&lineno);.  t
1a220 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
1a230 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
1a240 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
1a250 61 74 65 20 63 6f 64 65 20 77 68 69 63 68 20 65  ate code which e
1a260 78 65 63 75 74 65 73 20 77 68 65 6e 20 74 68 65  xecutes when the
1a270 20 70 61 72 73 65 72 20 61 63 63 65 70 74 73 20   parser accepts 
1a280 69 74 73 20 69 6e 70 75 74 20 2a 2f 0a 20 20 74  its input */.  t
1a290 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
1a2a0 6d 70 2c 6c 65 6d 70 2d 3e 61 63 63 65 70 74 2c  mp,lemp->accept,
1a2b0 6c 65 6d 70 2d 3e 61 63 63 65 70 74 6c 6e 2c 26  lemp->acceptln,&
1a2c0 6c 69 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f  lineno);.  tplt_
1a2d0 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
1a2e0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
1a2f0 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 61 6e  ..  /* Append an
1a300 79 20 61 64 64 69 74 69 6f 6e 20 63 6f 64 65 20  y addition code 
1a310 74 68 65 20 75 73 65 72 20 64 65 73 69 72 65 73  the user desires
1a320 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74   */.  tplt_print
1a330 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e  (out,lemp,lemp->
1a340 65 78 74 72 61 63 6f 64 65 2c 6c 65 6d 70 2d 3e  extracode,lemp->
1a350 65 78 74 72 61 63 6f 64 65 6c 6e 2c 26 6c 69 6e  extracodeln,&lin
1a360 65 6e 6f 29 3b 0a 0a 20 20 66 63 6c 6f 73 65 28  eno);..  fclose(
1a370 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 6f 75  in);.  fclose(ou
1a380 74 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  t);.  return;.}.
1a390 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 20 68  ./* Generate a h
1a3a0 65 61 64 65 72 20 66 69 6c 65 20 66 6f 72 20 74  eader file for t
1a3b0 68 65 20 70 61 72 73 65 72 20 2a 2f 0a 76 6f 69  he parser */.voi
1a3c0 64 20 52 65 70 6f 72 74 48 65 61 64 65 72 28 6c  d ReportHeader(l
1a3d0 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  emp).struct lemo
1a3e0 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 46 49 4c  n *lemp;.{.  FIL
1a3f0 45 20 2a 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63  E *out, *in;.  c
1a400 68 61 72 20 2a 70 72 65 66 69 78 3b 0a 20 20 63  har *prefix;.  c
1a410 68 61 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a  har line[LINESIZ
1a420 45 5d 3b 0a 20 20 63 68 61 72 20 70 61 74 74 65  E];.  char patte
1a430 72 6e 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20  rn[LINESIZE];.  
1a440 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6c 65  int i;..  if( le
1a450 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20  mp->tokenprefix 
1a460 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d  ) prefix = lemp-
1a470 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20  >tokenprefix;.  
1a480 65 6c 73 65 20 20 20 20 20 20 20 20 20 20 20 20  else            
1a490 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d          prefix =
1a4a0 20 22 22 3b 0a 20 20 69 6e 20 3d 20 66 69 6c 65   "";.  in = file
1a4b0 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e 68 22 2c  _open(lemp,".h",
1a4c0 22 72 22 29 3b 0a 20 20 69 66 28 20 69 6e 20 29  "r");.  if( in )
1a4d0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  {.    for(i=1; i
1a4e0 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c  <lemp->nterminal
1a4f0 20 26 26 20 66 67 65 74 73 28 6c 69 6e 65 2c 4c   && fgets(line,L
1a500 49 4e 45 53 49 5a 45 2c 69 6e 29 3b 20 69 2b 2b  INESIZE,in); i++
1a510 29 7b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66  ){.      sprintf
1a520 28 70 61 74 74 65 72 6e 2c 22 23 64 65 66 69 6e  (pattern,"#defin
1a530 65 20 25 73 25 2d 33 30 73 20 25 32 64 5c 6e 22  e %s%-30s %2d\n"
1a540 2c 70 72 65 66 69 78 2c 6c 65 6d 70 2d 3e 73 79  ,prefix,lemp->sy
1a550 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 69  mbols[i]->name,i
1a560 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  );.      if( str
1a570 63 6d 70 28 6c 69 6e 65 2c 70 61 74 74 65 72 6e  cmp(line,pattern
1a580 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ) ) break;.    }
1a590 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b  .    fclose(in);
1a5a0 0a 20 20 20 20 69 66 28 20 69 3d 3d 6c 65 6d 70  .    if( i==lemp
1a5b0 2d 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20  ->nterminal ){. 
1a5c0 20 20 20 20 20 2f 2a 20 4e 6f 20 63 68 61 6e 67       /* No chang
1a5d0 65 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  e in the file.  
1a5e0 44 6f 6e 27 74 20 72 65 77 72 69 74 65 20 69 74  Don't rewrite it
1a5f0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
1a600 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6f  n;.    }.  }.  o
1a610 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c  ut = file_open(l
1a620 65 6d 70 2c 22 2e 68 22 2c 22 77 22 29 3b 0a 20  emp,".h","w");. 
1a630 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
1a640 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d  for(i=1; i<lemp-
1a650 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29  >nterminal; i++)
1a660 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  {.      fprintf(
1a670 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25 73 25  out,"#define %s%
1a680 2d 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66  -30s %2d\n",pref
1a690 69 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73  ix,lemp->symbols
1a6a0 5b 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20  [i]->name,i);.  
1a6b0 20 20 7d 0a 20 20 20 20 66 63 6c 6f 73 65 28 6f    }.    fclose(o
1a6c0 75 74 29 3b 20 20 0a 20 20 7d 0a 20 20 72 65 74  ut);  .  }.  ret
1a6d0 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 64 75 63  urn;.}../* Reduc
1a6e0 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
1a6f0 65 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 73 2c  e action tables,
1a700 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 62 79   if possible, by
1a710 20 6d 61 6b 69 6e 67 20 75 73 65 0a 2a 2a 20 6f   making use.** o
1a720 66 20 64 65 66 61 75 6c 74 73 2e 0a 2a 2a 0a 2a  f defaults..**.*
1a730 2a 20 49 6e 20 74 68 69 73 20 76 65 72 73 69 6f  * In this versio
1a740 6e 2c 20 77 65 20 74 61 6b 65 20 74 68 65 20 6d  n, we take the m
1a750 6f 73 74 20 66 72 65 71 75 65 6e 74 20 52 45 44  ost frequent RED
1a760 55 43 45 20 61 63 74 69 6f 6e 20 61 6e 64 20 6d  UCE action and m
1a770 61 6b 65 0a 2a 2a 20 69 74 20 74 68 65 20 64 65  ake.** it the de
1a780 66 61 75 6c 74 2e 20 20 4f 6e 6c 79 20 64 65 66  fault.  Only def
1a790 61 75 6c 74 20 61 20 72 65 64 75 63 65 20 69 66  ault a reduce if
1a7a0 20 74 68 65 72 65 20 61 72 65 20 6d 6f 72 65 20   there are more 
1a7b0 74 68 61 6e 20 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69  than one..*/.voi
1a7c0 64 20 43 6f 6d 70 72 65 73 73 54 61 62 6c 65 73  d CompressTables
1a7d0 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65  (lemp).struct le
1a7e0 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73  mon *lemp;.{.  s
1a7f0 74 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70  truct state *stp
1a800 3b 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f  ;.  struct actio
1a810 6e 20 2a 61 70 2c 20 2a 61 70 32 3b 0a 20 20 73  n *ap, *ap2;.  s
1a820 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 2c 20  truct rule *rp, 
1a830 2a 72 70 32 2c 20 2a 72 62 65 73 74 3b 0a 20 20  *rp2, *rbest;.  
1a840 69 6e 74 20 6e 62 65 73 74 2c 20 6e 3b 0a 20 20  int nbest, n;.  
1a850 69 6e 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d  int i;..  for(i=
1a860 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
1a870 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70  e; i++){.    stp
1a880 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b   = lemp->sorted[
1a890 69 5d 3b 0a 20 20 20 20 6e 62 65 73 74 20 3d 20  i];.    nbest = 
1a8a0 30 3b 0a 20 20 20 20 72 62 65 73 74 20 3d 20 30  0;.    rbest = 0
1a8b0 3b 0a 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74  ;..    for(ap=st
1a8c0 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
1a8d0 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
1a8e0 66 28 20 61 70 2d 3e 74 79 70 65 21 3d 52 45 44  f( ap->type!=RED
1a8f0 55 43 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  UCE ) continue;.
1a900 20 20 20 20 20 20 72 70 20 3d 20 61 70 2d 3e 78        rp = ap->x
1a910 2e 72 70 3b 0a 20 20 20 20 20 20 69 66 28 20 72  .rp;.      if( r
1a920 70 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69  p==rbest ) conti
1a930 6e 75 65 3b 0a 20 20 20 20 20 20 6e 20 3d 20 31  nue;.      n = 1
1a940 3b 0a 20 20 20 20 20 20 66 6f 72 28 61 70 32 3d  ;.      for(ap2=
1a950 61 70 2d 3e 6e 65 78 74 3b 20 61 70 32 3b 20 61  ap->next; ap2; a
1a960 70 32 3d 61 70 32 2d 3e 6e 65 78 74 29 7b 0a 20  p2=ap2->next){. 
1a970 20 20 20 20 20 20 20 69 66 28 20 61 70 32 2d 3e         if( ap2->
1a980 74 79 70 65 21 3d 52 45 44 55 43 45 20 29 20 63  type!=REDUCE ) c
1a990 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1a9a0 20 72 70 32 20 3d 20 61 70 32 2d 3e 78 2e 72 70   rp2 = ap2->x.rp
1a9b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 70  ;.        if( rp
1a9c0 32 3d 3d 72 62 65 73 74 20 29 20 63 6f 6e 74 69  2==rbest ) conti
1a9d0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
1a9e0 20 72 70 32 3d 3d 72 70 20 29 20 6e 2b 2b 3b 0a   rp2==rp ) n++;.
1a9f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1aa00 28 20 6e 3e 6e 62 65 73 74 20 29 7b 0a 20 20 20  ( n>nbest ){.   
1aa10 20 20 20 20 20 6e 62 65 73 74 20 3d 20 6e 3b 0a       nbest = n;.
1aa20 20 20 20 20 20 20 20 20 72 62 65 73 74 20 3d 20          rbest = 
1aa30 72 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rp;.      }.    
1aa40 7d 0a 20 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  }. .    /* Do no
1aa50 74 20 6d 61 6b 65 20 61 20 64 65 66 61 75 6c 74  t make a default
1aa60 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   if the number o
1aa70 66 20 72 75 6c 65 73 20 74 6f 20 64 65 66 61 75  f rules to defau
1aa80 6c 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  lt.    ** is not
1aa90 20 61 74 20 6c 65 61 73 74 20 32 20 2a 2f 0a 20   at least 2 */. 
1aaa0 20 20 20 69 66 28 20 6e 62 65 73 74 3c 32 20 29     if( nbest<2 )
1aab0 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 0a 20 20 20   continue;...   
1aac0 20 2f 2a 20 43 6f 6d 62 69 6e 65 20 6d 61 74 63   /* Combine matc
1aad0 68 69 6e 67 20 52 45 44 55 43 45 20 61 63 74 69  hing REDUCE acti
1aae0 6f 6e 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c  ons into a singl
1aaf0 65 20 64 65 66 61 75 6c 74 20 2a 2f 0a 20 20 20  e default */.   
1ab00 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
1ab10 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
1ab20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d  ){.      if( ap-
1ab30 3e 74 79 70 65 3d 3d 52 45 44 55 43 45 20 26 26  >type==REDUCE &&
1ab40 20 61 70 2d 3e 78 2e 72 70 3d 3d 72 62 65 73 74   ap->x.rp==rbest
1ab50 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
1ab60 20 20 20 20 61 73 73 65 72 74 28 20 61 70 20 29      assert( ap )
1ab70 3b 0a 20 20 20 20 61 70 2d 3e 73 70 20 3d 20 53  ;.    ap->sp = S
1ab80 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65 66 61  ymbol_new("{defa
1ab90 75 6c 74 7d 22 29 3b 0a 20 20 20 20 66 6f 72 28  ult}");.    for(
1aba0 61 70 3d 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3b  ap=ap->next; ap;
1abb0 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20   ap=ap->next){. 
1abc0 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70       if( ap->typ
1abd0 65 3d 3d 52 45 44 55 43 45 20 26 26 20 61 70 2d  e==REDUCE && ap-
1abe0 3e 78 2e 72 70 3d 3d 72 62 65 73 74 20 29 20 61  >x.rp==rbest ) a
1abf0 70 2d 3e 74 79 70 65 20 3d 20 4e 4f 54 5f 55 53  p->type = NOT_US
1ac00 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  ED;.    }.    st
1ac10 70 2d 3e 61 70 20 3d 20 41 63 74 69 6f 6e 5f 73  p->ap = Action_s
1ac20 6f 72 74 28 73 74 70 2d 3e 61 70 29 3b 0a 20 20  ort(stp->ap);.  
1ac30 7d 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}../**********
1ac40 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
1ac50 20 66 69 6c 65 20 22 73 65 74 2e 63 22 20 2a 2a   file "set.c" **
1ac60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ac80 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6d 61  **/./*.** Set ma
1ac90 6e 69 70 75 6c 61 74 69 6f 6e 20 72 6f 75 74 69  nipulation routi
1aca0 6e 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f  nes for the LEMO
1acb0 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74  N parser generat
1acc0 6f 72 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69  or..*/..static i
1acd0 6e 74 20 73 69 7a 65 20 3d 20 30 3b 0a 0a 2f 2a  nt size = 0;../*
1ace0 20 53 65 74 20 74 68 65 20 73 65 74 20 73 69 7a   Set the set siz
1acf0 65 20 2a 2f 0a 76 6f 69 64 20 53 65 74 53 69 7a  e */.void SetSiz
1ad00 65 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20  e(n).int n;.{.  
1ad10 73 69 7a 65 20 3d 20 6e 2b 31 3b 0a 7d 0a 0a 2f  size = n+1;.}../
1ad20 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
1ad30 20 73 65 74 20 2a 2f 0a 63 68 61 72 20 2a 53 65   set */.char *Se
1ad40 74 4e 65 77 28 29 7b 0a 20 20 63 68 61 72 20 2a  tNew(){.  char *
1ad50 73 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 20  s;.  int i;.  s 
1ad60 3d 20 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28  = (char*)malloc(
1ad70 20 73 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 73   size );.  if( s
1ad80 3d 3d 30 20 29 7b 0a 20 20 20 20 65 78 74 65 72  ==0 ){.    exter
1ad90 6e 20 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72  n void memory_er
1ada0 72 6f 72 28 29 3b 0a 20 20 20 20 6d 65 6d 6f 72  ror();.    memor
1adb0 79 5f 65 72 72 6f 72 28 29 3b 0a 20 20 7d 0a 20  y_error();.  }. 
1adc0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
1add0 3b 20 69 2b 2b 29 20 73 5b 69 5d 20 3d 20 30 3b  ; i++) s[i] = 0;
1ade0 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 0a  .  return s;.}..
1adf0 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20  /* Deallocate a 
1ae00 73 65 74 20 2a 2f 0a 76 6f 69 64 20 53 65 74 46  set */.void SetF
1ae10 72 65 65 28 73 29 0a 63 68 61 72 20 2a 73 3b 0a  ree(s).char *s;.
1ae20 7b 0a 20 20 66 72 65 65 28 73 29 3b 0a 7d 0a 0a  {.  free(s);.}..
1ae30 2f 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  /* Add a new ele
1ae40 6d 65 6e 74 20 74 6f 20 74 68 65 20 73 65 74 2e  ment to the set.
1ae50 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66    Return TRUE if
1ae60 20 74 68 65 20 65 6c 65 6d 65 6e 74 20 77 61 73   the element was
1ae70 20 61 64 64 65 64 0a 2a 2a 20 61 6e 64 20 46 41   added.** and FA
1ae80 4c 53 45 20 69 66 20 69 74 20 77 61 73 20 61 6c  LSE if it was al
1ae90 72 65 61 64 79 20 74 68 65 72 65 2e 20 2a 2f 0a  ready there. */.
1aea0 69 6e 74 20 53 65 74 41 64 64 28 73 2c 65 29 0a  int SetAdd(s,e).
1aeb0 63 68 61 72 20 2a 73 3b 0a 69 6e 74 20 65 3b 0a  char *s;.int e;.
1aec0 7b 0a 20 20 69 6e 74 20 72 76 3b 0a 20 20 72 76  {.  int rv;.  rv
1aed0 20 3d 20 73 5b 65 5d 3b 0a 20 20 73 5b 65 5d 20   = s[e];.  s[e] 
1aee0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 21 72  = 1;.  return !r
1aef0 76 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 65 76 65  v;.}../* Add eve
1af00 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 73 32  ry element of s2
1af10 20 74 6f 20 73 31 2e 20 20 52 65 74 75 72 6e 20   to s1.  Return 
1af20 54 52 55 45 20 69 66 20 73 31 20 63 68 61 6e 67  TRUE if s1 chang
1af30 65 73 2e 20 2a 2f 0a 69 6e 74 20 53 65 74 55 6e  es. */.int SetUn
1af40 69 6f 6e 28 73 31 2c 73 32 29 0a 63 68 61 72 20  ion(s1,s2).char 
1af50 2a 73 31 3b 0a 63 68 61 72 20 2a 73 32 3b 0a 7b  *s1;.char *s2;.{
1af60 0a 20 20 69 6e 74 20 69 2c 20 70 72 6f 67 72 65  .  int i, progre
1af70 73 73 3b 0a 20 20 70 72 6f 67 72 65 73 73 20 3d  ss;.  progress =
1af80 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
1af90 3c 73 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  <size; i++){.   
1afa0 20 69 66 28 20 73 32 5b 69 5d 3d 3d 30 20 29 20   if( s2[i]==0 ) 
1afb0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
1afc0 28 20 73 31 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  ( s1[i]==0 ){.  
1afd0 20 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31      progress = 1
1afe0 3b 0a 20 20 20 20 20 20 73 31 5b 69 5d 20 3d 20  ;.      s1[i] = 
1aff0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
1b000 65 74 75 72 6e 20 70 72 6f 67 72 65 73 73 3b 0a  eturn progress;.
1b010 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
1b020 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  ********* From t
1b030 68 65 20 66 69 6c 65 20 22 74 61 62 6c 65 2e 63  he file "table.c
1b040 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
1b050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1b060 2f 2a 0a 2a 2a 20 41 6c 6c 20 63 6f 64 65 20 69  /*.** All code i
1b070 6e 20 74 68 69 73 20 66 69 6c 65 20 68 61 73 20  n this file has 
1b080 62 65 65 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c  been automatical
1b090 6c 79 20 67 65 6e 65 72 61 74 65 64 0a 2a 2a 20  ly generated.** 
1b0a0 66 72 6f 6d 20 61 20 73 70 65 63 69 66 69 63 61  from a specifica
1b0b0 74 69 6f 6e 20 69 6e 20 74 68 65 20 66 69 6c 65  tion in the file
1b0c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1b0d0 20 22 74 61 62 6c 65 2e 71 22 0a 2a 2a 20 62 79   "table.q".** by
1b0e0 20 74 68 65 20 61 73 73 6f 63 69 61 74 69 76 65   the associative
1b0f0 20 61 72 72 61 79 20 63 6f 64 65 20 62 75 69 6c   array code buil
1b100 64 69 6e 67 20 70 72 6f 67 72 61 6d 20 22 61 61  ding program "aa
1b110 67 65 6e 22 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20  gen"..** Do not 
1b120 65 64 69 74 20 74 68 69 73 20 66 69 6c 65 21 20  edit this file! 
1b130 20 49 6e 73 74 65 61 64 2c 20 65 64 69 74 20 74   Instead, edit t
1b140 68 65 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e  he specification
1b150 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 72  .** file, then r
1b160 65 72 75 6e 20 61 61 67 65 6e 2e 0a 2a 2f 0a 2f  erun aagen..*/./
1b170 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f 72 20 70 72  *.** Code for pr
1b180 6f 63 65 73 73 69 6e 67 20 74 61 62 6c 65 73 20  ocessing tables 
1b190 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72  in the LEMON par
1b1a0 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ser generator..*
1b1b0 2f 0a 0a 50 52 49 56 41 54 45 20 69 6e 74 20 73  /..PRIVATE int s
1b1c0 74 72 68 61 73 68 28 78 29 0a 63 68 61 72 20 2a  trhash(x).char *
1b1d0 78 3b 0a 7b 0a 20 20 69 6e 74 20 68 20 3d 20 30  x;.{.  int h = 0
1b1e0 3b 0a 20 20 77 68 69 6c 65 28 20 2a 78 29 20 68  ;.  while( *x) h
1b1f0 20 3d 20 68 2a 31 33 20 2b 20 2a 28 78 2b 2b 29   = h*13 + *(x++)
1b200 3b 0a 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a  ;.  return h;.}.
1b210 0a 2f 2a 20 57 6f 72 6b 73 20 6c 69 6b 65 20 73  ./* Works like s
1b220 74 72 64 75 70 2c 20 73 6f 72 74 20 6f 66 2e 20  trdup, sort of. 
1b230 20 53 61 76 65 20 61 20 73 74 72 69 6e 67 20 69   Save a string i
1b240 6e 20 6d 61 6c 6c 6f 63 65 64 20 6d 65 6d 6f 72  n malloced memor
1b250 79 2c 20 62 75 74 0a 2a 2a 20 6b 65 65 70 20 73  y, but.** keep s
1b260 74 72 69 6e 67 73 20 69 6e 20 61 20 74 61 62 6c  trings in a tabl
1b270 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 73 61  e so that the sa
1b280 6d 65 20 73 74 72 69 6e 67 20 69 73 20 6e 6f 74  me string is not
1b290 20 69 6e 20 6d 6f 72 65 0a 2a 2a 20 74 68 61 6e   in more.** than
1b2a0 20 6f 6e 65 20 70 6c 61 63 65 2e 0a 2a 2f 0a 63   one place..*/.c
1b2b0 68 61 72 20 2a 53 74 72 73 61 66 65 28 79 29 0a  har *Strsafe(y).
1b2c0 63 68 61 72 20 2a 79 3b 0a 7b 0a 20 20 63 68 61  char *y;.{.  cha
1b2d0 72 20 2a 7a 3b 0a 0a 20 20 7a 20 3d 20 53 74 72  r *z;..  z = Str
1b2e0 73 61 66 65 5f 66 69 6e 64 28 79 29 3b 0a 20 20  safe_find(y);.  
1b2f0 69 66 28 20 7a 3d 3d 30 20 26 26 20 28 7a 3d 6d  if( z==0 && (z=m
1b300 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 79 29  alloc( strlen(y)
1b310 2b 31 20 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  +1 ))!=0 ){.    
1b320 73 74 72 63 70 79 28 7a 2c 79 29 3b 0a 20 20 20  strcpy(z,y);.   
1b330 20 53 74 72 73 61 66 65 5f 69 6e 73 65 72 74 28   Strsafe_insert(
1b340 7a 29 3b 0a 20 20 7d 0a 20 20 4d 65 6d 6f 72 79  z);.  }.  Memory
1b350 43 68 65 63 6b 28 7a 29 3b 0a 20 20 72 65 74 75  Check(z);.  retu
1b360 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72  rn z;.}../* Ther
1b370 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
1b380 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
1b390 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  ng structure for
1b3a0 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61   each.** associa
1b3b0 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
1b3c0 70 65 20 22 78 31 22 2e 0a 2a 2f 0a 73 74 72 75  pe "x1"..*/.stru
1b3d0 63 74 20 73 5f 78 31 20 7b 0a 20 20 69 6e 74 20  ct s_x1 {.  int 
1b3e0 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
1b3f0 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
1b400 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73  r of available s
1b410 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lots. */.       
1b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b430 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20     /*   Must be 
1b440 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65  a power of 2 gre
1b450 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a  ater than or */.
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65            /*   e
1b480 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69  qual to 1 */.  i
1b490 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20  nt count;       
1b4a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b4b0 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c   of currently sl
1b4c0 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ots filled */.  
1b4d0 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20  struct s_x1node 
1b4e0 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61  *tbl;  /* The da
1b4f0 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a  ta stored here *
1b500 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e  /.  struct s_x1n
1b510 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61  ode **ht;  /* Ha
1b520 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f  sh table for loo
1b530 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54  kups */.};../* T
1b540 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
1b550 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
1b560 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79  ucture for every
1b570 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a   data element.**
1b580 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69   in an associati
1b590 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
1b5a0 20 22 78 31 22 2e 0a 2a 2f 0a 74 79 70 65 64 65   "x1"..*/.typede
1b5b0 66 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f 64  f struct s_x1nod
1b5c0 65 20 7b 0a 20 20 63 68 61 72 20 2a 64 61 74 61  e {.  char *data
1b5d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b5e0 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
1b5f0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e  /.  struct s_x1n
1b600 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20  ode *next;   /* 
1b610 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20  Next entry with 
1b620 74 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f  the same hash */
1b630 0a 20 20 73 74 72 75 63 74 20 73 5f 78 31 6e 6f  .  struct s_x1no
1b640 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50  de **from;  /* P
1b650 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a  revious link */.
1b660 7d 20 78 31 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68  } x1node;../* Th
1b670 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20  ere is only one 
1b680 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1b690 61 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20  array, which is 
1b6a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f  the following */
1b6b0 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73  .static struct s
1b6c0 5f 78 31 20 2a 78 31 61 3b 0a 0a 2f 2a 20 41 6c  _x1 *x1a;../* Al
1b6d0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73  locate a new ass
1b6e0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a  ociative array *
1b6f0 2f 0a 76 6f 69 64 20 53 74 72 73 61 66 65 5f 69  /.void Strsafe_i
1b700 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78 31 61  nit(){.  if( x1a
1b710 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 31 61   ) return;.  x1a
1b720 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 31 2a   = (struct s_x1*
1b730 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
1b740 73 74 72 75 63 74 20 73 5f 78 31 29 20 29 3b 0a  struct s_x1) );.
1b750 20 20 69 66 28 20 78 31 61 20 29 7b 0a 20 20 20    if( x1a ){.   
1b760 20 78 31 61 2d 3e 73 69 7a 65 20 3d 20 31 30 32   x1a->size = 102
1b770 34 3b 0a 20 20 20 20 78 31 61 2d 3e 63 6f 75 6e  4;.    x1a->coun
1b780 74 20 3d 20 30 3b 0a 20 20 20 20 78 31 61 2d 3e  t = 0;.    x1a->
1b790 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29 6d  tbl = (x1node*)m
1b7a0 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73  alloc( .      (s
1b7b0 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20  izeof(x1node) + 
1b7c0 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29  sizeof(x1node*))
1b7d0 2a 31 30 32 34 20 29 3b 0a 20 20 20 20 69 66 28  *1024 );.    if(
1b7e0 20 78 31 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a   x1a->tbl==0 ){.
1b7f0 20 20 20 20 20 20 66 72 65 65 28 78 31 61 29 3b        free(x1a);
1b800 0a 20 20 20 20 20 20 78 31 61 20 3d 20 30 3b 0a  .      x1a = 0;.
1b810 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b820 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 31   int i;.      x1
1b830 61 2d 3e 68 74 20 3d 20 28 78 31 6e 6f 64 65 2a  a->ht = (x1node*
1b840 2a 29 26 28 78 31 61 2d 3e 74 62 6c 5b 31 30 32  *)&(x1a->tbl[102
1b850 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  4]);.      for(i
1b860 3d 30 3b 20 69 3c 31 30 32 34 3b 20 69 2b 2b 29  =0; i<1024; i++)
1b870 20 78 31 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b   x1a->ht[i] = 0;
1b880 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20  .    }.  }.}./* 
1b890 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
1b8a0 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72  ord into the arr
1b8b0 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  ay.  Return TRUE
1b8c0 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a   if successful..
1b8d0 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20 77 69  ** Prior data wi
1b8e0 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20  th the same key 
1b8f0 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74  is NOT overwritt
1b900 65 6e 20 2a 2f 0a 69 6e 74 20 53 74 72 73 61 66  en */.int Strsaf
1b910 65 5f 69 6e 73 65 72 74 28 64 61 74 61 29 0a 63  e_insert(data).c
1b920 68 61 72 20 2a 64 61 74 61 3b 0a 7b 0a 20 20 78  har *data;.{.  x
1b930 31 6e 6f 64 65 20 2a 6e 70 3b 0a 20 20 69 6e 74  1node *np;.  int
1b940 20 68 3b 0a 20 20 69 6e 74 20 70 68 3b 0a 0a 20   h;.  int ph;.. 
1b950 20 69 66 28 20 78 31 61 3d 3d 30 20 29 20 72 65   if( x1a==0 ) re
1b960 74 75 72 6e 20 30 3b 0a 20 20 70 68 20 3d 20 73  turn 0;.  ph = s
1b970 74 72 68 61 73 68 28 64 61 74 61 29 3b 0a 20 20  trhash(data);.  
1b980 68 20 3d 20 70 68 20 26 20 28 78 31 61 2d 3e 73  h = ph & (x1a->s
1b990 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78  ize-1);.  np = x
1b9a0 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69  1a->ht[h];.  whi
1b9b0 6c 65 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66  le( np ){.    if
1b9c0 28 20 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74  ( strcmp(np->dat
1b9d0 61 2c 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20  a,data)==0 ){.  
1b9e0 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
1b9f0 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  ng entry with th
1ba00 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f  e same key is fo
1ba10 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  und. */.      /*
1ba20 20 46 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76   Fail because ov
1ba30 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61  erwrite is not a
1ba40 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20  llows. */.      
1ba50 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1ba60 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78      np = np->nex
1ba70 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78 31 61  t;.  }.  if( x1a
1ba80 2d 3e 63 6f 75 6e 74 3e 3d 78 31 61 2d 3e 73 69  ->count>=x1a->si
1ba90 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65  ze ){.    /* Nee
1baa0 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61  d to make the ha
1bab0 73 68 20 74 61 62 6c 65 20 62 69 67 67 65 72 20  sh table bigger 
1bac0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a  */.    int i,siz
1bad0 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f  e;.    struct s_
1bae0 78 31 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72  x1 array;.    ar
1baf0 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20  ray.size = size 
1bb00 3d 20 78 31 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20  = x1a->size*2;. 
1bb10 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d     array.count =
1bb20 20 78 31 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20   x1a->count;.   
1bb30 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 31   array.tbl = (x1
1bb40 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20  node*)malloc(.  
1bb50 20 20 20 20 28 73 69 7a 65 6f 66 28 78 31 6e 6f      (sizeof(x1no
1bb60 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 31 6e  de) + sizeof(x1n
1bb70 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20  ode*))*size );. 
1bb80 20 20 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c     if( array.tbl
1bb90 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
1bba0 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20   /* Fail due to 
1bbb0 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a  malloc failure *
1bbc0 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d  /.    array.ht =
1bbd0 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28 61 72 72   (x1node**)&(arr
1bbe0 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20  ay.tbl[size]);. 
1bbf0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
1bc00 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68  ze; i++) array.h
1bc10 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f  t[i] = 0;.    fo
1bc20 72 28 69 3d 30 3b 20 69 3c 78 31 61 2d 3e 63 6f  r(i=0; i<x1a->co
1bc30 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  unt; i++){.     
1bc40 20 78 31 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20   x1node *oldnp, 
1bc50 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c  *newnp;.      ol
1bc60 64 6e 70 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c  dnp = &(x1a->tbl
1bc70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20  [i]);.      h = 
1bc80 73 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64  strhash(oldnp->d
1bc90 61 74 61 29 20 26 20 28 73 69 7a 65 2d 31 29 3b  ata) & (size-1);
1bca0 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20 26  .      newnp = &
1bcb0 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a  (array.tbl[i]);.
1bcc0 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79 2e        if( array.
1bcd0 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68 74  ht[h] ) array.ht
1bce0 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65  [h]->from = &(ne
1bcf0 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20  wnp->next);.    
1bd00 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20    newnp->next = 
1bd10 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20  array.ht[h];.   
1bd20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d     newnp->data =
1bd30 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20   oldnp->data;.  
1bd40 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20      newnp->from 
1bd50 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29  = &(array.ht[h])
1bd60 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74  ;.      array.ht
1bd70 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20  [h] = newnp;.   
1bd80 20 7d 0a 20 20 20 20 66 72 65 65 28 78 31 61 2d   }.    free(x1a-
1bd90 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 31 61 20  >tbl);.    *x1a 
1bda0 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f  = array;.  }.  /
1bdb0 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
1bdc0 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70   data */.  h = p
1bdd0 68 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31  h & (x1a->size-1
1bde0 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 31 61 2d  );.  np = &(x1a-
1bdf0 3e 74 62 6c 5b 78 31 61 2d 3e 63 6f 75 6e 74 2b  >tbl[x1a->count+
1be00 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20  +]);.  np->data 
1be10 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78 31  = data;.  if( x1
1be20 61 2d 3e 68 74 5b 68 5d 20 29 20 78 31 61 2d 3e  a->ht[h] ) x1a->
1be30 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28  ht[h]->from = &(
1be40 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d  np->next);.  np-
1be50 3e 6e 65 78 74 20 3d 20 78 31 61 2d 3e 68 74 5b  >next = x1a->ht[
1be60 68 5d 3b 0a 20 20 78 31 61 2d 3e 68 74 5b 68 5d  h];.  x1a->ht[h]
1be70 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f   = np;.  np->fro
1be80 6d 20 3d 20 26 28 78 31 61 2d 3e 68 74 5b 68 5d  m = &(x1a->ht[h]
1be90 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
1bea0 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
1beb0 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61 73  inter to data as
1bec0 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67 69  signed to the gi
1bed0 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72 6e  ven key.  Return
1bee0 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73   NULL.** if no s
1bef0 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 63 68 61 72  uch key. */.char
1bf00 20 2a 53 74 72 73 61 66 65 5f 66 69 6e 64 28 6b   *Strsafe_find(k
1bf10 65 79 29 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b  ey).char *key;.{
1bf20 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78 31 6e 6f  .  int h;.  x1no
1bf30 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78  de *np;..  if( x
1bf40 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  1a==0 ) return 0
1bf50 3b 0a 20 20 68 20 3d 20 73 74 72 68 61 73 68 28  ;.  h = strhash(
1bf60 6b 65 79 29 20 26 20 28 78 31 61 2d 3e 73 69 7a  key) & (x1a->siz
1bf70 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 78 31 61  e-1);.  np = x1a
1bf80 2d 3e 68 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65  ->ht[h];.  while
1bf90 28 20 6e 70 20 29 7b 0a 20 20 20 20 69 66 28 20  ( np ){.    if( 
1bfa0 73 74 72 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c  strcmp(np->data,
1bfb0 6b 65 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  key)==0 ) break;
1bfc0 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65  .    np = np->ne
1bfd0 78 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  xt;.  }.  return
1bfe0 20 6e 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a   np ? np->data :
1bff0 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   0;.}../* Return
1c000 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
1c010 65 20 28 74 65 72 6d 69 6e 61 6c 20 6f 72 20 6e  e (terminal or n
1c020 6f 6e 74 65 72 6d 69 6e 61 6c 29 20 73 79 6d 62  onterminal) symb
1c030 6f 6c 20 22 78 22 2e 0a 2a 2a 20 43 72 65 61 74  ol "x"..** Creat
1c040 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 20 69  e a new symbol i
1c050 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1c060 72 73 74 20 74 69 6d 65 20 22 78 22 20 68 61 73  rst time "x" has
1c070 20 62 65 65 6e 20 73 65 65 6e 2e 0a 2a 2f 0a 73   been seen..*/.s
1c080 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
1c090 6d 62 6f 6c 5f 6e 65 77 28 78 29 0a 63 68 61 72  mbol_new(x).char
1c0a0 20 2a 78 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20   *x;.{.  struct 
1c0b0 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 0a 20 20 73  symbol *sp;..  s
1c0c0 70 20 3d 20 53 79 6d 62 6f 6c 5f 66 69 6e 64 28  p = Symbol_find(
1c0d0 78 29 3b 0a 20 20 69 66 28 20 73 70 3d 3d 30 20  x);.  if( sp==0 
1c0e0 29 7b 0a 20 20 20 20 73 70 20 3d 20 28 73 74 72  ){.    sp = (str
1c0f0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 29 6d 61 6c  uct symbol *)mal
1c100 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75  loc( sizeof(stru
1c110 63 74 20 73 79 6d 62 6f 6c 29 20 29 3b 0a 20 20  ct symbol) );.  
1c120 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73 70    MemoryCheck(sp
1c130 29 3b 0a 20 20 20 20 73 70 2d 3e 6e 61 6d 65 20  );.    sp->name 
1c140 3d 20 53 74 72 73 61 66 65 28 78 29 3b 0a 20 20  = Strsafe(x);.  
1c150 20 20 73 70 2d 3e 74 79 70 65 20 3d 20 69 73 75    sp->type = isu
1c160 70 70 65 72 28 2a 78 29 20 3f 20 54 45 52 4d 49  pper(*x) ? TERMI
1c170 4e 41 4c 20 3a 20 4e 4f 4e 54 45 52 4d 49 4e 41  NAL : NONTERMINA
1c180 4c 3b 0a 20 20 20 20 73 70 2d 3e 72 75 6c 65 20  L;.    sp->rule 
1c190 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 66 61 6c  = 0;.    sp->fal
1c1a0 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 20 20 73  lback = 0;.    s
1c1b0 70 2d 3e 70 72 65 63 20 3d 20 2d 31 3b 0a 20 20  p->prec = -1;.  
1c1c0 20 20 73 70 2d 3e 61 73 73 6f 63 20 3d 20 55 4e    sp->assoc = UN
1c1d0 4b 3b 0a 20 20 20 20 73 70 2d 3e 66 69 72 73 74  K;.    sp->first
1c1e0 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 73 70 2d  set = 0;.    sp-
1c1f0 3e 6c 61 6d 62 64 61 20 3d 20 42 5f 46 41 4c 53  >lambda = B_FALS
1c200 45 3b 0a 20 20 20 20 73 70 2d 3e 64 65 73 74 72  E;.    sp->destr
1c210 75 63 74 6f 72 20 3d 20 30 3b 0a 20 20 20 20 73  uctor = 0;.    s
1c220 70 2d 3e 64 61 74 61 74 79 70 65 20 3d 20 30 3b  p->datatype = 0;
1c230 0a 20 20 20 20 53 79 6d 62 6f 6c 5f 69 6e 73 65  .    Symbol_inse
1c240 72 74 28 73 70 2c 73 70 2d 3e 6e 61 6d 65 29 3b  rt(sp,sp->name);
1c250 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 70  .  }.  return sp
1c260 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20  ;.}../* Compare 
1c270 74 77 6f 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 69  two symbols */.i
1c280 6e 74 20 53 79 6d 62 6f 6c 63 6d 70 70 28 61 2c  nt Symbolcmpp(a,
1c290 62 29 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  b).struct symbol
1c2a0 20 2a 2a 61 3b 0a 73 74 72 75 63 74 20 73 79 6d   **a;.struct sym
1c2b0 62 6f 6c 20 2a 2a 62 3b 0a 7b 0a 20 20 72 65 74  bol **b;.{.  ret
1c2c0 75 72 6e 20 73 74 72 63 6d 70 28 28 2a 2a 61 29  urn strcmp((**a)
1c2d0 2e 6e 61 6d 65 2c 28 2a 2a 62 29 2e 6e 61 6d 65  .name,(**b).name
1c2e0 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69  );.}../* There i
1c2f0 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
1c300 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1c310 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61  structure for ea
1c320 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61 74 69 76  ch.** associativ
1c330 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65 20  e array of type 
1c340 22 78 32 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  "x2"..*/.struct 
1c350 73 5f 78 32 20 7b 0a 20 20 69 6e 74 20 73 69 7a  s_x2 {.  int siz
1c360 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1c370 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   /* The number o
1c380 66 20 61 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74  f available slot
1c390 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  s. */.          
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3b0 2f 2a 20 20 20 4d 75 73 74 20 62 65 20 61 20 70  /*   Must be a p
1c3c0 6f 77 65 72 20 6f 66 20 32 20 67 72 65 61 74 65  ower of 2 greate
1c3d0 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20  r than or */.   
1c3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3f0 20 20 20 20 20 20 20 2f 2a 20 20 20 65 71 75 61         /*   equa
1c400 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20  l to 1 */.  int 
1c410 63 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  count;          
1c420 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c430 20 63 75 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73   currently slots
1c440 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72   filled */.  str
1c450 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 2a 74 62  uct s_x2node *tb
1c460 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20  l;  /* The data 
1c470 73 74 6f 72 65 64 20 68 65 72 65 20 2a 2f 0a 20  stored here */. 
1c480 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65   struct s_x2node
1c490 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61 73 68 20   **ht;  /* Hash 
1c4a0 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70  table for lookup
1c4b0 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72  s */.};../* Ther
1c4c0 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
1c4d0 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
1c4e0 75 72 65 20 66 6f 72 20 65 76 65 72 79 20 64 61  ure for every da
1c4f0 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e  ta element.** in
1c500 20 61 6e 20 61 73 73 6f 63 69 61 74 69 76 65 20   an associative 
1c510 61 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78  array of type "x
1c520 32 22 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  2"..*/.typedef s
1c530 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65 20 7b  truct s_x2node {
1c540 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
1c550 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
1c560 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c570 64 61 74 61 20 2a 2f 0a 20 20 63 68 61 72 20 2a  data */.  char *
1c580 6b 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  key;            
1c590 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65         /* The ke
1c5a0 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f  y */.  struct s_
1c5b0 78 32 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20  x2node *next;   
1c5c0 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69  /* Next entry wi
1c5d0 74 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68  th the same hash
1c5e0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
1c5f0 32 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f  2node **from;  /
1c600 2a 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20  * Previous link 
1c610 2a 2f 0a 7d 20 78 32 6e 6f 64 65 3b 0a 0a 2f 2a  */.} x2node;../*
1c620 20 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f   There is only o
1c630 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
1c640 68 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  he array, which 
1c650 69 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  is the following
1c660 20 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63   */.static struc
1c670 74 20 73 5f 78 32 20 2a 78 32 61 3b 0a 0a 2f 2a  t s_x2 *x2a;../*
1c680 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
1c690 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
1c6a0 79 20 2a 2f 0a 76 6f 69 64 20 53 79 6d 62 6f 6c  y */.void Symbol
1c6b0 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78  _init(){.  if( x
1c6c0 32 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78  2a ) return;.  x
1c6d0 32 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78  2a = (struct s_x
1c6e0 32 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  2*)malloc( sizeo
1c6f0 66 28 73 74 72 75 63 74 20 73 5f 78 32 29 20 29  f(struct s_x2) )
1c700 3b 0a 20 20 69 66 28 20 78 32 61 20 29 7b 0a 20  ;.  if( x2a ){. 
1c710 20 20 20 78 32 61 2d 3e 73 69 7a 65 20 3d 20 31     x2a->size = 1
1c720 32 38 3b 0a 20 20 20 20 78 32 61 2d 3e 63 6f 75  28;.    x2a->cou
1c730 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 32 61 2d  nt = 0;.    x2a-
1c740 3e 74 62 6c 20 3d 20 28 78 32 6e 6f 64 65 2a 29  >tbl = (x2node*)
1c750 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28  malloc( .      (
1c760 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 29 20 2b  sizeof(x2node) +
1c770 20 73 69 7a 65 6f 66 28 78 32 6e 6f 64 65 2a 29   sizeof(x2node*)
1c780 29 2a 31 32 38 20 29 3b 0a 20 20 20 20 69 66 28  )*128 );.    if(
1c790 20 78 32 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a   x2a->tbl==0 ){.
1c7a0 20 20 20 20 20 20 66 72 65 65 28 78 32 61 29 3b        free(x2a);
1c7b0 0a 20 20 20 20 20 20 78 32 61 20 3d 20 30 3b 0a  .      x2a = 0;.
1c7c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c7d0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 32   int i;.      x2
1c7e0 61 2d 3e 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a  a->ht = (x2node*
1c7f0 2a 29 26 28 78 32 61 2d 3e 74 62 6c 5b 31 32 38  *)&(x2a->tbl[128
1c800 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ]);.      for(i=
1c810 30 3b 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78  0; i<128; i++) x
1c820 32 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20  2a->ht[i] = 0;. 
1c830 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e     }.  }.}./* In
1c840 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72  sert a new recor
1c850 64 20 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79  d into the array
1c860 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
1c870 66 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a  f successful..**
1c880 20 50 72 69 6f 72 20 64 61 74 61 20 77 69 74 68   Prior data with
1c890 20 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73   the same key is
1c8a0 20 4e 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e   NOT overwritten
1c8b0 20 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69   */.int Symbol_i
1c8c0 6e 73 65 72 74 28 64 61 74 61 2c 6b 65 79 29 0a  nsert(data,key).
1c8d0 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 64  struct symbol *d
1c8e0 61 74 61 3b 0a 63 68 61 72 20 2a 6b 65 79 3b 0a  ata;.char *key;.
1c8f0 7b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b 0a  {.  x2node *np;.
1c900 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70    int h;.  int p
1c910 68 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30  h;..  if( x2a==0
1c920 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
1c930 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29  h = strhash(key)
1c940 3b 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78 32  ;.  h = ph & (x2
1c950 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
1c960 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x2a->ht[h];. 
1c970 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
1c980 20 20 69 66 28 20 73 74 72 63 6d 70 28 6e 70 2d    if( strcmp(np-
1c990 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20 29 7b 0a  >key,key)==0 ){.
1c9a0 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73        /* An exis
1c9b0 74 69 6e 67 20 65 6e 74 72 79 20 77 69 74 68 20  ting entry with 
1c9c0 74 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20  the same key is 
1c9d0 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20 20 20 20 20  found. */.      
1c9e0 2f 2a 20 46 61 69 6c 20 62 65 63 61 75 73 65 20  /* Fail because 
1c9f0 6f 76 65 72 77 72 69 74 65 20 69 73 20 6e 6f 74  overwrite is not
1ca00 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a 20 20 20 20   allows. */.    
1ca10 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1ca20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e  }.    np = np->n
1ca30 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 78  ext;.  }.  if( x
1ca40 32 61 2d 3e 63 6f 75 6e 74 3e 3d 78 32 61 2d 3e  2a->count>=x2a->
1ca50 73 69 7a 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  size ){.    /* N
1ca60 65 65 64 20 74 6f 20 6d 61 6b 65 20 74 68 65 20  eed to make the 
1ca70 68 61 73 68 20 74 61 62 6c 65 20 62 69 67 67 65  hash table bigge
1ca80 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 73  r */.    int i,s
1ca90 69 7a 65 3b 0a 20 20 20 20 73 74 72 75 63 74 20  ize;.    struct 
1caa0 73 5f 78 32 20 61 72 72 61 79 3b 0a 20 20 20 20  s_x2 array;.    
1cab0 61 72 72 61 79 2e 73 69 7a 65 20 3d 20 73 69 7a  array.size = siz
1cac0 65 20 3d 20 78 32 61 2d 3e 73 69 7a 65 2a 32 3b  e = x2a->size*2;
1cad0 0a 20 20 20 20 61 72 72 61 79 2e 63 6f 75 6e 74  .    array.count
1cae0 20 3d 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20   = x2a->count;. 
1caf0 20 20 20 61 72 72 61 79 2e 74 62 6c 20 3d 20 28     array.tbl = (
1cb00 78 32 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a  x2node*)malloc(.
1cb10 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28 78 32        (sizeof(x2
1cb20 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66 28 78  node) + sizeof(x
1cb30 32 6e 6f 64 65 2a 29 29 2a 73 69 7a 65 20 29 3b  2node*))*size );
1cb40 0a 20 20 20 20 69 66 28 20 61 72 72 61 79 2e 74  .    if( array.t
1cb50 62 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  bl==0 ) return 0
1cb60 3b 20 20 2f 2a 20 46 61 69 6c 20 64 75 65 20 74  ;  /* Fail due t
1cb70 6f 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  o malloc failure
1cb80 20 2a 2f 0a 20 20 20 20 61 72 72 61 79 2e 68 74   */.    array.ht
1cb90 20 3d 20 28 78 32 6e 6f 64 65 2a 2a 29 26 28 61   = (x2node**)&(a
1cba0 72 72 61 79 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b  rray.tbl[size]);
1cbb0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1cbc0 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79  size; i++) array
1cbd0 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  .ht[i] = 0;.    
1cbe0 66 6f 72 28 69 3d 30 3b 20 69 3c 78 32 61 2d 3e  for(i=0; i<x2a->
1cbf0 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  count; i++){.   
1cc00 20 20 20 78 32 6e 6f 64 65 20 2a 6f 6c 64 6e 70     x2node *oldnp
1cc10 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20 20 20 20 20  , *newnp;.      
1cc20 6f 6c 64 6e 70 20 3d 20 26 28 78 32 61 2d 3e 74  oldnp = &(x2a->t
1cc30 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 68 20  bl[i]);.      h 
1cc40 3d 20 73 74 72 68 61 73 68 28 6f 6c 64 6e 70 2d  = strhash(oldnp-
1cc50 3e 6b 65 79 29 20 26 20 28 73 69 7a 65 2d 31 29  >key) & (size-1)
1cc60 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20  ;.      newnp = 
1cc70 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b  &(array.tbl[i]);
1cc80 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79  .      if( array
1cc90 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68  .ht[h] ) array.h
1cca0 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
1ccb0 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20  ewnp->next);.   
1ccc0 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d     newnp->next =
1ccd0 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20   array.ht[h];.  
1cce0 20 20 20 20 6e 65 77 6e 70 2d 3e 6b 65 79 20 3d      newnp->key =
1ccf0 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b 0a 20 20 20   oldnp->key;.   
1cd00 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d     newnp->data =
1cd10 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20   oldnp->data;.  
1cd20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20      newnp->from 
1cd30 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d 29  = &(array.ht[h])
1cd40 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68 74  ;.      array.ht
1cd50 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20  [h] = newnp;.   
1cd60 20 7d 0a 20 20 20 20 66 72 65 65 28 78 32 61 2d   }.    free(x2a-
1cd70 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 32 61 20  >tbl);.    *x2a 
1cd80 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f  = array;.  }.  /
1cd90 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65 77  * Insert the new
1cda0 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70   data */.  h = p
1cdb0 68 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31  h & (x2a->size-1
1cdc0 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 32 61 2d  );.  np = &(x2a-
1cdd0 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f 75 6e 74 2b  >tbl[x2a->count+
1cde0 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b 65 79 20 3d  +]);.  np->key =
1cdf0 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e 64 61 74 61   key;.  np->data
1ce00 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78   = data;.  if( x
1ce10 32 61 2d 3e 68 74 5b 68 5d 20 29 20 78 32 61 2d  2a->ht[h] ) x2a-
1ce20 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  >ht[h]->from = &
1ce30 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70  (np->next);.  np
1ce40 2d 3e 6e 65 78 74 20 3d 20 78 32 61 2d 3e 68 74  ->next = x2a->ht
1ce50 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e 68 74 5b 68  [h];.  x2a->ht[h
1ce60 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72  ] = np;.  np->fr
1ce70 6f 6d 20 3d 20 26 28 78 32 61 2d 3e 68 74 5b 68  om = &(x2a->ht[h
1ce80 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ]);.  return 1;.
1ce90 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
1cea0 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61  ointer to data a
1ceb0 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67  ssigned to the g
1cec0 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72  iven key.  Retur
1ced0 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20  n NULL.** if no 
1cee0 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72  such key. */.str
1cef0 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d 62  uct symbol *Symb
1cf00 6f 6c 5f 66 69 6e 64 28 6b 65 79 29 0a 63 68 61  ol_find(key).cha
1cf10 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20  r *key;.{.  int 
1cf20 68 3b 0a 20 20 78 32 6e 6f 64 65 20 2a 6e 70 3b  h;.  x2node *np;
1cf30 0a 0a 20 20 69 66 28 20 78 32 61 3d 3d 30 20 29  ..  if( x2a==0 )
1cf40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d   return 0;.  h =
1cf50 20 73 74 72 68 61 73 68 28 6b 65 79 29 20 26 20   strhash(key) & 
1cf60 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x2a->size-1);. 
1cf70 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68 5d   np = x2a->ht[h]
1cf80 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
1cf90 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
1cfa0 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30 20  np->key,key)==0 
1cfb0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70 20  ) break;.    np 
1cfc0 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a  = np->next;.  }.
1cfd0 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e 70    return np ? np
1cfe0 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->data : 0;.}../
1cff0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 2d 74  * Return the n-t
1d000 68 20 64 61 74 61 2e 20 20 52 65 74 75 72 6e 20  h data.  Return 
1d010 4e 55 4c 4c 20 69 66 20 6e 20 69 73 20 6f 75 74  NULL if n is out
1d020 20 6f 66 20 72 61 6e 67 65 2e 20 2a 2f 0a 73 74   of range. */.st
1d030 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79 6d  ruct symbol *Sym
1d040 62 6f 6c 5f 4e 74 68 28 6e 29 0a 69 6e 74 20 6e  bol_Nth(n).int n
1d050 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  ;.{.  struct sym
1d060 62 6f 6c 20 2a 64 61 74 61 3b 0a 20 20 69 66 28  bol *data;.  if(
1d070 20 78 32 61 20 26 26 20 6e 3e 30 20 26 26 20 6e   x2a && n>0 && n
1d080 3c 3d 78 32 61 2d 3e 63 6f 75 6e 74 20 29 7b 0a  <=x2a->count ){.
1d090 20 20 20 20 64 61 74 61 20 3d 20 78 32 61 2d 3e      data = x2a->
1d0a0 74 62 6c 5b 6e 2d 31 5d 2e 64 61 74 61 3b 0a 20  tbl[n-1].data;. 
1d0b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 61 74 61   }else{.    data
1d0c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1d0d0 72 6e 20 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 20 52  rn data;.}../* R
1d0e0 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
1d0f0 66 20 74 68 65 20 61 72 72 61 79 20 2a 2f 0a 69  f the array */.i
1d100 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28  nt Symbol_count(
1d110 29 0a 7b 0a 20 20 72 65 74 75 72 6e 20 78 32 61  ).{.  return x2a
1d120 20 3f 20 78 32 61 2d 3e 63 6f 75 6e 74 20 3a 20   ? x2a->count : 
1d130 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20  0;.}../* Return 
1d140 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e  an array of poin
1d150 74 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61  ters to all data
1d160 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   in the table..*
1d170 2a 20 54 68 65 20 61 72 72 61 79 20 69 73 20 6f  * The array is o
1d180 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
1d190 6c 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  loc.  Return NUL
1d1a0 4c 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  L if memory allo
1d1b0 63 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65  cation.** proble
1d1c0 6d 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72  ms, or if the ar
1d1d0 72 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f  ray is empty. */
1d1e0 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
1d1f0 2a 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28  *Symbol_arrayof(
1d200 29 0a 7b 0a 20 20 73 74 72 75 63 74 20 73 79 6d  ).{.  struct sym
1d210 62 6f 6c 20 2a 2a 61 72 72 61 79 3b 0a 20 20 69  bol **array;.  i
1d220 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 69 66 28  nt i,size;.  if(
1d230 20 78 32 61 3d 3d 30 20 29 20 72 65 74 75 72 6e   x2a==0 ) return
1d240 20 30 3b 0a 20 20 73 69 7a 65 20 3d 20 78 32 61   0;.  size = x2a
1d250 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61 72 72 61 79  ->count;.  array
1d260 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62 6f   = (struct symbo
1d270 6c 20 2a 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a  l **)malloc( siz
1d280 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d 62 6f  eof(struct symbo
1d290 6c 20 2a 29 2a 73 69 7a 65 20 29 3b 0a 20 20 69  l *)*size );.  i
1d2a0 66 28 20 61 72 72 61 79 20 29 7b 0a 20 20 20 20  f( array ){.    
1d2b0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
1d2c0 20 69 2b 2b 29 20 61 72 72 61 79 5b 69 5d 20 3d   i++) array[i] =
1d2d0 20 78 32 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74   x2a->tbl[i].dat
1d2e0 61 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  a;.  }.  return 
1d2f0 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d  array;.}../* Com
1d300 70 61 72 65 20 74 77 6f 20 63 6f 6e 66 69 67 75  pare two configu
1d310 72 61 74 69 6f 6e 73 20 2a 2f 0a 69 6e 74 20 43  rations */.int C
1d320 6f 6e 66 69 67 63 6d 70 28 61 2c 62 29 0a 73 74  onfigcmp(a,b).st
1d330 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a  ruct config *a;.
1d340 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 62  struct config *b
1d350 3b 0a 7b 0a 20 20 69 6e 74 20 78 3b 0a 20 20 78  ;.{.  int x;.  x
1d360 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20   = a->rp->index 
1d370 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a  - b->rp->index;.
1d380 20 20 69 66 28 20 78 3d 3d 30 20 29 20 78 20 3d    if( x==0 ) x =
1d390 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74   a->dot - b->dot
1d3a0 3b 0a 20 20 72 65 74 75 72 6e 20 78 3b 0a 7d 0a  ;.  return x;.}.
1d3b0 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  ./* Compare two 
1d3c0 73 74 61 74 65 73 20 2a 2f 0a 50 52 49 56 41 54  states */.PRIVAT
1d3d0 45 20 69 6e 74 20 73 74 61 74 65 63 6d 70 28 61  E int statecmp(a
1d3e0 2c 62 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  ,b).struct confi
1d3f0 67 20 2a 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e  g *a;.struct con
1d400 66 69 67 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20  fig *b;.{.  int 
1d410 72 63 3b 0a 20 20 66 6f 72 28 72 63 3d 30 3b 20  rc;.  for(rc=0; 
1d420 72 63 3d 3d 30 20 26 26 20 61 20 26 26 20 62 3b  rc==0 && a && b;
1d430 20 20 61 3d 61 2d 3e 62 70 2c 20 62 3d 62 2d 3e    a=a->bp, b=b->
1d440 62 70 29 7b 0a 20 20 20 20 72 63 20 3d 20 61 2d  bp){.    rc = a-
1d450 3e 72 70 2d 3e 69 6e 64 65 78 20 2d 20 62 2d 3e  >rp->index - b->
1d460 72 70 2d 3e 69 6e 64 65 78 3b 0a 20 20 20 20 69  rp->index;.    i
1d470 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20  f( rc==0 ) rc = 
1d480 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e 64 6f 74 3b  a->dot - b->dot;
1d490 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 30  .  }.  if( rc==0
1d4a0 20 29 7b 0a 20 20 20 20 69 66 28 20 61 20 29 20   ){.    if( a ) 
1d4b0 72 63 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  rc = 1;.    if( 
1d4c0 62 20 29 20 72 63 20 3d 20 2d 31 3b 0a 20 20 7d  b ) rc = -1;.  }
1d4d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d4e0 0a 2f 2a 20 48 61 73 68 20 61 20 73 74 61 74 65  ./* Hash a state
1d4f0 20 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e 74 20   */.PRIVATE int 
1d500 73 74 61 74 65 68 61 73 68 28 61 29 0a 73 74 72  statehash(a).str
1d510 75 63 74 20 63 6f 6e 66 69 67 20 2a 61 3b 0a 7b  uct config *a;.{
1d520 0a 20 20 69 6e 74 20 68 3d 30 3b 0a 20 20 77 68  .  int h=0;.  wh
1d530 69 6c 65 28 20 61 20 29 7b 0a 20 20 20 20 68 20  ile( a ){.    h 
1d540 3d 20 68 2a 35 37 31 20 2b 20 61 2d 3e 72 70 2d  = h*571 + a->rp-
1d550 3e 69 6e 64 65 78 2a 33 37 20 2b 20 61 2d 3e 64  >index*37 + a->d
1d560 6f 74 3b 0a 20 20 20 20 61 20 3d 20 61 2d 3e 62  ot;.    a = a->b
1d570 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
1d580 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  h;.}../* Allocat
1d590 65 20 61 20 6e 65 77 20 73 74 61 74 65 20 73 74  e a new state st
1d5a0 72 75 63 74 75 72 65 20 2a 2f 0a 73 74 72 75 63  ructure */.struc
1d5b0 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e  t state *State_n
1d5c0 65 77 28 29 0a 7b 0a 20 20 73 74 72 75 63 74 20  ew().{.  struct 
1d5d0 73 74 61 74 65 20 2a 6e 65 77 3b 0a 20 20 6e 65  state *new;.  ne
1d5e0 77 20 3d 20 28 73 74 72 75 63 74 20 73 74 61 74  w = (struct stat
1d5f0 65 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  e *)malloc( size
1d600 6f 66 28 73 74 72 75 63 74 20 73 74 61 74 65 29  of(struct state)
1d610 20 29 3b 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63   );.  MemoryChec
1d620 6b 28 6e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e  k(new);.  return
1d630 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 72   new;.}../* Ther
1d640 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
1d650 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
1d660 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  ng structure for
1d670 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69 61   each.** associa
1d680 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
1d690 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 73 74 72 75  pe "x3"..*/.stru
1d6a0 63 74 20 73 5f 78 33 20 7b 0a 20 20 69 6e 74 20  ct s_x3 {.  int 
1d6b0 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
1d6c0 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65      /* The numbe
1d6d0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73  r of available s
1d6e0 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  lots. */.       
1d6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d700 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65 20     /*   Must be 
1d710 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72 65  a power of 2 gre
1d720 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f 0a  ater than or */.
1d730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 65            /*   e
1d750 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20 69  qual to 1 */.  i
1d760 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20 20  nt count;       
1d770 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d780 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73 6c   of currently sl
1d790 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ots filled */.  
1d7a0 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65 20  struct s_x3node 
1d7b0 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64 61  *tbl;  /* The da
1d7c0 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20 2a  ta stored here *
1d7d0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e  /.  struct s_x3n
1d7e0 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48 61  ode **ht;  /* Ha
1d7f0 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f 6f  sh table for loo
1d800 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54  kups */.};../* T
1d810 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74  here is one inst
1d820 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
1d830 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72 79  ucture for every
1d840 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a 2a   data element.**
1d850 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74 69   in an associati
1d860 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70 65  ve array of type
1d870 20 22 78 33 22 2e 0a 2a 2f 0a 74 79 70 65 64 65   "x3"..*/.typede
1d880 66 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64  f struct s_x3nod
1d890 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  e {.  struct sta
1d8a0 74 65 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  te *data;       
1d8b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1d8c0 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74 72 75  e data */.  stru
1d8d0 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b 20  ct config *key; 
1d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8f0 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a 2f 0a    /* The key */.
1d900 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64    struct s_x3nod
1d910 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65  e *next;   /* Ne
1d920 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74 68  xt entry with th
1d930 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20  e same hash */. 
1d940 20 73 74 72 75 63 74 20 73 5f 78 33 6e 6f 64 65   struct s_x3node
1d950 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65   **from;  /* Pre
1d960 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20  vious link */.} 
1d970 78 33 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72  x3node;../* Ther
1d980 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e  e is only one in
1d990 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61 72  stance of the ar
1d9a0 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74 68  ray, which is th
1d9b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73  e following */.s
1d9c0 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f 78  tatic struct s_x
1d9d0 33 20 2a 78 33 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f  3 *x3a;../* Allo
1d9e0 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f 63  cate a new assoc
1d9f0 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f 0a  iative array */.
1da00 76 6f 69 64 20 53 74 61 74 65 5f 69 6e 69 74 28  void State_init(
1da10 29 7b 0a 20 20 69 66 28 20 78 33 61 20 29 20 72  ){.  if( x3a ) r
1da20 65 74 75 72 6e 3b 0a 20 20 78 33 61 20 3d 20 28  eturn;.  x3a = (
1da30 73 74 72 75 63 74 20 73 5f 78 33 2a 29 6d 61 6c  struct s_x3*)mal
1da40 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75  loc( sizeof(stru
1da50 63 74 20 73 5f 78 33 29 20 29 3b 0a 20 20 69 66  ct s_x3) );.  if
1da60 28 20 78 33 61 20 29 7b 0a 20 20 20 20 78 33 61  ( x3a ){.    x3a
1da70 2d 3e 73 69 7a 65 20 3d 20 31 32 38 3b 0a 20 20  ->size = 128;.  
1da80 20 20 78 33 61 2d 3e 63 6f 75 6e 74 20 3d 20 30    x3a->count = 0
1da90 3b 0a 20 20 20 20 78 33 61 2d 3e 74 62 6c 20 3d  ;.    x3a->tbl =
1daa0 20 28 78 33 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63   (x3node*)malloc
1dab0 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66  ( .      (sizeof
1dac0 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f  (x3node) + sizeo
1dad0 66 28 78 33 6e 6f 64 65 2a 29 29 2a 31 32 38 20  f(x3node*))*128 
1dae0 29 3b 0a 20 20 20 20 69 66 28 20 78 33 61 2d 3e  );.    if( x3a->
1daf0 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tbl==0 ){.      
1db00 66 72 65 65 28 78 33 61 29 3b 0a 20 20 20 20 20  free(x3a);.     
1db10 20 78 33 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65   x3a = 0;.    }e
1db20 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
1db30 3b 0a 20 20 20 20 20 20 78 33 61 2d 3e 68 74 20  ;.      x3a->ht 
1db40 3d 20 28 78 33 6e 6f 64 65 2a 2a 29 26 28 78 33  = (x3node**)&(x3
1db50 61 2d 3e 74 62 6c 5b 31 32 38 5d 29 3b 0a 20 20  a->tbl[128]);.  
1db60 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
1db70 32 38 3b 20 69 2b 2b 29 20 78 33 61 2d 3e 68 74  28; i++) x3a->ht
1db80 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  [i] = 0;.    }. 
1db90 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61   }.}./* Insert a
1dba0 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
1dbb0 20 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74   the array.  Ret
1dbc0 75 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63  urn TRUE if succ
1dbd0 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72  essful..** Prior
1dbe0 20 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73   data with the s
1dbf0 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f  ame key is NOT o
1dc00 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e  verwritten */.in
1dc10 74 20 53 74 61 74 65 5f 69 6e 73 65 72 74 28 64  t State_insert(d
1dc20 61 74 61 2c 6b 65 79 29 0a 73 74 72 75 63 74 20  ata,key).struct 
1dc30 73 74 61 74 65 20 2a 64 61 74 61 3b 0a 73 74 72  state *data;.str
1dc40 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79 3b  uct config *key;
1dc50 0a 7b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b  .{.  x3node *np;
1dc60 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20  .  int h;.  int 
1dc70 70 68 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d  ph;..  if( x3a==
1dc80 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1dc90 70 68 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b  ph = statehash(k
1dca0 65 79 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20  ey);.  h = ph & 
1dcb0 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x3a->size-1);. 
1dcc0 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d   np = x3a->ht[h]
1dcd0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
1dce0 0a 20 20 20 20 69 66 28 20 73 74 61 74 65 63 6d  .    if( statecm
1dcf0 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d  p(np->key,key)==
1dd00 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  0 ){.      /* An
1dd10 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
1dd20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
1dd30 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20  y is found. */. 
1dd40 20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63       /* Fail bec
1dd50 61 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69  ause overwrite i
1dd60 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f  s not allows. */
1dd70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1dd80 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20  .    }.    np = 
1dd90 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20  np->next;.  }.  
1dda0 69 66 28 20 78 33 61 2d 3e 63 6f 75 6e 74 3e 3d  if( x3a->count>=
1ddb0 78 33 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20  x3a->size ){.   
1ddc0 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65   /* Need to make
1ddd0 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
1dde0 62 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e  bigger */.    in
1ddf0 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74  t i,size;.    st
1de00 72 75 63 74 20 73 5f 78 33 20 61 72 72 61 79 3b  ruct s_x3 array;
1de10 0a 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20  .    array.size 
1de20 3d 20 73 69 7a 65 20 3d 20 78 33 61 2d 3e 73 69  = size = x3a->si
1de30 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e  ze*2;.    array.
1de40 63 6f 75 6e 74 20 3d 20 78 33 61 2d 3e 63 6f 75  count = x3a->cou
1de50 6e 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62  nt;.    array.tb
1de60 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 6d 61 6c  l = (x3node*)mal
1de70 6c 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65  loc(.      (size
1de80 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x3node) + siz
1de90 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 2a 73 69  eof(x3node*))*si
1dea0 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72  ze );.    if( ar
1deb0 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74  ray.tbl==0 ) ret
1dec0 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20  urn 0;  /* Fail 
1ded0 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61  due to malloc fa
1dee0 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72  ilure */.    arr
1def0 61 79 2e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a  ay.ht = (x3node*
1df00 2a 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69  *)&(array.tbl[si
1df10 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  ze]);.    for(i=
1df20 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20  0; i<size; i++) 
1df30 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b  array.ht[i] = 0;
1df40 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
1df50 78 33 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29  x3a->count; i++)
1df60 7b 0a 20 20 20 20 20 20 78 33 6e 6f 64 65 20 2a  {.      x3node *
1df70 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20  oldnp, *newnp;. 
1df80 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78       oldnp = &(x
1df90 33 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  3a->tbl[i]);.   
1dfa0 20 20 20 68 20 3d 20 73 74 61 74 65 68 61 73 68     h = statehash
1dfb0 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28  (oldnp->key) & (
1dfc0 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e  size-1);.      n
1dfd0 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79 2e 74  ewnp = &(array.t
1dfe0 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  bl[i]);.      if
1dff0 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 29 20  ( array.ht[h] ) 
1e000 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f  array.ht[h]->fro
1e010 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78  m = &(newnp->nex
1e020 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  t);.      newnp-
1e030 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e 68 74  >next = array.ht
1e040 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  [h];.      newnp
1e050 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b  ->key = oldnp->k
1e060 65 79 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d  ey;.      newnp-
1e070 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64  >data = oldnp->d
1e080 61 74 61 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70  ata;.      newnp
1e090 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72 72 61 79  ->from = &(array
1e0a0 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61  .ht[h]);.      a
1e0b0 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77  rray.ht[h] = new
1e0c0 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72  np;.    }.    fr
1e0d0 65 65 28 78 33 61 2d 3e 74 62 6c 29 3b 0a 20 20  ee(x3a->tbl);.  
1e0e0 20 20 2a 78 33 61 20 3d 20 61 72 72 61 79 3b 0a    *x3a = array;.
1e0f0 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20    }.  /* Insert 
1e100 74 68 65 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a  the new data */.
1e110 20 20 68 20 3d 20 70 68 20 26 20 28 78 33 61 2d    h = ph & (x3a-
1e120 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d  >size-1);.  np =
1e130 20 26 28 78 33 61 2d 3e 74 62 6c 5b 78 33 61 2d   &(x3a->tbl[x3a-
1e140 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70  >count++]);.  np
1e150 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e  ->key = key;.  n
1e160 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61 3b 0a  p->data = data;.
1e170 20 20 69 66 28 20 78 33 61 2d 3e 68 74 5b 68 5d    if( x3a->ht[h]
1e180 20 29 20 78 33 61 2d 3e 68 74 5b 68 5d 2d 3e 66   ) x3a->ht[h]->f
1e190 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74  rom = &(np->next
1e1a0 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20  );.  np->next = 
1e1b0 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 33  x3a->ht[h];.  x3
1e1c0 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20  a->ht[h] = np;. 
1e1d0 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 33   np->from = &(x3
1e1e0 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74  a->ht[h]);.  ret
1e1f0 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  urn 1;.}../* Ret
1e200 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1e210 20 64 61 74 61 20 61 73 73 69 67 6e 65 64 20 74   data assigned t
1e220 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65 79 2e  o the given key.
1e230 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a    Return NULL.**
1e240 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e   if no such key.
1e250 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74 65   */.struct state
1e260 20 2a 53 74 61 74 65 5f 66 69 6e 64 28 6b 65 79   *State_find(key
1e270 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ).struct config 
1e280 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b  *key;.{.  int h;
1e290 0a 20 20 78 33 6e 6f 64 65 20 2a 6e 70 3b 0a 0a  .  x3node *np;..
1e2a0 20 20 69 66 28 20 78 33 61 3d 3d 30 20 29 20 72    if( x3a==0 ) r
1e2b0 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 73  eturn 0;.  h = s
1e2c0 74 61 74 65 68 61 73 68 28 6b 65 79 29 20 26 20  tatehash(key) & 
1e2d0 28 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x3a->size-1);. 
1e2e0 20 6e 70 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d   np = x3a->ht[h]
1e2f0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
1e300 0a 20 20 20 20 69 66 28 20 73 74 61 74 65 63 6d  .    if( statecm
1e310 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d  p(np->key,key)==
1e320 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e  0 ) break;.    n
1e330 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
1e340 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20  }.  return np ? 
1e350 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a  np->data : 0;.}.
1e360 0a 2f 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 72  ./* Return an ar
1e370 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ray of pointers 
1e380 74 6f 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 74  to all data in t
1e390 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 54 68 65  he table..** The
1e3a0 20 61 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e   array is obtain
1e3b0 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 2e 20  ed from malloc. 
1e3c0 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   Return NULL if 
1e3d0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1e3e0 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d 73 2c 20 6f  n.** problems, o
1e3f0 72 20 69 66 20 74 68 65 20 61 72 72 61 79 20 69  r if the array i
1e400 73 20 65 6d 70 74 79 2e 20 2a 2f 0a 73 74 72 75  s empty. */.stru
1e410 63 74 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65  ct state **State
1e420 5f 61 72 72 61 79 6f 66 28 29 0a 7b 0a 20 20 73  _arrayof().{.  s
1e430 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 61 72  truct state **ar
1e440 72 61 79 3b 0a 20 20 69 6e 74 20 69 2c 73 69 7a  ray;.  int i,siz
1e450 65 3b 0a 20 20 69 66 28 20 78 33 61 3d 3d 30 20  e;.  if( x3a==0 
1e460 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 69  ) return 0;.  si
1e470 7a 65 20 3d 20 78 33 61 2d 3e 63 6f 75 6e 74 3b  ze = x3a->count;
1e480 0a 20 20 61 72 72 61 79 20 3d 20 28 73 74 72 75  .  array = (stru
1e490 63 74 20 73 74 61 74 65 20 2a 2a 29 6d 61 6c 6c  ct state **)mall
1e4a0 6f 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63  oc( sizeof(struc
1e4b0 74 20 73 74 61 74 65 20 2a 29 2a 73 69 7a 65 20  t state *)*size 
1e4c0 29 3b 0a 20 20 69 66 28 20 61 72 72 61 79 20 29  );.  if( array )
1e4d0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
1e4e0 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61  <size; i++) arra
1e4f0 79 5b 69 5d 20 3d 20 78 33 61 2d 3e 74 62 6c 5b  y[i] = x3a->tbl[
1e500 69 5d 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72  i].data;.  }.  r
1e510 65 74 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a  eturn array;.}..
1e520 2f 2a 20 48 61 73 68 20 61 20 63 6f 6e 66 69 67  /* Hash a config
1e530 75 72 61 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41  uration */.PRIVA
1e540 54 45 20 69 6e 74 20 63 6f 6e 66 69 67 68 61 73  TE int confighas
1e550 68 28 61 29 0a 73 74 72 75 63 74 20 63 6f 6e 66  h(a).struct conf
1e560 69 67 20 2a 61 3b 0a 7b 0a 20 20 69 6e 74 20 68  ig *a;.{.  int h
1e570 3d 30 3b 0a 20 20 68 20 3d 20 68 2a 35 37 31 20  =0;.  h = h*571 
1e580 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 2a 33  + a->rp->index*3
1e590 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a 20 20 72 65  7 + a->dot;.  re
1e5a0 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 54 68  turn h;.}../* Th
1e5b0 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61  ere is one insta
1e5c0 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
1e5d0 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66  wing structure f
1e5e0 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63  or each.** assoc
1e5f0 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
1e600 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 73 74  type "x4"..*/.st
1e610 72 75 63 74 20 73 5f 78 34 20 7b 0a 20 20 69 6e  ruct s_x4 {.  in
1e620 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20  t size;         
1e630 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d        /* The num
1e640 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  ber of available
1e650 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20   slots. */.     
1e660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e670 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62       /*   Must b
1e680 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67  e a power of 2 g
1e690 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a  reater than or *
1e6a0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
1e6b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
1e6c0 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20   equal to 1 */. 
1e6d0 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20   int count;     
1e6e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1e6f0 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20  er of currently 
1e700 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a  slots filled */.
1e710 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64    struct s_x4nod
1e720 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20  e *tbl;  /* The 
1e730 64 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65  data stored here
1e740 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
1e750 34 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20  4node **ht;  /* 
1e760 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c  Hash table for l
1e770 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ookups */.};../*
1e780 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
1e790 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
1e7a0 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65  tructure for eve
1e7b0 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a  ry data element.
1e7c0 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61  ** in an associa
1e7d0 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79  tive array of ty
1e7e0 70 65 20 22 78 34 22 2e 0a 2a 2f 0a 74 79 70 65  pe "x4"..*/.type
1e7f0 64 65 66 20 73 74 72 75 63 74 20 73 5f 78 34 6e  def struct s_x4n
1e800 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 63  ode {.  struct c
1e810 6f 6e 66 69 67 20 2a 64 61 74 61 3b 20 20 20 20  onfig *data;    
1e820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e830 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73   The data */.  s
1e840 74 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a  truct s_x4node *
1e850 6e 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20  next;   /* Next 
1e860 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73  entry with the s
1e870 61 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74  ame hash */.  st
1e880 72 75 63 74 20 73 5f 78 34 6e 6f 64 65 20 2a 2a  ruct s_x4node **
1e890 66 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f  from;  /* Previo
1e8a0 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 34 6e  us link */.} x4n
1e8b0 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  ode;../* There i
1e8c0 73 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61  s only one insta
1e8d0 6e 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79  nce of the array
1e8e0 2c 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66  , which is the f
1e8f0 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74  ollowing */.stat
1e900 69 63 20 73 74 72 75 63 74 20 73 5f 78 34 20 2a  ic struct s_x4 *
1e910 78 34 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74  x4a;../* Allocat
1e920 65 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74  e a new associat
1e930 69 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69  ive array */.voi
1e940 64 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e  d Configtable_in
1e950 69 74 28 29 7b 0a 20 20 69 66 28 20 78 34 61 20  it(){.  if( x4a 
1e960 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 34 61 20  ) return;.  x4a 
1e970 3d 20 28 73 74 72 75 63 74 20 73 5f 78 34 2a 29  = (struct s_x4*)
1e980 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
1e990 74 72 75 63 74 20 73 5f 78 34 29 20 29 3b 0a 20  truct s_x4) );. 
1e9a0 20 69 66 28 20 78 34 61 20 29 7b 0a 20 20 20 20   if( x4a ){.    
1e9b0 78 34 61 2d 3e 73 69 7a 65 20 3d 20 36 34 3b 0a  x4a->size = 64;.
1e9c0 20 20 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d      x4a->count =
1e9d0 20 30 3b 0a 20 20 20 20 78 34 61 2d 3e 74 62 6c   0;.    x4a->tbl
1e9e0 20 3d 20 28 78 34 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x4node*)mall
1e9f0 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69 7a 65  oc( .      (size
1ea00 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20 73 69 7a  of(x4node) + siz
1ea10 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29 2a 36 34  eof(x4node*))*64
1ea20 20 29 3b 0a 20 20 20 20 69 66 28 20 78 34 61 2d   );.    if( x4a-
1ea30 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >tbl==0 ){.     
1ea40 20 66 72 65 65 28 78 34 61 29 3b 0a 20 20 20 20   free(x4a);.    
1ea50 20 20 78 34 61 20 3d 20 30 3b 0a 20 20 20 20 7d    x4a = 0;.    }
1ea60 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
1ea70 69 3b 0a 20 20 20 20 20 20 78 34 61 2d 3e 68 74  i;.      x4a->ht
1ea80 20 3d 20 28 78 34 6e 6f 64 65 2a 2a 29 26 28 78   = (x4node**)&(x
1ea90 34 61 2d 3e 74 62 6c 5b 36 34 5d 29 3b 0a 20 20  4a->tbl[64]);.  
1eaa0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 36      for(i=0; i<6
1eab0 34 3b 20 69 2b 2b 29 20 78 34 61 2d 3e 68 74 5b  4; i++) x4a->ht[
1eac0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  i] = 0;.    }.  
1ead0 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74 20 61 20  }.}./* Insert a 
1eae0 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20  new record into 
1eaf0 74 68 65 20 61 72 72 61 79 2e 20 20 52 65 74 75  the array.  Retu
1eb00 72 6e 20 54 52 55 45 20 69 66 20 73 75 63 63 65  rn TRUE if succe
1eb10 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69 6f 72 20  ssful..** Prior 
1eb20 64 61 74 61 20 77 69 74 68 20 74 68 65 20 73 61  data with the sa
1eb30 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54 20 6f 76  me key is NOT ov
1eb40 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a 69 6e 74  erwritten */.int
1eb50 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73   Configtable_ins
1eb60 65 72 74 28 64 61 74 61 29 0a 73 74 72 75 63 74  ert(data).struct
1eb70 20 63 6f 6e 66 69 67 20 2a 64 61 74 61 3b 0a 7b   config *data;.{
1eb80 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 20  .  x4node *np;. 
1eb90 20 69 6e 74 20 68 3b 0a 20 20 69 6e 74 20 70 68   int h;.  int ph
1eba0 3b 0a 0a 20 20 69 66 28 20 78 34 61 3d 3d 30 20  ;..  if( x4a==0 
1ebb0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 68  ) return 0;.  ph
1ebc0 20 3d 20 63 6f 6e 66 69 67 68 61 73 68 28 64 61   = confighash(da
1ebd0 74 61 29 3b 0a 20 20 68 20 3d 20 70 68 20 26 20  ta);.  h = ph & 
1ebe0 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20  (x4a->size-1);. 
1ebf0 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d   np = x4a->ht[h]
1ec00 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29 7b  ;.  while( np ){
1ec10 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69 67 63  .    if( Configc
1ec20 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61  mp(np->data,data
1ec30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
1ec40 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   An existing ent
1ec50 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
1ec60 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a   key is found. *
1ec70 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20  /.      /* Fail 
1ec80 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74  because overwrit
1ec90 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e  e is not allows.
1eca0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1ecb0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70   0;.    }.    np
1ecc0 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
1ecd0 0a 20 20 69 66 28 20 78 34 61 2d 3e 63 6f 75 6e  .  if( x4a->coun
1ece0 74 3e 3d 78 34 61 2d 3e 73 69 7a 65 20 29 7b 0a  t>=x4a->size ){.
1ecf0 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d      /* Need to m
1ed00 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62  ake the hash tab
1ed10 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20  le bigger */.   
1ed20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20   int i,size;.   
1ed30 20 73 74 72 75 63 74 20 73 5f 78 34 20 61 72 72   struct s_x4 arr
1ed40 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69  ay;.    array.si
1ed50 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 34 61 2d  ze = size = x4a-
1ed60 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72  >size*2;.    arr
1ed70 61 79 2e 63 6f 75 6e 74 20 3d 20 78 34 61 2d 3e  ay.count = x4a->
1ed80 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79  count;.    array
1ed90 2e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29  .tbl = (x4node*)
1eda0 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73  malloc(.      (s
1edb0 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b 20  izeof(x4node) + 
1edc0 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29 29  sizeof(x4node*))
1edd0 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28  *size );.    if(
1ede0 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20   array.tbl==0 ) 
1edf0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61  return 0;  /* Fa
1ee00 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63  il due to malloc
1ee10 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20   failure */.    
1ee20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 34 6e 6f  array.ht = (x4no
1ee30 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c  de**)&(array.tbl
1ee40 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72  [size]);.    for
1ee50 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b  (i=0; i<size; i+
1ee60 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d  +) array.ht[i] =
1ee70 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
1ee80 20 69 3c 78 34 61 2d 3e 63 6f 75 6e 74 3b 20 69   i<x4a->count; i
1ee90 2b 2b 29 7b 0a 20 20 20 20 20 20 78 34 6e 6f 64  ++){.      x4nod
1eea0 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70  e *oldnp, *newnp
1eeb0 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20  ;.      oldnp = 
1eec0 26 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a  &(x4a->tbl[i]);.
1eed0 20 20 20 20 20 20 68 20 3d 20 63 6f 6e 66 69 67        h = config
1eee0 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61  hash(oldnp->data
1eef0 29 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20  ) & (size-1);.  
1ef00 20 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72      newnp = &(ar
1ef10 72 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20  ray.tbl[i]);.   
1ef20 20 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b     if( array.ht[
1ef30 68 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d  h] ) array.ht[h]
1ef40 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70  ->from = &(newnp
1ef50 2d 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e  ->next);.      n
1ef60 65 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72  ewnp->next = arr
1ef70 61 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20  ay.ht[h];.      
1ef80 6e 65 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c  newnp->data = ol
1ef90 64 6e 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20  dnp->data;.     
1efa0 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26   newnp->from = &
1efb0 28 61 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20  (array.ht[h]);. 
1efc0 20 20 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d       array.ht[h]
1efd0 20 3d 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a   = newnp;.    }.
1efe0 20 20 20 20 66 72 65 65 28 78 34 61 2d 3e 74 62      free(x4a->tb
1eff0 6c 29 3b 0a 20 20 20 20 2a 78 34 61 20 3d 20 61  l);.    *x4a = a
1f000 72 72 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49  rray;.  }.  /* I
1f010 6e 73 65 72 74 20 74 68 65 20 6e 65 77 20 64 61  nsert the new da
1f020 74 61 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26  ta */.  h = ph &
1f030 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x4a->size-1);.
1f040 20 20 6e 70 20 3d 20 26 28 78 34 61 2d 3e 74 62    np = &(x4a->tb
1f050 6c 5b 78 34 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29  l[x4a->count++])
1f060 3b 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64  ;.  np->data = d
1f070 61 74 61 3b 0a 20 20 69 66 28 20 78 34 61 2d 3e  ata;.  if( x4a->
1f080 68 74 5b 68 5d 20 29 20 78 34 61 2d 3e 68 74 5b  ht[h] ) x4a->ht[
1f090 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d  h]->from = &(np-
1f0a0 3e 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65  >next);.  np->ne
1f0b0 78 74 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b  xt = x4a->ht[h];
1f0c0 0a 20 20 78 34 61 2d 3e 68 74 5b 68 5d 20 3d 20  .  x4a->ht[h] = 
1f0d0 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d  np;.  np->from =
1f0e0 20 26 28 78 34 61 2d 3e 68 74 5b 68 5d 29 3b 0a   &(x4a->ht[h]);.
1f0f0 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
1f100 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1f110 65 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67  er to data assig
1f120 6e 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e  ned to the given
1f130 20 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55   key.  Return NU
1f140 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68  LL.** if no such
1f150 20 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20   key. */.struct 
1f160 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 74 61  config *Configta
1f170 62 6c 65 5f 66 69 6e 64 28 6b 65 79 29 0a 73 74  ble_find(key).st
1f180 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b 65 79  ruct config *key
1f190 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 78  ;.{.  int h;.  x
1f1a0 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a 20 20 69 66  4node *np;..  if
1f1b0 28 20 78 34 61 3d 3d 30 20 29 20 72 65 74 75 72  ( x4a==0 ) retur
1f1c0 6e 20 30 3b 0a 20 20 68 20 3d 20 63 6f 6e 66 69  n 0;.  h = confi
1f1d0 67 68 61 73 68 28 6b 65 79 29 20 26 20 28 78 34  ghash(key) & (x4
1f1e0 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e 70  a->size-1);.  np
1f1f0 20 3d 20 78 34 61 2d 3e 68 74 5b 68 5d 3b 0a 20   = x4a->ht[h];. 
1f200 20 77 68 69 6c 65 28 20 6e 70 20 29 7b 0a 20 20   while( np ){.  
1f210 20 20 69 66 28 20 43 6f 6e 66 69 67 63 6d 70 28    if( Configcmp(
1f220 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29 3d 3d 30  np->data,key)==0
1f230 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e 70   ) break;.    np
1f240 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
1f250 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20 6e  .  return np ? n
1f260 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a 0a  p->data : 0;.}..
1f270 2f 2a 20 52 65 6d 6f 76 65 20 61 6c 6c 20 64 61  /* Remove all da
1f280 74 61 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  ta from the tabl
1f290 65 2e 20 20 50 61 73 73 20 65 61 63 68 20 64 61  e.  Pass each da
1f2a0 74 61 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  ta to the functi
1f2b0 6f 6e 20 22 66 22 0a 2a 2a 20 61 73 20 69 74 20  on "f".** as it 
1f2c0 69 73 20 72 65 6d 6f 76 65 64 2e 20 20 28 22 66  is removed.  ("f
1f2d0 22 20 6d 61 79 20 62 65 20 6e 75 6c 6c 20 74 6f  " may be null to
1f2e0 20 61 76 6f 69 64 20 74 68 69 73 20 73 74 65 70   avoid this step
1f2f0 2e 29 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69  .) */.void Confi
1f300 67 74 61 62 6c 65 5f 63 6c 65 61 72 28 66 29 0a  gtable_clear(f).
1f310 69 6e 74 28 2a 66 29 28 2f 2a 20 73 74 72 75 63  int(*f)(/* struc
1f320 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a  t config * */);.
1f330 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
1f340 20 78 34 61 3d 3d 30 20 7c 7c 20 78 34 61 2d 3e   x4a==0 || x4a->
1f350 63 6f 75 6e 74 3d 3d 30 20 29 20 72 65 74 75 72  count==0 ) retur
1f360 6e 3b 0a 20 20 69 66 28 20 66 20 29 20 66 6f 72  n;.  if( f ) for
1f370 28 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75  (i=0; i<x4a->cou
1f380 6e 74 3b 20 69 2b 2b 29 20 28 2a 66 29 28 78 34  nt; i++) (*f)(x4
1f390 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61 74 61 29 3b  a->tbl[i].data);
1f3a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34  .  for(i=0; i<x4
1f3b0 61 2d 3e 73 69 7a 65 3b 20 69 2b 2b 29 20 78 34  a->size; i++) x4
1f3c0 61 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20  a->ht[i] = 0;.  
1f3d0 78 34 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a  x4a->count = 0;.
1f3e0 20 20 72 65 74 75 72 6e 3b 0a 7d 0a                return;.}.