/ Hex Artifact Content
Login

Artifact f4fb7226c930435e994441a470ed60a7c540f518:


0000: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  /*.** This file 
0010: 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 6f 75  contains all sou
0020: 72 63 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  rces (including 
0030: 68 65 61 64 65 72 73 29 20 74 6f 20 74 68 65 20  headers) to the 
0040: 4c 45 4d 4f 4e 0a 2a 2a 20 4c 41 4c 52 28 31 29  LEMON.** LALR(1)
0050: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0060: 72 2e 20 20 54 68 65 20 73 6f 75 72 63 65 73 20  r.  The sources 
0070: 68 61 76 65 20 62 65 65 6e 20 63 6f 6d 62 69 6e  have been combin
0080: 65 64 20 69 6e 74 6f 20 61 0a 2a 2a 20 73 69 6e  ed into a.** sin
0090: 67 6c 65 20 66 69 6c 65 20 74 6f 20 6d 61 6b 65  gle file to make
00a0: 20 69 74 20 65 61 73 79 20 74 6f 20 69 6e 63 6c   it easy to incl
00b0: 75 64 65 20 4c 45 4d 4f 4e 20 69 6e 20 74 68 65  ude LEMON in the
00c0: 20 73 6f 75 72 63 65 20 74 72 65 65 0a 2a 2a 20   source tree.** 
00d0: 61 6e 64 20 4d 61 6b 65 66 69 6c 65 20 6f 66 20  and Makefile of 
00e0: 61 6e 6f 74 68 65 72 20 70 72 6f 67 72 61 6d 2e  another program.
00f0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0100: 72 20 6f 66 20 74 68 69 73 20 70 72 6f 67 72 61  r of this progra
0110: 6d 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  m disclaims copy
0120: 72 69 67 68 74 2e 0a 2a 2f 0a 23 69 6e 63 6c 75  right..*/.#inclu
0130: 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e  de <stdio.h>.#in
0140: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0150: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0160: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63  g.h>.#include <c
0170: 74 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  type.h>.#include
0180: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 0a 65 78 74   <stdlib.h>..ext
0190: 65 72 6e 20 76 6f 69 64 20 71 73 6f 72 74 28 29  ern void qsort()
01a0: 3b 0a 65 78 74 65 72 6e 20 64 6f 75 62 6c 65 20  ;.extern double 
01b0: 73 74 72 74 6f 64 28 29 3b 0a 65 78 74 65 72 6e  strtod();.extern
01c0: 20 6c 6f 6e 67 20 73 74 72 74 6f 6c 28 29 3b 0a   long strtol();.
01d0: 65 78 74 65 72 6e 20 76 6f 69 64 20 66 72 65 65  extern void free
01e0: 28 29 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 61  ();.extern int a
01f0: 63 63 65 73 73 28 29 3b 0a 65 78 74 65 72 6e 20  ccess();.extern 
0200: 69 6e 74 20 61 74 6f 69 28 29 3b 0a 0a 23 69 66  int atoi();..#if
0210: 6e 64 65 66 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23  ndef __WIN32__.#
0220: 20 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 57     if defined(_W
0230: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
0240: 28 57 49 4e 33 32 29 0a 23 09 64 65 66 69 6e 65  (WIN32).#.define
0250: 20 5f 5f 57 49 4e 33 32 5f 5f 0a 23 20 20 20 65   __WIN32__.#   e
0260: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  ndif.#endif../* 
0270: 23 64 65 66 69 6e 65 20 50 52 49 56 41 54 45 20  #define PRIVATE 
0280: 73 74 61 74 69 63 20 2a 2f 0a 23 64 65 66 69 6e  static */.#defin
0290: 65 20 50 52 49 56 41 54 45 0a 0a 23 69 66 64 65  e PRIVATE..#ifde
02a0: 66 20 54 45 53 54 0a 23 64 65 66 69 6e 65 20 4d  f TEST.#define M
02b0: 41 58 52 48 53 20 35 20 20 20 20 20 20 20 2f 2a  AXRHS 5       /*
02c0: 20 53 65 74 20 6c 6f 77 20 74 6f 20 65 78 65 72   Set low to exer
02d0: 63 69 73 65 20 65 78 63 65 70 74 69 6f 6e 20 63  cise exception c
02e0: 6f 64 65 20 2a 2f 0a 23 65 6c 73 65 0a 23 64 65  ode */.#else.#de
02f0: 66 69 6e 65 20 4d 41 58 52 48 53 20 31 30 30 30  fine MAXRHS 1000
0300: 0a 23 65 6e 64 69 66 0a 0a 63 68 61 72 20 2a 6d  .#endif..char *m
0310: 73 6f 72 74 28 29 3b 0a 65 78 74 65 72 6e 20 76  sort();.extern v
0320: 6f 69 64 20 2a 6d 61 6c 6c 6f 63 28 29 3b 0a 0a  oid *malloc();..
0330: 2f 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74  /******** From t
0340: 68 65 20 66 69 6c 65 20 22 61 63 74 69 6f 6e 2e  he file "action.
0350: 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  h" *************
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63 74  ********/.struct
0380: 20 61 63 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f   action *Action_
0390: 6e 65 77 28 29 3b 0a 73 74 72 75 63 74 20 61 63  new();.struct ac
03a0: 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72  tion *Action_sor
03b0: 74 28 29 3b 0a 76 6f 69 64 20 41 63 74 69 6f 6e  t();.void Action
03c0: 5f 61 64 64 28 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a  _add();../******
03d0: 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
03e0: 65 20 22 61 73 73 65 72 74 2e 68 22 20 2a 2a 2a  e "assert.h" ***
03f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0410: 2a 2f 0a 76 6f 69 64 20 6d 79 61 73 73 65 72 74  */.void myassert
0420: 28 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ();.#ifndef NDEB
0430: 55 47 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  UG.#  define ass
0440: 65 72 74 28 58 29 20 69 66 28 21 28 58 29 29 6d  ert(X) if(!(X))m
0450: 79 61 73 73 65 72 74 28 5f 5f 46 49 4c 45 5f 5f  yassert(__FILE__
0460: 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 23 65 6c 73 65  ,__LINE__).#else
0470: 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73 65 72  .#  define asser
0480: 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 2a  t(X).#endif../**
0490: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
04a0: 65 20 66 69 6c 65 20 22 62 75 69 6c 64 2e 68 22  e file "build.h"
04b0: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
04c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
04d0: 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64  *****/.void Find
04e0: 52 75 6c 65 50 72 65 63 65 64 65 6e 63 65 73 28  RulePrecedences(
04f0: 29 3b 0a 76 6f 69 64 20 46 69 6e 64 46 69 72 73  );.void FindFirs
0500: 74 53 65 74 73 28 29 3b 0a 76 6f 69 64 20 46 69  tSets();.void Fi
0510: 6e 64 53 74 61 74 65 73 28 29 3b 0a 76 6f 69 64  ndStates();.void
0520: 20 46 69 6e 64 4c 69 6e 6b 73 28 29 3b 0a 76 6f   FindLinks();.vo
0530: 69 64 20 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74  id FindFollowSet
0540: 73 28 29 3b 0a 76 6f 69 64 20 46 69 6e 64 41 63  s();.void FindAc
0550: 74 69 6f 6e 73 28 29 3b 0a 0a 2f 2a 2a 2a 2a 2a  tions();../*****
0560: 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69  **** From the fi
0570: 6c 65 20 22 63 6f 6e 66 69 67 6c 69 73 74 2e 68  le "configlist.h
0580: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
0590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
05a0: 2a 2a 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67  ***/.void Config
05b0: 6c 69 73 74 5f 69 6e 69 74 28 2f 2a 20 76 6f 69  list_init(/* voi
05c0: 64 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 63 6f  d */);.struct co
05d0: 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74  nfig *Configlist
05e0: 5f 61 64 64 28 2f 2a 20 73 74 72 75 63 74 20 72  _add(/* struct r
05f0: 75 6c 65 20 2a 2c 20 69 6e 74 20 2a 2f 29 3b 0a  ule *, int */);.
0600: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 43  struct config *C
0610: 6f 6e 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73  onfiglist_addbas
0620: 69 73 28 2f 2a 20 73 74 72 75 63 74 20 72 75 6c  is(/* struct rul
0630: 65 20 2a 2c 20 69 6e 74 20 2a 2f 29 3b 0a 76 6f  e *, int */);.vo
0640: 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c  id Configlist_cl
0650: 6f 73 75 72 65 28 2f 2a 20 76 6f 69 64 20 2a 2f  osure(/* void */
0660: 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  );.void Configli
0670: 73 74 5f 73 6f 72 74 28 2f 2a 20 76 6f 69 64 20  st_sort(/* void 
0680: 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67  */);.void Config
0690: 6c 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28 2f  list_sortbasis(/
06a0: 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 73 74 72 75  * void */);.stru
06b0: 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
06c0: 67 6c 69 73 74 5f 72 65 74 75 72 6e 28 2f 2a 20  glist_return(/* 
06d0: 76 6f 69 64 20 2a 2f 29 3b 0a 73 74 72 75 63 74  void */);.struct
06e0: 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67 6c   config *Configl
06f0: 69 73 74 5f 62 61 73 69 73 28 2f 2a 20 76 6f 69  ist_basis(/* voi
0700: 64 20 2a 2f 29 3b 0a 76 6f 69 64 20 43 6f 6e 66  d */);.void Conf
0710: 69 67 6c 69 73 74 5f 65 61 74 28 2f 2a 20 73 74  iglist_eat(/* st
0720: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f  ruct config * */
0730: 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  );.void Configli
0740: 73 74 5f 72 65 73 65 74 28 2f 2a 20 76 6f 69 64  st_reset(/* void
0750: 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   */);../********
0760: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
0770: 22 65 72 72 6f 72 2e 68 22 20 2a 2a 2a 2a 2a 2a  "error.h" ******
0780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0790: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
07a0: 2a 2f 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67  */.void ErrorMsg
07b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69  (const char *, i
07c0: 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c  nt,const char *,
07d0: 20 2e 2e 2e 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 20   ...);../****** 
07e0: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 6f  From the file "o
07f0: 70 74 69 6f 6e 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a  ption.h" *******
0800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0820: 2a 2a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 6f 70  ***/.struct s_op
0830: 74 69 6f 6e 73 20 7b 0a 20 20 65 6e 75 6d 20 7b  tions {.  enum {
0840: 20 4f 50 54 5f 46 4c 41 47 3d 31 2c 20 20 4f 50   OPT_FLAG=1,  OP
0850: 54 5f 49 4e 54 2c 20 20 4f 50 54 5f 44 42 4c 2c  T_INT,  OPT_DBL,
0860: 20 20 4f 50 54 5f 53 54 52 2c 0a 20 20 20 20 20    OPT_STR,.     
0870: 20 20 20 20 4f 50 54 5f 46 46 4c 41 47 2c 20 4f      OPT_FFLAG, O
0880: 50 54 5f 46 49 4e 54 2c 20 4f 50 54 5f 46 44 42  PT_FINT, OPT_FDB
0890: 4c 2c 20 4f 50 54 5f 46 53 54 52 7d 20 74 79 70  L, OPT_FSTR} typ
08a0: 65 3b 0a 20 20 63 68 61 72 20 2a 6c 61 62 65 6c  e;.  char *label
08b0: 3b 0a 20 20 63 68 61 72 20 2a 61 72 67 3b 0a 20  ;.  char *arg;. 
08c0: 20 63 68 61 72 20 2a 6d 65 73 73 61 67 65 3b 0a   char *message;.
08d0: 7d 3b 0a 69 6e 74 20 20 20 20 4f 70 74 49 6e 69  };.int    OptIni
08e0: 74 28 2f 2a 20 63 68 61 72 2a 2a 2c 73 74 72 75  t(/* char**,stru
08f0: 63 74 20 73 5f 6f 70 74 69 6f 6e 73 2a 2c 46 49  ct s_options*,FI
0900: 4c 45 2a 20 2a 2f 29 3b 0a 69 6e 74 20 20 20 20  LE* */);.int    
0910: 4f 70 74 4e 41 72 67 73 28 2f 2a 20 76 6f 69 64  OptNArgs(/* void
0920: 20 2a 2f 29 3b 0a 63 68 61 72 20 20 2a 4f 70 74   */);.char  *Opt
0930: 41 72 67 28 2f 2a 20 69 6e 74 20 2a 2f 29 3b 0a  Arg(/* int */);.
0940: 76 6f 69 64 20 20 20 4f 70 74 45 72 72 28 2f 2a  void   OptErr(/*
0950: 20 69 6e 74 20 2a 2f 29 3b 0a 76 6f 69 64 20 20   int */);.void  
0960: 20 4f 70 74 50 72 69 6e 74 28 2f 2a 20 76 6f 69   OptPrint(/* voi
0970: 64 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  d */);../*******
0980: 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
0990: 22 70 61 72 73 65 2e 68 22 20 2a 2a 2a 2a 2a 2a  "parse.h" ******
09a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09c0: 2a 2a 2a 2f 0a 76 6f 69 64 20 50 61 72 73 65 28  ***/.void Parse(
09d0: 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  /* struct lemon 
09e0: 2a 6c 65 6d 70 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a  *lemp */);../***
09f0: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
0a00: 66 69 6c 65 20 22 70 6c 69 6e 6b 2e 68 22 20 2a  file "plink.h" *
0a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a30: 2a 2a 2a 2a 2a 2a 2f 0a 73 74 72 75 63 74 20 70  ******/.struct p
0a40: 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65 77 28  link *Plink_new(
0a50: 2f 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 76 6f 69  /* void */);.voi
0a60: 64 20 50 6c 69 6e 6b 5f 61 64 64 28 2f 2a 20 73  d Plink_add(/* s
0a70: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a 2c 20  truct plink **, 
0a80: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20  struct config * 
0a90: 2a 2f 29 3b 0a 76 6f 69 64 20 50 6c 69 6e 6b 5f  */);.void Plink_
0aa0: 63 6f 70 79 28 2f 2a 20 73 74 72 75 63 74 20 70  copy(/* struct p
0ab0: 6c 69 6e 6b 20 2a 2a 2c 20 73 74 72 75 63 74 20  link **, struct 
0ac0: 70 6c 69 6e 6b 20 2a 20 2a 2f 29 3b 0a 76 6f 69  plink * */);.voi
0ad0: 64 20 50 6c 69 6e 6b 5f 64 65 6c 65 74 65 28 2f  d Plink_delete(/
0ae0: 2a 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a  * struct plink *
0af0: 20 2a 2f 29 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   */);../********
0b00: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
0b10: 20 22 72 65 70 6f 72 74 2e 68 22 20 2a 2a 2a 2a   "report.h" ****
0b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0b40: 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28  */.void Reprint(
0b50: 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  /* struct lemon 
0b60: 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 52 65 70 6f  * */);.void Repo
0b70: 72 74 4f 75 74 70 75 74 28 2f 2a 20 73 74 72 75  rtOutput(/* stru
0b80: 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a  ct lemon * */);.
0b90: 76 6f 69 64 20 52 65 70 6f 72 74 54 61 62 6c 65  void ReportTable
0ba0: 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  (/* struct lemon
0bb0: 20 2a 20 2a 2f 29 3b 0a 76 6f 69 64 20 52 65 70   * */);.void Rep
0bc0: 6f 72 74 48 65 61 64 65 72 28 2f 2a 20 73 74 72  ortHeader(/* str
0bd0: 75 63 74 20 6c 65 6d 6f 6e 20 2a 20 2a 2f 29 3b  uct lemon * */);
0be0: 0a 76 6f 69 64 20 43 6f 6d 70 72 65 73 73 54 61  .void CompressTa
0bf0: 62 6c 65 73 28 2f 2a 20 73 74 72 75 63 74 20 6c  bles(/* struct l
0c00: 65 6d 6f 6e 20 2a 20 2a 2f 29 3b 0a 0a 2f 2a 2a  emon * */);../**
0c10: 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68  ******** From th
0c20: 65 20 66 69 6c 65 20 22 73 65 74 2e 68 22 20 2a  e file "set.h" *
0c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0c50: 2a 2a 2a 2a 2a 2a 2a 2f 0a 76 6f 69 64 20 20 53  *******/.void  S
0c60: 65 74 53 69 7a 65 28 2f 2a 20 69 6e 74 20 4e 20  etSize(/* int N 
0c70: 2a 2f 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  */);            
0c80: 20 2f 2a 20 41 6c 6c 20 73 65 74 73 20 77 69 6c   /* All sets wil
0c90: 6c 20 62 65 20 6f 66 20 73 69 7a 65 20 4e 20 2a  l be of size N *
0ca0: 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28 2f  /.char *SetNew(/
0cb0: 2a 20 76 6f 69 64 20 2a 2f 29 3b 20 20 20 20 20  * void */);     
0cc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6e            /* A n
0cd0: 65 77 20 73 65 74 20 66 6f 72 20 65 6c 65 6d 65  ew set for eleme
0ce0: 6e 74 20 30 2e 2e 4e 20 2a 2f 0a 76 6f 69 64 20  nt 0..N */.void 
0cf0: 20 53 65 74 46 72 65 65 28 2f 2a 20 63 68 61 72   SetFree(/* char
0d00: 2a 20 2a 2f 29 3b 20 20 20 20 20 20 20 20 20 20  * */);          
0d10: 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65     /* Deallocate
0d20: 20 61 20 73 65 74 20 2a 2f 0a 0a 69 6e 74 20 53   a set */..int S
0d30: 65 74 41 64 64 28 2f 2a 20 63 68 61 72 2a 2c 69  etAdd(/* char*,i
0d40: 6e 74 20 2a 2f 29 3b 20 20 20 20 20 20 20 20 20  nt */);         
0d50: 20 20 20 2f 2a 20 41 64 64 20 65 6c 65 6d 65 6e     /* Add elemen
0d60: 74 20 74 6f 20 61 20 73 65 74 20 2a 2f 0a 69 6e  t to a set */.in
0d70: 74 20 53 65 74 55 6e 69 6f 6e 28 2f 2a 20 63 68  t SetUnion(/* ch
0d80: 61 72 20 2a 41 2c 63 68 61 72 20 2a 42 20 2a 2f  ar *A,char *B */
0d90: 29 3b 20 20 20 20 2f 2a 20 41 20 3c 2d 20 41 20  );    /* A <- A 
0da0: 55 20 42 2c 20 74 68 72 75 20 65 6c 65 6d 65 6e  U B, thru elemen
0db0: 74 20 4e 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20  t N */..#define 
0dc0: 53 65 74 46 69 6e 64 28 58 2c 59 29 20 28 58 5b  SetFind(X,Y) (X[
0dd0: 59 5d 29 20 20 20 20 20 20 20 2f 2a 20 54 72 75  Y])       /* Tru
0de0: 65 20 69 66 20 59 20 69 73 20 69 6e 20 73 65 74  e if Y is in set
0df0: 20 58 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   X */../********
0e00: 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** From the file
0e10: 20 22 73 74 72 75 63 74 2e 68 22 20 2a 2a 2a 2a   "struct.h" ****
0e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0e40: 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 63 69 70  */./*.** Princip
0e50: 61 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72  al data structur
0e60: 65 73 20 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e  es for the LEMON
0e70: 20 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f   parser generato
0e80: 72 2e 0a 2a 2f 0a 0a 74 79 70 65 64 65 66 20 65  r..*/..typedef e
0e90: 6e 75 6d 20 7b 42 5f 46 41 4c 53 45 3d 30 2c 20  num {B_FALSE=0, 
0ea0: 42 5f 54 52 55 45 7d 20 42 6f 6f 6c 65 61 6e 3b  B_TRUE} Boolean;
0eb0: 0a 0a 2f 2a 20 53 79 6d 62 6f 6c 73 20 28 74 65  ../* Symbols (te
0ec0: 72 6d 69 6e 61 6c 73 20 61 6e 64 20 6e 6f 6e 74  rminals and nont
0ed0: 65 72 6d 69 6e 61 6c 73 29 20 6f 66 20 74 68 65  erminals) of the
0ee0: 20 67 72 61 6d 6d 61 72 20 61 72 65 20 73 74 6f   grammar are sto
0ef0: 72 65 64 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f  red.** in the fo
0f00: 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 73 74 72 75  llowing: */.stru
0f10: 63 74 20 73 79 6d 62 6f 6c 20 7b 0a 20 20 63 68  ct symbol {.  ch
0f20: 61 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20  ar *name;       
0f30: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
0f40: 66 20 74 68 65 20 73 79 6d 62 6f 6c 20 2a 2f 0a  f the symbol */.
0f50: 20 20 69 6e 74 20 69 6e 64 65 78 3b 20 20 20 20    int index;    
0f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
0f70: 64 65 78 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  dex number for t
0f80: 68 69 73 20 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20  his symbol */.  
0f90: 65 6e 75 6d 20 7b 0a 20 20 20 20 54 45 52 4d 49  enum {.    TERMI
0fa0: 4e 41 4c 2c 0a 20 20 20 20 4e 4f 4e 54 45 52 4d  NAL,.    NONTERM
0fb0: 49 4e 41 4c 0a 20 20 7d 20 74 79 70 65 3b 20 20  INAL.  } type;  
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fd0: 2f 2a 20 53 79 6d 62 6f 6c 73 20 61 72 65 20 61  /* Symbols are a
0fe0: 6c 6c 20 65 69 74 68 65 72 20 54 45 52 4d 49 4e  ll either TERMIN
0ff0: 41 4c 53 20 6f 72 20 4e 54 73 20 2a 2f 0a 20 20  ALS or NTs */.  
1000: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 75 6c  struct rule *rul
1010: 65 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 6b  e;       /* Link
1020: 65 64 20 6c 69 73 74 20 6f 66 20 72 75 6c 65 73  ed list of rules
1030: 20 6f 66 20 74 68 69 73 20 28 69 66 20 61 6e 20   of this (if an 
1040: 4e 54 29 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  NT) */.  struct 
1050: 73 79 6d 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b  symbol *fallback
1060: 3b 20 2f 2a 20 66 61 6c 6c 62 61 63 6b 20 74 6f  ; /* fallback to
1070: 6b 65 6e 20 69 6e 20 63 61 73 65 20 74 68 69 73  ken in case this
1080: 20 74 6f 6b 65 6e 20 64 6f 65 73 6e 27 74 20 70   token doesn't p
1090: 61 72 73 65 20 2a 2f 0a 20 20 69 6e 74 20 70 72  arse */.  int pr
10a0: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
10b0: 20 20 20 2f 2a 20 50 72 65 63 65 64 65 6e 63 65     /* Precedence
10c0: 20 69 66 20 64 65 66 69 6e 65 64 20 28 2d 31 20   if defined (-1 
10d0: 6f 74 68 65 72 77 69 73 65 29 20 2a 2f 0a 20 20  otherwise) */.  
10e0: 65 6e 75 6d 20 65 5f 61 73 73 6f 63 20 7b 0a 20  enum e_assoc {. 
10f0: 20 20 20 4c 45 46 54 2c 0a 20 20 20 20 52 49 47     LEFT,.    RIG
1100: 48 54 2c 0a 20 20 20 20 4e 4f 4e 45 2c 0a 20 20  HT,.    NONE,.  
1110: 20 20 55 4e 4b 0a 20 20 7d 20 61 73 73 6f 63 3b    UNK.  } assoc;
1120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1130: 20 2f 2a 20 41 73 73 6f 63 69 61 74 69 76 69 74   /* Associativit
1140: 79 20 69 66 20 70 72 65 64 65 63 65 6e 63 65 20  y if predecence 
1150: 69 73 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20  is defined */.  
1160: 63 68 61 72 20 2a 66 69 72 73 74 73 65 74 3b 20  char *firstset; 
1170: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
1180: 74 2d 73 65 74 20 66 6f 72 20 61 6c 6c 20 72 75  t-set for all ru
1190: 6c 65 73 20 6f 66 20 74 68 69 73 20 73 79 6d 62  les of this symb
11a0: 6f 6c 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e 20  ol */.  Boolean 
11b0: 6c 61 6d 62 64 61 3b 20 20 20 20 20 20 20 20 20  lambda;         
11c0: 20 2f 2a 20 54 72 75 65 20 69 66 20 4e 54 20 61   /* True if NT a
11d0: 6e 64 20 63 61 6e 20 67 65 6e 65 72 61 74 65 20  nd can generate 
11e0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20  an empty string 
11f0: 2a 2f 0a 20 20 63 68 61 72 20 2a 64 65 73 74 72  */.  char *destr
1200: 75 63 74 6f 72 3b 20 20 20 20 20 20 20 20 2f 2a  uctor;        /*
1210: 20 43 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   Code which exec
1220: 75 74 65 73 20 77 68 65 6e 65 76 65 72 20 74 68  utes whenever th
1230: 69 73 20 73 79 6d 62 6f 6c 20 69 73 0a 20 20 20  is symbol is.   
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1250: 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 70 70 65          ** poppe
1260: 64 20 66 72 6f 6d 20 74 68 65 20 73 74 61 63 6b  d from the stack
1270: 20 64 75 72 69 6e 67 20 65 72 72 6f 72 20 70 72   during error pr
1280: 6f 63 65 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e  ocessing */.  in
1290: 74 20 64 65 73 74 72 75 63 74 6f 72 6c 6e 3b 20  t destructorln; 
12a0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e         /* Line n
12b0: 75 6d 62 65 72 20 6f 66 20 64 65 73 74 72 75 63  umber of destruc
12c0: 74 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68  tor code */.  ch
12d0: 61 72 20 2a 64 61 74 61 74 79 70 65 3b 20 20 20  ar *datatype;   
12e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
12f0: 74 61 20 74 79 70 65 20 6f 66 20 69 6e 66 6f 72  ta type of infor
1300: 6d 61 74 69 6f 6e 20 68 65 6c 64 20 62 79 20 74  mation held by t
1310: 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  his.            
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1330: 2a 20 6f 62 6a 65 63 74 2e 20 4f 6e 6c 79 20 75  * object. Only u
1340: 73 65 64 20 69 66 20 74 79 70 65 3d 3d 4e 4f 4e  sed if type==NON
1350: 54 45 52 4d 49 4e 41 4c 20 2a 2f 0a 20 20 69 6e  TERMINAL */.  in
1360: 74 20 64 74 6e 75 6d 3b 20 20 20 20 20 20 20 20  t dtnum;        
1370: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61         /* The da
1380: 74 61 20 74 79 70 65 20 6e 75 6d 62 65 72 2e 20  ta type number. 
1390: 20 49 6e 20 74 68 65 20 70 61 72 73 65 72 2c 20   In the parser, 
13a0: 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  the value.      
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c0: 20 20 20 20 20 2a 2a 20 73 74 61 63 6b 20 69 73       ** stack is
13d0: 20 61 20 75 6e 69 6f 6e 2e 20 20 54 68 65 20 2e   a union.  The .
13e0: 79 79 25 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20  yy%d element of 
13f0: 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  this.           
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 2a 2a 20 75 6e 69 6f 6e 20 69 73 20 74 68 65 20  ** union is the 
1420: 63 6f 72 72 65 63 74 20 64 61 74 61 20 74 79 70  correct data typ
1430: 65 20 66 6f 72 20 74 68 69 73 20 6f 62 6a 65 63  e for this objec
1440: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45 61 63 68  t */.};../* Each
1450: 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65   production rule
1460: 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61 72 20   in the grammar 
1470: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  is stored in the
1480: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
1490: 72 75 63 74 75 72 65 2e 20 20 2a 2f 0a 73 74 72  ructure.  */.str
14a0: 75 63 74 20 72 75 6c 65 20 7b 0a 20 20 73 74 72  uct rule {.  str
14b0: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b  uct symbol *lhs;
14c0: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61        /* Left-ha
14d0: 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65 20 72  nd side of the r
14e0: 75 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c  ule */.  char *l
14f0: 68 73 61 6c 69 61 73 3b 20 20 20 20 20 20 20 20  hsalias;        
1500: 20 20 2f 2a 20 41 6c 69 61 73 20 66 6f 72 20 74    /* Alias for t
1510: 68 65 20 4c 48 53 20 28 4e 55 4c 4c 20 69 66 20  he LHS (NULL if 
1520: 6e 6f 6e 65 29 20 2a 2f 0a 20 20 69 6e 74 20 72  none) */.  int r
1530: 75 6c 65 6c 69 6e 65 3b 20 20 20 20 20 20 20 20  uleline;        
1540: 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62      /* Line numb
1550: 65 72 20 66 6f 72 20 74 68 65 20 72 75 6c 65 20  er for the rule 
1560: 2a 2f 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20 20  */.  int nrhs;  
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1580: 20 4e 75 6d 62 65 72 20 6f 66 20 52 48 53 20 73   Number of RHS s
1590: 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 73 74 72 75  ymbols */.  stru
15a0: 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 72 68 73 3b  ct symbol **rhs;
15b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 52 48 53 20       /* The RHS 
15c0: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 68 61  symbols */.  cha
15d0: 72 20 2a 2a 72 68 73 61 6c 69 61 73 3b 20 20 20  r **rhsalias;   
15e0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 61 6c 69 61        /* An alia
15f0: 73 20 66 6f 72 20 65 61 63 68 20 52 48 53 20 73  s for each RHS s
1600: 79 6d 62 6f 6c 20 28 4e 55 4c 4c 20 69 66 20 6e  ymbol (NULL if n
1610: 6f 6e 65 29 20 2a 2f 0a 20 20 69 6e 74 20 6c 69  one) */.  int li
1620: 6e 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ne;             
1630: 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65     /* Line numbe
1640: 72 20 61 74 20 77 68 69 63 68 20 63 6f 64 65 20  r at which code 
1650: 62 65 67 69 6e 73 20 2a 2f 0a 20 20 63 68 61 72  begins */.  char
1660: 20 2a 63 6f 64 65 3b 20 20 20 20 20 20 20 20 20   *code;         
1670: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65       /* The code
1680: 20 65 78 65 63 75 74 65 64 20 77 68 65 6e 20 74   executed when t
1690: 68 69 73 20 72 75 6c 65 20 69 73 20 72 65 64 75  his rule is redu
16a0: 63 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ced */.  struct 
16b0: 73 79 6d 62 6f 6c 20 2a 70 72 65 63 73 79 6d 3b  symbol *precsym;
16c0: 20 20 2f 2a 20 50 72 65 63 65 64 65 6e 63 65 20    /* Precedence 
16d0: 73 79 6d 62 6f 6c 20 66 6f 72 20 74 68 69 73 20  symbol for this 
16e0: 72 75 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  rule */.  int in
16f0: 64 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  dex;            
1700: 20 20 20 2f 2a 20 41 6e 20 69 6e 64 65 78 20 6e     /* An index n
1710: 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 72  umber for this r
1720: 75 6c 65 20 2a 2f 0a 20 20 42 6f 6f 6c 65 61 6e  ule */.  Boolean
1730: 20 63 61 6e 52 65 64 75 63 65 3b 20 20 20 20 20   canReduce;     
1740: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69    /* True if thi
1750: 73 20 72 75 6c 65 20 69 73 20 65 76 65 72 20 72  s rule is ever r
1760: 65 64 75 63 65 64 20 2a 2f 0a 20 20 73 74 72 75  educed */.  stru
1770: 63 74 20 72 75 6c 65 20 2a 6e 65 78 74 6c 68 73  ct rule *nextlhs
1780: 3b 20 20 20 20 2f 2a 20 4e 65 78 74 20 72 75 6c  ;    /* Next rul
1790: 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
17a0: 4c 48 53 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  LHS */.  struct 
17b0: 72 75 6c 65 20 2a 6e 65 78 74 3b 20 20 20 20 20  rule *next;     
17c0: 20 20 2f 2a 20 4e 65 78 74 20 72 75 6c 65 20 69    /* Next rule i
17d0: 6e 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73  n the global lis
17e0: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 20 63 6f  t */.};../* A co
17f0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 73 20 61  nfiguration is a
1800: 20 70 72 6f 64 75 63 74 69 6f 6e 20 72 75 6c 65   production rule
1810: 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 20   of the grammar 
1820: 74 6f 67 65 74 68 65 72 20 77 69 74 68 0a 2a 2a  together with.**
1830: 20 61 20 6d 61 72 6b 20 28 64 6f 74 29 20 73 68   a mark (dot) sh
1840: 6f 77 69 6e 67 20 68 6f 77 20 6d 75 63 68 20 6f  owing how much o
1850: 66 20 74 68 61 74 20 72 75 6c 65 20 68 61 73 20  f that rule has 
1860: 62 65 65 6e 20 70 72 6f 63 65 73 73 65 64 20 73  been processed s
1870: 6f 20 66 61 72 2e 0a 2a 2a 20 43 6f 6e 66 69 67  o far..** Config
1880: 75 72 61 74 69 6f 6e 73 20 61 6c 73 6f 20 63 6f  urations also co
1890: 6e 74 61 69 6e 20 61 20 66 6f 6c 6c 6f 77 2d 73  ntain a follow-s
18a0: 65 74 20 77 68 69 63 68 20 69 73 20 61 20 6c 69  et which is a li
18b0: 73 74 20 6f 66 20 74 65 72 6d 69 6e 61 6c 0a 2a  st of terminal.*
18c0: 2a 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20  * symbols which 
18d0: 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 69  are allowed to i
18e0: 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
18f0: 77 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  w the end of the
1900: 20 72 75 6c 65 2e 0a 2a 2a 20 45 76 65 72 79 20   rule..** Every 
1910: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 69 73  configuration is
1920: 20 72 65 63 6f 72 64 65 64 20 61 73 20 61 6e 20   recorded as an 
1930: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1940: 66 6f 6c 6c 6f 77 69 6e 67 3a 20 2a 2f 0a 73 74  following: */.st
1950: 72 75 63 74 20 63 6f 6e 66 69 67 20 7b 0a 20 20  ruct config {.  
1960: 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b  struct rule *rp;
1970: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1980: 72 75 6c 65 20 75 70 6f 6e 20 77 68 69 63 68 20  rule upon which 
1990: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
19a0: 6e 20 69 73 20 62 61 73 65 64 20 2a 2f 0a 20 20  n is based */.  
19b0: 69 6e 74 20 64 6f 74 3b 20 20 20 20 20 20 20 20  int dot;        
19c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
19d0: 70 61 72 73 65 20 70 6f 69 6e 74 20 2a 2f 0a 20  parse point */. 
19e0: 20 63 68 61 72 20 2a 66 77 73 3b 20 20 20 20 20   char *fws;     
19f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 6c            /* Fol
1a00: 6c 6f 77 2d 73 65 74 20 66 6f 72 20 74 68 69 73  low-set for this
1a10: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   configuration o
1a20: 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
1a30: 70 6c 69 6e 6b 20 2a 66 70 6c 70 3b 20 20 20 20  plink *fplp;    
1a40: 20 20 2f 2a 20 46 6f 6c 6c 6f 77 2d 73 65 74 20    /* Follow-set 
1a50: 66 6f 72 77 61 72 64 20 70 72 6f 70 61 67 61 74  forward propagat
1a60: 69 6f 6e 20 6c 69 6e 6b 73 20 2a 2f 0a 20 20 73  ion links */.  s
1a70: 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 62 70 6c  truct plink *bpl
1a80: 70 3b 20 20 20 20 20 20 2f 2a 20 46 6f 6c 6c 6f  p;      /* Follo
1a90: 77 2d 73 65 74 20 62 61 63 6b 77 61 72 64 73 20  w-set backwards 
1aa0: 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b  propagation link
1ab0: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  s */.  struct st
1ac0: 61 74 65 20 2a 73 74 70 3b 20 20 20 20 20 20 20  ate *stp;       
1ad0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 74  /* Pointer to st
1ae0: 61 74 65 20 77 68 69 63 68 20 63 6f 6e 74 61 69  ate which contai
1af0: 6e 73 20 74 68 69 73 20 2a 2f 0a 20 20 65 6e 75  ns this */.  enu
1b00: 6d 20 7b 0a 20 20 20 20 43 4f 4d 50 4c 45 54 45  m {.    COMPLETE
1b10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1b20: 2a 20 54 68 65 20 73 74 61 74 75 73 20 69 73 20  * The status is 
1b30: 75 73 65 64 20 64 75 72 69 6e 67 20 66 6f 6c 6c  used during foll
1b40: 6f 77 73 65 74 20 61 6e 64 20 2a 2f 0a 20 20 20  owset and */.   
1b50: 20 49 4e 43 4f 4d 50 4c 45 54 45 20 20 20 20 20   INCOMPLETE     
1b60: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 73 68          /*    sh
1b70: 69 66 74 20 63 6f 6d 70 75 74 61 74 69 6f 6e 73  ift computations
1b80: 20 2a 2f 0a 20 20 7d 20 73 74 61 74 75 73 3b 0a   */.  } status;.
1b90: 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20    struct config 
1ba0: 2a 6e 65 78 74 3b 20 20 20 20 20 2f 2a 20 4e 65  *next;     /* Ne
1bb0: 78 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  xt configuration
1bc0: 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 2a 2f   in the state */
1bd0: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
1be0: 20 2a 62 70 3b 20 20 20 20 20 20 20 2f 2a 20 54   *bp;       /* T
1bf0: 68 65 20 6e 65 78 74 20 62 61 73 69 73 20 63 6f  he next basis co
1c00: 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 7d  nfiguration */.}
1c10: 3b 0a 0a 2f 2a 20 45 76 65 72 79 20 73 68 69 66  ;../* Every shif
1c20: 74 20 6f 72 20 72 65 64 75 63 65 20 6f 70 65 72  t or reduce oper
1c30: 61 74 69 6f 6e 20 69 73 20 73 74 6f 72 65 64 20  ation is stored 
1c40: 61 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  as one of the fo
1c50: 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 72 75 63  llowing */.struc
1c60: 74 20 61 63 74 69 6f 6e 20 7b 0a 20 20 73 74 72  t action {.  str
1c70: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 20  uct symbol *sp; 
1c80: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f        /* The loo
1c90: 6b 2d 61 68 65 61 64 20 73 79 6d 62 6f 6c 20 2a  k-ahead symbol *
1ca0: 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 63 74 69 6f  /.  enum e_actio
1cb0: 6e 20 7b 0a 20 20 20 20 53 48 49 46 54 2c 0a 20  n {.    SHIFT,. 
1cc0: 20 20 20 41 43 43 45 50 54 2c 0a 20 20 20 20 52     ACCEPT,.    R
1cd0: 45 44 55 43 45 2c 0a 20 20 20 20 45 52 52 4f 52  EDUCE,.    ERROR
1ce0: 2c 0a 20 20 20 20 43 4f 4e 46 4c 49 43 54 2c 20  ,.    CONFLICT, 
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d00: 2a 20 57 61 73 20 61 20 72 65 64 75 63 65 2c 20  * Was a reduce, 
1d10: 62 75 74 20 70 61 72 74 20 6f 66 20 61 20 63 6f  but part of a co
1d20: 6e 66 6c 69 63 74 20 2a 2f 0a 20 20 20 20 53 48  nflict */.    SH
1d30: 5f 52 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20  _RESOLVED,      
1d40: 20 20 20 20 20 20 20 2f 2a 20 57 61 73 20 61 20         /* Was a 
1d50: 73 68 69 66 74 2e 20 20 50 72 65 63 65 64 65 6e  shift.  Preceden
1d60: 63 65 20 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66  ce resolved conf
1d70: 6c 69 63 74 20 2a 2f 0a 20 20 20 20 52 44 5f 52  lict */.    RD_R
1d80: 45 53 4f 4c 56 45 44 2c 20 20 20 20 20 20 20 20  ESOLVED,        
1d90: 20 20 20 20 20 2f 2a 20 57 61 73 20 72 65 64 75       /* Was redu
1da0: 63 65 2e 20 20 50 72 65 63 65 64 65 6e 63 65 20  ce.  Precedence 
1db0: 72 65 73 6f 6c 76 65 64 20 63 6f 6e 66 6c 69 63  resolved conflic
1dc0: 74 20 2a 2f 0a 20 20 20 20 4e 4f 54 5f 55 53 45  t */.    NOT_USE
1dd0: 44 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D               
1de0: 20 20 2f 2a 20 44 65 6c 65 74 65 64 20 62 79 20    /* Deleted by 
1df0: 63 6f 6d 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  compression */. 
1e00: 20 7d 20 74 79 70 65 3b 0a 20 20 75 6e 69 6f 6e   } type;.  union
1e10: 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74   {.    struct st
1e20: 61 74 65 20 2a 73 74 70 3b 20 20 20 20 20 2f 2a  ate *stp;     /*
1e30: 20 54 68 65 20 6e 65 77 20 73 74 61 74 65 2c 20   The new state, 
1e40: 69 66 20 61 20 73 68 69 66 74 20 2a 2f 0a 20 20  if a shift */.  
1e50: 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72    struct rule *r
1e60: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
1e70: 72 75 6c 65 2c 20 69 66 20 61 20 72 65 64 75 63  rule, if a reduc
1e80: 65 20 2a 2f 0a 20 20 7d 20 78 3b 0a 20 20 73 74  e */.  } x;.  st
1e90: 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 78  ruct action *nex
1ea0: 74 3b 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61  t;     /* Next a
1eb0: 63 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 73  ction for this s
1ec0: 74 61 74 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  tate */.  struct
1ed0: 20 61 63 74 69 6f 6e 20 2a 63 6f 6c 6c 69 64 65   action *collide
1ee0: 3b 20 20 2f 2a 20 4e 65 78 74 20 61 63 74 69 6f  ;  /* Next actio
1ef0: 6e 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  n with the same 
1f00: 68 61 73 68 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 45  hash */.};../* E
1f10: 61 63 68 20 73 74 61 74 65 20 6f 66 20 74 68 65  ach state of the
1f20: 20 67 65 6e 65 72 61 74 65 64 20 70 61 72 73 65   generated parse
1f30: 72 27 73 20 66 69 6e 69 74 65 20 73 74 61 74 65  r's finite state
1f40: 20 6d 61 63 68 69 6e 65 0a 2a 2a 20 69 73 20 65   machine.** is e
1f50: 6e 63 6f 64 65 64 20 61 73 20 61 6e 20 69 6e 73  ncoded as an ins
1f60: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
1f70: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1f80: 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 74 61 74  . */.struct stat
1f90: 65 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e  e {.  struct con
1fa0: 66 69 67 20 2a 62 70 3b 20 20 20 20 20 20 20 2f  fig *bp;       /
1fb0: 2a 20 54 68 65 20 62 61 73 69 73 20 63 6f 6e 66  * The basis conf
1fc0: 69 67 75 72 61 74 69 6f 6e 73 20 66 6f 72 20 74  igurations for t
1fd0: 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20 20 73  his state */.  s
1fe0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66  truct config *cf
1ff0: 70 3b 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63  p;      /* All c
2000: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 69 6e  onfigurations in
2010: 20 74 68 69 73 20 73 65 74 20 2a 2f 0a 20 20 69   this set */.  i
2020: 6e 74 20 69 6e 64 65 78 3b 20 20 20 20 20 20 20  nt index;       
2030: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 71 75 65          /* Seque
2040: 6e 63 69 61 6c 20 6e 75 6d 62 65 72 20 66 6f 72  ncial number for
2050: 20 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a 20   this state */. 
2060: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
2070: 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 41 72 72  ap;       /* Arr
2080: 61 79 20 6f 66 20 61 63 74 69 6f 6e 73 20 66 6f  ay of actions fo
2090: 72 20 74 68 69 73 20 73 74 61 74 65 20 2a 2f 0a  r this state */.
20a0: 20 20 69 6e 74 20 6e 54 6b 6e 41 63 74 2c 20 6e    int nTknAct, n
20b0: 4e 74 41 63 74 3b 20 20 20 20 20 2f 2a 20 4e 75  NtAct;     /* Nu
20c0: 6d 62 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20  mber of actions 
20d0: 6f 6e 20 74 65 72 6d 69 6e 61 6c 73 20 61 6e 64  on terminals and
20e0: 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20 2a 2f   nonterminals */
20f0: 0a 20 20 69 6e 74 20 69 54 6b 6e 4f 66 73 74 2c  .  int iTknOfst,
2100: 20 69 4e 74 4f 66 73 74 3b 20 20 20 2f 2a 20 79   iNtOfst;   /* y
2110: 79 5f 61 63 74 69 6f 6e 5b 5d 20 6f 66 66 73 65  y_action[] offse
2120: 74 20 66 6f 72 20 74 65 72 6d 69 6e 61 6c 73 20  t for terminals 
2130: 61 6e 64 20 6e 6f 6e 74 65 72 6d 73 20 2a 2f 0a  and nonterms */.
2140: 20 20 69 6e 74 20 69 44 66 6c 74 3b 20 20 20 20    int iDflt;    
2150: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
2160: 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 2a 2f 0a  fault action */.
2170: 7d 3b 0a 23 64 65 66 69 6e 65 20 4e 4f 5f 4f 46  };.#define NO_OF
2180: 46 53 45 54 20 28 2d 32 31 34 37 34 38 33 36 34  FSET (-214748364
2190: 37 29 0a 0a 2f 2a 20 41 20 66 6f 6c 6c 6f 77 73  7)../* A follows
21a0: 65 74 20 70 72 6f 70 61 67 61 74 69 6f 6e 20 6c  et propagation l
21b0: 69 6e 6b 20 69 6e 64 69 63 61 74 65 73 20 74 68  ink indicates th
21c0: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
21d0: 6f 66 20 6f 6e 65 0a 2a 2a 20 63 6f 6e 66 69 67  of one.** config
21e0: 75 72 61 74 69 6f 6e 20 66 6f 6c 6c 6f 77 73 65  uration followse
21f0: 74 20 73 68 6f 75 6c 64 20 62 65 20 70 72 6f 70  t should be prop
2200: 61 67 61 74 65 64 20 74 6f 20 61 6e 6f 74 68 65  agated to anothe
2210: 72 20 77 68 65 6e 65 76 65 72 0a 2a 2a 20 74 68  r whenever.** th
2220: 65 20 66 69 72 73 74 20 63 68 61 6e 67 65 73 2e  e first changes.
2230: 20 2a 2f 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b   */.struct plink
2240: 20 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66   {.  struct conf
2250: 69 67 20 2a 63 66 70 3b 20 20 20 20 20 20 2f 2a  ig *cfp;      /*
2260: 20 54 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   The configurati
2270: 6f 6e 20 74 6f 20 77 68 69 63 68 20 6c 69 6e 6b  on to which link
2280: 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 70  ed */.  struct p
2290: 6c 69 6e 6b 20 2a 6e 65 78 74 3b 20 20 20 20 20  link *next;     
22a0: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 70 72 6f   /* The next pro
22b0: 70 61 67 61 74 65 20 6c 69 6e 6b 20 2a 2f 0a 7d  pagate link */.}
22c0: 3b 0a 0a 2f 2a 20 54 68 65 20 73 74 61 74 65 20  ;../* The state 
22d0: 76 65 63 74 6f 72 20 66 6f 72 20 74 68 65 20 65  vector for the e
22e0: 6e 74 69 72 65 20 70 61 72 73 65 72 20 67 65 6e  ntire parser gen
22f0: 65 72 61 74 6f 72 20 69 73 20 72 65 63 6f 72 64  erator is record
2300: 65 64 20 61 73 0a 2a 2a 20 66 6f 6c 6c 6f 77 73  ed as.** follows
2310: 2e 20 20 28 4c 45 4d 4f 4e 20 75 73 65 73 20 6e  .  (LEMON uses n
2320: 6f 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  o global variabl
2330: 65 73 20 61 6e 64 20 6d 61 6b 65 73 20 6c 69 74  es and makes lit
2340: 74 6c 65 20 75 73 65 20 6f 66 0a 2a 2a 20 73 74  tle use of.** st
2350: 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 2e 20  atic variables. 
2360: 20 46 69 65 6c 64 73 20 69 6e 20 74 68 65 20 66   Fields in the f
2370: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
2380: 72 65 20 63 61 6e 20 62 65 20 74 68 6f 75 67 68  re can be though
2390: 74 0a 2a 2a 20 6f 66 20 61 73 20 62 65 67 69 6e  t.** of as begin
23a0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
23b0: 73 20 69 6e 20 74 68 65 20 70 72 6f 67 72 61 6d  s in the program
23c0: 2e 29 20 2a 2f 0a 73 74 72 75 63 74 20 6c 65 6d  .) */.struct lem
23d0: 6f 6e 20 7b 0a 20 20 73 74 72 75 63 74 20 73 74  on {.  struct st
23e0: 61 74 65 20 2a 2a 73 6f 72 74 65 64 3b 20 20 20  ate **sorted;   
23f0: 2f 2a 20 54 61 62 6c 65 20 6f 66 20 73 74 61 74  /* Table of stat
2400: 65 73 20 73 6f 72 74 65 64 20 62 79 20 73 74 61  es sorted by sta
2410: 74 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 73  te number */.  s
2420: 74 72 75 63 74 20 72 75 6c 65 20 2a 72 75 6c 65  truct rule *rule
2430: 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  ;       /* List 
2440: 6f 66 20 61 6c 6c 20 72 75 6c 65 73 20 2a 2f 0a  of all rules */.
2450: 20 20 69 6e 74 20 6e 73 74 61 74 65 3b 20 20 20    int nstate;   
2460: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2470: 6d 62 65 72 20 6f 66 20 73 74 61 74 65 73 20 2a  mber of states *
2480: 2f 0a 20 20 69 6e 74 20 6e 72 75 6c 65 3b 20 20  /.  int nrule;  
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a0: 4e 75 6d 62 65 72 20 6f 66 20 72 75 6c 65 73 20  Number of rules 
24b0: 2a 2f 0a 20 20 69 6e 74 20 6e 73 79 6d 62 6f 6c  */.  int nsymbol
24c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24d0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 69   Number of termi
24e0: 6e 61 6c 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69  nal and nontermi
24f0: 6e 61 6c 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20  nal symbols */. 
2500: 20 69 6e 74 20 6e 74 65 72 6d 69 6e 61 6c 3b 20   int nterminal; 
2510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2520: 62 65 72 20 6f 66 20 74 65 72 6d 69 6e 61 6c 20  ber of terminal 
2530: 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 73 74 72  symbols */.  str
2540: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 73 79 6d  uct symbol **sym
2550: 62 6f 6c 73 3b 20 2f 2a 20 53 6f 72 74 65 64 20  bols; /* Sorted 
2560: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
2570: 73 20 74 6f 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a  s to symbols */.
2580: 20 20 69 6e 74 20 65 72 72 6f 72 63 6e 74 3b 20    int errorcnt; 
2590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25a0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 2a  mber of errors *
25b0: 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f  /.  struct symbo
25c0: 6c 20 2a 65 72 72 73 79 6d 3b 20 20 20 2f 2a 20  l *errsym;   /* 
25d0: 54 68 65 20 65 72 72 6f 72 20 73 79 6d 62 6f 6c  The error symbol
25e0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6e 61 6d 65   */.  char *name
25f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2600: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 67 65  * Name of the ge
2610: 6e 65 72 61 74 65 64 20 70 61 72 73 65 72 20 2a  nerated parser *
2620: 2f 0a 20 20 63 68 61 72 20 2a 61 72 67 3b 20 20  /.  char *arg;  
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2640: 44 65 63 6c 61 72 61 74 69 6f 6e 20 6f 66 20 74  Declaration of t
2650: 68 65 20 33 74 68 20 61 72 67 75 6d 65 6e 74 20  he 3th argument 
2660: 74 6f 20 70 61 72 73 65 72 20 2a 2f 0a 20 20 63  to parser */.  c
2670: 68 61 72 20 2a 74 6f 6b 65 6e 74 79 70 65 3b 20  har *tokentype; 
2680: 20 20 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20          /* Type 
2690: 6f 66 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62  of terminal symb
26a0: 6f 6c 73 20 69 6e 20 74 68 65 20 70 61 72 73 65  ols in the parse
26b0: 72 20 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61  r stack */.  cha
26c0: 72 20 2a 76 61 72 74 79 70 65 3b 20 20 20 20 20  r *vartype;     
26d0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 65 66        /* The def
26e0: 61 75 6c 74 20 74 79 70 65 20 6f 66 20 6e 6f 6e  ault type of non
26f0: 2d 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62 6f 6c  -terminal symbol
2700: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73 74 61  s */.  char *sta
2710: 72 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rt;             
2720: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
2730: 74 61 72 74 20 73 79 6d 62 6f 6c 20 66 6f 72 20  tart symbol for 
2740: 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20  the grammar */. 
2750: 20 63 68 61 72 20 2a 73 74 61 63 6b 73 69 7a 65   char *stacksize
2760: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  ;         /* Siz
2770: 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72 20  e of the parser 
2780: 73 74 61 63 6b 20 2a 2f 0a 20 20 63 68 61 72 20  stack */.  char 
2790: 2a 69 6e 63 6c 75 64 65 3b 20 20 20 20 20 20 20  *include;       
27a0: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 70      /* Code to p
27b0: 75 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ut at the start 
27c0: 6f 66 20 74 68 65 20 43 20 66 69 6c 65 20 2a 2f  of the C file */
27d0: 0a 20 20 69 6e 74 20 20 69 6e 63 6c 75 64 65 6c  .  int  includel
27e0: 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  n;          /* L
27f0: 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 73  ine number for s
2800: 74 61 72 74 20 6f 66 20 69 6e 63 6c 75 64 65 20  tart of include 
2810: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
2820: 65 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20  error;          
2830: 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f 20 65 78     /* Code to ex
2840: 65 63 75 74 65 20 77 68 65 6e 20 61 6e 20 65 72  ecute when an er
2850: 72 6f 72 20 69 73 20 73 65 65 6e 20 2a 2f 0a 20  ror is seen */. 
2860: 20 69 6e 74 20 20 65 72 72 6f 72 6c 6e 3b 20 20   int  errorln;  
2870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
2880: 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 73 74 61  e number for sta
2890: 72 74 20 6f 66 20 65 72 72 6f 72 20 63 6f 64 65  rt of error code
28a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 76 65 72   */.  char *over
28b0: 66 6c 6f 77 3b 20 20 20 20 20 20 20 20 20 20 2f  flow;          /
28c0: 2a 20 43 6f 64 65 20 74 6f 20 65 78 65 63 75 74  * Code to execut
28d0: 65 20 6f 6e 20 61 20 73 74 61 63 6b 20 6f 76 65  e on a stack ove
28e0: 72 66 6c 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 20  rflow */.  int  
28f0: 6f 76 65 72 66 6c 6f 77 6c 6e 3b 20 20 20 20 20  overflowln;     
2900: 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62      /* Line numb
2910: 65 72 20 66 6f 72 20 73 74 61 72 74 20 6f 66 20  er for start of 
2920: 6f 76 65 72 66 6c 6f 77 20 63 6f 64 65 20 2a 2f  overflow code */
2930: 0a 20 20 63 68 61 72 20 2a 66 61 69 6c 75 72 65  .  char *failure
2940: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
2950: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 6f  ode to execute o
2960: 6e 20 70 61 72 73 65 72 20 66 61 69 6c 75 72 65  n parser failure
2970: 20 2a 2f 0a 20 20 69 6e 74 20 20 66 61 69 6c 75   */.  int  failu
2980: 72 65 6c 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  reln;          /
2990: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f  * Line number fo
29a0: 72 20 73 74 61 72 74 20 6f 66 20 66 61 69 6c 75  r start of failu
29b0: 72 65 20 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61  re code */.  cha
29c0: 72 20 2a 61 63 63 65 70 74 3b 20 20 20 20 20 20  r *accept;      
29d0: 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 6f        /* Code to
29e0: 20 65 78 65 63 75 74 65 20 77 68 65 6e 20 74 68   execute when th
29f0: 65 20 70 61 72 73 65 72 20 65 78 63 65 70 74 73  e parser excepts
2a00: 20 2a 2f 0a 20 20 69 6e 74 20 20 61 63 63 65 70   */.  int  accep
2a10: 74 6c 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  tln;           /
2a20: 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f  * Line number fo
2a30: 72 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  r the start of a
2a40: 63 63 65 70 74 20 63 6f 64 65 20 2a 2f 0a 20 20  ccept code */.  
2a50: 63 68 61 72 20 2a 65 78 74 72 61 63 6f 64 65 3b  char *extracode;
2a60: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65           /* Code
2a70: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
2a80: 20 67 65 6e 65 72 61 74 65 64 20 66 69 6c 65 20   generated file 
2a90: 2a 2f 0a 20 20 69 6e 74 20 20 65 78 74 72 61 63  */.  int  extrac
2aa0: 6f 64 65 6c 6e 3b 20 20 20 20 20 20 20 20 2f 2a  odeln;        /*
2ab0: 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f 72   Line number for
2ac0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2ad0: 65 20 65 78 74 72 61 20 63 6f 64 65 20 2a 2f 0a  e extra code */.
2ae0: 20 20 63 68 61 72 20 2a 74 6f 6b 65 6e 64 65 73    char *tokendes
2af0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  t;         /* Co
2b00: 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 74 6f  de to execute to
2b10: 20 64 65 73 74 72 6f 79 20 74 6f 6b 65 6e 20 64   destroy token d
2b20: 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 20 74 6f  ata */.  int  to
2b30: 6b 65 6e 64 65 73 74 6c 6e 3b 20 20 20 20 20 20  kendestln;      
2b40: 20 20 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72    /* Line number
2b50: 20 66 6f 72 20 74 6f 6b 65 6e 20 64 65 73 74 72   for token destr
2b60: 6f 79 65 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63  oyer code */.  c
2b70: 68 61 72 20 2a 76 61 72 64 65 73 74 3b 20 20 20  har *vardest;   
2b80: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 64 65 20          /* Code 
2b90: 66 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20  for the default 
2ba0: 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 20 64 65 73  non-terminal des
2bb0: 74 72 75 63 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  tructor */.  int
2bc0: 20 20 76 61 72 64 65 73 74 6c 6e 3b 20 20 20 20    vardestln;    
2bd0: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
2be0: 6d 62 65 72 20 66 6f 72 20 64 65 66 61 75 6c 74  mber for default
2bf0: 20 6e 6f 6e 2d 74 65 72 6d 20 64 65 73 74 72 75   non-term destru
2c00: 63 74 6f 72 20 63 6f 64 65 2a 2f 0a 20 20 63 68  ctor code*/.  ch
2c10: 61 72 20 2a 66 69 6c 65 6e 61 6d 65 3b 20 20 20  ar *filename;   
2c20: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2c30: 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c 65  f the input file
2c40: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6f 75 74 6e   */.  char *outn
2c50: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
2c60: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 75  * Name of the cu
2c70: 72 72 65 6e 74 20 6f 75 74 70 75 74 20 66 69 6c  rrent output fil
2c80: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 74 6f 6b  e */.  char *tok
2c90: 65 6e 70 72 65 66 69 78 3b 20 20 20 20 20 20 20  enprefix;       
2ca0: 2f 2a 20 41 20 70 72 65 66 69 78 20 61 64 64 65  /* A prefix adde
2cb0: 64 20 74 6f 20 74 6f 6b 65 6e 20 6e 61 6d 65 73  d to token names
2cc0: 20 69 6e 20 74 68 65 20 2e 68 20 66 69 6c 65 20   in the .h file 
2cd0: 2a 2f 0a 20 20 69 6e 74 20 6e 63 6f 6e 66 6c 69  */.  int nconfli
2ce0: 63 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ct;           /*
2cf0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 73 69   Number of parsi
2d00: 6e 67 20 63 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a  ng conflicts */.
2d10: 20 20 69 6e 74 20 74 61 62 6c 65 73 69 7a 65 3b    int tablesize;
2d20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
2d30: 7a 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 20  ze of the parse 
2d40: 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20  tables */.  int 
2d50: 62 61 73 69 73 66 6c 61 67 3b 20 20 20 20 20 20  basisflag;      
2d60: 20 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 6f 6e       /* Print on
2d70: 6c 79 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75  ly basis configu
2d80: 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  rations */.  int
2d90: 20 68 61 73 5f 66 61 6c 6c 62 61 63 6b 3b 20 20   has_fallback;  
2da0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2db0: 20 61 6e 79 20 25 66 61 6c 6c 62 61 63 6b 20 69   any %fallback i
2dc0: 73 20 73 65 65 6e 20 69 6e 20 74 68 65 20 67 72  s seen in the gr
2dd0: 61 6d 6d 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  ammer */.  char 
2de0: 2a 61 72 67 76 30 3b 20 20 20 20 20 20 20 20 20  *argv0;         
2df0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2e00: 68 65 20 70 72 6f 67 72 61 6d 20 2a 2f 0a 7d 3b  he program */.};
2e10: 0a 0a 23 64 65 66 69 6e 65 20 4d 65 6d 6f 72 79  ..#define Memory
2e20: 43 68 65 63 6b 28 58 29 20 69 66 28 28 58 29 3d  Check(X) if((X)=
2e30: 3d 30 29 7b 20 5c 0a 20 20 65 78 74 65 72 6e 20  =0){ \.  extern 
2e40: 76 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f  void memory_erro
2e50: 72 28 29 3b 20 5c 0a 20 20 6d 65 6d 6f 72 79 5f  r(); \.  memory_
2e60: 65 72 72 6f 72 28 29 3b 20 5c 0a 7d 0a 0a 2f 2a  error(); \.}../*
2e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
2e80: 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 74  From the file "t
2e90: 61 62 6c 65 2e 68 22 20 2a 2a 2a 2a 2a 2a 2a 2a  able.h" ********
2ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
2ec0: 20 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69   All code in thi
2ed0: 73 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  s file has been 
2ee0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65  automatically ge
2ef0: 6e 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20  nerated.** from 
2f00: 61 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20  a specification 
2f10: 69 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20  in the file.**  
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 22 74 61 62              "tab
2f30: 6c 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20  le.q".** by the 
2f40: 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61  associative arra
2f50: 79 20 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20  y code building 
2f60: 70 72 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e  program "aagen".
2f70: 0a 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20  .** Do not edit 
2f80: 74 68 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74  this file!  Inst
2f90: 65 61 64 2c 20 65 64 69 74 20 74 68 65 20 73 70  ead, edit the sp
2fa0: 65 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66  ecification.** f
2fb0: 69 6c 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20  ile, then rerun 
2fc0: 61 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20  aagen..*/./*.** 
2fd0: 43 6f 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73  Code for process
2fe0: 69 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68  ing tables in th
2ff0: 65 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67  e LEMON parser g
3000: 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a  enerator..*/../*
3010: 20 52 6f 75 74 69 6e 65 73 20 66 6f 72 20 68 61   Routines for ha
3020: 6e 64 6c 69 6e 67 20 61 20 73 74 72 69 6e 67 73  ndling a strings
3030: 20 2a 2f 0a 0a 63 68 61 72 20 2a 53 74 72 73 61   */..char *Strsa
3040: 66 65 28 29 3b 0a 0a 76 6f 69 64 20 53 74 72 73  fe();..void Strs
3050: 61 66 65 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64  afe_init(/* void
3060: 20 2a 2f 29 3b 0a 69 6e 74 20 53 74 72 73 61 66   */);.int Strsaf
3070: 65 5f 69 6e 73 65 72 74 28 2f 2a 20 63 68 61 72  e_insert(/* char
3080: 20 2a 20 2a 2f 29 3b 0a 63 68 61 72 20 2a 53 74   * */);.char *St
3090: 72 73 61 66 65 5f 66 69 6e 64 28 2f 2a 20 63 68  rsafe_find(/* ch
30a0: 61 72 20 2a 20 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f  ar * */);../* Ro
30b0: 75 74 69 6e 65 73 20 66 6f 72 20 68 61 6e 64 6c  utines for handl
30c0: 69 6e 67 20 73 79 6d 62 6f 6c 73 20 6f 66 20 74  ing symbols of t
30d0: 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 0a 73  he grammar */..s
30e0: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53 79  truct symbol *Sy
30f0: 6d 62 6f 6c 5f 6e 65 77 28 29 3b 0a 69 6e 74 20  mbol_new();.int 
3100: 53 79 6d 62 6f 6c 63 6d 70 70 28 2f 2a 20 73 74  Symbolcmpp(/* st
3110: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a 2c 20  ruct symbol **, 
3120: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
3130: 20 2a 2f 29 3b 0a 76 6f 69 64 20 53 79 6d 62 6f   */);.void Symbo
3140: 6c 5f 69 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a  l_init(/* void *
3150: 2f 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 69  /);.int Symbol_i
3160: 6e 73 65 72 74 28 2f 2a 20 73 74 72 75 63 74 20  nsert(/* struct 
3170: 73 79 6d 62 6f 6c 20 2a 2c 20 63 68 61 72 20 2a  symbol *, char *
3180: 20 2a 2f 29 3b 0a 73 74 72 75 63 74 20 73 79 6d   */);.struct sym
3190: 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 66 69 6e 64  bol *Symbol_find
31a0: 28 2f 2a 20 63 68 61 72 20 2a 20 2a 2f 29 3b 0a  (/* char * */);.
31b0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 53  struct symbol *S
31c0: 79 6d 62 6f 6c 5f 4e 74 68 28 2f 2a 20 69 6e 74  ymbol_Nth(/* int
31d0: 20 2a 2f 29 3b 0a 69 6e 74 20 53 79 6d 62 6f 6c   */);.int Symbol
31e0: 5f 63 6f 75 6e 74 28 2f 2a 20 20 2a 2f 29 3b 0a  _count(/*  */);.
31f0: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 2a  struct symbol **
3200: 53 79 6d 62 6f 6c 5f 61 72 72 61 79 6f 66 28 2f  Symbol_arrayof(/
3210: 2a 20 20 2a 2f 29 3b 0a 0a 2f 2a 20 52 6f 75 74  *  */);../* Rout
3220: 69 6e 65 73 20 74 6f 20 6d 61 6e 61 67 65 20 74  ines to manage t
3230: 68 65 20 73 74 61 74 65 20 74 61 62 6c 65 20 2a  he state table *
3240: 2f 0a 0a 69 6e 74 20 43 6f 6e 66 69 67 63 6d 70  /..int Configcmp
3250: 28 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e 66 69  (/* struct confi
3260: 67 20 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e 66  g *, struct conf
3270: 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63 74  ig * */);.struct
3280: 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 6e 65   state *State_ne
3290: 77 28 29 3b 0a 76 6f 69 64 20 53 74 61 74 65 5f  w();.void State_
32a0: 69 6e 69 74 28 2f 2a 20 76 6f 69 64 20 2a 2f 29  init(/* void */)
32b0: 3b 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65  ;.int State_inse
32c0: 72 74 28 2f 2a 20 73 74 72 75 63 74 20 73 74 61  rt(/* struct sta
32d0: 74 65 20 2a 2c 20 73 74 72 75 63 74 20 63 6f 6e  te *, struct con
32e0: 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63  fig * */);.struc
32f0: 74 20 73 74 61 74 65 20 2a 53 74 61 74 65 5f 66  t state *State_f
3300: 69 6e 64 28 2f 2a 20 73 74 72 75 63 74 20 63 6f  ind(/* struct co
3310: 6e 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75  nfig * */);.stru
3320: 63 74 20 73 74 61 74 65 20 2a 2a 53 74 61 74 65  ct state **State
3330: 5f 61 72 72 61 79 6f 66 28 2f 2a 20 20 2a 2f 29  _arrayof(/*  */)
3340: 3b 0a 0a 2f 2a 20 52 6f 75 74 69 6e 65 73 20 75  ;../* Routines u
3350: 73 65 64 20 66 6f 72 20 65 66 66 69 63 69 65 6e  sed for efficien
3360: 63 79 20 69 6e 20 43 6f 6e 66 69 67 6c 69 73 74  cy in Configlist
3370: 5f 61 64 64 20 2a 2f 0a 0a 76 6f 69 64 20 43 6f  _add */..void Co
3380: 6e 66 69 67 74 61 62 6c 65 5f 69 6e 69 74 28 2f  nfigtable_init(/
3390: 2a 20 76 6f 69 64 20 2a 2f 29 3b 0a 69 6e 74 20  * void */);.int 
33a0: 43 6f 6e 66 69 67 74 61 62 6c 65 5f 69 6e 73 65  Configtable_inse
33b0: 72 74 28 2f 2a 20 73 74 72 75 63 74 20 63 6f 6e  rt(/* struct con
33c0: 66 69 67 20 2a 20 2a 2f 29 3b 0a 73 74 72 75 63  fig * */);.struc
33d0: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
33e0: 74 61 62 6c 65 5f 66 69 6e 64 28 2f 2a 20 73 74  table_find(/* st
33f0: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a 2f  ruct config * */
3400: 29 3b 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61  );.void Configta
3410: 62 6c 65 5f 63 6c 65 61 72 28 2f 2a 20 69 6e 74  ble_clear(/* int
3420: 28 2a 29 28 73 74 72 75 63 74 20 63 6f 6e 66 69  (*)(struct confi
3430: 67 20 2a 29 20 2a 2f 29 3b 0a 2f 2a 2a 2a 2a 2a  g *) */);./*****
3440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72  ************* Fr
3450: 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 61 63 74  om the file "act
3460: 69 6f 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion.c" *********
3470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3480: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f  ******/./*.** Ro
3490: 75 74 69 6e 65 73 20 70 72 6f 63 65 73 73 69 6e  utines processin
34a0: 67 20 70 61 72 73 65 72 20 61 63 74 69 6f 6e 73  g parser actions
34b0: 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61   in the LEMON pa
34c0: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
34d0: 2a 2f 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  */../* Allocate 
34e0: 61 20 6e 65 77 20 70 61 72 73 65 72 20 61 63 74  a new parser act
34f0: 69 6f 6e 20 2a 2f 0a 73 74 72 75 63 74 20 61 63  ion */.struct ac
3500: 74 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 6e 65 77  tion *Action_new
3510: 28 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  (){.  static str
3520: 75 63 74 20 61 63 74 69 6f 6e 20 2a 66 72 65 65  uct action *free
3530: 6c 69 73 74 20 3d 20 30 3b 0a 20 20 73 74 72 75  list = 0;.  stru
3540: 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 3b 0a  ct action *new;.
3550: 0a 20 20 69 66 28 20 66 72 65 65 6c 69 73 74 3d  .  if( freelist=
3560: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
3570: 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 31  .    int amt = 1
3580: 30 30 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74  00;.    freelist
3590: 20 3d 20 28 73 74 72 75 63 74 20 61 63 74 69 6f   = (struct actio
35a0: 6e 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  n *)malloc( size
35b0: 6f 66 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e  of(struct action
35c0: 29 2a 61 6d 74 20 29 3b 0a 20 20 20 20 69 66 28  )*amt );.    if(
35d0: 20 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a   freelist==0 ){.
35e0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
35f0: 64 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20  derr,"Unable to 
3600: 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  allocate memory 
3610: 66 6f 72 20 61 20 6e 65 77 20 70 61 72 73 65 72  for a new parser
3620: 20 61 63 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20   action.");.    
3630: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d    exit(1);.    }
3640: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
3650: 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65  amt-1; i++) free
3660: 6c 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26  list[i].next = &
3670: 66 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20  freelist[i+1];. 
3680: 20 20 20 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d     freelist[amt-
3690: 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d  1].next = 0;.  }
36a0: 0a 20 20 6e 65 77 20 3d 20 66 72 65 65 6c 69 73  .  new = freelis
36b0: 74 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20  t;.  freelist = 
36c0: 66 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a  freelist->next;.
36d0: 20 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a    return new;.}.
36e0: 0a 2f 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  ./* Compare two 
36f0: 61 63 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69  actions */.stati
3700: 63 20 69 6e 74 20 61 63 74 69 6f 6e 63 6d 70 28  c int actioncmp(
3710: 61 70 31 2c 61 70 32 29 0a 73 74 72 75 63 74 20  ap1,ap2).struct 
3720: 61 63 74 69 6f 6e 20 2a 61 70 31 3b 0a 73 74 72  action *ap1;.str
3730: 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 32 3b  uct action *ap2;
3740: 0a 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72  .{.  int rc;.  r
3750: 63 20 3d 20 61 70 31 2d 3e 73 70 2d 3e 69 6e 64  c = ap1->sp->ind
3760: 65 78 20 2d 20 61 70 32 2d 3e 73 70 2d 3e 69 6e  ex - ap2->sp->in
3770: 64 65 78 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  dex;.  if( rc==0
3780: 20 29 20 72 63 20 3d 20 28 69 6e 74 29 61 70 31   ) rc = (int)ap1
3790: 2d 3e 74 79 70 65 20 2d 20 28 69 6e 74 29 61 70  ->type - (int)ap
37a0: 32 2d 3e 74 79 70 65 3b 0a 20 20 69 66 28 20 72  2->type;.  if( r
37b0: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  c==0 ){.    asse
37c0: 72 74 28 20 61 70 31 2d 3e 74 79 70 65 3d 3d 52  rt( ap1->type==R
37d0: 45 44 55 43 45 20 7c 7c 20 61 70 31 2d 3e 74 79  EDUCE || ap1->ty
37e0: 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44 20  pe==RD_RESOLVED 
37f0: 7c 7c 20 61 70 31 2d 3e 74 79 70 65 3d 3d 43 4f  || ap1->type==CO
3800: 4e 46 4c 49 43 54 29 3b 0a 20 20 20 20 61 73 73  NFLICT);.    ass
3810: 65 72 74 28 20 61 70 32 2d 3e 74 79 70 65 3d 3d  ert( ap2->type==
3820: 52 45 44 55 43 45 20 7c 7c 20 61 70 32 2d 3e 74  REDUCE || ap2->t
3830: 79 70 65 3d 3d 52 44 5f 52 45 53 4f 4c 56 45 44  ype==RD_RESOLVED
3840: 20 7c 7c 20 61 70 32 2d 3e 74 79 70 65 3d 3d 43   || ap2->type==C
3850: 4f 4e 46 4c 49 43 54 29 3b 0a 20 20 20 20 72 63  ONFLICT);.    rc
3860: 20 3d 20 61 70 31 2d 3e 78 2e 72 70 2d 3e 69 6e   = ap1->x.rp->in
3870: 64 65 78 20 2d 20 61 70 32 2d 3e 78 2e 72 70 2d  dex - ap2->x.rp-
3880: 3e 69 6e 64 65 78 3b 0a 20 20 7d 0a 20 20 72 65  >index;.  }.  re
3890: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 53  turn rc;.}../* S
38a0: 6f 72 74 20 70 61 72 73 65 72 20 61 63 74 69 6f  ort parser actio
38b0: 6e 73 20 2a 2f 0a 73 74 72 75 63 74 20 61 63 74  ns */.struct act
38c0: 69 6f 6e 20 2a 41 63 74 69 6f 6e 5f 73 6f 72 74  ion *Action_sort
38d0: 28 61 70 29 0a 73 74 72 75 63 74 20 61 63 74 69  (ap).struct acti
38e0: 6f 6e 20 2a 61 70 3b 0a 7b 0a 20 20 61 70 20 3d  on *ap;.{.  ap =
38f0: 20 28 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20   (struct action 
3900: 2a 29 6d 73 6f 72 74 28 61 70 2c 26 61 70 2d 3e  *)msort(ap,&ap->
3910: 6e 65 78 74 2c 61 63 74 69 6f 6e 63 6d 70 29 3b  next,actioncmp);
3920: 0a 20 20 72 65 74 75 72 6e 20 61 70 3b 0a 7d 0a  .  return ap;.}.
3930: 0a 76 6f 69 64 20 41 63 74 69 6f 6e 5f 61 64 64  .void Action_add
3940: 28 61 70 70 2c 74 79 70 65 2c 73 70 2c 61 72 67  (app,type,sp,arg
3950: 29 0a 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20  ).struct action 
3960: 2a 2a 61 70 70 3b 0a 65 6e 75 6d 20 65 5f 61 63  **app;.enum e_ac
3970: 74 69 6f 6e 20 74 79 70 65 3b 0a 73 74 72 75 63  tion type;.struc
3980: 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b 0a 63 68  t symbol *sp;.ch
3990: 61 72 20 2a 61 72 67 3b 0a 7b 0a 20 20 73 74 72  ar *arg;.{.  str
39a0: 75 63 74 20 61 63 74 69 6f 6e 20 2a 6e 65 77 3b  uct action *new;
39b0: 0a 20 20 6e 65 77 20 3d 20 41 63 74 69 6f 6e 5f  .  new = Action_
39c0: 6e 65 77 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e 65  new();.  new->ne
39d0: 78 74 20 3d 20 2a 61 70 70 3b 0a 20 20 2a 61 70  xt = *app;.  *ap
39e0: 70 20 3d 20 6e 65 77 3b 0a 20 20 6e 65 77 2d 3e  p = new;.  new->
39f0: 74 79 70 65 20 3d 20 74 79 70 65 3b 0a 20 20 6e  type = type;.  n
3a00: 65 77 2d 3e 73 70 20 3d 20 73 70 3b 0a 20 20 69  ew->sp = sp;.  i
3a10: 66 28 20 74 79 70 65 3d 3d 53 48 49 46 54 20 29  f( type==SHIFT )
3a20: 7b 0a 20 20 20 20 6e 65 77 2d 3e 78 2e 73 74 70  {.    new->x.stp
3a30: 20 3d 20 28 73 74 72 75 63 74 20 73 74 61 74 65   = (struct state
3a40: 20 2a 29 61 72 67 3b 0a 20 20 7d 65 6c 73 65 7b   *)arg;.  }else{
3a50: 0a 20 20 20 20 6e 65 77 2d 3e 78 2e 72 70 20 3d  .    new->x.rp =
3a60: 20 28 73 74 72 75 63 74 20 72 75 6c 65 20 2a 29   (struct rule *)
3a70: 61 72 67 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a  arg;.  }.}./****
3a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
3a90: 2a 2a 20 4e 65 77 20 63 6f 64 65 20 74 6f 20 69  ** New code to i
3aa0: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 22 61 63  mplement the "ac
3ab0: 74 74 61 62 22 20 6d 6f 64 75 6c 65 20 2a 2a 2a  ttab" module ***
3ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
3ad0: 54 68 69 73 20 6d 6f 64 75 6c 65 20 69 6d 70 6c  This module impl
3ae0: 65 6d 65 6e 74 73 20 72 6f 75 74 69 6e 65 73 20  ements routines 
3af0: 75 73 65 20 74 6f 20 63 6f 6e 73 74 72 75 63 74  use to construct
3b00: 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 5b 5d   the yy_action[]
3b10: 20 74 61 62 6c 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a   table..*/../*.*
3b20: 2a 20 54 68 65 20 73 74 61 74 65 20 6f 66 20 74  * The state of t
3b30: 68 65 20 79 79 5f 61 63 74 69 6f 6e 20 74 61 62  he yy_action tab
3b40: 6c 65 20 75 6e 64 65 72 20 63 6f 6e 73 74 72 75  le under constru
3b50: 63 74 69 6f 6e 20 69 73 20 61 6e 20 69 6e 73 74  ction is an inst
3b60: 61 6e 63 65 20 6f 66 0a 2a 2a 20 74 68 65 20 66  ance of.** the f
3b70: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
3b80: 72 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  re.*/.typedef st
3b90: 72 75 63 74 20 61 63 74 74 61 62 20 61 63 74 74  ruct acttab actt
3ba0: 61 62 3b 0a 73 74 72 75 63 74 20 61 63 74 74 61  ab;.struct actta
3bb0: 62 20 7b 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f  b {.  int nActio
3bc0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3bd0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3be0: 75 73 65 64 20 73 6c 6f 74 73 20 69 6e 20 61 41  used slots in aA
3bf0: 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20 69 6e 74  ction[] */.  int
3c00: 20 6e 41 63 74 69 6f 6e 41 6c 6c 6f 63 3b 20 20   nActionAlloc;  
3c10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f            /* Slo
3c20: 74 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ts allocated for
3c30: 20 61 41 63 74 69 6f 6e 5b 5d 20 2a 2f 0a 20 20   aAction[] */.  
3c40: 73 74 72 75 63 74 20 7b 0a 20 20 20 20 69 6e 74  struct {.    int
3c50: 20 6c 6f 6f 6b 61 68 65 61 64 3b 20 20 20 20 20   lookahead;     
3c60: 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
3c70: 20 6f 66 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61   of the lookahea
3c80: 64 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 69  d token */.    i
3c90: 6e 74 20 61 63 74 69 6f 6e 3b 20 20 20 20 20 20  nt action;      
3ca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 74            /* Act
3cb0: 69 6f 6e 20 74 6f 20 74 61 6b 65 20 6f 6e 20 74  ion to take on t
3cc0: 68 65 20 67 69 76 65 6e 20 6c 6f 6f 6b 61 68 65  he given lookahe
3cd0: 61 64 20 2a 2f 0a 20 20 7d 20 2a 61 41 63 74 69  ad */.  } *aActi
3ce0: 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
3cf0: 20 20 20 20 20 2f 2a 20 54 68 65 20 79 79 5f 61       /* The yy_a
3d00: 63 74 69 6f 6e 5b 5d 20 74 61 62 6c 65 20 75 6e  ction[] table un
3d10: 64 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e  der construction
3d20: 20 2a 2f 0a 20 20 20 20 2a 61 4c 6f 6f 6b 61 68   */.    *aLookah
3d30: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
3d40: 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6e     /* A single n
3d50: 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  ew transaction s
3d60: 65 74 20 2a 2f 0a 20 20 69 6e 74 20 6d 6e 4c 6f  et */.  int mnLo
3d70: 6f 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20  okahead;        
3d80: 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20       /* Minimum 
3d90: 61 4c 6f 6f 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f  aLookahead[].loo
3da0: 6b 61 68 65 61 64 20 2a 2f 0a 20 20 69 6e 74 20  kahead */.  int 
3db0: 6d 6e 41 63 74 69 6f 6e 3b 20 20 20 20 20 20 20  mnAction;       
3dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 63 74 69           /* Acti
3dd0: 6f 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  on associated wi
3de0: 74 68 20 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2a  th mnLookahead *
3df0: 2f 0a 20 20 69 6e 74 20 6d 78 4c 6f 6f 6b 61 68  /.  int mxLookah
3e00: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
3e10: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 4c 6f 6f   /* Maximum aLoo
3e20: 6b 61 68 65 61 64 5b 5d 2e 6c 6f 6f 6b 61 68 65  kahead[].lookahe
3e30: 61 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  ad */.  int nLoo
3e40: 6b 61 68 65 61 64 3b 20 20 20 20 20 20 20 20 20  kahead;         
3e50: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 73 6c 6f       /* Used slo
3e60: 74 73 20 69 6e 20 61 4c 6f 6f 6b 61 68 65 61 64  ts in aLookahead
3e70: 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 6f  [] */.  int nLoo
3e80: 6b 61 68 65 61 64 41 6c 6c 6f 63 3b 20 20 20 20  kaheadAlloc;    
3e90: 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 61 6c       /* Slots al
3ea0: 6c 6f 63 61 74 65 64 20 69 6e 20 61 4c 6f 6f 6b  located in aLook
3eb0: 61 68 65 61 64 5b 5d 20 2a 2f 0a 7d 3b 0a 0a 2f  ahead[] */.};../
3ec0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
3ed0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
3ee0: 6e 20 74 68 65 20 79 79 5f 61 63 74 69 6f 6e 20  n the yy_action 
3ef0: 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65  table */.#define
3f00: 20 61 63 74 74 61 62 5f 73 69 7a 65 28 58 29 20   acttab_size(X) 
3f10: 28 28 58 29 2d 3e 6e 41 63 74 69 6f 6e 29 0a 0a  ((X)->nAction)..
3f20: 2f 2a 20 54 68 65 20 76 61 6c 75 65 20 66 6f 72  /* The value for
3f30: 20 74 68 65 20 4e 2d 74 68 20 65 6e 74 72 79 20   the N-th entry 
3f40: 69 6e 20 79 79 5f 61 63 74 69 6f 6e 20 2a 2f 0a  in yy_action */.
3f50: 23 64 65 66 69 6e 65 20 61 63 74 74 61 62 5f 79  #define acttab_y
3f60: 79 61 63 74 69 6f 6e 28 58 2c 4e 29 20 20 28 28  yaction(X,N)  ((
3f70: 58 29 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 61  X)->aAction[N].a
3f80: 63 74 69 6f 6e 29 0a 0a 2f 2a 20 54 68 65 20 76  ction)../* The v
3f90: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 4e 2d 74  alue for the N-t
3fa0: 68 20 65 6e 74 72 79 20 69 6e 20 79 79 5f 6c 6f  h entry in yy_lo
3fb0: 6f 6b 61 68 65 61 64 20 2a 2f 0a 23 64 65 66 69  okahead */.#defi
3fc0: 6e 65 20 61 63 74 74 61 62 5f 79 79 6c 6f 6f 6b  ne acttab_yylook
3fd0: 61 68 65 61 64 28 58 2c 4e 29 20 20 28 28 58 29  ahead(X,N)  ((X)
3fe0: 2d 3e 61 41 63 74 69 6f 6e 5b 4e 5d 2e 6c 6f 6f  ->aAction[N].loo
3ff0: 6b 61 68 65 61 64 29 0a 0a 2f 2a 20 46 72 65 65  kahead)../* Free
4000: 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
4010: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
4020: 67 69 76 65 6e 20 61 63 74 74 61 62 20 2a 2f 0a  given acttab */.
4030: 76 6f 69 64 20 61 63 74 74 61 62 5f 66 72 65 65  void acttab_free
4040: 28 61 63 74 74 61 62 20 2a 70 29 7b 0a 20 20 66  (acttab *p){.  f
4050: 72 65 65 28 20 70 2d 3e 61 41 63 74 69 6f 6e 20  ree( p->aAction 
4060: 29 3b 0a 20 20 66 72 65 65 28 20 70 2d 3e 61 4c  );.  free( p->aL
4070: 6f 6f 6b 61 68 65 61 64 20 29 3b 0a 20 20 66 72  ookahead );.  fr
4080: 65 65 28 20 70 20 29 3b 0a 7d 0a 0a 2f 2a 20 41  ee( p );.}../* A
4090: 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61 63  llocate a new ac
40a0: 74 74 61 62 20 73 74 72 75 63 74 75 72 65 20 2a  ttab structure *
40b0: 2f 0a 61 63 74 74 61 62 20 2a 61 63 74 74 61 62  /.acttab *acttab
40c0: 5f 61 6c 6c 6f 63 28 76 6f 69 64 29 7b 0a 20 20  _alloc(void){.  
40d0: 61 63 74 74 61 62 20 2a 70 20 3d 20 6d 61 6c 6c  acttab *p = mall
40e0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  oc( sizeof(*p) )
40f0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
4100: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
4110: 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61 6c  rr,"Unable to al
4120: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
4130: 72 20 61 20 6e 65 77 20 61 63 74 74 61 62 2e 22  r a new acttab."
4140: 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
4150: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20    }.  memset(p, 
4160: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
4170: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
4180: 2a 20 41 64 64 20 61 20 6e 65 77 20 61 63 74 69  * Add a new acti
4190: 6f 6e 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  on to the curren
41a0: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65  t transaction se
41b0: 74 0a 2a 2f 0a 76 6f 69 64 20 61 63 74 74 61 62  t.*/.void acttab
41c0: 5f 61 63 74 69 6f 6e 28 61 63 74 74 61 62 20 2a  _action(acttab *
41d0: 70 2c 20 69 6e 74 20 6c 6f 6f 6b 61 68 65 61 64  p, int lookahead
41e0: 2c 20 69 6e 74 20 61 63 74 69 6f 6e 29 7b 0a 20  , int action){. 
41f0: 20 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65   if( p->nLookahe
4200: 61 64 3e 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  ad>=p->nLookahea
4210: 64 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d  dAlloc ){.    p-
4220: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 41 6c 6c 6f 63  >nLookaheadAlloc
4230: 20 2b 3d 20 32 35 3b 0a 20 20 20 20 70 2d 3e 61   += 25;.    p->a
4240: 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 72 65 61 6c  Lookahead = real
4250: 6c 6f 63 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65  loc( p->aLookahe
4260: 61 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ad,.            
4270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4280: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 6f 6f 6b   sizeof(p->aLook
4290: 61 68 65 61 64 5b 30 5d 29 2a 70 2d 3e 6e 4c 6f  ahead[0])*p->nLo
42a0: 6f 6b 61 68 65 61 64 41 6c 6c 6f 63 20 29 3b 0a  okaheadAlloc );.
42b0: 20 20 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b      if( p->aLook
42c0: 61 68 65 61 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ahead==0 ){.    
42d0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
42e0: 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c  ,"malloc failed\
42f0: 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  n");.      exit(
4300: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
4310: 69 66 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61  if( p->nLookahea
4320: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6d  d==0 ){.    p->m
4330: 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f  xLookahead = loo
4340: 6b 61 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d  kahead;.    p->m
4350: 6e 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c 6f 6f  nLookahead = loo
4360: 6b 61 68 65 61 64 3b 0a 20 20 20 20 70 2d 3e 6d  kahead;.    p->m
4370: 6e 41 63 74 69 6f 6e 20 3d 20 61 63 74 69 6f 6e  nAction = action
4380: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
4390: 66 28 20 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61  f( p->mxLookahea
43a0: 64 3c 6c 6f 6f 6b 61 68 65 61 64 20 29 20 70 2d  d<lookahead ) p-
43b0: 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 3d 20 6c  >mxLookahead = l
43c0: 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 20 20 69 66  ookahead;.    if
43d0: 28 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64  ( p->mnLookahead
43e0: 3e 6c 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20  >lookahead ){.  
43f0: 20 20 20 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65      p->mnLookahe
4400: 61 64 20 3d 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a  ad = lookahead;.
4410: 20 20 20 20 20 20 70 2d 3e 6d 6e 41 63 74 69 6f        p->mnActio
4420: 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20  n = action;.    
4430: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c 6f 6f 6b  }.  }.  p->aLook
4440: 61 68 65 61 64 5b 70 2d 3e 6e 4c 6f 6f 6b 61 68  ahead[p->nLookah
4450: 65 61 64 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 3d  ead].lookahead =
4460: 20 6c 6f 6f 6b 61 68 65 61 64 3b 0a 20 20 70 2d   lookahead;.  p-
4470: 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 70 2d 3e 6e  >aLookahead[p->n
4480: 4c 6f 6f 6b 61 68 65 61 64 5d 2e 61 63 74 69 6f  Lookahead].actio
4490: 6e 20 3d 20 61 63 74 69 6f 6e 3b 0a 20 20 70 2d  n = action;.  p-
44a0: 3e 6e 4c 6f 6f 6b 61 68 65 61 64 2b 2b 3b 0a 7d  >nLookahead++;.}
44b0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20  ../*.** Add the 
44c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20  transaction set 
44d0: 62 75 69 6c 74 20 75 70 20 77 69 74 68 20 70 72  built up with pr
44e0: 69 6f 72 20 63 61 6c 6c 73 20 74 6f 20 61 63 74  ior calls to act
44f0: 74 61 62 5f 61 63 74 69 6f 6e 28 29 0a 2a 2a 20  tab_action().** 
4500: 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
4510: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20   action table.  
4520: 54 68 65 6e 20 72 65 73 65 74 20 74 68 65 20 74  Then reset the t
4530: 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 74 20 62  ransaction set b
4540: 61 63 6b 0a 2a 2a 20 74 6f 20 61 6e 20 65 6d 70  ack.** to an emp
4550: 74 79 20 73 65 74 20 69 6e 20 70 72 65 70 61 72  ty set in prepar
4560: 61 74 69 6f 6e 20 66 6f 72 20 61 20 6e 65 77 20  ation for a new 
4570: 72 6f 75 6e 64 20 6f 66 20 61 63 74 74 61 62 5f  round of acttab_
4580: 61 63 74 69 6f 6e 28 29 20 63 61 6c 6c 73 2e 0a  action() calls..
4590: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
45a0: 20 6f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65   offset into the
45b0: 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20 6f 66   action table of
45c0: 20 74 68 65 20 6e 65 77 20 74 72 61 6e 73 61 63   the new transac
45d0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 61 63 74  tion..*/.int act
45e0: 74 61 62 5f 69 6e 73 65 72 74 28 61 63 74 74 61  tab_insert(actta
45f0: 62 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 2c 20  b *p){.  int i, 
4600: 6a 2c 20 6b 2c 20 6e 3b 0a 20 20 61 73 73 65 72  j, k, n;.  asser
4610: 74 28 20 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64  t( p->nLookahead
4620: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65  >0 );..  /* Make
4630: 20 73 75 72 65 20 77 65 20 68 61 76 65 20 65 6e   sure we have en
4640: 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 68 6f  ough space to ho
4650: 6c 64 20 74 68 65 20 65 78 70 61 6e 64 65 64 20  ld the expanded 
4660: 61 63 74 69 6f 6e 20 74 61 62 6c 65 0a 20 20 2a  action table.  *
4670: 2a 20 69 6e 20 74 68 65 20 77 6f 72 73 74 20 63  * in the worst c
4680: 61 73 65 2e 20 20 54 68 65 20 77 6f 72 73 74 20  ase.  The worst 
4690: 63 61 73 65 20 6f 63 63 75 72 73 20 69 66 20 74  case occurs if t
46a0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
46b0: 65 74 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65 20  et.  ** must be 
46c0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
46d0: 63 75 72 72 65 6e 74 20 61 63 74 69 6f 6e 20 74  current action t
46e0: 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20  able.  */.  n = 
46f0: 70 2d 3e 6d 78 4c 6f 6f 6b 61 68 65 61 64 20 2b  p->mxLookahead +
4700: 20 31 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 41 63   1;.  if( p->nAc
4710: 74 69 6f 6e 20 2b 20 6e 20 3e 3d 20 70 2d 3e 6e  tion + n >= p->n
4720: 41 63 74 69 6f 6e 41 6c 6c 6f 63 20 29 7b 0a 20  ActionAlloc ){. 
4730: 20 20 20 69 6e 74 20 6f 6c 64 41 6c 6c 6f 63 20     int oldAlloc 
4740: 3d 20 70 2d 3e 6e 41 63 74 69 6f 6e 41 6c 6c 6f  = p->nActionAllo
4750: 63 3b 0a 20 20 20 20 70 2d 3e 6e 41 63 74 69 6f  c;.    p->nActio
4760: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 63 74  nAlloc = p->nAct
4770: 69 6f 6e 20 2b 20 6e 20 2b 20 70 2d 3e 6e 41 63  ion + n + p->nAc
4780: 74 69 6f 6e 41 6c 6c 6f 63 20 2b 20 32 30 3b 0a  tionAlloc + 20;.
4790: 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 20 3d      p->aAction =
47a0: 20 72 65 61 6c 6c 6f 63 28 20 70 2d 3e 61 41 63   realloc( p->aAc
47b0: 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  tion,.          
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47d0: 73 69 7a 65 6f 66 28 70 2d 3e 61 41 63 74 69 6f  sizeof(p->aActio
47e0: 6e 5b 30 5d 29 2a 70 2d 3e 6e 41 63 74 69 6f 6e  n[0])*p->nAction
47f0: 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20  Alloc);.    if( 
4800: 70 2d 3e 61 41 63 74 69 6f 6e 3d 3d 30 20 29 7b  p->aAction==0 ){
4810: 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73  .      fprintf(s
4820: 74 64 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61  tderr,"malloc fa
4830: 69 6c 65 64 5c 6e 22 29 3b 0a 20 20 20 20 20 20  iled\n");.      
4840: 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20  exit(1);.    }. 
4850: 20 20 20 66 6f 72 28 69 3d 6f 6c 64 41 6c 6c 6f     for(i=oldAllo
4860: 63 3b 20 69 3c 70 2d 3e 6e 41 63 74 69 6f 6e 41  c; i<p->nActionA
4870: 6c 6c 6f 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lloc; i++){.    
4880: 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e    p->aAction[i].
4890: 6c 6f 6f 6b 61 68 65 61 64 20 3d 20 2d 31 3b 0a  lookahead = -1;.
48a0: 20 20 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e        p->aAction
48b0: 5b 69 5d 2e 61 63 74 69 6f 6e 20 3d 20 2d 31 3b  [i].action = -1;
48c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
48d0: 20 53 63 61 6e 20 74 68 65 20 65 78 69 73 74 69   Scan the existi
48e0: 6e 67 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 20  ng action table 
48f0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 6e 20 6f  looking for an o
4900: 66 66 73 65 74 20 77 68 65 72 65 20 77 65 20 63  ffset where we c
4910: 61 6e 0a 20 20 2a 2a 20 69 6e 73 65 72 74 20 74  an.  ** insert t
4920: 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
4930: 61 63 74 69 6f 6e 20 73 65 74 2e 20 20 46 61 6c  action set.  Fal
4940: 6c 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f  l out of the loo
4950: 70 20 77 68 65 6e 20 74 68 61 74 0a 20 20 2a 2a  p when that.  **
4960: 20 6f 66 66 73 65 74 20 69 73 20 66 6f 75 6e 64   offset is found
4970: 2e 20 20 49 6e 20 74 68 65 20 77 6f 72 73 74 20  .  In the worst 
4980: 63 61 73 65 2c 20 77 65 20 66 61 6c 6c 20 6f 75  case, we fall ou
4990: 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70 20 77 68  t of the loop wh
49a0: 65 6e 0a 20 20 2a 2a 20 69 20 72 65 61 63 68 65  en.  ** i reache
49b0: 73 20 70 2d 3e 6e 41 63 74 69 6f 6e 2c 20 77 68  s p->nAction, wh
49c0: 69 63 68 20 6d 65 61 6e 73 20 77 65 20 61 70 70  ich means we app
49d0: 65 6e 64 20 74 68 65 20 6e 65 77 20 74 72 61 6e  end the new tran
49e0: 73 61 63 74 69 6f 6e 20 73 65 74 2e 0a 20 20 2a  saction set..  *
49f0: 2a 0a 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20  *.  ** i is the 
4a00: 69 6e 64 65 78 20 69 6e 20 70 2d 3e 61 41 63 74  index in p->aAct
4a10: 69 6f 6e 5b 5d 20 77 68 65 72 65 20 70 2d 3e 6d  ion[] where p->m
4a20: 6e 4c 6f 6f 6b 61 68 65 61 64 20 69 73 20 69 6e  nLookahead is in
4a30: 73 65 72 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 66  serted..  */.  f
4a40: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 41 63  or(i=0; i<p->nAc
4a50: 74 69 6f 6e 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68  tion+p->mnLookah
4a60: 65 61 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ead; i++){.    i
4a70: 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d  f( p->aAction[i]
4a80: 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30 20 29 7b 0a  .lookahead<0 ){.
4a90: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
4aa0: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b 20  <p->nLookahead; 
4ab0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6b 20  j++){.        k 
4ac0: 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b  = p->aLookahead[
4ad0: 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70  j].lookahead - p
4ae0: 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20  ->mnLookahead + 
4af0: 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b  i;.        if( k
4b00: 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  <0 ) break;.    
4b10: 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69      if( p->aActi
4b20: 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3e  on[k].lookahead>
4b30: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
4b40: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a 3c    }.      if( j<
4b50: 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29 20  p->nLookahead ) 
4b60: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
4b70: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41  for(j=0; j<p->nA
4b80: 63 74 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ction; j++){.   
4b90: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74       if( p->aAct
4ba0: 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[j].lookahead
4bb0: 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  ==j+p->mnLookahe
4bc0: 61 64 2d 69 20 29 20 62 72 65 61 6b 3b 0a 20 20  ad-i ) break;.  
4bd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
4be0: 6a 3d 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 7b  j==p->nAction ){
4bf0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 20  .        break; 
4c00: 20 2f 2a 20 46 69 74 73 20 69 6e 20 65 6d 70 74   /* Fits in empt
4c10: 79 20 73 6c 6f 74 73 20 2a 2f 0a 20 20 20 20 20  y slots */.     
4c20: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
4c30: 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 69 5d 2e 6c   p->aAction[i].l
4c40: 6f 6f 6b 61 68 65 61 64 3d 3d 70 2d 3e 6d 6e 4c  ookahead==p->mnL
4c50: 6f 6f 6b 61 68 65 61 64 20 29 7b 0a 20 20 20 20  ookahead ){.    
4c60: 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f 6e    if( p->aAction
4c70: 5b 69 5d 2e 61 63 74 69 6f 6e 21 3d 70 2d 3e 6d  [i].action!=p->m
4c80: 6e 41 63 74 69 6f 6e 20 29 20 63 6f 6e 74 69 6e  nAction ) contin
4c90: 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  ue;.      for(j=
4ca0: 30 3b 20 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65  0; j<p->nLookahe
4cb0: 61 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ad; j++){.      
4cc0: 20 20 6b 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68    k = p->aLookah
4cd0: 65 61 64 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ead[j].lookahead
4ce0: 20 2d 20 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65 61   - p->mnLookahea
4cf0: 64 20 2b 20 69 3b 0a 20 20 20 20 20 20 20 20 69  d + i;.        i
4d00: 66 28 20 6b 3c 30 20 7c 7c 20 6b 3e 3d 70 2d 3e  f( k<0 || k>=p->
4d10: 6e 41 63 74 69 6f 6e 20 29 20 62 72 65 61 6b 3b  nAction ) break;
4d20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
4d30: 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e 6c 6f  aLookahead[j].lo
4d40: 6f 6b 61 68 65 61 64 21 3d 70 2d 3e 61 41 63 74  okahead!=p->aAct
4d50: 69 6f 6e 5b 6b 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[k].lookahead
4d60: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
4d70: 20 20 69 66 28 20 70 2d 3e 61 4c 6f 6f 6b 61 68    if( p->aLookah
4d80: 65 61 64 5b 6a 5d 2e 61 63 74 69 6f 6e 21 3d 70  ead[j].action!=p
4d90: 2d 3e 61 41 63 74 69 6f 6e 5b 6b 5d 2e 61 63 74  ->aAction[k].act
4da0: 69 6f 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ion ) break;.   
4db0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6a     }.      if( j
4dc0: 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  <p->nLookahead )
4dd0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
4de0: 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f   n = 0;.      fo
4df0: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 41 63 74  r(j=0; j<p->nAct
4e00: 69 6f 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  ion; j++){.     
4e10: 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74 69 6f     if( p->aActio
4e20: 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64 3c 30  n[j].lookahead<0
4e30: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
4e40: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 41 63 74       if( p->aAct
4e50: 69 6f 6e 5b 6a 5d 2e 6c 6f 6f 6b 61 68 65 61 64  ion[j].lookahead
4e60: 3d 3d 6a 2b 70 2d 3e 6d 6e 4c 6f 6f 6b 61 68 65  ==j+p->mnLookahe
4e70: 61 64 2d 69 20 29 20 6e 2b 2b 3b 0a 20 20 20 20  ad-i ) n++;.    
4e80: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3d    }.      if( n=
4e90: 3d 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 20 29  =p->nLookahead )
4ea0: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
4eb0: 20 20 2f 2a 20 53 61 6d 65 20 61 73 20 61 20 70    /* Same as a p
4ec0: 72 69 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  rior transaction
4ed0: 20 73 65 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a   set */.      }.
4ee0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 49      }.  }.  /* I
4ef0: 6e 73 65 72 74 20 74 72 61 6e 73 61 63 74 69 6f  nsert transactio
4f00: 6e 20 73 65 74 20 61 74 20 69 6e 64 65 78 20 69  n set at index i
4f10: 2e 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  . */.  for(j=0; 
4f20: 6a 3c 70 2d 3e 6e 4c 6f 6f 6b 61 68 65 61 64 3b  j<p->nLookahead;
4f30: 20 6a 2b 2b 29 7b 0a 20 20 20 20 6b 20 3d 20 70   j++){.    k = p
4f40: 2d 3e 61 4c 6f 6f 6b 61 68 65 61 64 5b 6a 5d 2e  ->aLookahead[j].
4f50: 6c 6f 6f 6b 61 68 65 61 64 20 2d 20 70 2d 3e 6d  lookahead - p->m
4f60: 6e 4c 6f 6f 6b 61 68 65 61 64 20 2b 20 69 3b 0a  nLookahead + i;.
4f70: 20 20 20 20 70 2d 3e 61 41 63 74 69 6f 6e 5b 6b      p->aAction[k
4f80: 5d 20 3d 20 70 2d 3e 61 4c 6f 6f 6b 61 68 65 61  ] = p->aLookahea
4f90: 64 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20 6b 3e  d[j];.    if( k>
4fa0: 3d 70 2d 3e 6e 41 63 74 69 6f 6e 20 29 20 70 2d  =p->nAction ) p-
4fb0: 3e 6e 41 63 74 69 6f 6e 20 3d 20 6b 2b 31 3b 0a  >nAction = k+1;.
4fc0: 20 20 7d 0a 20 20 70 2d 3e 6e 4c 6f 6f 6b 61 68    }.  p->nLookah
4fd0: 65 61 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 52  ead = 0;..  /* R
4fe0: 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65 74  eturn the offset
4ff0: 20 74 68 61 74 20 69 73 20 61 64 64 65 64 20 74   that is added t
5000: 6f 20 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20  o the lookahead 
5010: 69 6e 20 6f 72 64 65 72 20 74 6f 20 67 65 74 20  in order to get 
5020: 74 68 65 0a 20 20 2a 2a 20 69 6e 64 65 78 20 69  the.  ** index i
5030: 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e 20 6f 66  nto yy_action of
5040: 20 74 68 65 20 61 63 74 69 6f 6e 20 2a 2f 0a 20   the action */. 
5050: 20 72 65 74 75 72 6e 20 69 20 2d 20 70 2d 3e 6d   return i - p->m
5060: 6e 4c 6f 6f 6b 61 68 65 61 64 3b 0a 7d 0a 0a 2f  nLookahead;.}../
5070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5080: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
5090: 66 69 6c 65 20 22 61 73 73 65 72 74 2e 63 22 20  file "assert.c" 
50a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
50b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
50c0: 0a 2a 2a 20 41 20 6d 6f 72 65 20 65 66 66 69 63  .** A more effic
50d0: 69 65 6e 74 20 77 61 79 20 6f 66 20 68 61 6e 64  ient way of hand
50e0: 6c 69 6e 67 20 61 73 73 65 72 74 69 6f 6e 73 2e  ling assertions.
50f0: 0a 2a 2f 0a 76 6f 69 64 20 6d 79 61 73 73 65 72  .*/.void myasser
5100: 74 28 66 69 6c 65 2c 6c 69 6e 65 29 0a 63 68 61  t(file,line).cha
5110: 72 20 2a 66 69 6c 65 3b 0a 69 6e 74 20 6c 69 6e  r *file;.int lin
5120: 65 3b 0a 7b 0a 20 20 66 70 72 69 6e 74 66 28 73  e;.{.  fprintf(s
5130: 74 64 65 72 72 2c 22 41 73 73 65 72 74 69 6f 6e  tderr,"Assertion
5140: 20 66 61 69 6c 65 64 20 6f 6e 20 6c 69 6e 65 20   failed on line 
5150: 25 64 20 6f 66 20 66 69 6c 65 20 5c 22 25 73 5c  %d of file \"%s\
5160: 22 5c 6e 22 2c 6c 69 6e 65 2c 66 69 6c 65 29 3b  "\n",line,file);
5170: 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 2f 2a  .  exit(1);.}./*
5180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5190: 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66  ***** From the f
51a0: 69 6c 65 20 22 62 75 69 6c 64 2e 63 22 20 2a 2a  ile "build.c" **
51b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
51c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
51d0: 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 63  ** Routines to c
51e0: 6f 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 65 20  onstruction the 
51f0: 66 69 6e 69 74 65 20 73 74 61 74 65 20 6d 61 63  finite state mac
5200: 68 69 6e 65 20 66 6f 72 20 74 68 65 20 4c 45 4d  hine for the LEM
5210: 4f 4e 0a 2a 2a 20 70 61 72 73 65 72 20 67 65 6e  ON.** parser gen
5220: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 46  erator..*/../* F
5230: 69 6e 64 20 61 20 70 72 65 63 65 64 65 6e 63 65  ind a precedence
5240: 20 73 79 6d 62 6f 6c 20 6f 66 20 65 76 65 72 79   symbol of every
5250: 20 72 75 6c 65 20 69 6e 20 74 68 65 20 67 72 61   rule in the gra
5260: 6d 6d 61 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 6f  mmar..** .** Tho
5270: 73 65 20 72 75 6c 65 73 20 77 68 69 63 68 20 68  se rules which h
5280: 61 76 65 20 61 20 70 72 65 63 65 64 65 6e 63 65  ave a precedence
5290: 20 73 79 6d 62 6f 6c 20 63 6f 64 65 64 20 69 6e   symbol coded in
52a0: 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 67 72   the input.** gr
52b0: 61 6d 6d 61 72 20 75 73 69 6e 67 20 74 68 65 20  ammar using the 
52c0: 22 5b 73 79 6d 62 6f 6c 5d 22 20 63 6f 6e 73 74  "[symbol]" const
52d0: 72 75 63 74 20 77 69 6c 6c 20 61 6c 72 65 61 64  ruct will alread
52e0: 79 20 68 61 76 65 20 74 68 65 0a 2a 2a 20 72 70  y have the.** rp
52f0: 2d 3e 70 72 65 63 73 79 6d 20 66 69 65 6c 64 20  ->precsym field 
5300: 66 69 6c 6c 65 64 2e 20 20 4f 74 68 65 72 20 72  filled.  Other r
5310: 75 6c 65 73 20 74 61 6b 65 20 61 73 20 74 68 65  ules take as the
5320: 69 72 20 70 72 65 63 65 64 65 6e 63 65 0a 2a 2a  ir precedence.**
5330: 20 73 79 6d 62 6f 6c 20 74 68 65 20 66 69 72 73   symbol the firs
5340: 74 20 52 48 53 20 73 79 6d 62 6f 6c 20 77 69 74  t RHS symbol wit
5350: 68 20 61 20 64 65 66 69 6e 65 64 20 70 72 65 63  h a defined prec
5360: 65 64 65 6e 63 65 2e 20 20 49 66 20 74 68 65 72  edence.  If ther
5370: 65 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 52 48 53  e.** are not RHS
5380: 20 73 79 6d 62 6f 6c 73 20 77 69 74 68 20 61 20   symbols with a 
5390: 64 65 66 69 6e 65 64 20 70 72 65 63 65 64 65 6e  defined preceden
53a0: 63 65 2c 20 74 68 65 20 70 72 65 63 65 64 65 6e  ce, the preceden
53b0: 63 65 0a 2a 2a 20 73 79 6d 62 6f 6c 20 66 69 65  ce.** symbol fie
53c0: 6c 64 20 69 73 20 6c 65 66 74 20 62 6c 61 6e 6b  ld is left blank
53d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 52 75  ..*/.void FindRu
53e0: 6c 65 50 72 65 63 65 64 65 6e 63 65 73 28 78 70  lePrecedences(xp
53f0: 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a  ).struct lemon *
5400: 78 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 72  xp;.{.  struct r
5410: 75 6c 65 20 2a 72 70 3b 0a 20 20 66 6f 72 28 72  ule *rp;.  for(r
5420: 70 3d 78 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  p=xp->rule; rp; 
5430: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
5440: 20 20 69 66 28 20 72 70 2d 3e 70 72 65 63 73 79    if( rp->precsy
5450: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  m==0 ){.      in
5460: 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  t i;.      for(i
5470: 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
5480: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
5490: 28 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 70 72  ( rp->rhs[i]->pr
54a0: 65 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ec>=0 ){.       
54b0: 20 20 20 72 70 2d 3e 70 72 65 63 73 79 6d 20 3d     rp->precsym =
54c0: 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20 20 20   rp->rhs[i];.   
54d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d         break;..}
54e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
54f0: 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a   }.  return;.}..
5500: 2f 2a 20 46 69 6e 64 20 61 6c 6c 20 6e 6f 6e 74  /* Find all nont
5510: 65 72 6d 69 6e 61 6c 73 20 77 68 69 63 68 20 77  erminals which w
5520: 69 6c 6c 20 67 65 6e 65 72 61 74 65 20 74 68 65  ill generate the
5530: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a 2a   empty string..*
5540: 2a 20 54 68 65 6e 20 67 6f 20 62 61 63 6b 20 61  * Then go back a
5550: 6e 64 20 63 6f 6d 70 75 74 65 20 74 68 65 20 66  nd compute the f
5560: 69 72 73 74 20 73 65 74 73 20 6f 66 20 65 76 65  irst sets of eve
5570: 72 79 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a  ry nonterminal..
5580: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 73 65 74  ** The first set
5590: 20 69 73 20 74 68 65 20 73 65 74 20 6f 66 20 61   is the set of a
55a0: 6c 6c 20 74 65 72 6d 69 6e 61 6c 20 73 79 6d 62  ll terminal symb
55b0: 6f 6c 73 20 77 68 69 63 68 20 63 61 6e 20 62 65  ols which can be
55c0: 67 69 6e 0a 2a 2a 20 61 20 73 74 72 69 6e 67 20  gin.** a string 
55d0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 61  generated by tha
55e0: 74 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 0a 2a  t nonterminal..*
55f0: 2f 0a 76 6f 69 64 20 46 69 6e 64 46 69 72 73 74  /.void FindFirst
5600: 53 65 74 73 28 6c 65 6d 70 29 0a 73 74 72 75 63  Sets(lemp).struc
5610: 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b  t lemon *lemp;.{
5620: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
5630: 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69  ct rule *rp;.  i
5640: 6e 74 20 70 72 6f 67 72 65 73 73 3b 0a 0a 20 20  nt progress;..  
5650: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
5660: 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a  >nsymbol; i++){.
5670: 20 20 20 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c      lemp->symbol
5680: 73 5b 69 5d 2d 3e 6c 61 6d 62 64 61 20 3d 20 42  s[i]->lambda = B
5690: 5f 46 41 4c 53 45 3b 0a 20 20 7d 0a 20 20 66 6f  _FALSE;.  }.  fo
56a0: 72 28 69 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  r(i=lemp->ntermi
56b0: 6e 61 6c 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  nal; i<lemp->nsy
56c0: 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
56d0: 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
56e0: 2d 3e 66 69 72 73 74 73 65 74 20 3d 20 53 65 74  ->firstset = Set
56f0: 4e 65 77 28 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  New();.  }..  /*
5700: 20 46 69 72 73 74 20 63 6f 6d 70 75 74 65 20 61   First compute a
5710: 6c 6c 20 6c 61 6d 62 64 61 73 20 2a 2f 0a 20 20  ll lambdas */.  
5720: 64 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73  do{.    progress
5730: 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 72 70   = 0;.    for(rp
5740: 3d 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b  =lemp->rule; rp;
5750: 20 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20   rp=rp->next){. 
5760: 20 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73       if( rp->lhs
5770: 2d 3e 6c 61 6d 62 64 61 20 29 20 63 6f 6e 74 69  ->lambda ) conti
5780: 6e 75 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  nue;.      for(i
5790: 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20  =0; i<rp->nrhs; 
57a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 69  i++){.         i
57b0: 66 28 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6c  f( rp->rhs[i]->l
57c0: 61 6d 62 64 61 3d 3d 42 5f 46 41 4c 53 45 20 29  ambda==B_FALSE )
57d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
57e0: 20 20 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d        if( i==rp-
57f0: 3e 6e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  >nrhs ){.       
5800: 20 72 70 2d 3e 6c 68 73 2d 3e 6c 61 6d 62 64 61   rp->lhs->lambda
5810: 20 3d 20 42 5f 54 52 55 45 3b 0a 20 20 20 20 20   = B_TRUE;.     
5820: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
5830: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
5840: 20 7d 77 68 69 6c 65 28 20 70 72 6f 67 72 65 73   }while( progres
5850: 73 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63  s );..  /* Now c
5860: 6f 6d 70 75 74 65 20 61 6c 6c 20 66 69 72 73 74  ompute all first
5870: 20 73 65 74 73 20 2a 2f 0a 20 20 64 6f 7b 0a 20   sets */.  do{. 
5880: 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c     struct symbol
5890: 20 2a 73 31 2c 20 2a 73 32 3b 0a 20 20 20 20 70   *s1, *s2;.    p
58a0: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
58b0: 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72 75   for(rp=lemp->ru
58c0: 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e 6e  le; rp; rp=rp->n
58d0: 65 78 74 29 7b 0a 20 20 20 20 20 20 73 31 20 3d  ext){.      s1 =
58e0: 20 72 70 2d 3e 6c 68 73 3b 0a 20 20 20 20 20 20   rp->lhs;.      
58f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e  for(i=0; i<rp->n
5900: 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
5910: 20 20 20 73 32 20 3d 20 72 70 2d 3e 72 68 73 5b     s2 = rp->rhs[
5920: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
5930: 73 32 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  s2->type==TERMIN
5940: 41 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AL ){.          
5950: 70 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 41  progress += SetA
5960: 64 64 28 73 31 2d 3e 66 69 72 73 74 73 65 74 2c  dd(s1->firstset,
5970: 73 32 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  s2->index);.    
5980: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 65        break;..}e
5990: 6c 73 65 20 69 66 28 20 73 31 3d 3d 73 32 20 29  lse if( s1==s2 )
59a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
59b0: 73 31 2d 3e 6c 61 6d 62 64 61 3d 3d 42 5f 46 41  s1->lambda==B_FA
59c0: 4c 53 45 20 29 20 62 72 65 61 6b 3b 0a 09 7d 65  LSE ) break;..}e
59d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
59e0: 72 6f 67 72 65 73 73 20 2b 3d 20 53 65 74 55 6e  rogress += SetUn
59f0: 69 6f 6e 28 73 31 2d 3e 66 69 72 73 74 73 65 74  ion(s1->firstset
5a00: 2c 73 32 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a  ,s2->firstset);.
5a10: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 32            if( s2
5a20: 2d 3e 6c 61 6d 62 64 61 3d 3d 42 5f 46 41 4c 53  ->lambda==B_FALS
5a30: 45 20 29 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20  E ) break;..}.  
5a40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 77      }.    }.  }w
5a50: 68 69 6c 65 28 20 70 72 6f 67 72 65 73 73 20 29  hile( progress )
5a60: 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  ;.  return;.}../
5a70: 2a 20 43 6f 6d 70 75 74 65 20 61 6c 6c 20 4c 52  * Compute all LR
5a80: 28 30 29 20 73 74 61 74 65 73 20 66 6f 72 20 74  (0) states for t
5a90: 68 65 20 67 72 61 6d 6d 61 72 2e 20 20 4c 69 6e  he grammar.  Lin
5aa0: 6b 73 0a 2a 2a 20 61 72 65 20 61 64 64 65 64 20  ks.** are added 
5ab0: 74 6f 20 62 65 74 77 65 65 6e 20 73 6f 6d 65 20  to between some 
5ac0: 73 74 61 74 65 73 20 73 6f 20 74 68 61 74 20 74  states so that t
5ad0: 68 65 20 4c 52 28 31 29 20 66 6f 6c 6c 6f 77 20  he LR(1) follow 
5ae0: 73 65 74 73 0a 2a 2a 20 63 61 6e 20 62 65 20 63  sets.** can be c
5af0: 6f 6d 70 75 74 65 64 20 6c 61 74 65 72 2e 0a 2a  omputed later..*
5b00: 2f 0a 50 52 49 56 41 54 45 20 73 74 72 75 63 74  /.PRIVATE struct
5b10: 20 73 74 61 74 65 20 2a 67 65 74 73 74 61 74 65   state *getstate
5b20: 28 2f 2a 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e  (/* struct lemon
5b30: 20 2a 20 2a 2f 29 3b 20 20 2f 2a 20 66 6f 72 77   * */);  /* forw
5b40: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
5b50: 0a 76 6f 69 64 20 46 69 6e 64 53 74 61 74 65 73  .void FindStates
5b60: 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65  (lemp).struct le
5b70: 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73  mon *lemp;.{.  s
5b80: 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
5b90: 3b 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20  ;.  struct rule 
5ba0: 2a 72 70 3b 0a 0a 20 20 43 6f 6e 66 69 67 6c 69  *rp;..  Configli
5bb0: 73 74 5f 69 6e 69 74 28 29 3b 0a 0a 20 20 2f 2a  st_init();..  /*
5bc0: 20 46 69 6e 64 20 74 68 65 20 73 74 61 72 74 20   Find the start 
5bd0: 73 79 6d 62 6f 6c 20 2a 2f 0a 20 20 69 66 28 20  symbol */.  if( 
5be0: 6c 65 6d 70 2d 3e 73 74 61 72 74 20 29 7b 0a 20  lemp->start ){. 
5bf0: 20 20 20 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 66     sp = Symbol_f
5c00: 69 6e 64 28 6c 65 6d 70 2d 3e 73 74 61 72 74 29  ind(lemp->start)
5c10: 3b 0a 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20  ;.    if( sp==0 
5c20: 29 7b 0a 20 20 20 20 20 20 45 72 72 6f 72 4d 73  ){.      ErrorMs
5c30: 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65  g(lemp->filename
5c40: 2c 30 2c 0a 22 54 68 65 20 73 70 65 63 69 66 69  ,0,."The specifi
5c50: 65 64 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20  ed start symbol 
5c60: 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 5c 0a  \"%s\" is not \.
5c70: 69 6e 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c  in a nonterminal
5c80: 20 6f 66 20 74 68 65 20 67 72 61 6d 6d 61 72 2e   of the grammar.
5c90: 20 20 5c 22 25 73 5c 22 20 77 69 6c 6c 20 62 65    \"%s\" will be
5ca0: 20 75 73 65 64 20 61 73 20 74 68 65 20 73 74 61   used as the sta
5cb0: 72 74 20 5c 0a 73 79 6d 62 6f 6c 20 69 6e 73 74  rt \.symbol inst
5cc0: 65 61 64 2e 22 2c 6c 65 6d 70 2d 3e 73 74 61 72  ead.",lemp->star
5cd0: 74 2c 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68  t,lemp->rule->lh
5ce0: 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  s->name);.      
5cf0: 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
5d00: 3b 0a 20 20 20 20 20 20 73 70 20 3d 20 6c 65 6d  ;.      sp = lem
5d10: 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a 20 20  p->rule->lhs;.  
5d20: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
5d30: 20 73 70 20 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65   sp = lemp->rule
5d40: 2d 3e 6c 68 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ->lhs;.  }..  /*
5d50: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 73   Make sure the s
5d60: 74 61 72 74 20 73 79 6d 62 6f 6c 20 64 6f 65 73  tart symbol does
5d70: 6e 27 74 20 6f 63 63 75 72 20 6f 6e 20 74 68 65  n't occur on the
5d80: 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
5d90: 20 6f 66 0a 20 20 2a 2a 20 61 6e 79 20 72 75 6c   of.  ** any rul
5da0: 65 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  e.  Report an er
5db0: 72 6f 72 20 69 66 20 69 74 20 64 6f 65 73 2e 20  ror if it does. 
5dc0: 20 28 59 41 43 43 20 77 6f 75 6c 64 20 67 65 6e   (YACC would gen
5dd0: 65 72 61 74 65 20 61 20 6e 65 77 0a 20 20 2a 2a  erate a new.  **
5de0: 20 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 69 6e   start symbol in
5df0: 20 74 68 69 73 20 63 61 73 65 2e 29 20 2a 2f 0a   this case.) */.
5e00: 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
5e10: 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
5e20: 6e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 69  next){.    int i
5e30: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
5e40: 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
5e50: 0a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e 72  .      if( rp->r
5e60: 68 73 5b 69 5d 3d 3d 73 70 20 29 7b 0a 20 20 20  hs[i]==sp ){.   
5e70: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 6c 65       ErrorMsg(le
5e80: 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 30 2c 0a  mp->filename,0,.
5e90: 22 54 68 65 20 73 74 61 72 74 20 73 79 6d 62 6f  "The start symbo
5ea0: 6c 20 5c 22 25 73 5c 22 20 6f 63 63 75 72 73 20  l \"%s\" occurs 
5eb0: 6f 6e 20 74 68 65 20 5c 0a 72 69 67 68 74 2d 68  on the \.right-h
5ec0: 61 6e 64 20 73 69 64 65 20 6f 66 20 61 20 72 75  and side of a ru
5ed0: 6c 65 2e 20 54 68 69 73 20 77 69 6c 6c 20 72 65  le. This will re
5ee0: 73 75 6c 74 20 69 6e 20 61 20 70 61 72 73 65 72  sult in a parser
5ef0: 20 77 68 69 63 68 20 5c 0a 64 6f 65 73 20 6e 6f   which \.does no
5f00: 74 20 77 6f 72 6b 20 70 72 6f 70 65 72 6c 79 2e  t work properly.
5f10: 22 2c 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20  ",sp->name);.   
5f20: 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72       lemp->error
5f30: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  cnt++;.      }. 
5f40: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
5f50: 68 65 20 62 61 73 69 73 20 63 6f 6e 66 69 67 75  he basis configu
5f60: 72 61 74 69 6f 6e 20 73 65 74 20 66 6f 72 20 74  ration set for t
5f70: 68 65 20 66 69 72 73 74 20 73 74 61 74 65 0a 20  he first state. 
5f80: 20 2a 2a 20 69 73 20 61 6c 6c 20 72 75 6c 65 73   ** is all rules
5f90: 20 77 68 69 63 68 20 68 61 76 65 20 74 68 65 20   which have the 
5fa0: 73 74 61 72 74 20 73 79 6d 62 6f 6c 20 61 73 20  start symbol as 
5fb0: 74 68 65 69 72 0a 20 20 2a 2a 20 6c 65 66 74 2d  their.  ** left-
5fc0: 68 61 6e 64 20 73 69 64 65 20 2a 2f 0a 20 20 66  hand side */.  f
5fd0: 6f 72 28 72 70 3d 73 70 2d 3e 72 75 6c 65 3b 20  or(rp=sp->rule; 
5fe0: 72 70 3b 20 72 70 3d 72 70 2d 3e 6e 65 78 74 6c  rp; rp=rp->nextl
5ff0: 68 73 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  hs){.    struct 
6000: 63 6f 6e 66 69 67 20 2a 6e 65 77 63 66 70 3b 0a  config *newcfp;.
6010: 20 20 20 20 6e 65 77 63 66 70 20 3d 20 43 6f 6e      newcfp = Con
6020: 66 69 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73  figlist_addbasis
6030: 28 72 70 2c 30 29 3b 0a 20 20 20 20 53 65 74 41  (rp,0);.    SetA
6040: 64 64 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 30  dd(newcfp->fws,0
6050: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d  );.  }..  /* Com
6060: 70 75 74 65 20 74 68 65 20 66 69 72 73 74 20 73  pute the first s
6070: 74 61 74 65 2e 20 20 41 6c 6c 20 6f 74 68 65 72  tate.  All other
6080: 20 73 74 61 74 65 73 20 77 69 6c 6c 20 62 65 0a   states will be.
6090: 20 20 2a 2a 20 63 6f 6d 70 75 74 65 64 20 61 75    ** computed au
60a0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 75 72 69  tomatically duri
60b0: 6e 67 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  ng the computati
60c0: 6f 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  on of the first 
60d0: 6f 6e 65 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65  one..  ** The re
60e0: 74 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 20 74  turned pointer t
60f0: 6f 20 74 68 65 20 66 69 72 73 74 20 73 74 61 74  o the first stat
6100: 65 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 2a  e is not used. *
6110: 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 73 74 61  /.  (void)getsta
6120: 74 65 28 6c 65 6d 70 29 3b 0a 20 20 72 65 74 75  te(lemp);.  retu
6130: 72 6e 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  rn;.}../* Return
6140: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
6150: 73 74 61 74 65 20 77 68 69 63 68 20 69 73 20 64  state which is d
6160: 65 73 63 72 69 62 65 64 20 62 79 20 74 68 65 20  escribed by the 
6170: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 2a 2a  configuration.**
6180: 20 6c 69 73 74 20 77 68 69 63 68 20 68 61 73 20   list which has 
6190: 62 65 65 6e 20 62 75 69 6c 74 20 66 72 6f 6d 20  been built from 
61a0: 63 61 6c 6c 73 20 74 6f 20 43 6f 6e 66 69 67 6c  calls to Configl
61b0: 69 73 74 5f 61 64 64 2e 0a 2a 2f 0a 50 52 49 56  ist_add..*/.PRIV
61c0: 41 54 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68  ATE void buildsh
61d0: 69 66 74 73 28 2f 2a 20 73 74 72 75 63 74 20 6c  ifts(/* struct l
61e0: 65 6d 6f 6e 20 2a 2c 20 73 74 72 75 63 74 20 73  emon *, struct s
61f0: 74 61 74 65 20 2a 20 2a 2f 29 3b 20 2f 2a 20 46  tate * */); /* F
6200: 6f 72 77 64 20 72 65 66 20 2a 2f 0a 50 52 49 56  orwd ref */.PRIV
6210: 41 54 45 20 73 74 72 75 63 74 20 73 74 61 74 65  ATE struct state
6220: 20 2a 67 65 74 73 74 61 74 65 28 6c 65 6d 70 29   *getstate(lemp)
6230: 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
6240: 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  emp;.{.  struct 
6250: 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 62 70  config *cfp, *bp
6260: 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65  ;.  struct state
6270: 20 2a 73 74 70 3b 0a 0a 20 20 2f 2a 20 45 78 74   *stp;..  /* Ext
6280: 72 61 63 74 20 74 68 65 20 73 6f 72 74 65 64 20  ract the sorted 
6290: 62 61 73 69 73 20 6f 66 20 74 68 65 20 6e 65 77  basis of the new
62a0: 20 73 74 61 74 65 2e 20 20 54 68 65 20 62 61 73   state.  The bas
62b0: 69 73 20 77 61 73 20 63 6f 6e 73 74 72 75 63 74  is was construct
62c0: 65 64 0a 20 20 2a 2a 20 62 79 20 70 72 69 6f 72  ed.  ** by prior
62d0: 20 63 61 6c 6c 73 20 74 6f 20 22 43 6f 6e 66 69   calls to "Confi
62e0: 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 29  glist_addbasis()
62f0: 22 2e 20 2a 2f 0a 20 20 43 6f 6e 66 69 67 6c 69  ". */.  Configli
6300: 73 74 5f 73 6f 72 74 62 61 73 69 73 28 29 3b 0a  st_sortbasis();.
6310: 20 20 62 70 20 3d 20 43 6f 6e 66 69 67 6c 69 73    bp = Configlis
6320: 74 5f 62 61 73 69 73 28 29 3b 0a 0a 20 20 2f 2a  t_basis();..  /*
6330: 20 47 65 74 20 61 20 73 74 61 74 65 20 77 69 74   Get a state wit
6340: 68 20 74 68 65 20 73 61 6d 65 20 62 61 73 69 73  h the same basis
6350: 20 2a 2f 0a 20 20 73 74 70 20 3d 20 53 74 61 74   */.  stp = Stat
6360: 65 5f 66 69 6e 64 28 62 70 29 3b 0a 20 20 69 66  e_find(bp);.  if
6370: 28 20 73 74 70 20 29 7b 0a 20 20 20 20 2f 2a 20  ( stp ){.    /* 
6380: 41 20 73 74 61 74 65 20 77 69 74 68 20 74 68 65  A state with the
6390: 20 73 61 6d 65 20 62 61 73 69 73 20 61 6c 72 65   same basis alre
63a0: 61 64 79 20 65 78 69 73 74 73 21 20 20 43 6f 70  ady exists!  Cop
63b0: 79 20 61 6c 6c 20 74 68 65 20 66 6f 6c 6c 6f 77  y all the follow
63c0: 2d 73 65 74 0a 20 20 20 20 2a 2a 20 70 72 6f 70  -set.    ** prop
63d0: 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 20 66 72  agation links fr
63e0: 6f 6d 20 74 68 65 20 73 74 61 74 65 20 75 6e 64  om the state und
63f0: 65 72 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20  er construction 
6400: 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  into the.    ** 
6410: 70 72 65 65 78 69 73 74 69 6e 67 20 73 74 61 74  preexisting stat
6420: 65 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 61  e, then return a
6430: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
6440: 70 72 65 65 78 69 73 74 69 6e 67 20 73 74 61 74  preexisting stat
6450: 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  e */.    struct 
6460: 63 6f 6e 66 69 67 20 2a 78 2c 20 2a 79 3b 0a 20  config *x, *y;. 
6470: 20 20 20 66 6f 72 28 78 3d 62 70 2c 20 79 3d 73     for(x=bp, y=s
6480: 74 70 2d 3e 62 70 3b 20 78 20 26 26 20 79 3b 20  tp->bp; x && y; 
6490: 78 3d 78 2d 3e 62 70 2c 20 79 3d 79 2d 3e 62 70  x=x->bp, y=y->bp
64a0: 29 7b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 63  ){.      Plink_c
64b0: 6f 70 79 28 26 79 2d 3e 62 70 6c 70 2c 78 2d 3e  opy(&y->bplp,x->
64c0: 62 70 6c 70 29 3b 0a 20 20 20 20 20 20 50 6c 69  bplp);.      Pli
64d0: 6e 6b 5f 64 65 6c 65 74 65 28 78 2d 3e 66 70 6c  nk_delete(x->fpl
64e0: 70 29 3b 0a 20 20 20 20 20 20 78 2d 3e 66 70 6c  p);.      x->fpl
64f0: 70 20 3d 20 78 2d 3e 62 70 6c 70 20 3d 20 30 3b  p = x->bplp = 0;
6500: 0a 20 20 20 20 7d 0a 20 20 20 20 63 66 70 20 3d  .    }.    cfp =
6510: 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74 75   Configlist_retu
6520: 72 6e 28 29 3b 0a 20 20 20 20 43 6f 6e 66 69 67  rn();.    Config
6530: 6c 69 73 74 5f 65 61 74 28 63 66 70 29 3b 0a 20  list_eat(cfp);. 
6540: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
6550: 68 69 73 20 72 65 61 6c 6c 79 20 69 73 20 61 20  his really is a 
6560: 6e 65 77 20 73 74 61 74 65 2e 20 20 43 6f 6e 73  new state.  Cons
6570: 74 72 75 63 74 20 61 6c 6c 20 74 68 65 20 64 65  truct all the de
6580: 74 61 69 6c 73 20 2a 2f 0a 20 20 20 20 43 6f 6e  tails */.    Con
6590: 66 69 67 6c 69 73 74 5f 63 6c 6f 73 75 72 65 28  figlist_closure(
65a0: 6c 65 6d 70 29 3b 20 20 20 20 2f 2a 20 43 6f 6d  lemp);    /* Com
65b0: 70 75 74 65 20 74 68 65 20 63 6f 6e 66 69 67 75  pute the configu
65c0: 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72 65 20 2a  ration closure *
65d0: 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73 74  /.    Configlist
65e0: 5f 73 6f 72 74 28 29 3b 20 20 20 20 20 20 20 20  _sort();        
65f0: 20 20 20 2f 2a 20 53 6f 72 74 20 74 68 65 20 63     /* Sort the c
6600: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f  onfiguration clo
6610: 73 75 72 65 20 2a 2f 0a 20 20 20 20 63 66 70 20  sure */.    cfp 
6620: 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 72 65 74  = Configlist_ret
6630: 75 72 6e 28 29 3b 20 20 20 2f 2a 20 47 65 74 20  urn();   /* Get 
6640: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
6650: 20 63 6f 6e 66 69 67 20 6c 69 73 74 20 2a 2f 0a   config list */.
6660: 20 20 20 20 73 74 70 20 3d 20 53 74 61 74 65 5f      stp = State_
6670: 6e 65 77 28 29 3b 20 20 20 20 20 20 20 20 20 20  new();          
6680: 20 2f 2a 20 41 20 6e 65 77 20 73 74 61 74 65 20   /* A new state 
6690: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
66a0: 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28 73 74 70   MemoryCheck(stp
66b0: 29 3b 0a 20 20 20 20 73 74 70 2d 3e 62 70 20 3d  );.    stp->bp =
66c0: 20 62 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   bp;            
66d0: 20 20 20 20 2f 2a 20 52 65 6d 65 6d 62 65 72 20      /* Remember 
66e0: 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  the configuratio
66f0: 6e 20 62 61 73 69 73 20 2a 2f 0a 20 20 20 20 73  n basis */.    s
6700: 74 70 2d 3e 63 66 70 20 3d 20 63 66 70 3b 20 20  tp->cfp = cfp;  
6710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
6720: 65 6d 65 6d 62 65 72 20 74 68 65 20 63 6f 6e 66  emember the conf
6730: 69 67 75 72 61 74 69 6f 6e 20 63 6c 6f 73 75 72  iguration closur
6740: 65 20 2a 2f 0a 20 20 20 20 73 74 70 2d 3e 69 6e  e */.    stp->in
6750: 64 65 78 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61  dex = lemp->nsta
6760: 74 65 2b 2b 3b 20 2f 2a 20 45 76 65 72 79 20 73  te++; /* Every s
6770: 74 61 74 65 20 67 65 74 73 20 61 20 73 65 71 75  tate gets a sequ
6780: 65 6e 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  ence number */. 
6790: 20 20 20 73 74 70 2d 3e 61 70 20 3d 20 30 3b 20     stp->ap = 0; 
67a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67b0: 2f 2a 20 4e 6f 20 61 63 74 69 6f 6e 73 2c 20 79  /* No actions, y
67c0: 65 74 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65  et. */.    State
67d0: 5f 69 6e 73 65 72 74 28 73 74 70 2c 73 74 70 2d  _insert(stp,stp-
67e0: 3e 62 70 29 3b 20 20 20 2f 2a 20 41 64 64 20 74  >bp);   /* Add t
67f0: 6f 20 74 68 65 20 73 74 61 74 65 20 74 61 62 6c  o the state tabl
6800: 65 20 2a 2f 0a 20 20 20 20 62 75 69 6c 64 73 68  e */.    buildsh
6810: 69 66 74 73 28 6c 65 6d 70 2c 73 74 70 29 3b 20  ifts(lemp,stp); 
6820: 20 20 20 20 20 20 2f 2a 20 52 65 63 75 72 73 69        /* Recursi
6830: 76 65 6c 79 20 63 6f 6d 70 75 74 65 20 73 75 63  vely compute suc
6840: 63 65 73 73 6f 72 20 73 74 61 74 65 73 20 2a 2f  cessor states */
6850: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 74  .  }.  return st
6860: 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6e 73 74 72 75  p;.}../* Constru
6870: 63 74 20 61 6c 6c 20 73 75 63 63 65 73 73 6f 72  ct all successor
6880: 20 73 74 61 74 65 73 20 74 6f 20 74 68 65 20 67   states to the g
6890: 69 76 65 6e 20 73 74 61 74 65 2e 20 20 41 20 22  iven state.  A "
68a0: 73 75 63 63 65 73 73 6f 72 22 0a 2a 2a 20 73 74  successor".** st
68b0: 61 74 65 20 69 73 20 61 6e 79 20 73 74 61 74 65  ate is any state
68c0: 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 72 65   which can be re
68d0: 61 63 68 65 64 20 62 79 20 61 20 73 68 69 66 74  ached by a shift
68e0: 20 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56   action..*/.PRIV
68f0: 41 54 45 20 76 6f 69 64 20 62 75 69 6c 64 73 68  ATE void buildsh
6900: 69 66 74 73 28 6c 65 6d 70 2c 73 74 70 29 0a 73  ifts(lemp,stp).s
6910: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
6920: 70 3b 0a 73 74 72 75 63 74 20 73 74 61 74 65 20  p;.struct state 
6930: 2a 73 74 70 3b 20 20 20 20 20 2f 2a 20 54 68 65  *stp;     /* The
6940: 20 73 74 61 74 65 20 66 72 6f 6d 20 77 68 69 63   state from whic
6950: 68 20 73 75 63 63 65 73 73 6f 72 73 20 61 72 65  h successors are
6960: 20 63 6f 6d 70 75 74 65 64 20 2a 2f 0a 7b 0a 20   computed */.{. 
6970: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
6980: 63 66 70 3b 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  cfp;  /* For loo
6990: 70 69 6e 67 20 74 68 72 75 20 74 68 65 20 63 6f  ping thru the co
69a0: 6e 66 69 67 20 63 6c 6f 73 75 72 65 20 6f 66 20  nfig closure of 
69b0: 22 73 74 70 22 20 2a 2f 0a 20 20 73 74 72 75 63  "stp" */.  struc
69c0: 74 20 63 6f 6e 66 69 67 20 2a 62 63 66 70 3b 20  t config *bcfp; 
69d0: 2f 2a 20 46 6f 72 20 74 68 65 20 69 6e 6e 65 72  /* For the inner
69e0: 20 6c 6f 6f 70 20 6f 6e 20 63 6f 6e 66 69 67 20   loop on config 
69f0: 63 6c 6f 73 75 72 65 20 6f 66 20 22 73 74 70 22  closure of "stp"
6a00: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 63 6f 6e   */.  struct con
6a10: 66 69 67 20 2a 6e 65 77 3b 20 20 2f 2a 20 2a 2f  fig *new;  /* */
6a20: 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
6a30: 20 2a 73 70 3b 20 20 20 2f 2a 20 53 79 6d 62 6f   *sp;   /* Symbo
6a40: 6c 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  l following the 
6a50: 64 6f 74 20 69 6e 20 63 6f 6e 66 69 67 75 72 61  dot in configura
6a60: 74 69 6f 6e 20 22 63 66 70 22 20 2a 2f 0a 20 20  tion "cfp" */.  
6a70: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 62  struct symbol *b
6a80: 73 70 3b 20 20 2f 2a 20 53 79 6d 62 6f 6c 20 66  sp;  /* Symbol f
6a90: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 64 6f 74  ollowing the dot
6aa0: 20 69 6e 20 63 6f 6e 66 69 67 75 72 61 74 69 6f   in configuratio
6ab0: 6e 20 22 62 63 66 70 22 20 2a 2f 0a 20 20 73 74  n "bcfp" */.  st
6ac0: 72 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77 73  ruct state *news
6ad0: 74 70 3b 20 2f 2a 20 41 20 70 6f 69 6e 74 65 72  tp; /* A pointer
6ae0: 20 74 6f 20 61 20 73 75 63 63 65 73 73 6f 72 20   to a successor 
6af0: 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45  state */..  /* E
6b00: 61 63 68 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ach configuratio
6b10: 6e 20 62 65 63 6f 6d 65 73 20 63 6f 6d 70 6c 65  n becomes comple
6b20: 74 65 20 61 66 74 65 72 20 69 74 20 63 6f 6e 74  te after it cont
6b30: 69 62 75 74 65 73 20 74 6f 20 61 20 73 75 63 63  ibutes to a succ
6b40: 65 73 73 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65  essor.  ** state
6b50: 2e 20 20 49 6e 69 74 69 61 6c 6c 79 2c 20 61 6c  .  Initially, al
6b60: 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73  l configurations
6b70: 20 61 72 65 20 69 6e 63 6f 6d 70 6c 65 74 65 20   are incomplete 
6b80: 2a 2f 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70  */.  for(cfp=stp
6b90: 2d 3e 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d  ->cfp; cfp; cfp=
6ba0: 63 66 70 2d 3e 6e 65 78 74 29 20 63 66 70 2d 3e  cfp->next) cfp->
6bb0: 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d 50 4c  status = INCOMPL
6bc0: 45 54 45 3b 0a 0a 20 20 2f 2a 20 4c 6f 6f 70 20  ETE;..  /* Loop 
6bd0: 74 68 72 6f 75 67 68 20 61 6c 6c 20 63 6f 6e 66  through all conf
6be0: 69 67 75 72 61 74 69 6f 6e 73 20 6f 66 20 74 68  igurations of th
6bf0: 65 20 73 74 61 74 65 20 22 73 74 70 22 20 2a 2f  e state "stp" */
6c00: 0a 20 20 66 6f 72 28 63 66 70 3d 73 74 70 2d 3e  .  for(cfp=stp->
6c10: 63 66 70 3b 20 63 66 70 3b 20 63 66 70 3d 63 66  cfp; cfp; cfp=cf
6c20: 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 69 66  p->next){.    if
6c30: 28 20 63 66 70 2d 3e 73 74 61 74 75 73 3d 3d 43  ( cfp->status==C
6c40: 4f 4d 50 4c 45 54 45 20 29 20 63 6f 6e 74 69 6e  OMPLETE ) contin
6c50: 75 65 3b 20 20 20 20 2f 2a 20 41 6c 72 65 61 64  ue;    /* Alread
6c60: 79 20 75 73 65 64 20 62 79 20 69 6e 6e 65 72 20  y used by inner 
6c70: 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 69 66 28 20  loop */.    if( 
6c80: 63 66 70 2d 3e 64 6f 74 3e 3d 63 66 70 2d 3e 72  cfp->dot>=cfp->r
6c90: 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e  p->nrhs ) contin
6ca0: 75 65 3b 20 20 2f 2a 20 43 61 6e 27 74 20 73 68  ue;  /* Can't sh
6cb0: 69 66 74 20 74 68 69 73 20 63 6f 6e 66 69 67 20  ift this config 
6cc0: 2a 2f 0a 20 20 20 20 43 6f 6e 66 69 67 6c 69 73  */.    Configlis
6cd0: 74 5f 72 65 73 65 74 28 29 3b 20 20 20 20 20 20  t_reset();      
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cf0: 2f 2a 20 52 65 73 65 74 20 74 68 65 20 6e 65 77  /* Reset the new
6d00: 20 63 6f 6e 66 69 67 20 73 65 74 20 2a 2f 0a 20   config set */. 
6d10: 20 20 20 73 70 20 3d 20 63 66 70 2d 3e 72 70 2d     sp = cfp->rp-
6d20: 3e 72 68 73 5b 63 66 70 2d 3e 64 6f 74 5d 3b 20  >rhs[cfp->dot]; 
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
6d40: 79 6d 62 6f 6c 20 61 66 74 65 72 20 74 68 65 20  ymbol after the 
6d50: 64 6f 74 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46  dot */..    /* F
6d60: 6f 72 20 65 76 65 72 79 20 63 6f 6e 66 69 67 75  or every configu
6d70: 72 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 73 74  ration in the st
6d80: 61 74 65 20 22 73 74 70 22 20 77 68 69 63 68 20  ate "stp" which 
6d90: 68 61 73 20 74 68 65 20 73 79 6d 62 6f 6c 20 22  has the symbol "
6da0: 73 70 22 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  sp".    ** follo
6db0: 77 69 6e 67 20 69 74 73 20 64 6f 74 2c 20 61 64  wing its dot, ad
6dc0: 64 20 74 68 65 20 73 61 6d 65 20 63 6f 6e 66 69  d the same confi
6dd0: 67 75 72 61 74 69 6f 6e 20 74 6f 20 74 68 65 20  guration to the 
6de0: 62 61 73 69 73 20 73 65 74 20 75 6e 64 65 72 0a  basis set under.
6df0: 20 20 20 20 2a 2a 20 63 6f 6e 73 74 72 75 63 74      ** construct
6e00: 69 6f 6e 20 62 75 74 20 77 69 74 68 20 74 68 65  ion but with the
6e10: 20 64 6f 74 20 73 68 69 66 74 65 64 20 6f 6e 65   dot shifted one
6e20: 20 73 79 6d 62 6f 6c 20 74 6f 20 74 68 65 20 72   symbol to the r
6e30: 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  ight. */.    for
6e40: 28 62 63 66 70 3d 63 66 70 3b 20 62 63 66 70 3b  (bcfp=cfp; bcfp;
6e50: 20 62 63 66 70 3d 62 63 66 70 2d 3e 6e 65 78 74   bcfp=bcfp->next
6e60: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 63 66  ){.      if( bcf
6e70: 70 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c  p->status==COMPL
6e80: 45 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 20  ETE ) continue; 
6e90: 20 20 20 2f 2a 20 41 6c 72 65 61 64 79 20 75 73     /* Already us
6ea0: 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
6eb0: 62 63 66 70 2d 3e 64 6f 74 3e 3d 62 63 66 70 2d  bcfp->dot>=bcfp-
6ec0: 3e 72 70 2d 3e 6e 72 68 73 20 29 20 63 6f 6e 74  >rp->nrhs ) cont
6ed0: 69 6e 75 65 3b 20 2f 2a 20 43 61 6e 27 74 20 73  inue; /* Can't s
6ee0: 68 69 66 74 20 74 68 69 73 20 6f 6e 65 20 2a 2f  hift this one */
6ef0: 0a 20 20 20 20 20 20 62 73 70 20 3d 20 62 63 66  .      bsp = bcf
6f00: 70 2d 3e 72 70 2d 3e 72 68 73 5b 62 63 66 70 2d  p->rp->rhs[bcfp-
6f10: 3e 64 6f 74 5d 3b 20 20 20 20 20 20 20 20 20 20  >dot];          
6f20: 20 2f 2a 20 47 65 74 20 73 79 6d 62 6f 6c 20 61   /* Get symbol a
6f30: 66 74 65 72 20 64 6f 74 20 2a 2f 0a 20 20 20 20  fter dot */.    
6f40: 20 20 69 66 28 20 62 73 70 21 3d 73 70 20 29 20    if( bsp!=sp ) 
6f50: 63 6f 6e 74 69 6e 75 65 3b 20 20 20 20 20 20 20  continue;       
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
6f70: 75 73 74 20 62 65 20 73 61 6d 65 20 61 73 20 66  ust be same as f
6f80: 6f 72 20 22 63 66 70 22 20 2a 2f 0a 20 20 20 20  or "cfp" */.    
6f90: 20 20 62 63 66 70 2d 3e 73 74 61 74 75 73 20 3d    bcfp->status =
6fa0: 20 43 4f 4d 50 4c 45 54 45 3b 20 20 20 20 20 20   COMPLETE;      
6fb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
6fc0: 61 72 6b 20 74 68 69 73 20 63 6f 6e 66 69 67 20  ark this config 
6fd0: 61 73 20 75 73 65 64 20 2a 2f 0a 20 20 20 20 20  as used */.     
6fe0: 20 6e 65 77 20 3d 20 43 6f 6e 66 69 67 6c 69 73   new = Configlis
6ff0: 74 5f 61 64 64 62 61 73 69 73 28 62 63 66 70 2d  t_addbasis(bcfp-
7000: 3e 72 70 2c 62 63 66 70 2d 3e 64 6f 74 2b 31 29  >rp,bcfp->dot+1)
7010: 3b 0a 20 20 20 20 20 20 50 6c 69 6e 6b 5f 61 64  ;.      Plink_ad
7020: 64 28 26 6e 65 77 2d 3e 62 70 6c 70 2c 62 63 66  d(&new->bplp,bcf
7030: 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  p);.    }..    /
7040: 2a 20 47 65 74 20 61 20 70 6f 69 6e 74 65 72 20  * Get a pointer 
7050: 74 6f 20 74 68 65 20 73 74 61 74 65 20 64 65 73  to the state des
7060: 63 72 69 62 65 64 20 62 79 20 74 68 65 20 62 61  cribed by the ba
7070: 73 69 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  sis configuratio
7080: 6e 20 73 65 74 0a 20 20 20 20 2a 2a 20 63 6f 6e  n set.    ** con
7090: 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 65 20  structed in the 
70a0: 70 72 65 63 65 64 69 6e 67 20 6c 6f 6f 70 20 2a  preceding loop *
70b0: 2f 0a 20 20 20 20 6e 65 77 73 74 70 20 3d 20 67  /.    newstp = g
70c0: 65 74 73 74 61 74 65 28 6c 65 6d 70 29 3b 0a 0a  etstate(lemp);..
70d0: 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61 74 65      /* The state
70e0: 20 22 6e 65 77 73 74 70 22 20 69 73 20 72 65 61   "newstp" is rea
70f0: 63 68 65 64 20 66 72 6f 6d 20 74 68 65 20 73 74  ched from the st
7100: 61 74 65 20 22 73 74 70 22 20 62 79 20 61 20 73  ate "stp" by a s
7110: 68 69 66 74 20 61 63 74 69 6f 6e 0a 20 20 20 20  hift action.    
7120: 2a 2a 20 6f 6e 20 74 68 65 20 73 79 6d 62 6f 6c  ** on the symbol
7130: 20 22 73 70 22 20 2a 2f 0a 20 20 20 20 41 63 74   "sp" */.    Act
7140: 69 6f 6e 5f 61 64 64 28 26 73 74 70 2d 3e 61 70  ion_add(&stp->ap
7150: 2c 53 48 49 46 54 2c 73 70 2c 6e 65 77 73 74 70  ,SHIFT,sp,newstp
7160: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
7170: 43 6f 6e 73 74 72 75 63 74 20 74 68 65 20 70 72  Construct the pr
7180: 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a  opagation links.
7190: 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 4c 69 6e 6b  */.void FindLink
71a0: 73 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c  s(lemp).struct l
71b0: 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20  emon *lemp;.{.  
71c0: 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
71d0: 63 6f 6e 66 69 67 20 2a 63 66 70 2c 20 2a 6f 74  config *cfp, *ot
71e0: 68 65 72 3b 0a 20 20 73 74 72 75 63 74 20 73 74  her;.  struct st
71f0: 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72 75  ate *stp;.  stru
7200: 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 0a  ct plink *plp;..
7210: 20 20 2f 2a 20 48 6f 75 73 65 6b 65 65 70 69 6e    /* Housekeepin
7220: 67 20 64 65 74 61 69 6c 3a 0a 20 20 2a 2a 20 41  g detail:.  ** A
7230: 64 64 20 74 6f 20 65 76 65 72 79 20 70 72 6f 70  dd to every prop
7240: 61 67 61 74 65 20 6c 69 6e 6b 20 61 20 70 6f 69  agate link a poi
7250: 6e 74 65 72 20 62 61 63 6b 20 74 6f 20 74 68 65  nter back to the
7260: 20 73 74 61 74 65 20 74 6f 0a 20 20 2a 2a 20 77   state to.  ** w
7270: 68 69 63 68 20 74 68 65 20 6c 69 6e 6b 20 69 73  hich the link is
7280: 20 61 74 74 61 63 68 65 64 2e 20 2a 2f 0a 20 20   attached. */.  
7290: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
72a0: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20  >nstate; i++){. 
72b0: 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
72c0: 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f  orted[i];.    fo
72d0: 72 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20  r(cfp=stp->cfp; 
72e0: 63 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65  cfp; cfp=cfp->ne
72f0: 78 74 29 7b 0a 20 20 20 20 20 20 63 66 70 2d 3e  xt){.      cfp->
7300: 73 74 70 20 3d 20 73 74 70 3b 0a 20 20 20 20 7d  stp = stp;.    }
7310: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65  .  }..  /* Conve
7320: 72 74 20 61 6c 6c 20 62 61 63 6b 6c 69 6e 6b 73  rt all backlinks
7330: 20 69 6e 74 6f 20 66 6f 72 77 61 72 64 20 6c 69   into forward li
7340: 6e 6b 73 2e 20 20 4f 6e 6c 79 20 74 68 65 20 66  nks.  Only the f
7350: 6f 72 77 61 72 64 0a 20 20 2a 2a 20 6c 69 6e 6b  orward.  ** link
7360: 73 20 61 72 65 20 75 73 65 64 20 69 6e 20 74 68  s are used in th
7370: 65 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 63 6f 6d  e follow-set com
7380: 70 75 74 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 66  putation. */.  f
7390: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e  or(i=0; i<lemp->
73a0: 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  nstate; i++){.  
73b0: 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f    stp = lemp->so
73c0: 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72  rted[i];.    for
73d0: 28 63 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63  (cfp=stp->cfp; c
73e0: 66 70 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78  fp; cfp=cfp->nex
73f0: 74 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 6c  t){.      for(pl
7400: 70 3d 63 66 70 2d 3e 62 70 6c 70 3b 20 70 6c 70  p=cfp->bplp; plp
7410: 3b 20 70 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29  ; plp=plp->next)
7420: 7b 0a 20 20 20 20 20 20 20 20 6f 74 68 65 72 20  {.        other 
7430: 3d 20 70 6c 70 2d 3e 63 66 70 3b 0a 20 20 20 20  = plp->cfp;.    
7440: 20 20 20 20 50 6c 69 6e 6b 5f 61 64 64 28 26 6f      Plink_add(&o
7450: 74 68 65 72 2d 3e 66 70 6c 70 2c 63 66 70 29 3b  ther->fplp,cfp);
7460: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7470: 20 7d 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 75 74 65   }.}../* Compute
7480: 20 61 6c 6c 20 66 6f 6c 6c 6f 77 73 65 74 73 2e   all followsets.
7490: 0a 2a 2a 0a 2a 2a 20 41 20 66 6f 6c 6c 6f 77 73  .**.** A follows
74a0: 65 74 20 69 73 20 74 68 65 20 73 65 74 20 6f 66  et is the set of
74b0: 20 61 6c 6c 20 73 79 6d 62 6f 6c 73 20 77 68 69   all symbols whi
74c0: 63 68 20 63 61 6e 20 63 6f 6d 65 20 69 6d 6d 65  ch can come imme
74d0: 64 69 61 74 65 6c 79 0a 2a 2a 20 61 66 74 65 72  diately.** after
74e0: 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
74f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69 6e 64 46 6f  ..*/.void FindFo
7500: 6c 6c 6f 77 53 65 74 73 28 6c 65 6d 70 29 0a 73  llowSets(lemp).s
7510: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
7520: 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  p;.{.  int i;.  
7530: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 63  struct config *c
7540: 66 70 3b 0a 20 20 73 74 72 75 63 74 20 70 6c 69  fp;.  struct pli
7550: 6e 6b 20 2a 70 6c 70 3b 0a 20 20 69 6e 74 20 70  nk *plp;.  int p
7560: 72 6f 67 72 65 73 73 3b 0a 20 20 69 6e 74 20 63  rogress;.  int c
7570: 68 61 6e 67 65 3b 0a 0a 20 20 66 6f 72 28 69 3d  hange;..  for(i=
7580: 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74  0; i<lemp->nstat
7590: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66 6f 72  e; i++){.    for
75a0: 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74 65  (cfp=lemp->sorte
75b0: 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b 20  d[i]->cfp; cfp; 
75c0: 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b 0a  cfp=cfp->next){.
75d0: 20 20 20 20 20 20 63 66 70 2d 3e 73 74 61 74 75        cfp->statu
75e0: 73 20 3d 20 49 4e 43 4f 4d 50 4c 45 54 45 3b 0a  s = INCOMPLETE;.
75f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 64      }.  }.  .  d
7600: 6f 7b 0a 20 20 20 20 70 72 6f 67 72 65 73 73 20  o{.    progress 
7610: 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
7620: 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65  ; i<lemp->nstate
7630: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  ; i++){.      fo
7640: 72 28 63 66 70 3d 6c 65 6d 70 2d 3e 73 6f 72 74  r(cfp=lemp->sort
7650: 65 64 5b 69 5d 2d 3e 63 66 70 3b 20 63 66 70 3b  ed[i]->cfp; cfp;
7660: 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29 7b   cfp=cfp->next){
7670: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 66 70  .        if( cfp
7680: 2d 3e 73 74 61 74 75 73 3d 3d 43 4f 4d 50 4c 45  ->status==COMPLE
7690: 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  TE ) continue;. 
76a0: 20 20 20 20 20 20 20 66 6f 72 28 70 6c 70 3d 63         for(plp=c
76b0: 66 70 2d 3e 66 70 6c 70 3b 20 70 6c 70 3b 20 70  fp->fplp; plp; p
76c0: 6c 70 3d 70 6c 70 2d 3e 6e 65 78 74 29 7b 0a 20  lp=plp->next){. 
76d0: 20 20 20 20 20 20 20 20 20 63 68 61 6e 67 65 20           change 
76e0: 3d 20 53 65 74 55 6e 69 6f 6e 28 70 6c 70 2d 3e  = SetUnion(plp->
76f0: 63 66 70 2d 3e 66 77 73 2c 63 66 70 2d 3e 66 77  cfp->fws,cfp->fw
7700: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  s);.          if
7710: 28 20 63 68 61 6e 67 65 20 29 7b 0a 20 20 20 20  ( change ){.    
7720: 20 20 20 20 20 20 20 20 70 6c 70 2d 3e 63 66 70          plp->cfp
7730: 2d 3e 73 74 61 74 75 73 20 3d 20 49 4e 43 4f 4d  ->status = INCOM
7740: 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 20 20 20  PLETE;.         
7750: 20 20 20 70 72 6f 67 72 65 73 73 20 3d 20 31 3b     progress = 1;
7760: 0a 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 20  ..  }..}.       
7770: 20 63 66 70 2d 3e 73 74 61 74 75 73 20 3d 20 43   cfp->status = C
7780: 4f 4d 50 4c 45 54 45 3b 0a 20 20 20 20 20 20 7d  OMPLETE;.      }
7790: 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28  .    }.  }while(
77a0: 20 70 72 6f 67 72 65 73 73 20 29 3b 0a 7d 0a 0a   progress );.}..
77b0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
77c0: 76 65 5f 63 6f 6e 66 6c 69 63 74 28 29 3b 0a 0a  ve_conflict();..
77d0: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 72  /* Compute the r
77e0: 65 64 75 63 65 20 61 63 74 69 6f 6e 73 2c 20 61  educe actions, a
77f0: 6e 64 20 72 65 73 6f 6c 76 65 20 63 6f 6e 66 6c  nd resolve confl
7800: 69 63 74 73 2e 0a 2a 2f 0a 76 6f 69 64 20 46 69  icts..*/.void Fi
7810: 6e 64 41 63 74 69 6f 6e 73 28 6c 65 6d 70 29 0a  ndActions(lemp).
7820: 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65  struct lemon *le
7830: 6d 70 3b 0a 7b 0a 20 20 69 6e 74 20 69 2c 6a 3b  mp;.{.  int i,j;
7840: 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67  .  struct config
7850: 20 2a 63 66 70 3b 0a 20 20 73 74 72 75 63 74 20   *cfp;.  struct 
7860: 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
7870: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 3b  ruct symbol *sp;
7880: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
7890: 72 70 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 61 6c  rp;..  /* Add al
78a0: 6c 20 6f 66 20 74 68 65 20 72 65 64 75 63 65 20  l of the reduce 
78b0: 61 63 74 69 6f 6e 73 20 0a 20 20 2a 2a 20 41 20  actions .  ** A 
78c0: 72 65 64 75 63 65 20 61 63 74 69 6f 6e 20 69 73  reduce action is
78d0: 20 61 64 64 65 64 20 66 6f 72 20 65 61 63 68 20   added for each 
78e0: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 66  element of the f
78f0: 6f 6c 6c 6f 77 73 65 74 20 6f 66 0a 20 20 2a 2a  ollowset of.  **
7900: 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e   a configuration
7910: 20 77 68 69 63 68 20 68 61 73 20 69 74 73 20 64   which has its d
7920: 6f 74 20 61 74 20 74 68 65 20 65 78 74 72 65 6d  ot at the extrem
7930: 65 20 72 69 67 68 74 2e 0a 20 20 2a 2f 0a 20 20  e right..  */.  
7940: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d  for(i=0; i<lemp-
7950: 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29 7b 20 20  >nstate; i++){  
7960: 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20 61 6c   /* Loop over al
7970: 6c 20 73 74 61 74 65 73 20 2a 2f 0a 20 20 20 20  l states */.    
7980: 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
7990: 65 64 5b 69 5d 3b 0a 20 20 20 20 66 6f 72 28 63  ed[i];.    for(c
79a0: 66 70 3d 73 74 70 2d 3e 63 66 70 3b 20 63 66 70  fp=stp->cfp; cfp
79b0: 3b 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74 29  ; cfp=cfp->next)
79c0: 7b 20 20 2f 2a 20 4c 6f 6f 70 20 6f 76 65 72 20  {  /* Loop over 
79d0: 61 6c 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  all configuratio
79e0: 6e 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ns */.      if( 
79f0: 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 3d 3d 63  cfp->rp->nrhs==c
7a00: 66 70 2d 3e 64 6f 74 20 29 7b 20 20 20 20 20 20  fp->dot ){      
7a10: 20 20 2f 2a 20 49 73 20 64 6f 74 20 61 74 20 65    /* Is dot at e
7a20: 78 74 72 65 6d 65 20 72 69 67 68 74 3f 20 2a 2f  xtreme right? */
7a30: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
7a40: 3b 20 6a 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69  ; j<lemp->ntermi
7a50: 6e 61 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nal; j++){.     
7a60: 20 20 20 20 20 69 66 28 20 53 65 74 46 69 6e 64       if( SetFind
7a70: 28 63 66 70 2d 3e 66 77 73 2c 6a 29 20 29 7b 0a  (cfp->fws,j) ){.
7a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
7a90: 64 64 20 61 20 72 65 64 75 63 65 20 61 63 74 69  dd a reduce acti
7aa0: 6f 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65 20  on to the state 
7ab0: 22 73 74 70 22 20 77 68 69 63 68 20 77 69 6c 6c  "stp" which will
7ac0: 20 72 65 64 75 63 65 20 62 79 20 74 68 65 0a 20   reduce by the. 
7ad0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 75             ** ru
7ae0: 6c 65 20 22 63 66 70 2d 3e 72 70 22 20 69 66 20  le "cfp->rp" if 
7af0: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 73 79  the lookahead sy
7b00: 6d 62 6f 6c 20 69 73 20 22 6c 65 6d 70 2d 3e 73  mbol is "lemp->s
7b10: 79 6d 62 6f 6c 73 5b 6a 5d 22 20 2a 2f 0a 20 20  ymbols[j]" */.  
7b20: 20 20 20 20 20 20 20 20 20 20 41 63 74 69 6f 6e            Action
7b30: 5f 61 64 64 28 26 73 74 70 2d 3e 61 70 2c 52 45  _add(&stp->ap,RE
7b40: 44 55 43 45 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f  DUCE,lemp->symbo
7b50: 6c 73 5b 6a 5d 2c 63 66 70 2d 3e 72 70 29 3b 0a  ls[j],cfp->rp);.
7b60: 20 20 20 20 20 20 20 20 20 20 7d 0a 09 7d 0a 20            }..}. 
7b70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
7b80: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 61  ..  /* Add the a
7b90: 63 63 65 70 74 69 6e 67 20 74 6f 6b 65 6e 20 2a  ccepting token *
7ba0: 2f 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 73 74  /.  if( lemp->st
7bb0: 61 72 74 20 29 7b 0a 20 20 20 20 73 70 20 3d 20  art ){.    sp = 
7bc0: 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6c 65 6d 70  Symbol_find(lemp
7bd0: 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 69 66  ->start);.    if
7be0: 28 20 73 70 3d 3d 30 20 29 20 73 70 20 3d 20 6c  ( sp==0 ) sp = l
7bf0: 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68 73 3b 0a  emp->rule->lhs;.
7c00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 20    }else{.    sp 
7c10: 3d 20 6c 65 6d 70 2d 3e 72 75 6c 65 2d 3e 6c 68  = lemp->rule->lh
7c20: 73 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 64 64 20  s;.  }.  /* Add 
7c30: 74 6f 20 74 68 65 20 66 69 72 73 74 20 73 74 61  to the first sta
7c40: 74 65 20 28 77 68 69 63 68 20 69 73 20 61 6c 77  te (which is alw
7c50: 61 79 73 20 74 68 65 20 73 74 61 72 74 69 6e 67  ays the starting
7c60: 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 20 20   state of the.  
7c70: 2a 2a 20 66 69 6e 69 74 65 20 73 74 61 74 65 20  ** finite state 
7c80: 6d 61 63 68 69 6e 65 29 20 61 6e 20 61 63 74 69  machine) an acti
7c90: 6f 6e 20 74 6f 20 41 43 43 45 50 54 20 69 66 20  on to ACCEPT if 
7ca0: 74 68 65 20 6c 6f 6f 6b 61 68 65 61 64 20 69 73  the lookahead is
7cb0: 20 74 68 65 0a 20 20 2a 2a 20 73 74 61 72 74 20   the.  ** start 
7cc0: 6e 6f 6e 74 65 72 6d 69 6e 61 6c 2e 20 20 2a 2f  nonterminal.  */
7cd0: 0a 20 20 41 63 74 69 6f 6e 5f 61 64 64 28 26 6c  .  Action_add(&l
7ce0: 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 30 5d 2d 3e  emp->sorted[0]->
7cf0: 61 70 2c 41 43 43 45 50 54 2c 73 70 2c 30 29 3b  ap,ACCEPT,sp,0);
7d00: 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 63  ..  /* Resolve c
7d10: 6f 6e 66 6c 69 63 74 73 20 2a 2f 0a 20 20 66 6f  onflicts */.  fo
7d20: 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
7d30: 73 74 61 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  state; i++){.   
7d40: 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a   struct action *
7d50: 61 70 2c 20 2a 6e 61 70 3b 0a 20 20 20 20 73 74  ap, *nap;.    st
7d60: 72 75 63 74 20 73 74 61 74 65 20 2a 73 74 70 3b  ruct state *stp;
7d70: 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d  .    stp = lemp-
7d80: 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20  >sorted[i];.    
7d90: 61 73 73 65 72 74 28 20 73 74 70 2d 3e 61 70 20  assert( stp->ap 
7da0: 29 3b 0a 20 20 20 20 73 74 70 2d 3e 61 70 20 3d  );.    stp->ap =
7db0: 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74 70   Action_sort(stp
7dc0: 2d 3e 61 70 29 3b 0a 20 20 20 20 66 6f 72 28 61  ->ap);.    for(a
7dd0: 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 20 26 26  p=stp->ap; ap &&
7de0: 20 61 70 2d 3e 6e 65 78 74 3b 20 61 70 3d 61 70   ap->next; ap=ap
7df0: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 66  ->next){.      f
7e00: 6f 72 28 6e 61 70 3d 61 70 2d 3e 6e 65 78 74 3b  or(nap=ap->next;
7e10: 20 6e 61 70 20 26 26 20 6e 61 70 2d 3e 73 70 3d   nap && nap->sp=
7e20: 3d 61 70 2d 3e 73 70 3b 20 6e 61 70 3d 6e 61 70  =ap->sp; nap=nap
7e30: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
7e40: 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 61 63 74    /* The two act
7e50: 69 6f 6e 73 20 22 61 70 22 20 61 6e 64 20 22 6e  ions "ap" and "n
7e60: 61 70 22 20 68 61 76 65 20 74 68 65 20 73 61 6d  ap" have the sam
7e70: 65 20 6c 6f 6f 6b 61 68 65 61 64 2e 0a 20 20 20  e lookahead..   
7e80: 20 20 20 20 20 20 2a 2a 20 46 69 67 75 72 65 20        ** Figure 
7e90: 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 73 68  out which one sh
7ea0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 2a 2f 0a  ould be used */.
7eb0: 20 20 20 20 20 20 20 20 20 6c 65 6d 70 2d 3e 6e           lemp->n
7ec0: 63 6f 6e 66 6c 69 63 74 20 2b 3d 20 72 65 73 6f  conflict += reso
7ed0: 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28 61 70 2c  lve_conflict(ap,
7ee0: 6e 61 70 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d  nap,lemp->errsym
7ef0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7f00: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6f 72  .  }..  /* Repor
7f10: 74 20 61 6e 20 65 72 72 6f 72 20 66 6f 72 20 65  t an error for e
7f20: 61 63 68 20 72 75 6c 65 20 74 68 61 74 20 63 61  ach rule that ca
7f30: 6e 20 6e 65 76 65 72 20 62 65 20 72 65 64 75 63  n never be reduc
7f40: 65 64 2e 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d  ed. */.  for(rp=
7f50: 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
7f60: 72 70 3d 72 70 2d 3e 6e 65 78 74 29 20 72 70 2d  rp=rp->next) rp-
7f70: 3e 63 61 6e 52 65 64 75 63 65 20 3d 20 42 5f 46  >canReduce = B_F
7f80: 41 4c 53 45 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ALSE;.  for(i=0;
7f90: 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b   i<lemp->nstate;
7fa0: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
7fb0: 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b 0a 20 20  t action *ap;.  
7fc0: 20 20 66 6f 72 28 61 70 3d 6c 65 6d 70 2d 3e 73    for(ap=lemp->s
7fd0: 6f 72 74 65 64 5b 69 5d 2d 3e 61 70 3b 20 61 70  orted[i]->ap; ap
7fe0: 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a  ; ap=ap->next){.
7ff0: 20 20 20 20 20 20 69 66 28 20 61 70 2d 3e 74 79        if( ap->ty
8000: 70 65 3d 3d 52 45 44 55 43 45 20 29 20 61 70 2d  pe==REDUCE ) ap-
8010: 3e 78 2e 72 70 2d 3e 63 61 6e 52 65 64 75 63 65  >x.rp->canReduce
8020: 20 3d 20 42 5f 54 52 55 45 3b 0a 20 20 20 20 7d   = B_TRUE;.    }
8030: 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d 6c 65  .  }.  for(rp=le
8040: 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72 70  mp->rule; rp; rp
8050: 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20  =rp->next){.    
8060: 69 66 28 20 72 70 2d 3e 63 61 6e 52 65 64 75 63  if( rp->canReduc
8070: 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
8080: 20 20 45 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d    ErrorMsg(lemp-
8090: 3e 66 69 6c 65 6e 61 6d 65 2c 72 70 2d 3e 72 75  >filename,rp->ru
80a0: 6c 65 6c 69 6e 65 2c 22 54 68 69 73 20 72 75 6c  leline,"This rul
80b0: 65 20 63 61 6e 20 6e 6f 74 20 62 65 20 72 65 64  e can not be red
80c0: 75 63 65 64 2e 5c 6e 22 29 3b 0a 20 20 20 20 6c  uced.\n");.    l
80d0: 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
80e0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 73 6f 6c  .  }.}../* Resol
80f0: 76 65 20 61 20 63 6f 6e 66 6c 69 63 74 20 62 65  ve a conflict be
8100: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
8110: 76 65 6e 20 61 63 74 69 6f 6e 73 2e 20 20 49 66  ven actions.  If
8120: 20 74 68 65 0a 2a 2a 20 63 6f 6e 66 6c 69 63 74   the.** conflict
8130: 20 63 61 6e 27 74 20 62 65 20 72 65 73 6f 6c 76   can't be resolv
8140: 65 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  e, return non-ze
8150: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 4e 4f 20 4c 4f 4e  ro..**.** NO LON
8160: 47 45 52 20 54 52 55 45 3a 0a 2a 2a 20 20 20 54  GER TRUE:.**   T
8170: 6f 20 72 65 73 6f 6c 76 65 20 61 20 63 6f 6e 66  o resolve a conf
8180: 6c 69 63 74 2c 20 66 69 72 73 74 20 6c 6f 6f 6b  lict, first look
8190: 20 74 6f 20 73 65 65 20 69 66 20 65 69 74 68 65   to see if eithe
81a0: 72 20 61 63 74 69 6f 6e 0a 2a 2a 20 20 20 69 73  r action.**   is
81b0: 20 6f 6e 20 61 6e 20 65 72 72 6f 72 20 72 75 6c   on an error rul
81c0: 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  e.  In that case
81d0: 2c 20 74 61 6b 65 20 74 68 65 20 61 63 74 69 6f  , take the actio
81e0: 6e 20 77 68 69 63 68 0a 2a 2a 20 20 20 69 73 20  n which.**   is 
81f0: 6e 6f 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  not associated w
8200: 69 74 68 20 74 68 65 20 65 72 72 6f 72 20 72 75  ith the error ru
8210: 6c 65 2e 20 20 49 66 20 6e 65 69 74 68 65 72 20  le.  If neither 
8220: 6f 72 20 62 6f 74 68 0a 2a 2a 20 20 20 61 63 74  or both.**   act
8230: 69 6f 6e 73 20 61 72 65 20 61 73 73 6f 63 69 61  ions are associa
8240: 74 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f  ted with an erro
8250: 72 20 72 75 6c 65 2c 20 74 68 65 6e 20 74 72 79  r rule, then try
8260: 20 74 6f 0a 2a 2a 20 20 20 75 73 65 20 70 72 65   to.**   use pre
8270: 63 65 64 65 6e 63 65 20 74 6f 20 72 65 73 6f 6c  cedence to resol
8280: 76 65 20 74 68 65 20 63 6f 6e 66 6c 69 63 74 2e  ve the conflict.
8290: 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
82a0: 20 61 63 74 69 6f 6e 20 69 73 20 61 20 53 48 49   action is a SHI
82b0: 46 54 2c 20 74 68 65 6e 20 69 74 20 6d 75 73 74  FT, then it must
82c0: 20 62 65 20 61 70 78 2e 20 20 54 68 69 73 0a 2a   be apx.  This.*
82d0: 2a 20 66 75 6e 63 74 69 6f 6e 20 77 6f 6e 27 74  * function won't
82e0: 20 77 6f 72 6b 20 69 66 20 61 70 78 2d 3e 74 79   work if apx->ty
82f0: 70 65 3d 3d 52 45 44 55 43 45 20 61 6e 64 20 61  pe==REDUCE and a
8300: 70 79 2d 3e 74 79 70 65 3d 3d 53 48 49 46 54 2e  py->type==SHIFT.
8310: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
8320: 65 73 6f 6c 76 65 5f 63 6f 6e 66 6c 69 63 74 28  esolve_conflict(
8330: 61 70 78 2c 61 70 79 2c 65 72 72 73 79 6d 29 0a  apx,apy,errsym).
8340: 73 74 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61  struct action *a
8350: 70 78 3b 0a 73 74 72 75 63 74 20 61 63 74 69 6f  px;.struct actio
8360: 6e 20 2a 61 70 79 3b 0a 73 74 72 75 63 74 20 73  n *apy;.struct s
8370: 79 6d 62 6f 6c 20 2a 65 72 72 73 79 6d 3b 20 20  ymbol *errsym;  
8380: 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 73 79   /* The error sy
8390: 6d 62 6f 6c 20 28 69 66 20 64 65 66 69 6e 65 64  mbol (if defined
83a0: 2e 20 20 4e 55 4c 4c 20 6f 74 68 65 72 77 69 73  .  NULL otherwis
83b0: 65 29 20 2a 2f 0a 7b 0a 20 20 73 74 72 75 63 74  e) */.{.  struct
83c0: 20 73 79 6d 62 6f 6c 20 2a 73 70 78 2c 20 2a 73   symbol *spx, *s
83d0: 70 79 3b 0a 20 20 69 6e 74 20 65 72 72 63 6e 74  py;.  int errcnt
83e0: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
83f0: 61 70 78 2d 3e 73 70 3d 3d 61 70 79 2d 3e 73 70  apx->sp==apy->sp
8400: 20 29 3b 20 20 2f 2a 20 4f 74 68 65 72 77 69 73   );  /* Otherwis
8410: 65 20 74 68 65 72 65 20 77 6f 75 6c 64 20 62 65  e there would be
8420: 20 6e 6f 20 63 6f 6e 66 6c 69 63 74 20 2a 2f 0a   no conflict */.
8430: 20 20 69 66 28 20 61 70 78 2d 3e 74 79 70 65 3d    if( apx->type=
8440: 3d 53 48 49 46 54 20 26 26 20 61 70 79 2d 3e 74  =SHIFT && apy->t
8450: 79 70 65 3d 3d 52 45 44 55 43 45 20 29 7b 0a 20  ype==REDUCE ){. 
8460: 20 20 20 73 70 78 20 3d 20 61 70 78 2d 3e 73 70     spx = apx->sp
8470: 3b 0a 20 20 20 20 73 70 79 20 3d 20 61 70 79 2d  ;.    spy = apy-
8480: 3e 78 2e 72 70 2d 3e 70 72 65 63 73 79 6d 3b 0a  >x.rp->precsym;.
8490: 20 20 20 20 69 66 28 20 73 70 79 3d 3d 30 20 7c      if( spy==0 |
84a0: 7c 20 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c  | spx->prec<0 ||
84b0: 20 73 70 79 2d 3e 70 72 65 63 3c 30 20 29 7b 0a   spy->prec<0 ){.
84c0: 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20 65 6e 6f        /* Not eno
84d0: 75 67 68 20 70 72 65 63 65 64 65 6e 63 65 20 69  ugh precedence i
84e0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 20  nformation. */. 
84f0: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d       apy->type =
8500: 20 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20 20 20   CONFLICT;.     
8510: 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d   errcnt++;.    }
8520: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
8530: 65 63 3e 73 70 79 2d 3e 70 72 65 63 20 29 7b 20  ec>spy->prec ){ 
8540: 20 20 20 2f 2a 20 4c 6f 77 65 72 20 70 72 65 63     /* Lower prec
8550: 65 64 65 6e 63 65 20 77 69 6e 73 20 2a 2f 0a 20  edence wins */. 
8560: 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20 3d       apy->type =
8570: 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20   RD_RESOLVED;.  
8580: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78 2d    }else if( spx-
8590: 3e 70 72 65 63 3c 73 70 79 2d 3e 70 72 65 63 20  >prec<spy->prec 
85a0: 29 7b 0a 20 20 20 20 20 20 61 70 78 2d 3e 74 79  ){.      apx->ty
85b0: 70 65 20 3d 20 53 48 5f 52 45 53 4f 4c 56 45 44  pe = SH_RESOLVED
85c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
85d0: 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e  spx->prec==spy->
85e0: 70 72 65 63 20 26 26 20 73 70 78 2d 3e 61 73 73  prec && spx->ass
85f0: 6f 63 3d 3d 52 49 47 48 54 20 29 7b 20 2f 2a 20  oc==RIGHT ){ /* 
8600: 55 73 65 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a  Use operator */.
8610: 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65 20        apy->type 
8620: 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 20 20  = RD_RESOLVED;  
8630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8640: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 73             /* as
8650: 73 6f 63 69 61 74 69 76 69 74 79 20 2a 2f 0a 20  sociativity */. 
8660: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 70 78     }else if( spx
8670: 2d 3e 70 72 65 63 3d 3d 73 70 79 2d 3e 70 72 65  ->prec==spy->pre
8680: 63 20 26 26 20 73 70 78 2d 3e 61 73 73 6f 63 3d  c && spx->assoc=
8690: 3d 4c 45 46 54 20 29 7b 20 20 2f 2a 20 74 6f 20  =LEFT ){  /* to 
86a0: 62 72 65 61 6b 20 74 69 65 20 2a 2f 0a 20 20 20  break tie */.   
86b0: 20 20 20 61 70 78 2d 3e 74 79 70 65 20 3d 20 53     apx->type = S
86c0: 48 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20  H_RESOLVED;.    
86d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
86e0: 65 72 74 28 20 73 70 78 2d 3e 70 72 65 63 3d 3d  ert( spx->prec==
86f0: 73 70 79 2d 3e 70 72 65 63 20 26 26 20 73 70 78  spy->prec && spx
8700: 2d 3e 61 73 73 6f 63 3d 3d 4e 4f 4e 45 20 29 3b  ->assoc==NONE );
8710: 0a 20 20 20 20 20 20 61 70 79 2d 3e 74 79 70 65  .      apy->type
8720: 20 3d 20 43 4f 4e 46 4c 49 43 54 3b 0a 20 20 20   = CONFLICT;.   
8730: 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20     errcnt++;.   
8740: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 61   }.  }else if( a
8750: 70 78 2d 3e 74 79 70 65 3d 3d 52 45 44 55 43 45  px->type==REDUCE
8760: 20 26 26 20 61 70 79 2d 3e 74 79 70 65 3d 3d 52   && apy->type==R
8770: 45 44 55 43 45 20 29 7b 0a 20 20 20 20 73 70 78  EDUCE ){.    spx
8780: 20 3d 20 61 70 78 2d 3e 78 2e 72 70 2d 3e 70 72   = apx->x.rp->pr
8790: 65 63 73 79 6d 3b 0a 20 20 20 20 73 70 79 20 3d  ecsym;.    spy =
87a0: 20 61 70 79 2d 3e 78 2e 72 70 2d 3e 70 72 65 63   apy->x.rp->prec
87b0: 73 79 6d 3b 0a 20 20 20 20 69 66 28 20 73 70 78  sym;.    if( spx
87c0: 3d 3d 30 20 7c 7c 20 73 70 79 3d 3d 30 20 7c 7c  ==0 || spy==0 ||
87d0: 20 73 70 78 2d 3e 70 72 65 63 3c 30 20 7c 7c 0a   spx->prec<0 ||.
87e0: 20 20 20 20 73 70 79 2d 3e 70 72 65 63 3c 30 20      spy->prec<0 
87f0: 7c 7c 20 73 70 78 2d 3e 70 72 65 63 3d 3d 73 70  || spx->prec==sp
8800: 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20 20  y->prec ){.     
8810: 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 43 4f 4e   apy->type = CON
8820: 46 4c 49 43 54 3b 0a 20 20 20 20 20 20 65 72 72  FLICT;.      err
8830: 63 6e 74 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  cnt++;.    }else
8840: 20 69 66 28 20 73 70 78 2d 3e 70 72 65 63 3e 73   if( spx->prec>s
8850: 70 79 2d 3e 70 72 65 63 20 29 7b 0a 20 20 20 20  py->prec ){.    
8860: 20 20 61 70 79 2d 3e 74 79 70 65 20 3d 20 52 44    apy->type = RD
8870: 5f 52 45 53 4f 4c 56 45 44 3b 0a 20 20 20 20 7d  _RESOLVED;.    }
8880: 65 6c 73 65 20 69 66 28 20 73 70 78 2d 3e 70 72  else if( spx->pr
8890: 65 63 3c 73 70 79 2d 3e 70 72 65 63 20 29 7b 0a  ec<spy->prec ){.
88a0: 20 20 20 20 20 20 61 70 78 2d 3e 74 79 70 65 20        apx->type 
88b0: 3d 20 52 44 5f 52 45 53 4f 4c 56 45 44 3b 0a 20  = RD_RESOLVED;. 
88c0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
88d0: 20 20 61 73 73 65 72 74 28 20 0a 20 20 20 20 20    assert( .     
88e0: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 53 48 5f 52   apx->type==SH_R
88f0: 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20  ESOLVED ||.     
8900: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 52 44 5f 52   apx->type==RD_R
8910: 45 53 4f 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20  ESOLVED ||.     
8920: 20 61 70 78 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46   apx->type==CONF
8930: 4c 49 43 54 20 7c 7c 0a 20 20 20 20 20 20 61 70  LICT ||.      ap
8940: 79 2d 3e 74 79 70 65 3d 3d 53 48 5f 52 45 53 4f  y->type==SH_RESO
8950: 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70  LVED ||.      ap
8960: 79 2d 3e 74 79 70 65 3d 3d 52 44 5f 52 45 53 4f  y->type==RD_RESO
8970: 4c 56 45 44 20 7c 7c 0a 20 20 20 20 20 20 61 70  LVED ||.      ap
8980: 79 2d 3e 74 79 70 65 3d 3d 43 4f 4e 46 4c 49 43  y->type==CONFLIC
8990: 54 0a 20 20 20 20 29 3b 0a 20 20 20 20 2f 2a 20  T.    );.    /* 
89a0: 54 68 65 20 52 45 44 55 43 45 2f 53 48 49 46 54  The REDUCE/SHIFT
89b0: 20 63 61 73 65 20 63 61 6e 6e 6f 74 20 68 61 70   case cannot hap
89c0: 70 65 6e 20 62 65 63 61 75 73 65 20 53 48 49 46  pen because SHIF
89d0: 54 73 20 63 6f 6d 65 20 62 65 66 6f 72 65 0a 20  Ts come before. 
89e0: 20 20 20 2a 2a 20 52 45 44 55 43 45 73 20 6f 6e     ** REDUCEs on
89f0: 20 74 68 65 20 6c 69 73 74 2e 20 20 49 66 20 77   the list.  If w
8a00: 65 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69  e reach this poi
8a10: 6e 74 20 69 74 20 6d 75 73 74 20 62 65 20 62 65  nt it must be be
8a20: 63 61 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65  cause.    ** the
8a30: 20 70 61 72 73 65 72 20 63 6f 6e 66 6c 69 63 74   parser conflict
8a40: 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
8a50: 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a 20  n resolved. */. 
8a60: 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63   }.  return errc
8a70: 6e 74 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  nt;.}./*********
8a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f  ************ Fro
8a90: 6d 20 74 68 65 20 66 69 6c 65 20 22 63 6f 6e 66  m the file "conf
8aa0: 69 67 6c 69 73 74 2e 63 22 20 2a 2a 2a 2a 2a 2a  iglist.c" ******
8ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8ac0: 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  ***/./*.** Routi
8ad0: 6e 65 73 20 74 6f 20 70 72 6f 63 65 73 73 69 6e  nes to processin
8ae0: 67 20 61 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  g a configuratio
8af0: 6e 20 6c 69 73 74 20 61 6e 64 20 62 75 69 6c 64  n list and build
8b00: 69 6e 67 20 61 20 73 74 61 74 65 0a 2a 2a 20 69  ing a state.** i
8b10: 6e 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  n the LEMON pars
8b20: 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
8b30: 0a 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  ..static struct 
8b40: 63 6f 6e 66 69 67 20 2a 66 72 65 65 6c 69 73 74  config *freelist
8b50: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4c 69   = 0;      /* Li
8b60: 73 74 20 6f 66 20 66 72 65 65 20 63 6f 6e 66 69  st of free confi
8b70: 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61  gurations */.sta
8b80: 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69  tic struct confi
8b90: 67 20 2a 63 75 72 72 65 6e 74 20 3d 20 30 3b 20  g *current = 0; 
8ba0: 20 20 20 20 20 20 2f 2a 20 54 6f 70 20 6f 66 20        /* Top of 
8bb0: 6c 69 73 74 20 6f 66 20 63 6f 6e 66 69 67 75 72  list of configur
8bc0: 61 74 69 6f 6e 73 20 2a 2f 0a 73 74 61 74 69 63  ations */.static
8bd0: 20 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a   struct config *
8be0: 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b  *currentend = 0;
8bf0: 20 20 20 2f 2a 20 4c 61 73 74 20 6f 6e 20 6c 69     /* Last on li
8c00: 73 74 20 6f 66 20 63 6f 6e 66 69 67 73 20 2a 2f  st of configs */
8c10: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 63  .static struct c
8c20: 6f 6e 66 69 67 20 2a 62 61 73 69 73 20 3d 20 30  onfig *basis = 0
8c30: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 70  ;         /* Top
8c40: 20 6f 66 20 6c 69 73 74 20 6f 66 20 62 61 73 69   of list of basi
8c50: 73 20 63 6f 6e 66 69 67 73 20 2a 2f 0a 73 74 61  s configs */.sta
8c60: 74 69 63 20 73 74 72 75 63 74 20 63 6f 6e 66 69  tic struct confi
8c70: 67 20 2a 2a 62 61 73 69 73 65 6e 64 20 3d 20 30  g **basisend = 0
8c80: 3b 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20  ;     /* End of 
8c90: 6c 69 73 74 20 6f 66 20 62 61 73 69 73 20 63 6f  list of basis co
8ca0: 6e 66 69 67 73 20 2a 2f 0a 0a 2f 2a 20 52 65 74  nfigs */../* Ret
8cb0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
8cc0: 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75 72 61   a new configura
8cd0: 74 69 6f 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20  tion */.PRIVATE 
8ce0: 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e  struct config *n
8cf0: 65 77 63 6f 6e 66 69 67 28 29 7b 0a 20 20 73 74  ewconfig(){.  st
8d00: 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6e 65 77  ruct config *new
8d10: 3b 0a 20 20 69 66 28 20 66 72 65 65 6c 69 73 74  ;.  if( freelist
8d20: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ==0 ){.    int i
8d30: 3b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20  ;.    int amt = 
8d40: 33 3b 0a 20 20 20 20 66 72 65 65 6c 69 73 74 20  3;.    freelist 
8d50: 3d 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67  = (struct config
8d60: 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f   *)malloc( sizeo
8d70: 66 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 29  f(struct config)
8d80: 2a 61 6d 74 20 29 3b 0a 20 20 20 20 69 66 28 20  *amt );.    if( 
8d90: 66 72 65 65 6c 69 73 74 3d 3d 30 20 29 7b 0a 20  freelist==0 ){. 
8da0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
8db0: 65 72 72 2c 22 55 6e 61 62 6c 65 20 74 6f 20 61  err,"Unable to a
8dc0: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
8dd0: 6f 72 20 61 20 6e 65 77 20 63 6f 6e 66 69 67 75  or a new configu
8de0: 72 61 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20  ration.");.     
8df0: 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
8e00: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61      for(i=0; i<a
8e10: 6d 74 2d 31 3b 20 69 2b 2b 29 20 66 72 65 65 6c  mt-1; i++) freel
8e20: 69 73 74 5b 69 5d 2e 6e 65 78 74 20 3d 20 26 66  ist[i].next = &f
8e30: 72 65 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20  reelist[i+1];.  
8e40: 20 20 66 72 65 65 6c 69 73 74 5b 61 6d 74 2d 31    freelist[amt-1
8e50: 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 7d 0a  ].next = 0;.  }.
8e60: 20 20 6e 65 77 20 3d 20 66 72 65 65 6c 69 73 74    new = freelist
8e70: 3b 0a 20 20 66 72 65 65 6c 69 73 74 20 3d 20 66  ;.  freelist = f
8e80: 72 65 65 6c 69 73 74 2d 3e 6e 65 78 74 3b 0a 20  reelist->next;. 
8e90: 20 72 65 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a   return new;.}..
8ea0: 2f 2a 20 54 68 65 20 63 6f 6e 66 69 67 75 72 61  /* The configura
8eb0: 74 69 6f 6e 20 22 6f 6c 64 22 20 69 73 20 6e 6f  tion "old" is no
8ec0: 20 6c 6f 6e 67 65 72 20 75 73 65 64 20 2a 2f 0a   longer used */.
8ed0: 50 52 49 56 41 54 45 20 76 6f 69 64 20 64 65 6c  PRIVATE void del
8ee0: 65 74 65 63 6f 6e 66 69 67 28 6f 6c 64 29 0a 73  eteconfig(old).s
8ef0: 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6f 6c  truct config *ol
8f00: 64 3b 0a 7b 0a 20 20 6f 6c 64 2d 3e 6e 65 78 74  d;.{.  old->next
8f10: 20 3d 20 66 72 65 65 6c 69 73 74 3b 0a 20 20 66   = freelist;.  f
8f20: 72 65 65 6c 69 73 74 20 3d 20 6f 6c 64 3b 0a 7d  reelist = old;.}
8f30: 0a 0a 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 64  ../* Initialized
8f40: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
8f50: 6f 6e 20 6c 69 73 74 20 62 75 69 6c 64 65 72 20  on list builder 
8f60: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
8f70: 73 74 5f 69 6e 69 74 28 29 7b 0a 20 20 63 75 72  st_init(){.  cur
8f80: 72 65 6e 74 20 3d 20 30 3b 0a 20 20 63 75 72 72  rent = 0;.  curr
8f90: 65 6e 74 65 6e 64 20 3d 20 26 63 75 72 72 65 6e  entend = &curren
8fa0: 74 3b 0a 20 20 62 61 73 69 73 20 3d 20 30 3b 0a  t;.  basis = 0;.
8fb0: 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26 62 61    basisend = &ba
8fc0: 73 69 73 3b 0a 20 20 43 6f 6e 66 69 67 74 61 62  sis;.  Configtab
8fd0: 6c 65 5f 69 6e 69 74 28 29 3b 0a 20 20 72 65 74  le_init();.  ret
8fe0: 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 49 6e 69 74 69  urn;.}../* Initi
8ff0: 61 6c 69 7a 65 64 20 74 68 65 20 63 6f 6e 66 69  alized the confi
9000: 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20 62 75  guration list bu
9010: 69 6c 64 65 72 20 2a 2f 0a 76 6f 69 64 20 43 6f  ilder */.void Co
9020: 6e 66 69 67 6c 69 73 74 5f 72 65 73 65 74 28 29  nfiglist_reset()
9030: 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b  {.  current = 0;
9040: 0a 20 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20  .  currentend = 
9050: 26 63 75 72 72 65 6e 74 3b 0a 20 20 62 61 73 69  &current;.  basi
9060: 73 20 3d 20 30 3b 0a 20 20 62 61 73 69 73 65 6e  s = 0;.  basisen
9070: 64 20 3d 20 26 62 61 73 69 73 3b 0a 20 20 43 6f  d = &basis;.  Co
9080: 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72 28  nfigtable_clear(
9090: 30 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a  0);.  return;.}.
90a0: 0a 2f 2a 20 41 64 64 20 61 6e 6f 74 68 65 72 20  ./* Add another 
90b0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74 6f  configuration to
90c0: 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69   the configurati
90d0: 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75 63  on list */.struc
90e0: 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69 67  t config *Config
90f0: 6c 69 73 74 5f 61 64 64 28 72 70 2c 64 6f 74 29  list_add(rp,dot)
9100: 0a 73 74 72 75 63 74 20 72 75 6c 65 20 2a 72 70  .struct rule *rp
9110: 3b 20 20 20 20 2f 2a 20 54 68 65 20 72 75 6c 65  ;    /* The rule
9120: 20 2a 2f 0a 69 6e 74 20 64 6f 74 3b 20 20 20 20   */.int dot;    
9130: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
9140: 20 69 6e 74 6f 20 74 68 65 20 52 48 53 20 6f 66   into the RHS of
9150: 20 74 68 65 20 72 75 6c 65 20 77 68 65 72 65 20   the rule where 
9160: 74 68 65 20 64 6f 74 20 67 6f 65 73 20 2a 2f 0a  the dot goes */.
9170: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
9180: 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a 0a  g *cfp, model;..
9190: 20 20 61 73 73 65 72 74 28 20 63 75 72 72 65 6e    assert( curren
91a0: 74 65 6e 64 21 3d 30 20 29 3b 0a 20 20 6d 6f 64  tend!=0 );.  mod
91b0: 65 6c 2e 72 70 20 3d 20 72 70 3b 0a 20 20 6d 6f  el.rp = rp;.  mo
91c0: 64 65 6c 2e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20  del.dot = dot;. 
91d0: 20 63 66 70 20 3d 20 43 6f 6e 66 69 67 74 61 62   cfp = Configtab
91e0: 6c 65 5f 66 69 6e 64 28 26 6d 6f 64 65 6c 29 3b  le_find(&model);
91f0: 0a 20 20 69 66 28 20 63 66 70 3d 3d 30 20 29 7b  .  if( cfp==0 ){
9200: 0a 20 20 20 20 63 66 70 20 3d 20 6e 65 77 63 6f  .    cfp = newco
9210: 6e 66 69 67 28 29 3b 0a 20 20 20 20 63 66 70 2d  nfig();.    cfp-
9220: 3e 72 70 20 3d 20 72 70 3b 0a 20 20 20 20 63 66  >rp = rp;.    cf
9230: 70 2d 3e 64 6f 74 20 3d 20 64 6f 74 3b 0a 20 20  p->dot = dot;.  
9240: 20 20 63 66 70 2d 3e 66 77 73 20 3d 20 53 65 74    cfp->fws = Set
9250: 4e 65 77 28 29 3b 0a 20 20 20 20 63 66 70 2d 3e  New();.    cfp->
9260: 73 74 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70  stp = 0;.    cfp
9270: 2d 3e 66 70 6c 70 20 3d 20 63 66 70 2d 3e 62 70  ->fplp = cfp->bp
9280: 6c 70 20 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d  lp = 0;.    cfp-
9290: 3e 6e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20 63  >next = 0;.    c
92a0: 66 70 2d 3e 62 70 20 3d 20 30 3b 0a 20 20 20 20  fp->bp = 0;.    
92b0: 2a 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 63 66  *currentend = cf
92c0: 70 3b 0a 20 20 20 20 63 75 72 72 65 6e 74 65 6e  p;.    currenten
92d0: 64 20 3d 20 26 63 66 70 2d 3e 6e 65 78 74 3b 0a  d = &cfp->next;.
92e0: 20 20 20 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f      Configtable_
92f0: 69 6e 73 65 72 74 28 63 66 70 29 3b 0a 20 20 7d  insert(cfp);.  }
9300: 0a 20 20 72 65 74 75 72 6e 20 63 66 70 3b 0a 7d  .  return cfp;.}
9310: 0a 0a 2f 2a 20 41 64 64 20 61 20 62 61 73 69 73  ../* Add a basis
9320: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 74   configuration t
9330: 6f 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61 74  o the configurat
9340: 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 73 74 72 75  ion list */.stru
9350: 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66 69  ct config *Confi
9360: 67 6c 69 73 74 5f 61 64 64 62 61 73 69 73 28 72  glist_addbasis(r
9370: 70 2c 64 6f 74 29 0a 73 74 72 75 63 74 20 72 75  p,dot).struct ru
9380: 6c 65 20 2a 72 70 3b 0a 69 6e 74 20 64 6f 74 3b  le *rp;.int dot;
9390: 0a 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66  .{.  struct conf
93a0: 69 67 20 2a 63 66 70 2c 20 6d 6f 64 65 6c 3b 0a  ig *cfp, model;.
93b0: 0a 20 20 61 73 73 65 72 74 28 20 62 61 73 69 73  .  assert( basis
93c0: 65 6e 64 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  end!=0 );.  asse
93d0: 72 74 28 20 63 75 72 72 65 6e 74 65 6e 64 21 3d  rt( currentend!=
93e0: 30 20 29 3b 0a 20 20 6d 6f 64 65 6c 2e 72 70 20  0 );.  model.rp 
93f0: 3d 20 72 70 3b 0a 20 20 6d 6f 64 65 6c 2e 64 6f  = rp;.  model.do
9400: 74 20 3d 20 64 6f 74 3b 0a 20 20 63 66 70 20 3d  t = dot;.  cfp =
9410: 20 43 6f 6e 66 69 67 74 61 62 6c 65 5f 66 69 6e   Configtable_fin
9420: 64 28 26 6d 6f 64 65 6c 29 3b 0a 20 20 69 66 28  d(&model);.  if(
9430: 20 63 66 70 3d 3d 30 20 29 7b 0a 20 20 20 20 63   cfp==0 ){.    c
9440: 66 70 20 3d 20 6e 65 77 63 6f 6e 66 69 67 28 29  fp = newconfig()
9450: 3b 0a 20 20 20 20 63 66 70 2d 3e 72 70 20 3d 20  ;.    cfp->rp = 
9460: 72 70 3b 0a 20 20 20 20 63 66 70 2d 3e 64 6f 74  rp;.    cfp->dot
9470: 20 3d 20 64 6f 74 3b 0a 20 20 20 20 63 66 70 2d   = dot;.    cfp-
9480: 3e 66 77 73 20 3d 20 53 65 74 4e 65 77 28 29 3b  >fws = SetNew();
9490: 0a 20 20 20 20 63 66 70 2d 3e 73 74 70 20 3d 20  .    cfp->stp = 
94a0: 30 3b 0a 20 20 20 20 63 66 70 2d 3e 66 70 6c 70  0;.    cfp->fplp
94b0: 20 3d 20 63 66 70 2d 3e 62 70 6c 70 20 3d 20 30   = cfp->bplp = 0
94c0: 3b 0a 20 20 20 20 63 66 70 2d 3e 6e 65 78 74 20  ;.    cfp->next 
94d0: 3d 20 30 3b 0a 20 20 20 20 63 66 70 2d 3e 62 70  = 0;.    cfp->bp
94e0: 20 3d 20 30 3b 0a 20 20 20 20 2a 63 75 72 72 65   = 0;.    *curre
94f0: 6e 74 65 6e 64 20 3d 20 63 66 70 3b 0a 20 20 20  ntend = cfp;.   
9500: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 26 63   currentend = &c
9510: 66 70 2d 3e 6e 65 78 74 3b 0a 20 20 20 20 2a 62  fp->next;.    *b
9520: 61 73 69 73 65 6e 64 20 3d 20 63 66 70 3b 0a 20  asisend = cfp;. 
9530: 20 20 20 62 61 73 69 73 65 6e 64 20 3d 20 26 63     basisend = &c
9540: 66 70 2d 3e 62 70 3b 0a 20 20 20 20 43 6f 6e 66  fp->bp;.    Conf
9550: 69 67 74 61 62 6c 65 5f 69 6e 73 65 72 74 28 63  igtable_insert(c
9560: 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  fp);.  }.  retur
9570: 6e 20 63 66 70 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d  n cfp;.}../* Com
9580: 70 75 74 65 20 74 68 65 20 63 6c 6f 73 75 72 65  pute the closure
9590: 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75 72   of the configur
95a0: 61 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f  ation list */.vo
95b0: 69 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 63 6c  id Configlist_cl
95c0: 6f 73 75 72 65 28 6c 65 6d 70 29 0a 73 74 72 75  osure(lemp).stru
95d0: 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a  ct lemon *lemp;.
95e0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
95f0: 67 20 2a 63 66 70 2c 20 2a 6e 65 77 63 66 70 3b  g *cfp, *newcfp;
9600: 0a 20 20 73 74 72 75 63 74 20 72 75 6c 65 20 2a  .  struct rule *
9610: 72 70 2c 20 2a 6e 65 77 72 70 3b 0a 20 20 73 74  rp, *newrp;.  st
9620: 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 2c  ruct symbol *sp,
9630: 20 2a 78 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20   *xsp;.  int i, 
9640: 64 6f 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  dot;..  assert( 
9650: 63 75 72 72 65 6e 74 65 6e 64 21 3d 30 20 29 3b  currentend!=0 );
9660: 0a 20 20 66 6f 72 28 63 66 70 3d 63 75 72 72 65  .  for(cfp=curre
9670: 6e 74 3b 20 63 66 70 3b 20 63 66 70 3d 63 66 70  nt; cfp; cfp=cfp
9680: 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 72 70 20  ->next){.    rp 
9690: 3d 20 63 66 70 2d 3e 72 70 3b 0a 20 20 20 20 64  = cfp->rp;.    d
96a0: 6f 74 20 3d 20 63 66 70 2d 3e 64 6f 74 3b 0a 20  ot = cfp->dot;. 
96b0: 20 20 20 69 66 28 20 64 6f 74 3e 3d 72 70 2d 3e     if( dot>=rp->
96c0: 6e 72 68 73 20 29 20 63 6f 6e 74 69 6e 75 65 3b  nrhs ) continue;
96d0: 0a 20 20 20 20 73 70 20 3d 20 72 70 2d 3e 72 68  .    sp = rp->rh
96e0: 73 5b 64 6f 74 5d 3b 0a 20 20 20 20 69 66 28 20  s[dot];.    if( 
96f0: 73 70 2d 3e 74 79 70 65 3d 3d 4e 4f 4e 54 45 52  sp->type==NONTER
9700: 4d 49 4e 41 4c 20 29 7b 0a 20 20 20 20 20 20 69  MINAL ){.      i
9710: 66 28 20 73 70 2d 3e 72 75 6c 65 3d 3d 30 20 26  f( sp->rule==0 &
9720: 26 20 73 70 21 3d 6c 65 6d 70 2d 3e 65 72 72 73  & sp!=lemp->errs
9730: 79 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72  ym ){.        Er
9740: 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
9750: 65 6e 61 6d 65 2c 72 70 2d 3e 6c 69 6e 65 2c 22  ename,rp->line,"
9760: 4e 6f 6e 74 65 72 6d 69 6e 61 6c 20 5c 22 25 73  Nonterminal \"%s
9770: 5c 22 20 68 61 73 20 6e 6f 20 72 75 6c 65 73 2e  \" has no rules.
9780: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d  ",.          sp-
9790: 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  >name);.        
97a0: 6c 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b  lemp->errorcnt++
97b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
97c0: 66 6f 72 28 6e 65 77 72 70 3d 73 70 2d 3e 72 75  for(newrp=sp->ru
97d0: 6c 65 3b 20 6e 65 77 72 70 3b 20 6e 65 77 72 70  le; newrp; newrp
97e0: 3d 6e 65 77 72 70 2d 3e 6e 65 78 74 6c 68 73 29  =newrp->nextlhs)
97f0: 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 63 66 70  {.        newcfp
9800: 20 3d 20 43 6f 6e 66 69 67 6c 69 73 74 5f 61 64   = Configlist_ad
9810: 64 28 6e 65 77 72 70 2c 30 29 3b 0a 20 20 20 20  d(newrp,0);.    
9820: 20 20 20 20 66 6f 72 28 69 3d 64 6f 74 2b 31 3b      for(i=dot+1;
9830: 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
9840: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 78 73 70  ){.          xsp
9850: 20 3d 20 72 70 2d 3e 72 68 73 5b 69 5d 3b 0a 20   = rp->rhs[i];. 
9860: 20 20 20 20 20 20 20 20 20 69 66 28 20 78 73 70           if( xsp
9870: 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
9880: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9890: 53 65 74 41 64 64 28 6e 65 77 63 66 70 2d 3e 66  SetAdd(newcfp->f
98a0: 77 73 2c 78 73 70 2d 3e 69 6e 64 65 78 29 3b 0a  ws,xsp->index);.
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
98c0: 6b 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a 20 20 20  k;..  }else{.   
98d0: 20 20 20 20 20 20 20 20 20 53 65 74 55 6e 69 6f           SetUnio
98e0: 6e 28 6e 65 77 63 66 70 2d 3e 66 77 73 2c 78 73  n(newcfp->fws,xs
98f0: 70 2d 3e 66 69 72 73 74 73 65 74 29 3b 0a 20 20  p->firstset);.  
9900: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 73            if( xs
9910: 70 2d 3e 6c 61 6d 62 64 61 3d 3d 42 5f 46 41 4c  p->lambda==B_FAL
9920: 53 45 20 29 20 62 72 65 61 6b 3b 0a 09 20 20 7d  SE ) break;..  }
9930: 0a 09 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ..}.        if( 
9940: 69 3d 3d 72 70 2d 3e 6e 72 68 73 20 29 20 50 6c  i==rp->nrhs ) Pl
9950: 69 6e 6b 5f 61 64 64 28 26 63 66 70 2d 3e 66 70  ink_add(&cfp->fp
9960: 6c 70 2c 6e 65 77 63 66 70 29 3b 0a 20 20 20 20  lp,newcfp);.    
9970: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
9980: 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53 6f  return;.}../* So
9990: 72 74 20 74 68 65 20 63 6f 6e 66 69 67 75 72 61  rt the configura
99a0: 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 76 6f 69  tion list */.voi
99b0: 64 20 43 6f 6e 66 69 67 6c 69 73 74 5f 73 6f 72  d Configlist_sor
99c0: 74 28 29 7b 0a 20 20 63 75 72 72 65 6e 74 20 3d  t(){.  current =
99d0: 20 28 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20   (struct config 
99e0: 2a 29 6d 73 6f 72 74 28 63 75 72 72 65 6e 74 2c  *)msort(current,
99f0: 26 28 63 75 72 72 65 6e 74 2d 3e 6e 65 78 74 29  &(current->next)
9a00: 2c 43 6f 6e 66 69 67 63 6d 70 29 3b 0a 20 20 63  ,Configcmp);.  c
9a10: 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b 0a 20  urrentend = 0;. 
9a20: 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 53   return;.}../* S
9a30: 6f 72 74 20 74 68 65 20 62 61 73 69 73 20 63 6f  ort the basis co
9a40: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74  nfiguration list
9a50: 20 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c   */.void Configl
9a60: 69 73 74 5f 73 6f 72 74 62 61 73 69 73 28 29 7b  ist_sortbasis(){
9a70: 0a 20 20 62 61 73 69 73 20 3d 20 28 73 74 72 75  .  basis = (stru
9a80: 63 74 20 63 6f 6e 66 69 67 20 2a 29 6d 73 6f 72  ct config *)msor
9a90: 74 28 63 75 72 72 65 6e 74 2c 26 28 63 75 72 72  t(current,&(curr
9aa0: 65 6e 74 2d 3e 62 70 29 2c 43 6f 6e 66 69 67 63  ent->bp),Configc
9ab0: 6d 70 29 3b 0a 20 20 62 61 73 69 73 65 6e 64 20  mp);.  basisend 
9ac0: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  = 0;.  return;.}
9ad0: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
9ae0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
9af0: 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75  d of the configu
9b00: 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a  ration list and.
9b10: 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c 69 73  ** reset the lis
9b20: 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  t */.struct conf
9b30: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 72  ig *Configlist_r
9b40: 65 74 75 72 6e 28 29 7b 0a 20 20 73 74 72 75 63  eturn(){.  struc
9b50: 74 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20  t config *old;. 
9b60: 20 6f 6c 64 20 3d 20 63 75 72 72 65 6e 74 3b 0a   old = current;.
9b70: 20 20 63 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20    current = 0;. 
9b80: 20 63 75 72 72 65 6e 74 65 6e 64 20 3d 20 30 3b   currentend = 0;
9b90: 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 3b 0a 7d  .  return old;.}
9ba0: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  ../* Return a po
9bb0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
9bc0: 64 20 6f 66 20 74 68 65 20 63 6f 6e 66 69 67 75  d of the configu
9bd0: 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 0a  ration list and.
9be0: 2a 2a 20 72 65 73 65 74 20 74 68 65 20 6c 69 73  ** reset the lis
9bf0: 74 20 2a 2f 0a 73 74 72 75 63 74 20 63 6f 6e 66  t */.struct conf
9c00: 69 67 20 2a 43 6f 6e 66 69 67 6c 69 73 74 5f 62  ig *Configlist_b
9c10: 61 73 69 73 28 29 7b 0a 20 20 73 74 72 75 63 74  asis(){.  struct
9c20: 20 63 6f 6e 66 69 67 20 2a 6f 6c 64 3b 0a 20 20   config *old;.  
9c30: 6f 6c 64 20 3d 20 62 61 73 69 73 3b 0a 20 20 62  old = basis;.  b
9c40: 61 73 69 73 20 3d 20 30 3b 0a 20 20 62 61 73 69  asis = 0;.  basi
9c50: 73 65 6e 64 20 3d 20 30 3b 0a 20 20 72 65 74 75  send = 0;.  retu
9c60: 72 6e 20 6f 6c 64 3b 0a 7d 0a 0a 2f 2a 20 46 72  rn old;.}../* Fr
9c70: 65 65 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20  ee all elements 
9c80: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 6f 6e  of the given con
9c90: 66 69 67 75 72 61 74 69 6f 6e 20 6c 69 73 74 20  figuration list 
9ca0: 2a 2f 0a 76 6f 69 64 20 43 6f 6e 66 69 67 6c 69  */.void Configli
9cb0: 73 74 5f 65 61 74 28 63 66 70 29 0a 73 74 72 75  st_eat(cfp).stru
9cc0: 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b 0a  ct config *cfp;.
9cd0: 7b 0a 20 20 73 74 72 75 63 74 20 63 6f 6e 66 69  {.  struct confi
9ce0: 67 20 2a 6e 65 78 74 63 66 70 3b 0a 20 20 66 6f  g *nextcfp;.  fo
9cf0: 72 28 3b 20 63 66 70 3b 20 63 66 70 3d 6e 65 78  r(; cfp; cfp=nex
9d00: 74 63 66 70 29 7b 0a 20 20 20 20 6e 65 78 74 63  tcfp){.    nextc
9d10: 66 70 20 3d 20 63 66 70 2d 3e 6e 65 78 74 3b 0a  fp = cfp->next;.
9d20: 20 20 20 20 61 73 73 65 72 74 28 20 63 66 70 2d      assert( cfp-
9d30: 3e 66 70 6c 70 3d 3d 30 20 29 3b 0a 20 20 20 20  >fplp==0 );.    
9d40: 61 73 73 65 72 74 28 20 63 66 70 2d 3e 62 70 6c  assert( cfp->bpl
9d50: 70 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  p==0 );.    if( 
9d60: 63 66 70 2d 3e 66 77 73 20 29 20 53 65 74 46 72  cfp->fws ) SetFr
9d70: 65 65 28 63 66 70 2d 3e 66 77 73 29 3b 0a 20 20  ee(cfp->fws);.  
9d80: 20 20 64 65 6c 65 74 65 63 6f 6e 66 69 67 28 63    deleteconfig(c
9d90: 66 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  fp);.  }.  retur
9da0: 6e 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n;.}./**********
9db0: 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65  ******* From the
9dc0: 20 66 69 6c 65 20 22 65 72 72 6f 72 2e 63 22 20   file "error.c" 
9dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9df0: 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 64 65 20 66 6f  */./*.** Code fo
9e00: 72 20 70 72 69 6e 74 69 6e 67 20 65 72 72 6f 72  r printing error
9e10: 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 0a 2f 2a   message..*/../*
9e20: 20 46 69 6e 64 20 61 20 67 6f 6f 64 20 70 6c 61   Find a good pla
9e30: 63 65 20 74 6f 20 62 72 65 61 6b 20 22 6d 73 67  ce to break "msg
9e40: 22 20 73 6f 20 74 68 61 74 20 69 74 73 20 6c 65  " so that its le
9e50: 6e 67 74 68 20 69 73 20 61 74 20 6c 65 61 73 74  ngth is at least
9e60: 20 22 6d 69 6e 22 0a 2a 2a 20 62 75 74 20 6e 6f   "min".** but no
9e70: 20 6d 6f 72 65 20 74 68 61 6e 20 22 6d 61 78 22   more than "max"
9e80: 2e 20 20 4d 61 6b 65 20 74 68 65 20 70 6f 69 6e  .  Make the poin
9e90: 74 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 6d 61  t as close to ma
9ea0: 78 20 61 73 20 70 6f 73 73 69 62 6c 65 2e 0a 2a  x as possible..*
9eb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
9ec0: 64 62 72 65 61 6b 28 6d 73 67 2c 6d 69 6e 2c 6d  dbreak(msg,min,m
9ed0: 61 78 29 0a 63 68 61 72 20 2a 6d 73 67 3b 0a 69  ax).char *msg;.i
9ee0: 6e 74 20 6d 69 6e 3b 0a 69 6e 74 20 6d 61 78 3b  nt min;.int max;
9ef0: 0a 7b 0a 20 20 69 6e 74 20 69 2c 73 70 6f 74 3b  .{.  int i,spot;
9f00: 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 66 6f 72  .  char c;.  for
9f10: 28 69 3d 73 70 6f 74 3d 6d 69 6e 3b 20 69 3c 3d  (i=spot=min; i<=
9f20: 6d 61 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  max; i++){.    c
9f30: 20 3d 20 6d 73 67 5b 69 5d 3b 0a 20 20 20 20 69   = msg[i];.    i
9f40: 66 28 20 63 3d 3d 27 5c 74 27 20 29 20 6d 73 67  f( c=='\t' ) msg
9f50: 5b 69 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 69  [i] = ' ';.    i
9f60: 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 20 6d 73  f( c=='\n' ){ ms
9f70: 67 5b 69 5d 20 3d 20 27 20 27 3b 20 73 70 6f 74  g[i] = ' '; spot
9f80: 20 3d 20 69 3b 20 62 72 65 61 6b 3b 20 7d 0a 20   = i; break; }. 
9f90: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 20 73     if( c==0 ){ s
9fa0: 70 6f 74 20 3d 20 69 3b 20 62 72 65 61 6b 3b 20  pot = i; break; 
9fb0: 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 2d 27  }.    if( c=='-'
9fc0: 20 26 26 20 69 3c 6d 61 78 2d 31 20 29 20 73 70   && i<max-1 ) sp
9fd0: 6f 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 69 66  ot = i+1;.    if
9fe0: 28 20 63 3d 3d 27 20 27 20 29 20 73 70 6f 74 20  ( c==' ' ) spot 
9ff0: 3d 20 69 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = i;.  }.  retur
a000: 6e 20 73 70 6f 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n spot;.}../*.**
a010: 20 54 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   The error messa
a020: 67 65 20 69 73 20 73 70 6c 69 74 20 61 63 72 6f  ge is split acro
a030: 73 73 20 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 65  ss multiple line
a040: 73 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  s if necessary. 
a050: 20 54 68 65 0a 2a 2a 20 73 70 6c 69 74 73 20 6f   The.** splits o
a060: 63 63 75 72 20 61 74 20 61 20 73 70 61 63 65 2c  ccur at a space,
a070: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 73   if there is a s
a080: 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6e  pace available n
a090: 65 61 72 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f  ear the end.** o
a0a0: 66 20 74 68 65 20 6c 69 6e 65 2e 0a 2a 2f 0a 23  f the line..*/.#
a0b0: 64 65 66 69 6e 65 20 45 52 52 4d 53 47 53 49 5a  define ERRMSGSIZ
a0c0: 45 20 20 31 30 30 30 30 20 2f 2a 20 48 6f 70 65  E  10000 /* Hope
a0d0: 20 74 68 69 73 20 69 73 20 62 69 67 20 65 6e 6f   this is big eno
a0e0: 75 67 68 2e 20 20 4e 6f 20 77 61 79 20 74 6f 20  ugh.  No way to 
a0f0: 65 72 72 6f 72 20 63 68 65 63 6b 20 2a 2f 0a 23  error check */.#
a100: 64 65 66 69 6e 65 20 4c 49 4e 45 57 49 44 54 48  define LINEWIDTH
a110: 20 20 20 20 20 20 37 39 20 2f 2a 20 4d 61 78 20        79 /* Max 
a120: 77 69 64 74 68 20 6f 66 20 61 6e 79 20 6f 75 74  width of any out
a130: 70 75 74 20 6c 69 6e 65 20 2a 2f 0a 23 64 65 66  put line */.#def
a140: 69 6e 65 20 50 52 45 46 49 58 4c 49 4d 49 54 20  ine PREFIXLIMIT 
a150: 20 20 20 33 30 20 2f 2a 20 4d 61 78 20 77 69 64     30 /* Max wid
a160: 74 68 20 6f 66 20 74 68 65 20 70 72 65 66 69 78  th of the prefix
a170: 20 6f 6e 20 65 61 63 68 20 6c 69 6e 65 20 2a 2f   on each line */
a180: 0a 76 6f 69 64 20 45 72 72 6f 72 4d 73 67 28 63  .void ErrorMsg(c
a190: 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e  onst char *filen
a1a0: 61 6d 65 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 2c  ame, int lineno,
a1b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6f 72   const char *for
a1c0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 63 68 61  mat, ...){.  cha
a1d0: 72 20 65 72 72 6d 73 67 5b 45 52 52 4d 53 47 53  r errmsg[ERRMSGS
a1e0: 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 70 72 65  IZE];.  char pre
a1f0: 66 69 78 5b 50 52 45 46 49 58 4c 49 4d 49 54 2b  fix[PREFIXLIMIT+
a200: 31 30 5d 3b 0a 20 20 69 6e 74 20 65 72 72 6d 73  10];.  int errms
a210: 67 73 69 7a 65 3b 0a 20 20 69 6e 74 20 70 72 65  gsize;.  int pre
a220: 66 69 78 73 69 7a 65 3b 0a 20 20 69 6e 74 20 61  fixsize;.  int a
a230: 76 61 69 6c 61 62 6c 65 77 69 64 74 68 3b 0a 20  vailablewidth;. 
a240: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
a250: 6e 74 20 65 6e 64 2c 20 72 65 73 74 61 72 74 2c  nt end, restart,
a260: 20 62 61 73 65 3b 0a 0a 20 20 76 61 5f 73 74 61   base;..  va_sta
a270: 72 74 28 61 70 2c 20 66 6f 72 6d 61 74 29 3b 0a  rt(ap, format);.
a280: 20 20 2f 2a 20 50 72 65 70 61 72 65 20 61 20 70    /* Prepare a p
a290: 72 65 66 69 78 20 74 6f 20 62 65 20 70 72 65 70  refix to be prep
a2a0: 65 6e 64 65 64 20 74 6f 20 65 76 65 72 79 20 6f  ended to every o
a2b0: 75 74 70 75 74 20 6c 69 6e 65 20 2a 2f 0a 20 20  utput line */.  
a2c0: 69 66 28 20 6c 69 6e 65 6e 6f 3e 30 20 29 7b 0a  if( lineno>0 ){.
a2d0: 20 20 20 20 73 70 72 69 6e 74 66 28 70 72 65 66      sprintf(pref
a2e0: 69 78 2c 22 25 2e 2a 73 3a 25 64 3a 20 22 2c 50  ix,"%.*s:%d: ",P
a2f0: 52 45 46 49 58 4c 49 4d 49 54 2d 31 30 2c 66 69  REFIXLIMIT-10,fi
a300: 6c 65 6e 61 6d 65 2c 6c 69 6e 65 6e 6f 29 3b 0a  lename,lineno);.
a310: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 70 72    }else{.    spr
a320: 69 6e 74 66 28 70 72 65 66 69 78 2c 22 25 2e 2a  intf(prefix,"%.*
a330: 73 3a 20 22 2c 50 52 45 46 49 58 4c 49 4d 49 54  s: ",PREFIXLIMIT
a340: 2d 31 30 2c 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  -10,filename);. 
a350: 20 7d 0a 20 20 70 72 65 66 69 78 73 69 7a 65 20   }.  prefixsize 
a360: 3d 20 73 74 72 6c 65 6e 28 70 72 65 66 69 78 29  = strlen(prefix)
a370: 3b 0a 20 20 61 76 61 69 6c 61 62 6c 65 77 69 64  ;.  availablewid
a380: 74 68 20 3d 20 4c 49 4e 45 57 49 44 54 48 20 2d  th = LINEWIDTH -
a390: 20 70 72 65 66 69 78 73 69 7a 65 3b 0a 0a 20 20   prefixsize;..  
a3a0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20  /* Generate the 
a3b0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 2a 2f  error message */
a3c0: 0a 20 20 76 73 70 72 69 6e 74 66 28 65 72 72 6d  .  vsprintf(errm
a3d0: 73 67 2c 66 6f 72 6d 61 74 2c 61 70 29 3b 0a 20  sg,format,ap);. 
a3e0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 65   va_end(ap);.  e
a3f0: 72 72 6d 73 67 73 69 7a 65 20 3d 20 73 74 72 6c  rrmsgsize = strl
a400: 65 6e 28 65 72 72 6d 73 67 29 3b 0a 20 20 2f 2a  en(errmsg);.  /*
a410: 20 52 65 6d 6f 76 65 20 74 72 61 69 6c 69 6e 67   Remove trailing
a420: 20 27 5c 6e 27 73 20 66 72 6f 6d 20 74 68 65 20   '\n's from the 
a430: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 2a  error message. *
a440: 2f 0a 20 20 77 68 69 6c 65 28 20 65 72 72 6d 73  /.  while( errms
a450: 67 73 69 7a 65 3e 30 20 26 26 20 65 72 72 6d 73  gsize>0 && errms
a460: 67 5b 65 72 72 6d 73 67 73 69 7a 65 2d 31 5d 3d  g[errmsgsize-1]=
a470: 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 65 72  ='\n' ){.     er
a480: 72 6d 73 67 5b 2d 2d 65 72 72 6d 73 67 73 69 7a  rmsg[--errmsgsiz
a490: 65 5d 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  e] = 0;.  }..  /
a4a0: 2a 20 50 72 69 6e 74 20 74 68 65 20 65 72 72 6f  * Print the erro
a4b0: 72 20 6d 65 73 73 61 67 65 20 2a 2f 0a 20 20 62  r message */.  b
a4c0: 61 73 65 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  ase = 0;.  while
a4d0: 28 20 65 72 72 6d 73 67 5b 62 61 73 65 5d 21 3d  ( errmsg[base]!=
a4e0: 30 20 29 7b 0a 20 20 20 20 65 6e 64 20 3d 20 72  0 ){.    end = r
a4f0: 65 73 74 61 72 74 20 3d 20 66 69 6e 64 62 72 65  estart = findbre
a500: 61 6b 28 26 65 72 72 6d 73 67 5b 62 61 73 65 5d  ak(&errmsg[base]
a510: 2c 30 2c 61 76 61 69 6c 61 62 6c 65 77 69 64 74  ,0,availablewidt
a520: 68 29 3b 0a 20 20 20 20 72 65 73 74 61 72 74 20  h);.    restart 
a530: 2b 3d 20 62 61 73 65 3b 0a 20 20 20 20 77 68 69  += base;.    whi
a540: 6c 65 28 20 65 72 72 6d 73 67 5b 72 65 73 74 61  le( errmsg[resta
a550: 72 74 5d 3d 3d 27 20 27 20 29 20 72 65 73 74 61  rt]==' ' ) resta
a560: 72 74 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  rt++;.    fprint
a570: 66 28 73 74 64 6f 75 74 2c 22 25 73 25 2e 2a 73  f(stdout,"%s%.*s
a580: 5c 6e 22 2c 70 72 65 66 69 78 2c 65 6e 64 2c 26  \n",prefix,end,&
a590: 65 72 72 6d 73 67 5b 62 61 73 65 5d 29 3b 0a 20  errmsg[base]);. 
a5a0: 20 20 20 62 61 73 65 20 3d 20 72 65 73 74 61 72     base = restar
a5b0: 74 3b 0a 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  t;.  }.}./******
a5c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
a5d0: 74 68 65 20 66 69 6c 65 20 22 6d 61 69 6e 2e 63  the file "main.c
a5e0: 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  " **************
a5f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a600: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 61  ******/./*.** Ma
a610: 69 6e 20 70 72 6f 67 72 61 6d 20 66 69 6c 65 20  in program file 
a620: 66 6f 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61  for the LEMON pa
a630: 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  rser generator..
a640: 2a 2f 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 61 6e  */../* Report an
a650: 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 63   out-of-memory c
a660: 6f 6e 64 69 74 69 6f 6e 20 61 6e 64 20 61 62 6f  ondition and abo
a670: 72 74 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  rt.  This functi
a680: 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 20 6d 6f  on.** is used mo
a690: 73 74 6c 79 20 62 79 20 74 68 65 20 22 4d 65 6d  stly by the "Mem
a6a0: 6f 72 79 43 68 65 63 6b 22 20 6d 61 63 72 6f 20  oryCheck" macro 
a6b0: 69 6e 20 73 74 72 75 63 74 2e 68 0a 2a 2f 0a 76  in struct.h.*/.v
a6c0: 6f 69 64 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72  oid memory_error
a6d0: 28 29 7b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  (){.  fprintf(st
a6e0: 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d  derr,"Out of mem
a6f0: 6f 72 79 2e 20 20 41 62 6f 72 74 69 6e 67 2e 2e  ory.  Aborting..
a700: 2e 5c 6e 22 29 3b 0a 20 20 65 78 69 74 28 31 29  .\n");.  exit(1)
a710: 3b 0a 7d 0a 0a 0a 2f 2a 20 54 68 65 20 6d 61 69  ;.}.../* The mai
a720: 6e 20 70 72 6f 67 72 61 6d 2e 20 20 50 61 72 73  n program.  Pars
a730: 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  e the command li
a740: 6e 65 20 61 6e 64 20 64 6f 20 69 74 2e 2e 2e 20  ne and do it... 
a750: 2a 2f 0a 69 6e 74 20 6d 61 69 6e 28 61 72 67 63  */.int main(argc
a760: 2c 61 72 67 76 29 0a 69 6e 74 20 61 72 67 63 3b  ,argv).int argc;
a770: 0a 63 68 61 72 20 2a 2a 61 72 67 76 3b 0a 7b 0a  .char **argv;.{.
a780: 20 20 73 74 61 74 69 63 20 69 6e 74 20 76 65 72    static int ver
a790: 73 69 6f 6e 20 3d 20 30 3b 0a 20 20 73 74 61 74  sion = 0;.  stat
a7a0: 69 63 20 69 6e 74 20 72 70 66 6c 61 67 20 3d 20  ic int rpflag = 
a7b0: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  0;.  static int 
a7c0: 62 61 73 69 73 66 6c 61 67 20 3d 20 30 3b 0a 20  basisflag = 0;. 
a7d0: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6f 6d 70   static int comp
a7e0: 72 65 73 73 20 3d 20 30 3b 0a 20 20 73 74 61 74  ress = 0;.  stat
a7f0: 69 63 20 69 6e 74 20 71 75 69 65 74 20 3d 20 30  ic int quiet = 0
a800: 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 73  ;.  static int s
a810: 74 61 74 69 73 74 69 63 73 20 3d 20 30 3b 0a 20  tatistics = 0;. 
a820: 20 73 74 61 74 69 63 20 69 6e 74 20 6d 68 66 6c   static int mhfl
a830: 61 67 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  ag = 0;.  static
a840: 20 73 74 72 75 63 74 20 73 5f 6f 70 74 69 6f 6e   struct s_option
a850: 73 20 6f 70 74 69 6f 6e 73 5b 5d 20 3d 20 7b 0a  s options[] = {.
a860: 20 20 20 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22      {OPT_FLAG, "
a870: 62 22 2c 20 28 63 68 61 72 2a 29 26 62 61 73 69  b", (char*)&basi
a880: 73 66 6c 61 67 2c 20 22 50 72 69 6e 74 20 6f 6e  sflag, "Print on
a890: 6c 79 20 74 68 65 20 62 61 73 69 73 20 69 6e 20  ly the basis in 
a8a0: 72 65 70 6f 72 74 2e 22 7d 2c 0a 20 20 20 20 7b  report."},.    {
a8b0: 4f 50 54 5f 46 4c 41 47 2c 20 22 63 22 2c 20 28  OPT_FLAG, "c", (
a8c0: 63 68 61 72 2a 29 26 63 6f 6d 70 72 65 73 73 2c  char*)&compress,
a8d0: 20 22 44 6f 6e 27 74 20 63 6f 6d 70 72 65 73 73   "Don't compress
a8e0: 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61 62 6c   the action tabl
a8f0: 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  e."},.    {OPT_F
a900: 4c 41 47 2c 20 22 67 22 2c 20 28 63 68 61 72 2a  LAG, "g", (char*
a910: 29 26 72 70 66 6c 61 67 2c 20 22 50 72 69 6e 74  )&rpflag, "Print
a920: 20 67 72 61 6d 6d 61 72 20 77 69 74 68 6f 75 74   grammar without
a930: 20 61 63 74 69 6f 6e 73 2e 22 7d 2c 0a 20 20 20   actions."},.   
a940: 20 7b 4f 50 54 5f 46 4c 41 47 2c 20 22 6d 22 2c   {OPT_FLAG, "m",
a950: 20 28 63 68 61 72 2a 29 26 6d 68 66 6c 61 67 2c   (char*)&mhflag,
a960: 20 22 4f 75 74 70 75 74 20 61 20 6d 61 6b 65 68   "Output a makeh
a970: 65 61 64 65 72 73 20 63 6f 6d 70 61 74 69 62 6c  eaders compatibl
a980: 65 20 66 69 6c 65 22 7d 2c 0a 20 20 20 20 7b 4f  e file"},.    {O
a990: 50 54 5f 46 4c 41 47 2c 20 22 71 22 2c 20 28 63  PT_FLAG, "q", (c
a9a0: 68 61 72 2a 29 26 71 75 69 65 74 2c 20 22 28 51  har*)&quiet, "(Q
a9b0: 75 69 65 74 29 20 44 6f 6e 27 74 20 70 72 69 6e  uiet) Don't prin
a9c0: 74 20 74 68 65 20 72 65 70 6f 72 74 20 66 69 6c  t the report fil
a9d0: 65 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50 54 5f 46  e."},.    {OPT_F
a9e0: 4c 41 47 2c 20 22 73 22 2c 20 28 63 68 61 72 2a  LAG, "s", (char*
a9f0: 29 26 73 74 61 74 69 73 74 69 63 73 2c 20 22 50  )&statistics, "P
aa00: 72 69 6e 74 20 70 61 72 73 65 72 20 73 74 61 74  rint parser stat
aa10: 73 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75  s to standard ou
aa20: 74 70 75 74 2e 22 7d 2c 0a 20 20 20 20 7b 4f 50  tput."},.    {OP
aa30: 54 5f 46 4c 41 47 2c 20 22 78 22 2c 20 28 63 68  T_FLAG, "x", (ch
aa40: 61 72 2a 29 26 76 65 72 73 69 6f 6e 2c 20 22 50  ar*)&version, "P
aa50: 72 69 6e 74 20 74 68 65 20 76 65 72 73 69 6f 6e  rint the version
aa60: 20 6e 75 6d 62 65 72 2e 22 7d 2c 0a 20 20 20 20   number."},.    
aa70: 7b 4f 50 54 5f 46 4c 41 47 2c 30 2c 30 2c 30 7d  {OPT_FLAG,0,0,0}
aa80: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
aa90: 20 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 6c 65   struct lemon le
aaa0: 6d 3b 0a 0a 20 20 4f 70 74 49 6e 69 74 28 61 72  m;..  OptInit(ar
aab0: 67 76 2c 6f 70 74 69 6f 6e 73 2c 73 74 64 65 72  gv,options,stder
aac0: 72 29 3b 0a 20 20 69 66 28 20 76 65 72 73 69 6f  r);.  if( versio
aad0: 6e 20 29 7b 0a 20 20 20 20 20 70 72 69 6e 74 66  n ){.     printf
aae0: 28 22 4c 65 6d 6f 6e 20 76 65 72 73 69 6f 6e 20  ("Lemon version 
aaf0: 31 2e 30 5c 6e 22 29 3b 0a 20 20 20 20 20 65 78  1.0\n");.     ex
ab00: 69 74 28 30 29 3b 20 0a 20 20 7d 0a 20 20 69 66  it(0); .  }.  if
ab10: 28 20 4f 70 74 4e 41 72 67 73 28 29 21 3d 31 20  ( OptNArgs()!=1 
ab20: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
ab30: 74 64 65 72 72 2c 22 45 78 61 63 74 6c 79 20 6f  tderr,"Exactly o
ab40: 6e 65 20 66 69 6c 65 6e 61 6d 65 20 61 72 67 75  ne filename argu
ab50: 6d 65 6e 74 20 69 73 20 72 65 71 75 69 72 65 64  ment is required
ab60: 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28  .\n");.    exit(
ab70: 31 29 3b 0a 20 20 7d 0a 20 20 6c 65 6d 2e 65 72  1);.  }.  lem.er
ab80: 72 6f 72 63 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f  rorcnt = 0;..  /
ab90: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
aba0: 20 6d 61 63 68 69 6e 65 20 2a 2f 0a 20 20 53 74   machine */.  St
abb0: 72 73 61 66 65 5f 69 6e 69 74 28 29 3b 0a 20 20  rsafe_init();.  
abc0: 53 79 6d 62 6f 6c 5f 69 6e 69 74 28 29 3b 0a 20  Symbol_init();. 
abd0: 20 53 74 61 74 65 5f 69 6e 69 74 28 29 3b 0a 20   State_init();. 
abe0: 20 6c 65 6d 2e 61 72 67 76 30 20 3d 20 61 72 67   lem.argv0 = arg
abf0: 76 5b 30 5d 3b 0a 20 20 6c 65 6d 2e 66 69 6c 65  v[0];.  lem.file
ac00: 6e 61 6d 65 20 3d 20 4f 70 74 41 72 67 28 30 29  name = OptArg(0)
ac10: 3b 0a 20 20 6c 65 6d 2e 62 61 73 69 73 66 6c 61  ;.  lem.basisfla
ac20: 67 20 3d 20 62 61 73 69 73 66 6c 61 67 3b 0a 20  g = basisflag;. 
ac30: 20 6c 65 6d 2e 68 61 73 5f 66 61 6c 6c 62 61 63   lem.has_fallbac
ac40: 6b 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 6e 63 6f  k = 0;.  lem.nco
ac50: 6e 66 6c 69 63 74 20 3d 20 30 3b 0a 20 20 6c 65  nflict = 0;.  le
ac60: 6d 2e 6e 61 6d 65 20 3d 20 6c 65 6d 2e 69 6e 63  m.name = lem.inc
ac70: 6c 75 64 65 20 3d 20 6c 65 6d 2e 61 72 67 20 3d  lude = lem.arg =
ac80: 20 6c 65 6d 2e 74 6f 6b 65 6e 74 79 70 65 20 3d   lem.tokentype =
ac90: 20 6c 65 6d 2e 73 74 61 72 74 20 3d 20 30 3b 0a   lem.start = 0;.
aca0: 20 20 6c 65 6d 2e 76 61 72 74 79 70 65 20 3d 20    lem.vartype = 
acb0: 30 3b 0a 20 20 6c 65 6d 2e 73 74 61 63 6b 73 69  0;.  lem.stacksi
acc0: 7a 65 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 65 72  ze = 0;.  lem.er
acd0: 72 6f 72 20 3d 20 6c 65 6d 2e 6f 76 65 72 66 6c  ror = lem.overfl
ace0: 6f 77 20 3d 20 6c 65 6d 2e 66 61 69 6c 75 72 65  ow = lem.failure
acf0: 20 3d 20 6c 65 6d 2e 61 63 63 65 70 74 20 3d 20   = lem.accept = 
ad00: 6c 65 6d 2e 74 6f 6b 65 6e 64 65 73 74 20 3d 0a  lem.tokendest =.
ad10: 20 20 20 20 20 6c 65 6d 2e 74 6f 6b 65 6e 70 72       lem.tokenpr
ad20: 65 66 69 78 20 3d 20 6c 65 6d 2e 6f 75 74 6e 61  efix = lem.outna
ad30: 6d 65 20 3d 20 6c 65 6d 2e 65 78 74 72 61 63 6f  me = lem.extraco
ad40: 64 65 20 3d 20 30 3b 0a 20 20 6c 65 6d 2e 76 61  de = 0;.  lem.va
ad50: 72 64 65 73 74 20 3d 20 30 3b 0a 20 20 6c 65 6d  rdest = 0;.  lem
ad60: 2e 74 61 62 6c 65 73 69 7a 65 20 3d 20 30 3b 0a  .tablesize = 0;.
ad70: 20 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 24 22    Symbol_new("$"
ad80: 29 3b 0a 20 20 6c 65 6d 2e 65 72 72 73 79 6d 20  );.  lem.errsym 
ad90: 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 65 72  = Symbol_new("er
ada0: 72 6f 72 22 29 3b 0a 0a 20 20 2f 2a 20 50 61 72  ror");..  /* Par
adb0: 73 65 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  se the input fil
adc0: 65 20 2a 2f 0a 20 20 50 61 72 73 65 28 26 6c 65  e */.  Parse(&le
add0: 6d 29 3b 0a 20 20 69 66 28 20 6c 65 6d 2e 65 72  m);.  if( lem.er
ade0: 72 6f 72 63 6e 74 20 29 20 65 78 69 74 28 6c 65  rorcnt ) exit(le
adf0: 6d 2e 65 72 72 6f 72 63 6e 74 29 3b 0a 20 20 69  m.errorcnt);.  i
ae00: 66 28 20 6c 65 6d 2e 72 75 6c 65 3d 3d 30 20 29  f( lem.rule==0 )
ae10: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
ae20: 64 65 72 72 2c 22 45 6d 70 74 79 20 67 72 61 6d  derr,"Empty gram
ae30: 6d 61 72 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78  mar.\n");.    ex
ae40: 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  it(1);.  }..  /*
ae50: 20 43 6f 75 6e 74 20 61 6e 64 20 69 6e 64 65 78   Count and index
ae60: 20 74 68 65 20 73 79 6d 62 6f 6c 73 20 6f 66 20   the symbols of 
ae70: 74 68 65 20 67 72 61 6d 6d 61 72 20 2a 2f 0a 20  the grammar */. 
ae80: 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 3d 20 53   lem.nsymbol = S
ae90: 79 6d 62 6f 6c 5f 63 6f 75 6e 74 28 29 3b 0a 20  ymbol_count();. 
aea0: 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 22 7b 64 65   Symbol_new("{de
aeb0: 66 61 75 6c 74 7d 22 29 3b 0a 20 20 6c 65 6d 2e  fault}");.  lem.
aec0: 73 79 6d 62 6f 6c 73 20 3d 20 53 79 6d 62 6f 6c  symbols = Symbol
aed0: 5f 61 72 72 61 79 6f 66 28 29 3b 0a 20 20 66 6f  _arrayof();.  fo
aee0: 72 28 69 3d 30 3b 20 69 3c 3d 6c 65 6d 2e 6e 73  r(i=0; i<=lem.ns
aef0: 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20 6c 65 6d 2e  ymbol; i++) lem.
af00: 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 69 6e 64 65  symbols[i]->inde
af10: 78 20 3d 20 69 3b 0a 20 20 71 73 6f 72 74 28 6c  x = i;.  qsort(l
af20: 65 6d 2e 73 79 6d 62 6f 6c 73 2c 6c 65 6d 2e 6e  em.symbols,lem.n
af30: 73 79 6d 62 6f 6c 2b 31 2c 73 69 7a 65 6f 66 28  symbol+1,sizeof(
af40: 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 2a 29 2c  struct symbol*),
af50: 0a 20 20 20 20 20 20 20 20 28 69 6e 74 28 2a 29  .        (int(*)
af60: 28 29 29 53 79 6d 62 6f 6c 63 6d 70 70 29 3b 0a  ())Symbolcmpp);.
af70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 6c 65    for(i=0; i<=le
af80: 6d 2e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b 29 20  m.nsymbol; i++) 
af90: 6c 65 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  lem.symbols[i]->
afa0: 69 6e 64 65 78 20 3d 20 69 3b 0a 20 20 66 6f 72  index = i;.  for
afb0: 28 69 3d 31 3b 20 69 73 75 70 70 65 72 28 6c 65  (i=1; isupper(le
afc0: 6d 2e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e 61  m.symbols[i]->na
afd0: 6d 65 5b 30 5d 29 3b 20 69 2b 2b 29 3b 0a 20 20  me[0]); i++);.  
afe0: 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 20 3d 20  lem.nterminal = 
aff0: 69 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74  i;..  /* Generat
b000: 65 20 61 20 72 65 70 72 69 6e 74 20 6f 66 20 74  e a reprint of t
b010: 68 65 20 67 72 61 6d 6d 61 72 2c 20 69 66 20 72  he grammar, if r
b020: 65 71 75 65 73 74 65 64 20 6f 6e 20 74 68 65 20  equested on the 
b030: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 2a 2f 0a  command line */.
b040: 20 20 69 66 28 20 72 70 66 6c 61 67 20 29 7b 0a    if( rpflag ){.
b050: 20 20 20 20 52 65 70 72 69 6e 74 28 26 6c 65 6d      Reprint(&lem
b060: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b070: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
b080: 65 20 73 69 7a 65 20 66 6f 72 20 61 6c 6c 20 66  e size for all f
b090: 6f 6c 6c 6f 77 20 61 6e 64 20 66 69 72 73 74 20  ollow and first 
b0a0: 73 65 74 73 20 2a 2f 0a 20 20 20 20 53 65 74 53  sets */.    SetS
b0b0: 69 7a 65 28 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61  ize(lem.ntermina
b0c0: 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64  l);..    /* Find
b0d0: 20 74 68 65 20 70 72 65 63 65 64 65 6e 63 65 20   the precedence 
b0e0: 66 6f 72 20 65 76 65 72 79 20 70 72 6f 64 75 63  for every produc
b0f0: 74 69 6f 6e 20 72 75 6c 65 20 28 74 68 61 74 20  tion rule (that 
b100: 68 61 73 20 6f 6e 65 29 20 2a 2f 0a 20 20 20 20  has one) */.    
b110: 46 69 6e 64 52 75 6c 65 50 72 65 63 65 64 65 6e  FindRulePreceden
b120: 63 65 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20  ces(&lem);..    
b130: 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6c  /* Compute the l
b140: 61 6d 62 64 61 2d 6e 6f 6e 74 65 72 6d 69 6e 61  ambda-nontermina
b150: 6c 73 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  ls and the first
b160: 2d 73 65 74 73 20 66 6f 72 20 65 76 65 72 79 0a  -sets for every.
b170: 20 20 20 20 2a 2a 20 6e 6f 6e 74 65 72 6d 69 6e      ** nontermin
b180: 61 6c 20 2a 2f 0a 20 20 20 20 46 69 6e 64 46 69  al */.    FindFi
b190: 72 73 74 53 65 74 73 28 26 6c 65 6d 29 3b 0a 0a  rstSets(&lem);..
b1a0: 20 20 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 61      /* Compute a
b1b0: 6c 6c 20 4c 52 28 30 29 20 73 74 61 74 65 73 2e  ll LR(0) states.
b1c0: 20 20 41 6c 73 6f 20 72 65 63 6f 72 64 20 66 6f    Also record fo
b1d0: 6c 6c 6f 77 2d 73 65 74 20 70 72 6f 70 61 67 61  llow-set propaga
b1e0: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 6c 69 6e 6b  tion.    ** link
b1f0: 73 20 73 6f 20 74 68 61 74 20 74 68 65 20 66 6f  s so that the fo
b200: 6c 6c 6f 77 2d 73 65 74 20 63 61 6e 20 62 65 20  llow-set can be 
b210: 63 6f 6d 70 75 74 65 64 20 6c 61 74 65 72 20 2a  computed later *
b220: 2f 0a 20 20 20 20 6c 65 6d 2e 6e 73 74 61 74 65  /.    lem.nstate
b230: 20 3d 20 30 3b 0a 20 20 20 20 46 69 6e 64 53 74   = 0;.    FindSt
b240: 61 74 65 73 28 26 6c 65 6d 29 3b 0a 20 20 20 20  ates(&lem);.    
b250: 6c 65 6d 2e 73 6f 72 74 65 64 20 3d 20 53 74 61  lem.sorted = Sta
b260: 74 65 5f 61 72 72 61 79 6f 66 28 29 3b 0a 0a 20  te_arrayof();.. 
b270: 20 20 20 2f 2a 20 54 69 65 20 75 70 20 6c 6f 6f     /* Tie up loo
b280: 73 65 20 65 6e 64 73 20 6f 6e 20 74 68 65 20 70  se ends on the p
b290: 72 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73  ropagation links
b2a0: 20 2a 2f 0a 20 20 20 20 46 69 6e 64 4c 69 6e 6b   */.    FindLink
b2b0: 73 28 26 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a  s(&lem);..    /*
b2c0: 20 43 6f 6d 70 75 74 65 20 74 68 65 20 66 6f 6c   Compute the fol
b2d0: 6c 6f 77 20 73 65 74 20 6f 66 20 65 76 65 72 79  low set of every
b2e0: 20 72 65 64 75 63 69 62 6c 65 20 63 6f 6e 66 69   reducible confi
b2f0: 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  guration */.    
b300: 46 69 6e 64 46 6f 6c 6c 6f 77 53 65 74 73 28 26  FindFollowSets(&
b310: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  lem);..    /* Co
b320: 6d 70 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e  mpute the action
b330: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 46   tables */.    F
b340: 69 6e 64 41 63 74 69 6f 6e 73 28 26 6c 65 6d 29  indActions(&lem)
b350: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65  ;..    /* Compre
b360: 73 73 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  ss the action ta
b370: 62 6c 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  bles */.    if( 
b380: 63 6f 6d 70 72 65 73 73 3d 3d 30 20 29 20 43 6f  compress==0 ) Co
b390: 6d 70 72 65 73 73 54 61 62 6c 65 73 28 26 6c 65  mpressTables(&le
b3a0: 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e 65  m);..    /* Gene
b3b0: 72 61 74 65 20 61 20 72 65 70 6f 72 74 20 6f 66  rate a report of
b3c0: 20 74 68 65 20 70 61 72 73 65 72 20 67 65 6e 65   the parser gene
b3d0: 72 61 74 65 64 2e 20 20 28 74 68 65 20 22 79 2e  rated.  (the "y.
b3e0: 6f 75 74 70 75 74 22 20 66 69 6c 65 29 20 2a 2f  output" file) */
b3f0: 0a 20 20 20 20 69 66 28 20 21 71 75 69 65 74 20  .    if( !quiet 
b400: 29 20 52 65 70 6f 72 74 4f 75 74 70 75 74 28 26  ) ReportOutput(&
b410: 6c 65 6d 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  lem);..    /* Ge
b420: 6e 65 72 61 74 65 20 74 68 65 20 73 6f 75 72 63  nerate the sourc
b430: 65 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70  e code for the p
b440: 61 72 73 65 72 20 2a 2f 0a 20 20 20 20 52 65 70  arser */.    Rep
b450: 6f 72 74 54 61 62 6c 65 28 26 6c 65 6d 2c 20 6d  ortTable(&lem, m
b460: 68 66 6c 61 67 29 3b 0a 0a 20 20 20 20 2f 2a 20  hflag);..    /* 
b470: 50 72 6f 64 75 63 65 20 61 20 68 65 61 64 65 72  Produce a header
b480: 20 66 69 6c 65 20 66 6f 72 20 75 73 65 20 62 79   file for use by
b490: 20 74 68 65 20 73 63 61 6e 6e 65 72 2e 20 20 28   the scanner.  (
b4a0: 54 68 69 73 20 73 74 65 70 20 69 73 0a 20 20 20  This step is.   
b4b0: 20 2a 2a 20 6f 6d 69 74 74 65 64 20 69 66 20 74   ** omitted if t
b4c0: 68 65 20 22 2d 6d 22 20 6f 70 74 69 6f 6e 20 69  he "-m" option i
b4d0: 73 20 75 73 65 64 20 62 65 63 61 75 73 65 20 6d  s used because m
b4e0: 61 6b 65 68 65 61 64 65 72 73 20 77 69 6c 6c 0a  akeheaders will.
b4f0: 20 20 20 20 2a 2a 20 67 65 6e 65 72 61 74 65 20      ** generate 
b500: 74 68 65 20 66 69 6c 65 20 66 6f 72 20 75 73 2e  the file for us.
b510: 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 6d 68  ) */.    if( !mh
b520: 66 6c 61 67 20 29 20 52 65 70 6f 72 74 48 65 61  flag ) ReportHea
b530: 64 65 72 28 26 6c 65 6d 29 3b 0a 20 20 7d 0a 20  der(&lem);.  }. 
b540: 20 69 66 28 20 73 74 61 74 69 73 74 69 63 73 20   if( statistics 
b550: 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50  ){.    printf("P
b560: 61 72 73 65 72 20 73 74 61 74 69 73 74 69 63 73  arser statistics
b570: 3a 20 25 64 20 74 65 72 6d 69 6e 61 6c 73 2c 20  : %d terminals, 
b580: 25 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 2c  %d nonterminals,
b590: 20 25 64 20 72 75 6c 65 73 5c 6e 22 2c 0a 20 20   %d rules\n",.  
b5a0: 20 20 20 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61      lem.ntermina
b5b0: 6c 2c 20 6c 65 6d 2e 6e 73 79 6d 62 6f 6c 20 2d  l, lem.nsymbol -
b5c0: 20 6c 65 6d 2e 6e 74 65 72 6d 69 6e 61 6c 2c 20   lem.nterminal, 
b5d0: 6c 65 6d 2e 6e 72 75 6c 65 29 3b 0a 20 20 20 20  lem.nrule);.    
b5e0: 70 72 69 6e 74 66 28 22 20 20 20 20 20 20 20 20  printf("        
b5f0: 20 20 20 20 20 20 20 20 20 20 20 25 64 20 73 74             %d st
b600: 61 74 65 73 2c 20 25 64 20 70 61 72 73 65 72 20  ates, %d parser 
b610: 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2c 20 25  table entries, %
b620: 64 20 63 6f 6e 66 6c 69 63 74 73 5c 6e 22 2c 0a  d conflicts\n",.
b630: 20 20 20 20 20 20 6c 65 6d 2e 6e 73 74 61 74 65        lem.nstate
b640: 2c 20 6c 65 6d 2e 74 61 62 6c 65 73 69 7a 65 2c  , lem.tablesize,
b650: 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74 29 3b   lem.nconflict);
b660: 0a 20 20 7d 0a 20 20 69 66 28 20 6c 65 6d 2e 6e  .  }.  if( lem.n
b670: 63 6f 6e 66 6c 69 63 74 20 29 7b 0a 20 20 20 20  conflict ){.    
b680: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
b690: 25 64 20 70 61 72 73 69 6e 67 20 63 6f 6e 66 6c  %d parsing confl
b6a0: 69 63 74 73 2e 5c 6e 22 2c 6c 65 6d 2e 6e 63 6f  icts.\n",lem.nco
b6b0: 6e 66 6c 69 63 74 29 3b 0a 20 20 7d 0a 20 20 65  nflict);.  }.  e
b6c0: 78 69 74 28 6c 65 6d 2e 65 72 72 6f 72 63 6e 74  xit(lem.errorcnt
b6d0: 20 2b 20 6c 65 6d 2e 6e 63 6f 6e 66 6c 69 63 74   + lem.nconflict
b6e0: 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.}./**********
b6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20  ********** From 
b700: 74 68 65 20 66 69 6c 65 20 22 6d 73 6f 72 74 2e  the file "msort.
b710: 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c" *************
b720: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
b730: 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 20 67 65 6e 65  **/./*.** A gene
b740: 72 69 63 20 6d 65 72 67 65 2d 73 6f 72 74 20 70  ric merge-sort p
b750: 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 55 53  rogram..**.** US
b760: 41 47 45 3a 0a 2a 2a 20 4c 65 74 20 22 70 74 72  AGE:.** Let "ptr
b770: 22 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  " be a pointer t
b780: 6f 20 73 6f 6d 65 20 73 74 72 75 63 74 75 72 65  o some structure
b790: 20 77 68 69 63 68 20 69 73 20 61 74 20 74 68 65   which is at the
b7a0: 20 68 65 61 64 20 6f 66 0a 2a 2a 20 61 20 6e 75   head of.** a nu
b7b0: 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69  ll-terminated li
b7c0: 73 74 2e 20 20 54 68 65 6e 20 74 6f 20 73 6f 72  st.  Then to sor
b7d0: 74 20 74 68 65 20 6c 69 73 74 20 63 61 6c 6c 3a  t the list call:
b7e0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 74 72 20 3d  .**.**     ptr =
b7f0: 20 6d 73 6f 72 74 28 70 74 72 2c 26 28 70 74 72   msort(ptr,&(ptr
b800: 2d 3e 6e 65 78 74 29 2c 63 6d 70 66 6e 63 29 3b  ->next),cmpfnc);
b810: 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 61 62  .**.** In the ab
b820: 6f 76 65 2c 20 22 63 6d 70 66 6e 63 22 20 69 73  ove, "cmpfnc" is
b830: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
b840: 66 75 6e 63 74 69 6f 6e 20 77 68 69 63 68 20 63  function which c
b850: 6f 6d 70 61 72 65 73 0a 2a 2a 20 74 77 6f 20 69  ompares.** two i
b860: 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20  nstances of the 
b870: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72 65  structure and re
b880: 74 75 72 6e 73 20 61 6e 20 69 6e 74 65 67 65 72  turns an integer
b890: 2c 20 61 73 20 69 6e 0a 2a 2a 20 73 74 72 63 6d  , as in.** strcm
b8a0: 70 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 61  p.  The second a
b8b0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
b8c0: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 6f 69 6e  nter to the poin
b8d0: 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 73 65  ter to the.** se
b8e0: 63 6f 6e 64 20 65 6c 65 6d 65 6e 74 20 6f 66 20  cond element of 
b8f0: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  the linked list.
b900: 20 20 54 68 69 73 20 61 64 64 72 65 73 73 20 69    This address i
b910: 73 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 75 74  s used to comput
b920: 65 0a 2a 2a 20 74 68 65 20 6f 66 66 73 65 74 20  e.** the offset 
b930: 74 6f 20 74 68 65 20 22 6e 65 78 74 22 20 66 69  to the "next" fi
b940: 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65 20 73  eld within the s
b950: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6f  tructure.  The o
b960: 66 66 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20  ffset to.** the 
b970: 22 6e 65 78 74 22 20 66 69 65 6c 64 20 6d 75 73  "next" field mus
b980: 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 66 6f  t be constant fo
b990: 72 20 61 6c 6c 20 73 74 72 75 63 74 75 72 65 73  r all structures
b9a0: 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2a   in the list..**
b9b0: 0a 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e  .** The function
b9c0: 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77 20 70   returns a new p
b9d0: 6f 69 6e 74 65 72 20 77 68 69 63 68 20 69 73 20  ointer which is 
b9e0: 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 65 20  the head of the 
b9f0: 6c 69 73 74 0a 2a 2a 20 61 66 74 65 72 20 73 6f  list.** after so
ba00: 72 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 4c 47  rting..**.** ALG
ba10: 4f 52 49 54 48 4d 3a 0a 2a 2a 20 4d 65 72 67 65  ORITHM:.** Merge
ba20: 2d 73 6f 72 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  -sort..*/../*.**
ba30: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
ba40: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 74  r to the next st
ba50: 72 75 63 74 75 72 65 20 69 6e 20 74 68 65 20 6c  ructure in the l
ba60: 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 23  inked list..*/.#
ba70: 64 65 66 69 6e 65 20 4e 45 58 54 28 41 29 20 28  define NEXT(A) (
ba80: 2a 28 63 68 61 72 2a 2a 29 28 28 28 75 6e 73 69  *(char**)(((unsi
ba90: 67 6e 65 64 20 6c 6f 6e 67 29 41 29 2b 6f 66 66  gned long)A)+off
baa0: 73 65 74 29 29 0a 0a 2f 2a 0a 2a 2a 20 49 6e 70  set))../*.** Inp
bab0: 75 74 73 3a 0a 2a 2a 20 20 20 61 3a 20 20 20 20  uts:.**   a:    
bac0: 20 20 20 41 20 73 6f 72 74 65 64 2c 20 6e 75 6c     A sorted, nul
bad0: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 6c 69 6e  l-terminated lin
bae0: 6b 65 64 20 6c 69 73 74 2e 20 20 28 4d 61 79 20  ked list.  (May 
baf0: 62 65 20 6e 75 6c 6c 29 2e 0a 2a 2a 20 20 20 62  be null)..**   b
bb00: 3a 20 20 20 20 20 20 20 41 20 73 6f 72 74 65 64  :       A sorted
bb10: 2c 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65  , null-terminate
bb20: 64 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 20 20  d linked list.  
bb30: 28 4d 61 79 20 62 65 20 6e 75 6c 6c 29 2e 0a 2a  (May be null)..*
bb40: 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 41 20 70  *   cmp:     A p
bb50: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f  ointer to the co
bb60: 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
bb70: 6e 2e 0a 2a 2a 20 20 20 6f 66 66 73 65 74 3a 20  n..**   offset: 
bb80: 20 4f 66 66 73 65 74 20 69 6e 20 74 68 65 20 73   Offset in the s
bb90: 74 72 75 63 74 75 72 65 20 74 6f 20 74 68 65 20  tructure to the 
bba0: 22 6e 65 78 74 22 20 66 69 65 6c 64 2e 0a 2a 2a  "next" field..**
bbb0: 0a 2a 2a 20 52 65 74 75 72 6e 20 56 61 6c 75 65  .** Return Value
bbc0: 3a 0a 2a 2a 20 20 20 41 20 70 6f 69 6e 74 65 72  :.**   A pointer
bbd0: 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
bbe0: 61 20 73 6f 72 74 65 64 20 6c 69 73 74 20 63 6f  a sorted list co
bbf0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65 6c 65  ntaining the ele
bc00: 6d 65 6e 74 73 0a 2a 2a 20 20 20 6f 66 20 62 6f  ments.**   of bo
bc10: 74 68 20 61 20 61 6e 64 20 62 2e 0a 2a 2a 0a 2a  th a and b..**.*
bc20: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
bc30: 2a 2a 20 20 20 54 68 65 20 22 6e 65 78 74 22 20  **   The "next" 
bc40: 70 6f 69 6e 74 65 72 73 20 66 6f 72 20 65 6c 65  pointers for ele
bc50: 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6c 69 73  ments in the lis
bc60: 74 73 20 61 20 61 6e 64 20 62 20 61 72 65 0a 2a  ts a and b are.*
bc70: 2a 20 20 20 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  *   changed..*/.
bc80: 73 74 61 74 69 63 20 63 68 61 72 20 2a 6d 65 72  static char *mer
bc90: 67 65 28 61 2c 62 2c 63 6d 70 2c 6f 66 66 73 65  ge(a,b,cmp,offse
bca0: 74 29 0a 63 68 61 72 20 2a 61 3b 0a 63 68 61 72  t).char *a;.char
bcb0: 20 2a 62 3b 0a 69 6e 74 20 28 2a 63 6d 70 29 28   *b;.int (*cmp)(
bcc0: 29 3b 0a 69 6e 74 20 6f 66 66 73 65 74 3b 0a 7b  );.int offset;.{
bcd0: 0a 20 20 63 68 61 72 20 2a 70 74 72 2c 20 2a 68  .  char *ptr, *h
bce0: 65 61 64 3b 0a 0a 20 20 69 66 28 20 61 3d 3d 30  ead;..  if( a==0
bcf0: 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d 20 62   ){.    head = b
bd00: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 3d  ;.  }else if( b=
bd10: 3d 30 20 29 7b 0a 20 20 20 20 68 65 61 64 20 3d  =0 ){.    head =
bd20: 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   a;.  }else{.   
bd30: 20 69 66 28 20 28 2a 63 6d 70 29 28 61 2c 62 29   if( (*cmp)(a,b)
bd40: 3c 30 20 29 7b 0a 20 20 20 20 20 20 70 74 72 20  <0 ){.      ptr 
bd50: 3d 20 61 3b 0a 20 20 20 20 20 20 61 20 3d 20 4e  = a;.      a = N
bd60: 45 58 54 28 61 29 3b 0a 20 20 20 20 7d 65 6c 73  EXT(a);.    }els
bd70: 65 7b 0a 20 20 20 20 20 20 70 74 72 20 3d 20 62  e{.      ptr = b
bd80: 3b 0a 20 20 20 20 20 20 62 20 3d 20 4e 45 58 54  ;.      b = NEXT
bd90: 28 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68  (b);.    }.    h
bda0: 65 61 64 20 3d 20 70 74 72 3b 0a 20 20 20 20 77  ead = ptr;.    w
bdb0: 68 69 6c 65 28 20 61 20 26 26 20 62 20 29 7b 0a  hile( a && b ){.
bdc0: 20 20 20 20 20 20 69 66 28 20 28 2a 63 6d 70 29        if( (*cmp)
bdd0: 28 61 2c 62 29 3c 30 20 29 7b 0a 20 20 20 20 20  (a,b)<0 ){.     
bde0: 20 20 20 4e 45 58 54 28 70 74 72 29 20 3d 20 61     NEXT(ptr) = a
bdf0: 3b 0a 20 20 20 20 20 20 20 20 70 74 72 20 3d 20  ;.        ptr = 
be00: 61 3b 0a 20 20 20 20 20 20 20 20 61 20 3d 20 4e  a;.        a = N
be10: 45 58 54 28 61 29 3b 0a 20 20 20 20 20 20 7d 65  EXT(a);.      }e
be20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 4e 45 58  lse{.        NEX
be30: 54 28 70 74 72 29 20 3d 20 62 3b 0a 20 20 20 20  T(ptr) = b;.    
be40: 20 20 20 20 70 74 72 20 3d 20 62 3b 0a 20 20 20      ptr = b;.   
be50: 20 20 20 20 20 62 20 3d 20 4e 45 58 54 28 62 29       b = NEXT(b)
be60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
be70: 20 20 20 20 69 66 28 20 61 20 29 20 4e 45 58 54      if( a ) NEXT
be80: 28 70 74 72 29 20 3d 20 61 3b 0a 20 20 20 20 65  (ptr) = a;.    e
be90: 6c 73 65 20 20 20 20 4e 45 58 54 28 70 74 72 29  lse    NEXT(ptr)
bea0: 20 3d 20 62 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = b;.  }.  retu
beb0: 72 6e 20 68 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn head;.}../*.*
bec0: 2a 20 49 6e 70 75 74 73 3a 0a 2a 2a 20 20 20 6c  * Inputs:.**   l
bed0: 69 73 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65  ist:      Pointe
bee0: 72 20 74 6f 20 61 20 73 69 6e 67 6c 79 2d 6c 69  r to a singly-li
bef0: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 73 74 72  nked list of str
bf00: 75 63 74 75 72 65 73 2e 0a 2a 2a 20 20 20 6e 65  uctures..**   ne
bf10: 78 74 3a 20 20 20 20 20 20 50 6f 69 6e 74 65 72  xt:      Pointer
bf20: 20 74 6f 20 70 6f 69 6e 74 65 72 20 74 6f 20 74   to pointer to t
bf30: 68 65 20 73 65 63 6f 6e 64 20 65 6c 65 6d 65 6e  he second elemen
bf40: 74 20 6f 66 20 74 68 65 20 6c 69 73 74 2e 0a 2a  t of the list..*
bf50: 2a 20 20 20 63 6d 70 3a 20 20 20 20 20 20 20 41  *   cmp:       A
bf60: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
bf70: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  tion..**.** Retu
bf80: 72 6e 20 56 61 6c 75 65 3a 0a 2a 2a 20 20 20 41  rn Value:.**   A
bf90: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
bfa0: 68 65 61 64 20 6f 66 20 61 20 73 6f 72 74 65 64  head of a sorted
bfb0: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
bfc0: 20 74 68 65 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a   the elements.**
bfd0: 20 20 20 6f 72 67 69 6e 61 6c 6c 79 20 69 6e 20     orginally in 
bfe0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 53 69 64 65  list..**.** Side
bff0: 20 65 66 66 65 63 74 73 3a 0a 2a 2a 20 20 20 54   effects:.**   T
c000: 68 65 20 22 6e 65 78 74 22 20 70 6f 69 6e 74 65  he "next" pointe
c010: 72 73 20 66 6f 72 20 65 6c 65 6d 65 6e 74 73 20  rs for elements 
c020: 69 6e 20 6c 69 73 74 20 61 72 65 20 63 68 61 6e  in list are chan
c030: 67 65 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ged..*/.#define 
c040: 4c 49 53 54 53 49 5a 45 20 33 30 0a 63 68 61 72  LISTSIZE 30.char
c050: 20 2a 6d 73 6f 72 74 28 6c 69 73 74 2c 6e 65 78   *msort(list,nex
c060: 74 2c 63 6d 70 29 0a 63 68 61 72 20 2a 6c 69 73  t,cmp).char *lis
c070: 74 3b 0a 63 68 61 72 20 2a 2a 6e 65 78 74 3b 0a  t;.char **next;.
c080: 69 6e 74 20 28 2a 63 6d 70 29 28 29 3b 0a 7b 0a  int (*cmp)();.{.
c090: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
c0a0: 6f 66 66 73 65 74 3b 0a 20 20 63 68 61 72 20 2a  offset;.  char *
c0b0: 65 70 3b 0a 20 20 63 68 61 72 20 2a 73 65 74 5b  ep;.  char *set[
c0c0: 4c 49 53 54 53 49 5a 45 5d 3b 0a 20 20 69 6e 74  LISTSIZE];.  int
c0d0: 20 69 3b 0a 20 20 6f 66 66 73 65 74 20 3d 20 28   i;.  offset = (
c0e0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 6e 65  unsigned long)ne
c0f0: 78 74 20 2d 20 28 75 6e 73 69 67 6e 65 64 20 6c  xt - (unsigned l
c100: 6f 6e 67 29 6c 69 73 74 3b 0a 20 20 66 6f 72 28  ong)list;.  for(
c110: 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 3b  i=0; i<LISTSIZE;
c120: 20 69 2b 2b 29 20 73 65 74 5b 69 5d 20 3d 20 30   i++) set[i] = 0
c130: 3b 0a 20 20 77 68 69 6c 65 28 20 6c 69 73 74 20  ;.  while( list 
c140: 29 7b 0a 20 20 20 20 65 70 20 3d 20 6c 69 73 74  ){.    ep = list
c150: 3b 0a 20 20 20 20 6c 69 73 74 20 3d 20 4e 45 58  ;.    list = NEX
c160: 54 28 6c 69 73 74 29 3b 0a 20 20 20 20 4e 45 58  T(list);.    NEX
c170: 54 28 65 70 29 20 3d 20 30 3b 0a 20 20 20 20 66  T(ep) = 0;.    f
c180: 6f 72 28 69 3d 30 3b 20 69 3c 4c 49 53 54 53 49  or(i=0; i<LISTSI
c190: 5a 45 2d 31 20 26 26 20 73 65 74 5b 69 5d 21 3d  ZE-1 && set[i]!=
c1a0: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 65  0; i++){.      e
c1b0: 70 20 3d 20 6d 65 72 67 65 28 65 70 2c 73 65 74  p = merge(ep,set
c1c0: 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73 65 74 29 3b  [i],cmp,offset);
c1d0: 0a 20 20 20 20 20 20 73 65 74 5b 69 5d 20 3d 20  .      set[i] = 
c1e0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 65 74  0;.    }.    set
c1f0: 5b 69 5d 20 3d 20 65 70 3b 0a 20 20 7d 0a 20 20  [i] = ep;.  }.  
c200: 65 70 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ep = 0;.  for(i=
c210: 30 3b 20 69 3c 4c 49 53 54 53 49 5a 45 3b 20 69  0; i<LISTSIZE; i
c220: 2b 2b 29 20 69 66 28 20 73 65 74 5b 69 5d 20 29  ++) if( set[i] )
c230: 20 65 70 20 3d 20 6d 65 72 67 65 28 65 70 2c 73   ep = merge(ep,s
c240: 65 74 5b 69 5d 2c 63 6d 70 2c 6f 66 66 73 65 74  et[i],cmp,offset
c250: 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 70 3b 0a  );.  return ep;.
c260: 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
c270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
c280: 20 74 68 65 20 66 69 6c 65 20 22 6f 70 74 69 6f   the file "optio
c290: 6e 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n.c" ***********
c2a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
c2b0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 61  .static char **a
c2c0: 72 67 76 3b 0a 73 74 61 74 69 63 20 73 74 72 75  rgv;.static stru
c2d0: 63 74 20 73 5f 6f 70 74 69 6f 6e 73 20 2a 6f 70  ct s_options *op
c2e0: 3b 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 65  ;.static FILE *e
c2f0: 72 72 73 74 72 65 61 6d 3b 0a 0a 23 64 65 66 69  rrstream;..#defi
c300: 6e 65 20 49 53 4f 50 54 28 58 29 20 28 28 58 29  ne ISOPT(X) ((X)
c310: 5b 30 5d 3d 3d 27 2d 27 7c 7c 28 58 29 5b 30 5d  [0]=='-'||(X)[0]
c320: 3d 3d 27 2b 27 7c 7c 73 74 72 63 68 72 28 28 58  =='+'||strchr((X
c330: 29 2c 27 3d 27 29 21 3d 30 29 0a 0a 2f 2a 0a 2a  ),'=')!=0)../*.*
c340: 2a 20 50 72 69 6e 74 20 74 68 65 20 63 6f 6d 6d  * Print the comm
c350: 61 6e 64 20 6c 69 6e 65 20 77 69 74 68 20 61 20  and line with a 
c360: 63 61 72 72 6f 74 20 70 6f 69 6e 74 69 6e 67 20  carrot pointing 
c370: 74 6f 20 74 68 65 20 6b 2d 74 68 20 63 68 61 72  to the k-th char
c380: 61 63 74 65 72 0a 2a 2a 20 6f 66 20 74 68 65 20  acter.** of the 
c390: 6e 2d 74 68 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73  n-th field..*/.s
c3a0: 74 61 74 69 63 20 76 6f 69 64 20 65 72 72 6c 69  tatic void errli
c3b0: 6e 65 28 6e 2c 6b 2c 65 72 72 29 0a 69 6e 74 20  ne(n,k,err).int 
c3c0: 6e 3b 0a 69 6e 74 20 6b 3b 0a 46 49 4c 45 20 2a  n;.int k;.FILE *
c3d0: 65 72 72 3b 0a 7b 0a 20 20 69 6e 74 20 73 70 63  err;.{.  int spc
c3e0: 6e 74 2c 20 69 3b 0a 20 20 73 70 63 6e 74 20 3d  nt, i;.  spcnt =
c3f0: 20 30 3b 0a 20 20 69 66 28 20 61 72 67 76 5b 30   0;.  if( argv[0
c400: 5d 20 29 20 66 70 72 69 6e 74 66 28 65 72 72 2c  ] ) fprintf(err,
c410: 22 25 73 22 2c 61 72 67 76 5b 30 5d 29 3b 0a 20  "%s",argv[0]);. 
c420: 20 73 70 63 6e 74 20 3d 20 73 74 72 6c 65 6e 28   spcnt = strlen(
c430: 61 72 67 76 5b 30 5d 29 20 2b 20 31 3b 0a 20 20  argv[0]) + 1;.  
c440: 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 20 26 26 20  for(i=1; i<n && 
c450: 61 72 67 76 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  argv[i]; i++){. 
c460: 20 20 20 66 70 72 69 6e 74 66 28 65 72 72 2c 22     fprintf(err,"
c470: 20 25 73 22 2c 61 72 67 76 5b 69 5d 29 3b 0a 20   %s",argv[i]);. 
c480: 20 20 20 73 70 63 6e 74 20 2b 3d 20 73 74 72 6c     spcnt += strl
c490: 65 6e 28 61 72 67 76 5b 69 5d 2b 31 29 3b 0a 20  en(argv[i]+1);. 
c4a0: 20 7d 0a 20 20 73 70 63 6e 74 20 2b 3d 20 6b 3b   }.  spcnt += k;
c4b0: 0a 20 20 66 6f 72 28 3b 20 61 72 67 76 5b 69 5d  .  for(; argv[i]
c4c0: 3b 20 69 2b 2b 29 20 66 70 72 69 6e 74 66 28 65  ; i++) fprintf(e
c4d0: 72 72 2c 22 20 25 73 22 2c 61 72 67 76 5b 69 5d  rr," %s",argv[i]
c4e0: 29 3b 0a 20 20 69 66 28 20 73 70 63 6e 74 3c 32  );.  if( spcnt<2
c4f0: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
c500: 28 65 72 72 2c 22 5c 6e 25 2a 73 5e 2d 2d 20 68  (err,"\n%*s^-- h
c510: 65 72 65 5c 6e 22 2c 73 70 63 6e 74 2c 22 22 29  ere\n",spcnt,"")
c520: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
c530: 70 72 69 6e 74 66 28 65 72 72 2c 22 5c 6e 25 2a  printf(err,"\n%*
c540: 73 68 65 72 65 20 2d 2d 5e 5c 6e 22 2c 73 70 63  shere --^\n",spc
c550: 6e 74 2d 37 2c 22 22 29 3b 0a 20 20 7d 0a 7d 0a  nt-7,"");.  }.}.
c560: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
c570: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 4e  e index of the N
c580: 2d 74 68 20 6e 6f 6e 2d 73 77 69 74 63 68 20 61  -th non-switch a
c590: 72 67 75 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e  rgument.  Return
c5a0: 20 2d 31 0a 2a 2a 20 69 66 20 4e 20 69 73 20 6f   -1.** if N is o
c5b0: 75 74 20 6f 66 20 72 61 6e 67 65 2e 0a 2a 2f 0a  ut of range..*/.
c5c0: 73 74 61 74 69 63 20 69 6e 74 20 61 72 67 69 6e  static int argin
c5d0: 64 65 78 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a  dex(n).int n;.{.
c5e0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 64    int i;.  int d
c5f0: 61 73 68 64 61 73 68 20 3d 20 30 3b 0a 20 20 69  ashdash = 0;.  i
c600: 66 28 20 61 72 67 76 21 3d 30 20 26 26 20 2a 61  f( argv!=0 && *a
c610: 72 67 76 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f  rgv!=0 ){.    fo
c620: 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20  r(i=1; argv[i]; 
c630: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
c640: 64 61 73 68 64 61 73 68 20 7c 7c 20 21 49 53 4f  dashdash || !ISO
c650: 50 54 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20  PT(argv[i]) ){. 
c660: 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20         if( n==0 
c670: 29 20 72 65 74 75 72 6e 20 69 3b 0a 20 20 20 20  ) return i;.    
c680: 20 20 20 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d      n--;.      }
c690: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
c6a0: 70 28 61 72 67 76 5b 69 5d 2c 22 2d 2d 22 29 3d  p(argv[i],"--")=
c6b0: 3d 30 20 29 20 64 61 73 68 64 61 73 68 20 3d 20  =0 ) dashdash = 
c6c0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
c6d0: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 73 74 61  eturn -1;.}..sta
c6e0: 74 69 63 20 63 68 61 72 20 65 6d 73 67 5b 5d 20  tic char emsg[] 
c6f0: 3d 20 22 43 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  = "Command line 
c700: 73 79 6e 74 61 78 20 65 72 72 6f 72 3a 20 22 3b  syntax error: ";
c710: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 73 73 20  ../*.** Process 
c720: 61 20 66 6c 61 67 20 63 6f 6d 6d 61 6e 64 20 6c  a flag command l
c730: 69 6e 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ine argument..*/
c740: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 6e 64  .static int hand
c750: 6c 65 66 6c 61 67 73 28 69 2c 65 72 72 29 0a 69  leflags(i,err).i
c760: 6e 74 20 69 3b 0a 46 49 4c 45 20 2a 65 72 72 3b  nt i;.FILE *err;
c770: 0a 7b 0a 20 20 69 6e 74 20 76 3b 0a 20 20 69 6e  .{.  int v;.  in
c780: 74 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20  t errcnt = 0;.  
c790: 69 6e 74 20 6a 3b 0a 20 20 66 6f 72 28 6a 3d 30  int j;.  for(j=0
c7a0: 3b 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a  ; op[j].label; j
c7b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
c7c0: 63 6d 70 28 26 61 72 67 76 5b 69 5d 5b 31 5d 2c  cmp(&argv[i][1],
c7d0: 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 29 3d 3d 30 20  op[j].label)==0 
c7e0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 76  ) break;.  }.  v
c7f0: 20 3d 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27   = argv[i][0]=='
c800: 2d 27 20 3f 20 31 20 3a 20 30 3b 0a 20 20 69 66  -' ? 1 : 0;.  if
c810: 28 20 6f 70 5b 6a 5d 2e 6c 61 62 65 6c 3d 3d 30  ( op[j].label==0
c820: 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72 20   ){.    if( err 
c830: 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  ){.      fprintf
c840: 28 65 72 72 2c 22 25 73 75 6e 64 65 66 69 6e 65  (err,"%sundefine
c850: 64 20 6f 70 74 69 6f 6e 2e 5c 6e 22 2c 65 6d 73  d option.\n",ems
c860: 67 29 3b 0a 20 20 20 20 20 20 65 72 72 6c 69 6e  g);.      errlin
c870: 65 28 69 2c 31 2c 65 72 72 29 3b 0a 20 20 20 20  e(i,1,err);.    
c880: 7d 0a 20 20 20 20 65 72 72 63 6e 74 2b 2b 3b 0a  }.    errcnt++;.
c890: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a    }else if( op[j
c8a0: 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 4c 41 47  ].type==OPT_FLAG
c8b0: 20 29 7b 0a 20 20 20 20 2a 28 28 69 6e 74 2a 29   ){.    *((int*)
c8c0: 6f 70 5b 6a 5d 2e 61 72 67 29 20 3d 20 76 3b 0a  op[j].arg) = v;.
c8d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 5b 6a    }else if( op[j
c8e0: 5d 2e 74 79 70 65 3d 3d 4f 50 54 5f 46 46 4c 41  ].type==OPT_FFLA
c8f0: 47 20 29 7b 0a 20 20 20 20 28 2a 28 76 6f 69 64  G ){.    (*(void
c900: 28 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67  (*)())(op[j].arg
c910: 29 29 28 76 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ))(v);.  }else{.
c920: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
c930: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
c940: 2c 22 25 73 6d 69 73 73 69 6e 67 20 61 72 67 75  ,"%smissing argu
c950: 6d 65 6e 74 20 6f 6e 20 73 77 69 74 63 68 2e 5c  ment on switch.\
c960: 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20 20  n",emsg);.      
c970: 65 72 72 6c 69 6e 65 28 69 2c 31 2c 65 72 72 29  errline(i,1,err)
c980: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72 63  ;.    }.    errc
c990: 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nt++;.  }.  retu
c9a0: 72 6e 20 65 72 72 63 6e 74 3b 0a 7d 0a 0a 2f 2a  rn errcnt;.}../*
c9b0: 0a 2a 2a 20 50 72 6f 63 65 73 73 20 61 20 63 6f  .** Process a co
c9c0: 6d 6d 61 6e 64 20 6c 69 6e 65 20 73 77 69 74 63  mmand line switc
c9d0: 68 20 77 68 69 63 68 20 68 61 73 20 61 6e 20 61  h which has an a
c9e0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
c9f0: 69 63 20 69 6e 74 20 68 61 6e 64 6c 65 73 77 69  ic int handleswi
ca00: 74 63 68 28 69 2c 65 72 72 29 0a 69 6e 74 20 69  tch(i,err).int i
ca10: 3b 0a 46 49 4c 45 20 2a 65 72 72 3b 0a 7b 0a 20  ;.FILE *err;.{. 
ca20: 20 69 6e 74 20 6c 76 20 3d 20 30 3b 0a 20 20 64   int lv = 0;.  d
ca30: 6f 75 62 6c 65 20 64 76 20 3d 20 30 2e 30 3b 0a  ouble dv = 0.0;.
ca40: 20 20 63 68 61 72 20 2a 73 76 20 3d 20 30 2c 20    char *sv = 0, 
ca50: 2a 65 6e 64 3b 0a 20 20 63 68 61 72 20 2a 63 70  *end;.  char *cp
ca60: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74  ;.  int j;.  int
ca70: 20 65 72 72 63 6e 74 20 3d 20 30 3b 0a 20 20 63   errcnt = 0;.  c
ca80: 70 20 3d 20 73 74 72 63 68 72 28 61 72 67 76 5b  p = strchr(argv[
ca90: 69 5d 2c 27 3d 27 29 3b 0a 20 20 2a 63 70 20 3d  i],'=');.  *cp =
caa0: 20 30 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6f   0;.  for(j=0; o
cab0: 70 5b 6a 5d 2e 6c 61 62 65 6c 3b 20 6a 2b 2b 29  p[j].label; j++)
cac0: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
cad0: 28 61 72 67 76 5b 69 5d 2c 6f 70 5b 6a 5d 2e 6c  (argv[i],op[j].l
cae0: 61 62 65 6c 29 3d 3d 30 20 29 20 62 72 65 61 6b  abel)==0 ) break
caf0: 3b 0a 20 20 7d 0a 20 20 2a 63 70 20 3d 20 27 3d  ;.  }.  *cp = '=
cb00: 27 3b 0a 20 20 69 66 28 20 6f 70 5b 6a 5d 2e 6c  ';.  if( op[j].l
cb10: 61 62 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 69  abel==0 ){.    i
cb20: 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20  f( err ){.      
cb30: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 25 73 75  fprintf(err,"%su
cb40: 6e 64 65 66 69 6e 65 64 20 6f 70 74 69 6f 6e 2e  ndefined option.
cb50: 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20  \n",emsg);.     
cb60: 20 65 72 72 6c 69 6e 65 28 69 2c 30 2c 65 72 72   errline(i,0,err
cb70: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 72 72  );.    }.    err
cb80: 63 6e 74 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  cnt++;.  }else{.
cb90: 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20 73 77      cp++;.    sw
cba0: 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70 65  itch( op[j].type
cbb0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
cbc0: 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63  PT_FLAG:.      c
cbd0: 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20  ase OPT_FFLAG:. 
cbe0: 20 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29         if( err )
cbf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
cc00: 6e 74 66 28 65 72 72 2c 22 25 73 6f 70 74 69 6f  ntf(err,"%soptio
cc10: 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72  n requires an ar
cc20: 67 75 6d 65 6e 74 2e 5c 6e 22 2c 65 6d 73 67 29  gument.\n",emsg)
cc30: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 72 72 6c  ;.          errl
cc40: 69 6e 65 28 69 2c 30 2c 65 72 72 29 3b 0a 20 20  ine(i,0,err);.  
cc50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cc60: 65 72 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  errcnt++;.      
cc70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
cc80: 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20  ase OPT_DBL:.   
cc90: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c     case OPT_FDBL
cca0: 3a 0a 20 20 20 20 20 20 20 20 64 76 20 3d 20 73  :.        dv = s
ccb0: 74 72 74 6f 64 28 63 70 2c 26 65 6e 64 29 3b 0a  trtod(cp,&end);.
ccc0: 20 20 20 20 20 20 20 20 69 66 28 20 2a 65 6e 64          if( *end
ccd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
cce0: 28 20 65 72 72 20 29 7b 0a 20 20 20 20 20 20 20  ( err ){.       
ccf0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 65 72 72       fprintf(err
cd00: 2c 22 25 73 69 6c 6c 65 67 61 6c 20 63 68 61 72  ,"%sillegal char
cd10: 61 63 74 65 72 20 69 6e 20 66 6c 6f 61 74 69 6e  acter in floatin
cd20: 67 2d 70 6f 69 6e 74 20 61 72 67 75 6d 65 6e 74  g-point argument
cd30: 2e 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20  .\n",emsg);.    
cd40: 20 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28          errline(
cd50: 69 2c 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  i,((unsigned lon
cd60: 67 29 65 6e 64 29 2d 28 75 6e 73 69 67 6e 65 64  g)end)-(unsigned
cd70: 20 6c 6f 6e 67 29 61 72 67 76 5b 69 5d 2c 65 72   long)argv[i],er
cd80: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
cd90: 20 20 20 20 20 20 20 20 20 20 65 72 72 63 6e 74            errcnt
cda0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ++;.        }.  
cdb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
cdc0: 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54 3a     case OPT_INT:
cdd0: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
cde0: 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c 76  FINT:.        lv
cdf0: 20 3d 20 73 74 72 74 6f 6c 28 63 70 2c 26 65 6e   = strtol(cp,&en
ce00: 64 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  d,0);.        if
ce10: 28 20 2a 65 6e 64 20 29 7b 0a 20 20 20 20 20 20  ( *end ){.      
ce20: 20 20 20 20 69 66 28 20 65 72 72 20 29 7b 0a 20      if( err ){. 
ce30: 20 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e             fprin
ce40: 74 66 28 65 72 72 2c 22 25 73 69 6c 6c 65 67 61  tf(err,"%sillega
ce50: 6c 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 69  l character in i
ce60: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e  nteger argument.
ce70: 5c 6e 22 2c 65 6d 73 67 29 3b 0a 20 20 20 20 20  \n",emsg);.     
ce80: 20 20 20 20 20 20 20 65 72 72 6c 69 6e 65 28 69         errline(i
ce90: 2c 28 28 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ,((unsigned long
cea0: 29 65 6e 64 29 2d 28 75 6e 73 69 67 6e 65 64 20  )end)-(unsigned 
ceb0: 6c 6f 6e 67 29 61 72 67 76 5b 69 5d 2c 65 72 72  long)argv[i],err
cec0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
ced0: 20 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 2b           errcnt+
cee0: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
cef0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cf00: 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a    case OPT_STR:.
cf10: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
cf20: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 73 76 20  STR:.        sv 
cf30: 3d 20 63 70 3b 0a 20 20 20 20 20 20 20 20 62 72  = cp;.        br
cf40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  eak;.    }.    s
cf50: 77 69 74 63 68 28 20 6f 70 5b 6a 5d 2e 74 79 70  witch( op[j].typ
cf60: 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  e ){.      case 
cf70: 4f 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20  OPT_FLAG:.      
cf80: 63 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a  case OPT_FFLAG:.
cf90: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
cfa0: 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 44 42       case OPT_DB
cfb0: 4c 3a 0a 20 20 20 20 20 20 20 20 2a 28 64 6f 75  L:.        *(dou
cfc0: 62 6c 65 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  ble*)(op[j].arg)
cfd0: 20 3d 20 64 76 3b 0a 20 20 20 20 20 20 20 20 62   = dv;.        b
cfe0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
cff0: 20 4f 50 54 5f 46 44 42 4c 3a 0a 20 20 20 20 20   OPT_FDBL:.     
d000: 20 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 29 29     (*(void(*)())
d010: 28 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 64 76 29  (op[j].arg))(dv)
d020: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
d030: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
d040: 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 2a 28 69  INT:.        *(i
d050: 6e 74 2a 29 28 6f 70 5b 6a 5d 2e 61 72 67 29 20  nt*)(op[j].arg) 
d060: 3d 20 6c 76 3b 0a 20 20 20 20 20 20 20 20 62 72  = lv;.        br
d070: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
d080: 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20  OPT_FINT:.      
d090: 20 20 28 2a 28 76 6f 69 64 28 2a 29 28 29 29 28    (*(void(*)())(
d0a0: 6f 70 5b 6a 5d 2e 61 72 67 29 29 28 28 69 6e 74  op[j].arg))((int
d0b0: 29 6c 76 29 3b 0a 20 20 20 20 20 20 20 20 62 72  )lv);.        br
d0c0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
d0d0: 4f 50 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 20  OPT_STR:.       
d0e0: 20 2a 28 63 68 61 72 2a 2a 29 28 6f 70 5b 6a 5d   *(char**)(op[j]
d0f0: 2e 61 72 67 29 20 3d 20 73 76 3b 0a 20 20 20 20  .arg) = sv;.    
d100: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d110: 20 63 61 73 65 20 4f 50 54 5f 46 53 54 52 3a 0a   case OPT_FSTR:.
d120: 20 20 20 20 20 20 20 20 28 2a 28 76 6f 69 64 28          (*(void(
d130: 2a 29 28 29 29 28 6f 70 5b 6a 5d 2e 61 72 67 29  *)())(op[j].arg)
d140: 29 28 73 76 29 3b 0a 20 20 20 20 20 20 20 20 62  )(sv);.        b
d150: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
d160: 20 20 72 65 74 75 72 6e 20 65 72 72 63 6e 74 3b    return errcnt;
d170: 0a 7d 0a 0a 69 6e 74 20 4f 70 74 49 6e 69 74 28  .}..int OptInit(
d180: 61 2c 6f 2c 65 72 72 29 0a 63 68 61 72 20 2a 2a  a,o,err).char **
d190: 61 3b 0a 73 74 72 75 63 74 20 73 5f 6f 70 74 69  a;.struct s_opti
d1a0: 6f 6e 73 20 2a 6f 3b 0a 46 49 4c 45 20 2a 65 72  ons *o;.FILE *er
d1b0: 72 3b 0a 7b 0a 20 20 69 6e 74 20 65 72 72 63 6e  r;.{.  int errcn
d1c0: 74 20 3d 20 30 3b 0a 20 20 61 72 67 76 20 3d 20  t = 0;.  argv = 
d1d0: 61 3b 0a 20 20 6f 70 20 3d 20 6f 3b 0a 20 20 65  a;.  op = o;.  e
d1e0: 72 72 73 74 72 65 61 6d 20 3d 20 65 72 72 3b 0a  rrstream = err;.
d1f0: 20 20 69 66 28 20 61 72 67 76 20 26 26 20 2a 61    if( argv && *a
d200: 72 67 76 20 26 26 20 6f 70 20 29 7b 0a 20 20 20  rgv && op ){.   
d210: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
d220: 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b 20 69 2b  i=1; argv[i]; i+
d230: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 72  +){.      if( ar
d240: 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2b 27 20 7c 7c  gv[i][0]=='+' ||
d250: 20 61 72 67 76 5b 69 5d 5b 30 5d 3d 3d 27 2d 27   argv[i][0]=='-'
d260: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 63   ){.        errc
d270: 6e 74 20 2b 3d 20 68 61 6e 64 6c 65 66 6c 61 67  nt += handleflag
d280: 73 28 69 2c 65 72 72 29 3b 0a 20 20 20 20 20 20  s(i,err);.      
d290: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 68 72  }else if( strchr
d2a0: 28 61 72 67 76 5b 69 5d 2c 27 3d 27 29 20 29 7b  (argv[i],'=') ){
d2b0: 0a 20 20 20 20 20 20 20 20 65 72 72 63 6e 74 20  .        errcnt 
d2c0: 2b 3d 20 68 61 6e 64 6c 65 73 77 69 74 63 68 28  += handleswitch(
d2d0: 69 2c 65 72 72 29 3b 0a 20 20 20 20 20 20 7d 0a  i,err);.      }.
d2e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
d2f0: 65 72 72 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20  errcnt>0 ){.    
d300: 66 70 72 69 6e 74 66 28 65 72 72 2c 22 56 61 6c  fprintf(err,"Val
d310: 69 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  id command line 
d320: 6f 70 74 69 6f 6e 73 20 66 6f 72 20 5c 22 25 73  options for \"%s
d330: 5c 22 20 61 72 65 3a 5c 6e 22 2c 2a 61 29 3b 0a  \" are:\n",*a);.
d340: 20 20 20 20 4f 70 74 50 72 69 6e 74 28 29 3b 0a      OptPrint();.
d350: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
d360: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
d370: 69 6e 74 20 4f 70 74 4e 41 72 67 73 28 29 7b 0a  int OptNArgs(){.
d380: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20    int cnt = 0;. 
d390: 20 69 6e 74 20 64 61 73 68 64 61 73 68 20 3d 20   int dashdash = 
d3a0: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  0;.  int i;.  if
d3b0: 28 20 61 72 67 76 21 3d 30 20 26 26 20 61 72 67  ( argv!=0 && arg
d3c0: 76 5b 30 5d 21 3d 30 20 29 7b 0a 20 20 20 20 66  v[0]!=0 ){.    f
d3d0: 6f 72 28 69 3d 31 3b 20 61 72 67 76 5b 69 5d 3b  or(i=1; argv[i];
d3e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
d3f0: 20 64 61 73 68 64 61 73 68 20 7c 7c 20 21 49 53   dashdash || !IS
d400: 4f 50 54 28 61 72 67 76 5b 69 5d 29 20 29 20 63  OPT(argv[i]) ) c
d410: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  nt++;.      if( 
d420: 73 74 72 63 6d 70 28 61 72 67 76 5b 69 5d 2c 22  strcmp(argv[i],"
d430: 2d 2d 22 29 3d 3d 30 20 29 20 64 61 73 68 64 61  --")==0 ) dashda
d440: 73 68 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  sh = 1;.    }.  
d450: 7d 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 3b 0a  }.  return cnt;.
d460: 7d 0a 0a 63 68 61 72 20 2a 4f 70 74 41 72 67 28  }..char *OptArg(
d470: 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a 20 20 69 6e  n).int n;.{.  in
d480: 74 20 69 3b 0a 20 20 69 20 3d 20 61 72 67 69 6e  t i;.  i = argin
d490: 64 65 78 28 6e 29 3b 0a 20 20 72 65 74 75 72 6e  dex(n);.  return
d4a0: 20 69 3e 3d 30 20 3f 20 61 72 67 76 5b 69 5d 20   i>=0 ? argv[i] 
d4b0: 3a 20 30 3b 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74  : 0;.}..void Opt
d4c0: 45 72 72 28 6e 29 0a 69 6e 74 20 6e 3b 0a 7b 0a  Err(n).int n;.{.
d4d0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 61    int i;.  i = a
d4e0: 72 67 69 6e 64 65 78 28 6e 29 3b 0a 20 20 69 66  rgindex(n);.  if
d4f0: 28 20 69 3e 3d 30 20 29 20 65 72 72 6c 69 6e 65  ( i>=0 ) errline
d500: 28 69 2c 30 2c 65 72 72 73 74 72 65 61 6d 29 3b  (i,0,errstream);
d510: 0a 7d 0a 0a 76 6f 69 64 20 4f 70 74 50 72 69 6e  .}..void OptPrin
d520: 74 28 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  t(){.  int i;.  
d530: 69 6e 74 20 6d 61 78 2c 20 6c 65 6e 3b 0a 20 20  int max, len;.  
d540: 6d 61 78 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69  max = 0;.  for(i
d550: 3d 30 3b 20 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b  =0; op[i].label;
d560: 20 69 2b 2b 29 7b 0a 20 20 20 20 6c 65 6e 20 3d   i++){.    len =
d570: 20 73 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61   strlen(op[i].la
d580: 62 65 6c 29 20 2b 20 31 3b 0a 20 20 20 20 73 77  bel) + 1;.    sw
d590: 69 74 63 68 28 20 6f 70 5b 69 5d 2e 74 79 70 65  itch( op[i].type
d5a0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f   ){.      case O
d5b0: 50 54 5f 46 4c 41 47 3a 0a 20 20 20 20 20 20 63  PT_FLAG:.      c
d5c0: 61 73 65 20 4f 50 54 5f 46 46 4c 41 47 3a 0a 20  ase OPT_FFLAG:. 
d5d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d5e0: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 49 4e 54      case OPT_INT
d5f0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
d600: 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20 20 20 6c  _FINT:.        l
d610: 65 6e 20 2b 3d 20 39 3b 20 20 20 20 20 20 20 2f  en += 9;       /
d620: 2a 20 6c 65 6e 67 74 68 20 6f 66 20 22 3c 69 6e  * length of "<in
d630: 74 65 67 65 72 3e 22 20 2a 2f 0a 20 20 20 20 20  teger>" */.     
d640: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
d650: 63 61 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20  case OPT_DBL:.  
d660: 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42      case OPT_FDB
d670: 4c 3a 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 2b  L:.        len +
d680: 3d 20 36 3b 20 20 20 20 20 20 20 2f 2a 20 6c 65  = 6;       /* le
d690: 6e 67 74 68 20 6f 66 20 22 3c 72 65 61 6c 3e 22  ngth of "<real>"
d6a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 62 72 65 61   */.        brea
d6b0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  k;.      case OP
d6c0: 54 5f 53 54 52 3a 0a 20 20 20 20 20 20 63 61 73  T_STR:.      cas
d6d0: 65 20 4f 50 54 5f 46 53 54 52 3a 0a 20 20 20 20  e OPT_FSTR:.    
d6e0: 20 20 20 20 6c 65 6e 20 2b 3d 20 38 3b 20 20 20      len += 8;   
d6f0: 20 20 20 20 2f 2a 20 6c 65 6e 67 74 68 20 6f 66      /* length of
d700: 20 22 3c 73 74 72 69 6e 67 3e 22 20 2a 2f 0a 20   "<string>" */. 
d710: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
d720: 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e    }.    if( len>
d730: 6d 61 78 20 29 20 6d 61 78 20 3d 20 6c 65 6e 3b  max ) max = len;
d740: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
d750: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 3b 20 69 2b 2b  op[i].label; i++
d760: 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  ){.    switch( o
d770: 70 5b 69 5d 2e 74 79 70 65 20 29 7b 0a 20 20 20  p[i].type ){.   
d780: 20 20 20 63 61 73 65 20 4f 50 54 5f 46 4c 41 47     case OPT_FLAG
d790: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54  :.      case OPT
d7a0: 5f 46 46 4c 41 47 3a 0a 20 20 20 20 20 20 20 20  _FFLAG:.        
d7b0: 66 70 72 69 6e 74 66 28 65 72 72 73 74 72 65 61  fprintf(errstrea
d7c0: 6d 2c 22 20 20 2d 25 2d 2a 73 20 20 25 73 5c 6e  m,"  -%-*s  %s\n
d7d0: 22 2c 6d 61 78 2c 6f 70 5b 69 5d 2e 6c 61 62 65  ",max,op[i].labe
d7e0: 6c 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65 29  l,op[i].message)
d7f0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
d800: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f  .      case OPT_
d810: 49 4e 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20  INT:.      case 
d820: 4f 50 54 5f 46 49 4e 54 3a 0a 20 20 20 20 20 20  OPT_FINT:.      
d830: 20 20 66 70 72 69 6e 74 66 28 65 72 72 73 74 72    fprintf(errstr
d840: 65 61 6d 2c 22 20 20 25 73 3d 3c 69 6e 74 65 67  eam,"  %s=<integ
d850: 65 72 3e 25 2a 73 20 20 25 73 5c 6e 22 2c 6f 70  er>%*s  %s\n",op
d860: 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20 20 20 20 20  [i].label,.     
d870: 20 20 20 20 20 28 69 6e 74 29 28 6d 61 78 2d 73       (int)(max-s
d880: 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e 6c 61 62 65  trlen(op[i].labe
d890: 6c 29 2d 39 29 2c 22 22 2c 6f 70 5b 69 5d 2e 6d  l)-9),"",op[i].m
d8a0: 65 73 73 61 67 65 29 3b 0a 20 20 20 20 20 20 20  essage);.       
d8b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
d8c0: 73 65 20 4f 50 54 5f 44 42 4c 3a 0a 20 20 20 20  se OPT_DBL:.    
d8d0: 20 20 63 61 73 65 20 4f 50 54 5f 46 44 42 4c 3a    case OPT_FDBL:
d8e0: 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
d8f0: 28 65 72 72 73 74 72 65 61 6d 2c 22 20 20 25 73  (errstream,"  %s
d900: 3d 3c 72 65 61 6c 3e 25 2a 73 20 20 25 73 5c 6e  =<real>%*s  %s\n
d910: 22 2c 6f 70 5b 69 5d 2e 6c 61 62 65 6c 2c 0a 20  ",op[i].label,. 
d920: 20 20 20 20 20 20 20 20 20 28 69 6e 74 29 28 6d           (int)(m
d930: 61 78 2d 73 74 72 6c 65 6e 28 6f 70 5b 69 5d 2e  ax-strlen(op[i].
d940: 6c 61 62 65 6c 29 2d 36 29 2c 22 22 2c 6f 70 5b  label)-6),"",op[
d950: 69 5d 2e 6d 65 73 73 61 67 65 29 3b 0a 20 20 20  i].message);.   
d960: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d970: 20 20 63 61 73 65 20 4f 50 54 5f 53 54 52 3a 0a    case OPT_STR:.
d980: 20 20 20 20 20 20 63 61 73 65 20 4f 50 54 5f 46        case OPT_F
d990: 53 54 52 3a 0a 20 20 20 20 20 20 20 20 66 70 72  STR:.        fpr
d9a0: 69 6e 74 66 28 65 72 72 73 74 72 65 61 6d 2c 22  intf(errstream,"
d9b0: 20 20 25 73 3d 3c 73 74 72 69 6e 67 3e 25 2a 73    %s=<string>%*s
d9c0: 20 20 25 73 5c 6e 22 2c 6f 70 5b 69 5d 2e 6c 61    %s\n",op[i].la
d9d0: 62 65 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 28  bel,.          (
d9e0: 69 6e 74 29 28 6d 61 78 2d 73 74 72 6c 65 6e 28  int)(max-strlen(
d9f0: 6f 70 5b 69 5d 2e 6c 61 62 65 6c 29 2d 38 29 2c  op[i].label)-8),
da00: 22 22 2c 6f 70 5b 69 5d 2e 6d 65 73 73 61 67 65  "",op[i].message
da10: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
da20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a  ;.    }.  }.}./*
da30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
da40: 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20  ****** From the 
da50: 66 69 6c 65 20 22 70 61 72 73 65 2e 63 22 20 2a  file "parse.c" *
da60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
da70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a  ***********/./*.
da80: 2a 2a 20 49 6e 70 75 74 20 66 69 6c 65 20 70 61  ** Input file pa
da90: 72 73 65 72 20 66 6f 72 20 74 68 65 20 4c 45 4d  rser for the LEM
daa0: 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72 61  ON parser genera
dab0: 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 54 68 65 20  tor..*/../* The 
dac0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 72  state of the par
dad0: 73 65 72 20 2a 2f 0a 73 74 72 75 63 74 20 70 73  ser */.struct ps
dae0: 74 61 74 65 20 7b 0a 20 20 63 68 61 72 20 2a 66  tate {.  char *f
daf0: 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 2f  ilename;       /
db00: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
db10: 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  put file */.  in
db20: 74 20 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 20 20  t tokenlineno;  
db30: 20 20 20 20 2f 2a 20 4c 69 6e 65 6e 75 6d 62 65      /* Linenumbe
db40: 72 20 61 74 20 77 68 69 63 68 20 63 75 72 72 65  r at which curre
db50: 6e 74 20 74 6f 6b 65 6e 20 73 74 61 72 74 73 20  nt token starts 
db60: 2a 2f 0a 20 20 69 6e 74 20 65 72 72 6f 72 63 6e  */.  int errorcn
db70: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  t;         /* Nu
db80: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73  mber of errors s
db90: 6f 20 66 61 72 20 2a 2f 0a 20 20 63 68 61 72 20  o far */.  char 
dba0: 2a 74 6f 6b 65 6e 73 74 61 72 74 3b 20 20 20 20  *tokenstart;    
dbb0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 63 75 72 72   /* Text of curr
dbc0: 65 6e 74 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73  ent token */.  s
dbd0: 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 67 70 3b  truct lemon *gp;
dbe0: 20 20 20 20 20 2f 2a 20 47 6c 6f 62 61 6c 20 73       /* Global s
dbf0: 74 61 74 65 20 76 65 63 74 6f 72 20 2a 2f 0a 20  tate vector */. 
dc00: 20 65 6e 75 6d 20 65 5f 73 74 61 74 65 20 7b 0a   enum e_state {.
dc10: 20 20 20 20 49 4e 49 54 49 41 4c 49 5a 45 2c 0a      INITIALIZE,.
dc20: 20 20 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f      WAITING_FOR_
dc30: 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 2c 0a 20 20  DECL_OR_RULE,.  
dc40: 20 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45    WAITING_FOR_DE
dc50: 43 4c 5f 4b 45 59 57 4f 52 44 2c 0a 20 20 20 20  CL_KEYWORD,.    
dc60: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
dc70: 5f 41 52 47 2c 0a 20 20 20 20 57 41 49 54 49 4e  _ARG,.    WAITIN
dc80: 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45  G_FOR_PRECEDENCE
dc90: 5f 53 59 4d 42 4f 4c 2c 0a 20 20 20 20 57 41 49  _SYMBOL,.    WAI
dca0: 54 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 2c 0a  TING_FOR_ARROW,.
dcb0: 20 20 20 20 49 4e 5f 52 48 53 2c 0a 20 20 20 20      IN_RHS,.    
dcc0: 4c 48 53 5f 41 4c 49 41 53 5f 31 2c 0a 20 20 20  LHS_ALIAS_1,.   
dcd0: 20 4c 48 53 5f 41 4c 49 41 53 5f 32 2c 0a 20 20   LHS_ALIAS_2,.  
dce0: 20 20 4c 48 53 5f 41 4c 49 41 53 5f 33 2c 0a 20    LHS_ALIAS_3,. 
dcf0: 20 20 20 52 48 53 5f 41 4c 49 41 53 5f 31 2c 0a     RHS_ALIAS_1,.
dd00: 20 20 20 20 52 48 53 5f 41 4c 49 41 53 5f 32 2c      RHS_ALIAS_2,
dd10: 0a 20 20 20 20 50 52 45 43 45 44 45 4e 43 45 5f  .    PRECEDENCE_
dd20: 4d 41 52 4b 5f 31 2c 0a 20 20 20 20 50 52 45 43  MARK_1,.    PREC
dd30: 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 2c 0a 20  EDENCE_MARK_2,. 
dd40: 20 20 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f     RESYNC_AFTER_
dd50: 52 55 4c 45 5f 45 52 52 4f 52 2c 0a 20 20 20 20  RULE_ERROR,.    
dd60: 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43  RESYNC_AFTER_DEC
dd70: 4c 5f 45 52 52 4f 52 2c 0a 20 20 20 20 57 41 49  L_ERROR,.    WAI
dd80: 54 49 4e 47 5f 46 4f 52 5f 44 45 53 54 52 55 43  TING_FOR_DESTRUC
dd90: 54 4f 52 5f 53 59 4d 42 4f 4c 2c 0a 20 20 20 20  TOR_SYMBOL,.    
dda0: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54 41  WAITING_FOR_DATA
ddb0: 54 59 50 45 5f 53 59 4d 42 4f 4c 2c 0a 20 20 20  TYPE_SYMBOL,.   
ddc0: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c   WAITING_FOR_FAL
ddd0: 4c 42 41 43 4b 5f 49 44 0a 20 20 7d 20 73 74 61  LBACK_ID.  } sta
dde0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
ddf0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 74 61        /* The sta
de00: 74 65 20 6f 66 20 74 68 65 20 70 61 72 73 65 72  te of the parser
de10: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 79 6d   */.  struct sym
de20: 62 6f 6c 20 2a 66 61 6c 6c 62 61 63 6b 3b 20 20  bol *fallback;  
de30: 20 2f 2a 20 54 68 65 20 66 61 6c 6c 62 61 63 6b   /* The fallback
de40: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 73 74 72 75   token */.  stru
de50: 63 74 20 73 79 6d 62 6f 6c 20 2a 6c 68 73 3b 20  ct symbol *lhs; 
de60: 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68         /* Left-h
de70: 61 6e 64 20 73 69 64 65 20 6f 66 20 63 75 72 72  and side of curr
de80: 65 6e 74 20 72 75 6c 65 20 2a 2f 0a 20 20 63 68  ent rule */.  ch
de90: 61 72 20 2a 6c 68 73 61 6c 69 61 73 3b 20 20 20  ar *lhsalias;   
dea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 69 61           /* Alia
deb0: 73 20 66 6f 72 20 74 68 65 20 4c 48 53 20 2a 2f  s for the LHS */
dec0: 0a 20 20 69 6e 74 20 6e 72 68 73 3b 20 20 20 20  .  int nrhs;    
ded0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dee0: 20 4e 75 6d 62 65 72 20 6f 66 20 72 69 67 68 74   Number of right
def0: 2d 68 61 6e 64 20 73 69 64 65 20 73 79 6d 62 6f  -hand side symbo
df00: 6c 73 20 73 65 65 6e 20 2a 2f 0a 20 20 73 74 72  ls seen */.  str
df10: 75 63 74 20 73 79 6d 62 6f 6c 20 2a 72 68 73 5b  uct symbol *rhs[
df20: 4d 41 58 52 48 53 5d 3b 20 20 2f 2a 20 52 48 53  MAXRHS];  /* RHS
df30: 20 73 79 6d 62 6f 6c 73 20 2a 2f 0a 20 20 63 68   symbols */.  ch
df40: 61 72 20 2a 61 6c 69 61 73 5b 4d 41 58 52 48 53  ar *alias[MAXRHS
df50: 5d 3b 20 20 20 20 20 20 20 2f 2a 20 41 6c 69 61  ];       /* Alia
df60: 73 65 73 20 66 6f 72 20 65 61 63 68 20 52 48 53  ses for each RHS
df70: 20 73 79 6d 62 6f 6c 20 28 6f 72 20 4e 55 4c 4c   symbol (or NULL
df80: 29 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  ) */.  struct ru
df90: 6c 65 20 2a 70 72 65 76 72 75 6c 65 3b 20 20 20  le *prevrule;   
dfa0: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 75    /* Previous ru
dfb0: 6c 65 20 70 61 72 73 65 64 20 2a 2f 0a 20 20 63  le parsed */.  c
dfc0: 68 61 72 20 2a 64 65 63 6c 6b 65 79 77 6f 72 64  har *declkeyword
dfd0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4b 65 79  ;         /* Key
dfe0: 77 6f 72 64 20 6f 66 20 61 20 64 65 63 6c 61 72  word of a declar
dff0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20  ation */.  char 
e000: 2a 2a 64 65 63 6c 61 72 67 73 6c 6f 74 3b 20 20  **declargslot;  
e010: 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
e020: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 61  he declaration a
e030: 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62  rgument should b
e040: 65 20 70 75 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  e put */.  int *
e050: 64 65 63 6c 6c 6e 73 6c 6f 74 3b 20 20 20 20 20  decllnslot;     
e060: 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74        /* Where t
e070: 68 65 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6c  he declaration l
e080: 69 6e 65 6e 75 6d 62 65 72 20 69 73 20 70 75 74  inenumber is put
e090: 20 2a 2f 0a 20 20 65 6e 75 6d 20 65 5f 61 73 73   */.  enum e_ass
e0a0: 6f 63 20 64 65 63 6c 61 73 73 6f 63 3b 20 20 20  oc declassoc;   
e0b0: 20 2f 2a 20 41 73 73 69 67 6e 20 74 68 69 73 20   /* Assign this 
e0c0: 61 73 73 6f 63 69 61 74 69 6f 6e 20 74 6f 20 64  association to d
e0d0: 65 63 6c 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ecl arguments */
e0e0: 0a 20 20 69 6e 74 20 70 72 65 63 63 6f 75 6e 74  .  int preccount
e0f0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er;           /*
e100: 20 41 73 73 69 67 6e 20 74 68 69 73 20 70 72 65   Assign this pre
e110: 63 65 64 65 6e 63 65 20 74 6f 20 64 65 63 6c 20  cedence to decl 
e120: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 73  arguments */.  s
e130: 74 72 75 63 74 20 72 75 6c 65 20 2a 66 69 72 73  truct rule *firs
e140: 74 72 75 6c 65 3b 20 20 20 20 2f 2a 20 50 6f 69  trule;    /* Poi
e150: 6e 74 65 72 20 74 6f 20 66 69 72 73 74 20 72 75  nter to first ru
e160: 6c 65 20 69 6e 20 74 68 65 20 67 72 61 6d 6d 61  le in the gramma
e170: 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 72 75  r */.  struct ru
e180: 6c 65 20 2a 6c 61 73 74 72 75 6c 65 3b 20 20 20  le *lastrule;   
e190: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
e1a0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
e1b0: 79 20 70 61 72 73 65 64 20 72 75 6c 65 20 2a 2f  y parsed rule */
e1c0: 0a 7d 3b 0a 0a 2f 2a 20 50 61 72 73 65 20 61 20  .};../* Parse a 
e1d0: 73 69 6e 67 6c 65 20 74 6f 6b 65 6e 20 2a 2f 0a  single token */.
e1e0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 72 73  static void pars
e1f0: 65 6f 6e 65 74 6f 6b 65 6e 28 70 73 70 29 0a 73  eonetoken(psp).s
e200: 74 72 75 63 74 20 70 73 74 61 74 65 20 2a 70 73  truct pstate *ps
e210: 70 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 78 3b 0a  p;.{.  char *x;.
e220: 20 20 78 20 3d 20 53 74 72 73 61 66 65 28 70 73    x = Strsafe(ps
e230: 70 2d 3e 74 6f 6b 65 6e 73 74 61 72 74 29 3b 20  p->tokenstart); 
e240: 20 20 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20      /* Save the 
e250: 74 6f 6b 65 6e 20 70 65 72 6d 61 6e 65 6e 74 6c  token permanentl
e260: 79 20 2a 2f 0a 23 69 66 20 30 0a 20 20 70 72 69  y */.#if 0.  pri
e270: 6e 74 66 28 22 25 73 3a 25 64 3a 20 54 6f 6b 65  ntf("%s:%d: Toke
e280: 6e 3d 5b 25 73 5d 20 73 74 61 74 65 3d 25 64 5c  n=[%s] state=%d\
e290: 6e 22 2c 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  n",psp->filename
e2a0: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
e2b0: 6f 2c 0a 20 20 20 20 78 2c 70 73 70 2d 3e 73 74  o,.    x,psp->st
e2c0: 61 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  ate);.#endif.  s
e2d0: 77 69 74 63 68 28 20 70 73 70 2d 3e 73 74 61 74  witch( psp->stat
e2e0: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 49 4e  e ){.    case IN
e2f0: 49 54 49 41 4c 49 5a 45 3a 0a 20 20 20 20 20 20  ITIALIZE:.      
e300: 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 20 3d 20  psp->prevrule = 
e310: 30 3b 0a 20 20 20 20 20 20 70 73 70 2d 3e 70 72  0;.      psp->pr
e320: 65 63 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20  eccounter = 0;. 
e330: 20 20 20 20 20 70 73 70 2d 3e 66 69 72 73 74 72       psp->firstr
e340: 75 6c 65 20 3d 20 70 73 70 2d 3e 6c 61 73 74 72  ule = psp->lastr
e350: 75 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ule = 0;.      p
e360: 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65 20 3d 20  sp->gp->nrule = 
e370: 30 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  0;.      /* Fall
e380: 20 74 68 72 75 20 74 6f 20 6e 65 78 74 20 63 61   thru to next ca
e390: 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 57  se */.    case W
e3a0: 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f  AITING_FOR_DECL_
e3b0: 4f 52 5f 52 55 4c 45 3a 0a 20 20 20 20 20 20 69  OR_RULE:.      i
e3c0: 66 28 20 78 5b 30 5d 3d 3d 27 25 27 20 29 7b 0a  f( x[0]=='%' ){.
e3d0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
e3e0: 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
e3f0: 5f 44 45 43 4c 5f 4b 45 59 57 4f 52 44 3b 0a 20  _DECL_KEYWORD;. 
e400: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
e410: 73 6c 6f 77 65 72 28 78 5b 30 5d 29 20 29 7b 0a  slower(x[0]) ){.
e420: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c 68 73          psp->lhs
e430: 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
e440: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6e  ;.        psp->n
e450: 72 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rhs = 0;.       
e460: 20 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d   psp->lhsalias =
e470: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d   0;.        psp-
e480: 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
e490: 5f 46 4f 52 5f 41 52 52 4f 57 3b 0a 20 20 20 20  _FOR_ARROW;.    
e4a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30 5d    }else if( x[0]
e4b0: 3d 3d 27 7b 27 20 29 7b 0a 20 20 20 20 20 20 20  =='{' ){.       
e4c0: 20 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75   if( psp->prevru
e4d0: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
e4e0: 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
e4f0: 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
e500: 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22 54 68 65  okenlineno,."The
e510: 72 65 20 69 73 20 6e 6f 74 20 70 72 69 6f 72 20  re is not prior 
e520: 72 75 6c 65 20 6f 70 6f 6e 20 77 68 69 63 68 20  rule opon which 
e530: 74 6f 20 61 74 74 61 63 68 20 74 68 65 20 63 6f  to attach the co
e540: 64 65 20 5c 0a 66 72 61 67 6d 65 6e 74 20 77 68  de \.fragment wh
e550: 69 63 68 20 62 65 67 69 6e 73 20 6f 6e 20 74 68  ich begins on th
e560: 69 73 20 6c 69 6e 65 2e 22 29 3b 0a 20 20 20 20  is line.");.    
e570: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
e580: 63 6e 74 2b 2b 3b 0a 09 7d 65 6c 73 65 20 69 66  cnt++;..}else if
e590: 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d  ( psp->prevrule-
e5a0: 3e 63 6f 64 65 21 3d 30 20 29 7b 0a 20 20 20 20  >code!=0 ){.    
e5b0: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
e5c0: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
e5d0: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22  ->tokenlineno,."
e5e0: 43 6f 64 65 20 66 72 61 67 6d 65 6e 74 20 62 65  Code fragment be
e5f0: 67 69 6e 6e 69 6e 67 20 6f 6e 20 74 68 69 73 20  ginning on this 
e600: 6c 69 6e 65 20 69 73 20 6e 6f 74 20 74 68 65 20  line is not the 
e610: 66 69 72 73 74 20 5c 0a 74 6f 20 66 6f 6c 6c 6f  first \.to follo
e620: 77 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 72  w the previous r
e630: 75 6c 65 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ule.");.        
e640: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
e650: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
e660: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
e670: 3e 70 72 65 76 72 75 6c 65 2d 3e 6c 69 6e 65 20  >prevrule->line 
e680: 3d 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65  = psp->tokenline
e690: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  no;.          ps
e6a0: 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e 63 6f 64  p->prevrule->cod
e6b0: 65 20 3d 20 26 78 5b 31 5d 3b 0a 09 7d 0a 20 20  e = &x[1];..}.  
e6c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b      }else if( x[
e6d0: 30 5d 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20  0]=='[' ){.     
e6e0: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
e6f0: 50 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f  PRECEDENCE_MARK_
e700: 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
e710: 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67          ErrorMsg
e720: 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70  (psp->filename,p
e730: 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c  sp->tokenlineno,
e740: 0a 20 20 20 20 20 20 20 20 20 20 22 54 6f 6b 65  .          "Toke
e750: 6e 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20  n \"%s\" should 
e760: 62 65 20 65 69 74 68 65 72 20 5c 22 25 25 5c 22  be either \"%%\"
e770: 20 6f 72 20 61 20 6e 6f 6e 74 65 72 6d 69 6e 61   or a nontermina
e780: 6c 20 6e 61 6d 65 2e 22 2c 0a 20 20 20 20 20 20  l name.",.      
e790: 20 20 20 20 78 29 3b 0a 20 20 20 20 20 20 20 20      x);.        
e7a0: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
e7b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
e7c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50  reak;.    case P
e7d0: 52 45 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 31  RECEDENCE_MARK_1
e7e0: 3a 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 75  :.      if( !isu
e7f0: 70 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20  pper(x[0]) ){.  
e800: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
e810: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
e820: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
e830: 20 20 20 20 20 20 20 20 20 22 54 68 65 20 70 72           "The pr
e840: 65 63 65 64 65 6e 63 65 20 73 79 6d 62 6f 6c 20  ecedence symbol 
e850: 6d 75 73 74 20 62 65 20 61 20 74 65 72 6d 69 6e  must be a termin
e860: 61 6c 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 70  al.");.        p
e870: 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
e880: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e890: 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 3d 3d 30  psp->prevrule==0
e8a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
e8b0: 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
e8c0: 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
e8d0: 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
e8e0: 54 68 65 72 65 20 69 73 20 6e 6f 20 70 72 69 6f  There is no prio
e8f0: 72 20 72 75 6c 65 20 74 6f 20 61 73 73 69 67 6e  r rule to assign
e900: 20 70 72 65 63 65 64 65 6e 63 65 20 5c 22 5b 25   precedence \"[%
e910: 73 5d 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20  s]\".",x);.     
e920: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
e930: 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
e940: 69 66 28 20 70 73 70 2d 3e 70 72 65 76 72 75 6c  if( psp->prevrul
e950: 65 2d 3e 70 72 65 63 73 79 6d 21 3d 30 20 29 7b  e->precsym!=0 ){
e960: 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
e970: 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
e980: 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
e990: 2c 0a 22 50 72 65 63 65 64 65 6e 63 65 20 6d 61  ,."Precedence ma
e9a0: 72 6b 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20  rk on this line 
e9b0: 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72 73 74  is not the first
e9c0: 20 5c 0a 74 6f 20 66 6f 6c 6c 6f 77 20 74 68 65   \.to follow the
e9d0: 20 70 72 65 76 69 6f 75 73 20 72 75 6c 65 2e 22   previous rule."
e9e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  );.        psp->
e9f0: 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
ea00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ea10: 20 70 73 70 2d 3e 70 72 65 76 72 75 6c 65 2d 3e   psp->prevrule->
ea20: 70 72 65 63 73 79 6d 20 3d 20 53 79 6d 62 6f 6c  precsym = Symbol
ea30: 5f 6e 65 77 28 78 29 3b 0a 20 20 20 20 20 20 7d  _new(x);.      }
ea40: 0a 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74  .      psp->stat
ea50: 65 20 3d 20 50 52 45 43 45 44 45 4e 43 45 5f 4d  e = PRECEDENCE_M
ea60: 41 52 4b 5f 32 3b 0a 20 20 20 20 20 20 62 72 65  ARK_2;.      bre
ea70: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 50 52 45  ak;.    case PRE
ea80: 43 45 44 45 4e 43 45 5f 4d 41 52 4b 5f 32 3a 0a  CEDENCE_MARK_2:.
ea90: 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 21 3d        if( x[0]!=
eaa0: 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 45  ']' ){.        E
eab0: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
eac0: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
ead0: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
eae0: 20 20 22 4d 69 73 73 69 6e 67 20 5c 22 5d 5c 22    "Missing \"]\"
eaf0: 20 6f 6e 20 70 72 65 63 65 64 65 6e 63 65 20 6d   on precedence m
eb00: 61 72 6b 2e 22 29 3b 0a 20 20 20 20 20 20 20 20  ark.");.        
eb10: 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
eb20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
eb30: 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54  sp->state = WAIT
eb40: 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4f 52 5f  ING_FOR_DECL_OR_
eb50: 52 55 4c 45 3b 0a 20 20 20 20 20 20 62 72 65 61  RULE;.      brea
eb60: 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41 49 54  k;.    case WAIT
eb70: 49 4e 47 5f 46 4f 52 5f 41 52 52 4f 57 3a 0a 20  ING_FOR_ARROW:. 
eb80: 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
eb90: 3a 27 20 26 26 20 78 5b 31 5d 3d 3d 27 3a 27 20  :' && x[1]==':' 
eba0: 26 26 20 78 5b 32 5d 3d 3d 27 3d 27 20 29 7b 0a  && x[2]=='=' ){.
ebb0: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
ebc0: 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a 20 20 20  te = IN_RHS;.   
ebd0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 5b 30     }else if( x[0
ebe0: 5d 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20  ]=='(' ){.      
ebf0: 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c    psp->state = L
ec00: 48 53 5f 41 4c 49 41 53 5f 31 3b 0a 20 20 20 20  HS_ALIAS_1;.    
ec10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ec20: 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
ec30: 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
ec40: 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
ec50: 20 20 20 20 22 45 78 70 65 63 74 65 64 20 74 6f      "Expected to
ec60: 20 73 65 65 20 61 20 5c 22 3a 5c 22 20 66 6f 6c   see a \":\" fol
ec70: 6c 6f 77 69 6e 67 20 74 68 65 20 4c 48 53 20 73  lowing the LHS s
ec80: 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 2e 22 2c 0a  ymbol \"%s\".",.
ec90: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 6c            psp->l
eca0: 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20  hs->name);.     
ecb0: 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
ecc0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
ecd0: 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
ece0: 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52  AFTER_RULE_ERROR
ecf0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ed00: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
ed10: 4c 48 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20  LHS_ALIAS_1:.   
ed20: 20 20 20 69 66 28 20 69 73 61 6c 70 68 61 28 78     if( isalpha(x
ed30: 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  [0]) ){.        
ed40: 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 20 3d 20  psp->lhsalias = 
ed50: 78 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  x;.        psp->
ed60: 73 74 61 74 65 20 3d 20 4c 48 53 5f 41 4c 49 41  state = LHS_ALIA
ed70: 53 5f 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  S_2;.      }else
ed80: 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
ed90: 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65  sg(psp->filename
eda0: 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e  ,psp->tokenlinen
edb0: 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 5c 22  o,.          "\"
edc0: 25 73 5c 22 20 69 73 20 6e 6f 74 20 61 20 76 61  %s\" is not a va
edd0: 6c 69 64 20 61 6c 69 61 73 20 66 6f 72 20 74 68  lid alias for th
ede0: 65 20 4c 48 53 20 5c 22 25 73 5c 22 5c 6e 22 2c  e LHS \"%s\"\n",
edf0: 0a 20 20 20 20 20 20 20 20 20 20 78 2c 70 73 70  .          x,psp
ee00: 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20  ->lhs->name);.  
ee10: 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
ee20: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
ee30: 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59  sp->state = RESY
ee40: 4e 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52  NC_AFTER_RULE_ER
ee50: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
ee60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
ee70: 73 65 20 4c 48 53 5f 41 4c 49 41 53 5f 32 3a 0a  se LHS_ALIAS_2:.
ee80: 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
ee90: 27 29 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ')' ){.        p
eea0: 73 70 2d 3e 73 74 61 74 65 20 3d 20 4c 48 53 5f  sp->state = LHS_
eeb0: 41 4c 49 41 53 5f 33 3b 0a 20 20 20 20 20 20 7d  ALIAS_3;.      }
eec0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72  else{.        Er
eed0: 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65  rorMsg(psp->file
eee0: 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c  name,psp->tokenl
eef0: 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20  ineno,.         
ef00: 20 22 4d 69 73 73 69 6e 67 20 5c 22 29 5c 22 20   "Missing \")\" 
ef10: 66 6f 6c 6c 6f 77 69 6e 67 20 4c 48 53 20 61 6c  following LHS al
ef20: 69 61 73 20 6e 61 6d 65 20 5c 22 25 73 5c 22 2e  ias name \"%s\".
ef30: 22 2c 70 73 70 2d 3e 6c 68 73 61 6c 69 61 73 29  ",psp->lhsalias)
ef40: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65  ;.        psp->e
ef50: 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20  rrorcnt++;.     
ef60: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
ef70: 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 52 55 4c  RESYNC_AFTER_RUL
ef80: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
ef90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
efa0: 20 20 63 61 73 65 20 4c 48 53 5f 41 4c 49 41 53    case LHS_ALIAS
efb0: 5f 33 3a 0a 20 20 20 20 20 20 69 66 28 20 78 5b  _3:.      if( x[
efc0: 30 5d 3d 3d 27 3a 27 20 26 26 20 78 5b 31 5d 3d  0]==':' && x[1]=
efd0: 3d 27 3a 27 20 26 26 20 78 5b 32 5d 3d 3d 27 3d  =':' && x[2]=='=
efe0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70  ' ){.        psp
eff0: 2d 3e 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53  ->state = IN_RHS
f000: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
f010: 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28         ErrorMsg(
f020: 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73  psp->filename,ps
f030: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a  p->tokenlineno,.
f040: 20 20 20 20 20 20 20 20 20 20 22 4d 69 73 73 69            "Missi
f050: 6e 67 20 5c 22 2d 3e 5c 22 20 66 6f 6c 6c 6f 77  ng \"->\" follow
f060: 69 6e 67 3a 20 5c 22 25 73 28 25 73 29 5c 22 2e  ing: \"%s(%s)\".
f070: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 73  ",.           ps
f080: 70 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 2c 70 73 70  p->lhs->name,psp
f090: 2d 3e 6c 68 73 61 6c 69 61 73 29 3b 0a 20 20 20  ->lhsalias);.   
f0a0: 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63       psp->errorc
f0b0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73  nt++;.        ps
f0c0: 70 2d 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e  p->state = RESYN
f0d0: 43 5f 41 46 54 45 52 5f 52 55 4c 45 5f 45 52 52  C_AFTER_RULE_ERR
f0e0: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
f0f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
f100: 65 20 49 4e 5f 52 48 53 3a 0a 20 20 20 20 20 20  e IN_RHS:.      
f110: 69 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b  if( x[0]=='.' ){
f120: 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
f130: 72 75 6c 65 20 2a 72 70 3b 0a 20 20 20 20 20 20  rule *rp;.      
f140: 20 20 72 70 20 3d 20 28 73 74 72 75 63 74 20 72    rp = (struct r
f150: 75 6c 65 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 69  ule *)malloc( si
f160: 7a 65 6f 66 28 73 74 72 75 63 74 20 72 75 6c 65  zeof(struct rule
f170: 29 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20  ) + .           
f180: 20 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20    sizeof(struct 
f190: 73 79 6d 62 6f 6c 2a 29 2a 70 73 70 2d 3e 6e 72  symbol*)*psp->nr
f1a0: 68 73 20 2b 20 73 69 7a 65 6f 66 28 63 68 61 72  hs + sizeof(char
f1b0: 2a 29 2a 70 73 70 2d 3e 6e 72 68 73 20 29 3b 0a  *)*psp->nrhs );.
f1c0: 20 20 20 20 20 20 20 20 69 66 28 20 72 70 3d 3d          if( rp==
f1d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
f1e0: 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c  rrorMsg(psp->fil
f1f0: 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e  ename,psp->token
f200: 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20  lineno,.        
f210: 20 20 20 20 22 43 61 6e 27 74 20 61 6c 6c 6f 63      "Can't alloc
f220: 61 74 65 20 65 6e 6f 75 67 68 20 6d 65 6d 6f 72  ate enough memor
f230: 79 20 66 6f 72 20 74 68 69 73 20 72 75 6c 65 2e  y for this rule.
f240: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  ");.          ps
f250: 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
f260: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 70 72           psp->pr
f270: 65 76 72 75 6c 65 20 3d 20 30 3b 0a 09 7d 65 6c  evrule = 0;..}el
f280: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
f290: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 72  t i;.          r
f2a0: 70 2d 3e 72 75 6c 65 6c 69 6e 65 20 3d 20 70 73  p->ruleline = ps
f2b0: 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a  p->tokenlineno;.
f2c0: 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 72 68            rp->rh
f2d0: 73 20 3d 20 28 73 74 72 75 63 74 20 73 79 6d 62  s = (struct symb
f2e0: 6f 6c 2a 2a 29 26 72 70 5b 31 5d 3b 0a 20 20 20  ol**)&rp[1];.   
f2f0: 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 61 6c         rp->rhsal
f300: 69 61 73 20 3d 20 28 63 68 61 72 2a 2a 29 26 28  ias = (char**)&(
f310: 72 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68  rp->rhs[psp->nrh
f320: 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  s]);.          f
f330: 6f 72 28 69 3d 30 3b 20 69 3c 70 73 70 2d 3e 6e  or(i=0; i<psp->n
f340: 72 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  rhs; i++){.     
f350: 20 20 20 20 20 20 20 72 70 2d 3e 72 68 73 5b 69         rp->rhs[i
f360: 5d 20 3d 20 70 73 70 2d 3e 72 68 73 5b 69 5d 3b  ] = psp->rhs[i];
f370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 70 2d  .            rp-
f380: 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20 3d 20 70  >rhsalias[i] = p
f390: 73 70 2d 3e 61 6c 69 61 73 5b 69 5d 3b 0a 09 20  sp->alias[i];.. 
f3a0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d   }.          rp-
f3b0: 3e 6c 68 73 20 3d 20 70 73 70 2d 3e 6c 68 73 3b  >lhs = psp->lhs;
f3c0: 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 6c  .          rp->l
f3d0: 68 73 61 6c 69 61 73 20 3d 20 70 73 70 2d 3e 6c  hsalias = psp->l
f3e0: 68 73 61 6c 69 61 73 3b 0a 20 20 20 20 20 20 20  hsalias;.       
f3f0: 20 20 20 72 70 2d 3e 6e 72 68 73 20 3d 20 70 73     rp->nrhs = ps
f400: 70 2d 3e 6e 72 68 73 3b 0a 20 20 20 20 20 20 20  p->nrhs;.       
f410: 20 20 20 72 70 2d 3e 63 6f 64 65 20 3d 20 30 3b     rp->code = 0;
f420: 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d 3e 70  .          rp->p
f430: 72 65 63 73 79 6d 20 3d 20 30 3b 0a 20 20 20 20  recsym = 0;.    
f440: 20 20 20 20 20 20 72 70 2d 3e 69 6e 64 65 78 20        rp->index 
f450: 3d 20 70 73 70 2d 3e 67 70 2d 3e 6e 72 75 6c 65  = psp->gp->nrule
f460: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 72 70  ++;.          rp
f470: 2d 3e 6e 65 78 74 6c 68 73 20 3d 20 72 70 2d 3e  ->nextlhs = rp->
f480: 6c 68 73 2d 3e 72 75 6c 65 3b 0a 20 20 20 20 20  lhs->rule;.     
f490: 20 20 20 20 20 72 70 2d 3e 6c 68 73 2d 3e 72 75       rp->lhs->ru
f4a0: 6c 65 20 3d 20 72 70 3b 0a 20 20 20 20 20 20 20  le = rp;.       
f4b0: 20 20 20 72 70 2d 3e 6e 65 78 74 20 3d 20 30 3b     rp->next = 0;
f4c0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
f4d0: 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 3d 3d 30  sp->firstrule==0
f4e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
f4f0: 70 73 70 2d 3e 66 69 72 73 74 72 75 6c 65 20 3d  psp->firstrule =
f500: 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d   psp->lastrule =
f510: 20 72 70 3b 0a 09 20 20 7d 65 6c 73 65 7b 0a 20   rp;..  }else{. 
f520: 20 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e             psp->
f530: 6c 61 73 74 72 75 6c 65 2d 3e 6e 65 78 74 20 3d  lastrule->next =
f540: 20 72 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20   rp;.           
f550: 20 70 73 70 2d 3e 6c 61 73 74 72 75 6c 65 20 3d   psp->lastrule =
f560: 20 72 70 3b 0a 09 20 20 7d 0a 20 20 20 20 20 20   rp;..  }.      
f570: 20 20 20 20 70 73 70 2d 3e 70 72 65 76 72 75 6c      psp->prevrul
f580: 65 20 3d 20 72 70 3b 0a 09 7d 0a 20 20 20 20 20  e = rp;..}.     
f590: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f5a0: 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
f5b0: 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20 20 20  _OR_RULE;.      
f5c0: 7d 65 6c 73 65 20 69 66 28 20 69 73 61 6c 70 68  }else if( isalph
f5d0: 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  a(x[0]) ){.     
f5e0: 20 20 20 69 66 28 20 70 73 70 2d 3e 6e 72 68 73     if( psp->nrhs
f5f0: 3e 3d 4d 41 58 52 48 53 20 29 7b 0a 20 20 20 20  >=MAXRHS ){.    
f600: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
f610: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
f620: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
f630: 20 20 20 20 20 20 20 20 20 20 20 22 54 6f 6f 20             "Too 
f640: 6d 61 6e 79 20 73 79 6d 62 6f 6c 20 6f 6e 20 52  many symbol on R
f650: 48 53 20 6f 72 20 72 75 6c 65 20 62 65 67 69 6e  HS or rule begin
f660: 6e 69 6e 67 20 61 74 20 5c 22 25 73 5c 22 2e 22  ning at \"%s\"."
f670: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 29  ,.            x)
f680: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
f690: 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
f6a0: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
f6b0: 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52  e = RESYNC_AFTER
f6c0: 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a 09 7d 65  _RULE_ERROR;..}e
f6d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
f6e0: 73 70 2d 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68  sp->rhs[psp->nrh
f6f0: 73 5d 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  s] = Symbol_new(
f700: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  x);.          ps
f710: 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72  p->alias[psp->nr
f720: 68 73 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  hs] = 0;.       
f730: 20 20 20 70 73 70 2d 3e 6e 72 68 73 2b 2b 3b 0a     psp->nrhs++;.
f740: 09 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .}.      }else i
f750: 66 28 20 78 5b 30 5d 3d 3d 27 28 27 20 26 26 20  f( x[0]=='(' && 
f760: 70 73 70 2d 3e 6e 72 68 73 3e 30 20 29 7b 0a 20  psp->nrhs>0 ){. 
f770: 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74         psp->stat
f780: 65 20 3d 20 52 48 53 5f 41 4c 49 41 53 5f 31 3b  e = RHS_ALIAS_1;
f790: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f7a0: 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
f7b0: 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
f7c0: 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
f7d0: 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61           "Illega
f7e0: 6c 20 63 68 61 72 61 63 74 65 72 20 6f 6e 20 52  l character on R
f7f0: 48 53 20 6f 66 20 72 75 6c 65 3a 20 5c 22 25 73  HS of rule: \"%s
f800: 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20 20 20  \".",x);.       
f810: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
f820: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
f830: 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
f840: 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
f850: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
f860: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52 48  eak;.    case RH
f870: 53 5f 41 4c 49 41 53 5f 31 3a 0a 20 20 20 20 20  S_ALIAS_1:.     
f880: 20 69 66 28 20 69 73 61 6c 70 68 61 28 78 5b 30   if( isalpha(x[0
f890: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 73  ]) ){.        ps
f8a0: 70 2d 3e 61 6c 69 61 73 5b 70 73 70 2d 3e 6e 72  p->alias[psp->nr
f8b0: 68 73 2d 31 5d 20 3d 20 78 3b 0a 20 20 20 20 20  hs-1] = x;.     
f8c0: 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20     psp->state = 
f8d0: 52 48 53 5f 41 4c 49 41 53 5f 32 3b 0a 20 20 20  RHS_ALIAS_2;.   
f8e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f8f0: 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e    ErrorMsg(psp->
f900: 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f  filename,psp->to
f910: 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20  kenlineno,.     
f920: 20 20 20 20 20 22 5c 22 25 73 5c 22 20 69 73 20       "\"%s\" is 
f930: 6e 6f 74 20 61 20 76 61 6c 69 64 20 61 6c 69 61  not a valid alia
f940: 73 20 66 6f 72 20 74 68 65 20 52 48 53 20 73 79  s for the RHS sy
f950: 6d 62 6f 6c 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a  mbol \"%s\"\n",.
f960: 20 20 20 20 20 20 20 20 20 20 78 2c 70 73 70 2d            x,psp-
f970: 3e 72 68 73 5b 70 73 70 2d 3e 6e 72 68 73 2d 31  >rhs[psp->nrhs-1
f980: 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ]->name);.      
f990: 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b    psp->errorcnt+
f9a0: 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  +;.        psp->
f9b0: 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41  state = RESYNC_A
f9c0: 46 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b  FTER_RULE_ERROR;
f9d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
f9e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 52  reak;.    case R
f9f0: 48 53 5f 41 4c 49 41 53 5f 32 3a 0a 20 20 20 20  HS_ALIAS_2:.    
fa00: 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 29 27 20    if( x[0]==')' 
fa10: 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
fa20: 73 74 61 74 65 20 3d 20 49 4e 5f 52 48 53 3b 0a  state = IN_RHS;.
fa30: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fa40: 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73       ErrorMsg(ps
fa50: 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d  p->filename,psp-
fa60: 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20  >tokenlineno,.  
fa70: 20 20 20 20 20 20 20 20 22 4d 69 73 73 69 6e 67          "Missing
fa80: 20 5c 22 29 5c 22 20 66 6f 6c 6c 6f 77 69 6e 67   \")\" following
fa90: 20 4c 48 53 20 61 6c 69 61 73 20 6e 61 6d 65 20   LHS alias name 
faa0: 5c 22 25 73 5c 22 2e 22 2c 70 73 70 2d 3e 6c 68  \"%s\".",psp->lh
fab0: 73 61 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20  salias);.       
fac0: 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b   psp->errorcnt++
fad0: 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73  ;.        psp->s
fae0: 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46  tate = RESYNC_AF
faf0: 54 45 52 5f 52 55 4c 45 5f 45 52 52 4f 52 3b 0a  TER_RULE_ERROR;.
fb00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
fb10: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 57 41  eak;.    case WA
fb20: 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 4b  ITING_FOR_DECL_K
fb30: 45 59 57 4f 52 44 3a 0a 20 20 20 20 20 20 69 66  EYWORD:.      if
fb40: 28 20 69 73 61 6c 70 68 61 28 78 5b 30 5d 29 20  ( isalpha(x[0]) 
fb50: 29 7b 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e  ){.        psp->
fb60: 64 65 63 6c 6b 65 79 77 6f 72 64 20 3d 20 78 3b  declkeyword = x;
fb70: 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65  .        psp->de
fb80: 63 6c 61 72 67 73 6c 6f 74 20 3d 20 30 3b 0a 20  clargslot = 0;. 
fb90: 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
fba0: 6c 6e 73 6c 6f 74 20 3d 20 30 3b 0a 20 20 20 20  lnslot = 0;.    
fbb0: 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
fbc0: 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43   WAITING_FOR_DEC
fbd0: 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 20 20 69  L_ARG;.        i
fbe0: 66 28 20 73 74 72 63 6d 70 28 78 2c 22 6e 61 6d  f( strcmp(x,"nam
fbf0: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
fc00: 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
fc10: 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
fc20: 2d 3e 6e 61 6d 65 29 3b 0a 09 7d 65 6c 73 65 20  ->name);..}else 
fc30: 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 69 6e  if( strcmp(x,"in
fc40: 63 6c 75 64 65 22 29 3d 3d 30 20 29 7b 0a 20 20  clude")==0 ){.  
fc50: 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
fc60: 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73 70  largslot = &(psp
fc70: 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64 65 29 3b 0a  ->gp->include);.
fc80: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
fc90: 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70  ecllnslot = &psp
fca0: 2d 3e 67 70 2d 3e 69 6e 63 6c 75 64 65 6c 6e 3b  ->gp->includeln;
fcb0: 0a 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63  ..}else if( strc
fcc0: 6d 70 28 78 2c 22 63 6f 64 65 22 29 3d 3d 30 20  mp(x,"code")==0 
fcd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
fce0: 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20  ->declargslot = 
fcf0: 26 28 70 73 70 2d 3e 67 70 2d 3e 65 78 74 72 61  &(psp->gp->extra
fd00: 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 20 20 20  code);.         
fd10: 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74   psp->decllnslot
fd20: 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 65 78 74   = &psp->gp->ext
fd30: 72 61 63 6f 64 65 6c 6e 3b 0a 09 7d 65 6c 73 65  racodeln;..}else
fd40: 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74   if( strcmp(x,"t
fd50: 6f 6b 65 6e 5f 64 65 73 74 72 75 63 74 6f 72 22  oken_destructor"
fd60: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
fd70: 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
fd80: 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74  ot = &psp->gp->t
fd90: 6f 6b 65 6e 64 65 73 74 3b 0a 20 20 20 20 20 20  okendest;.      
fda0: 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73      psp->decllns
fdb0: 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e  lot = &psp->gp->
fdc0: 74 6f 6b 65 6e 64 65 73 74 6c 6e 3b 0a 09 7d 65  tokendestln;..}e
fdd0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
fde0: 2c 22 64 65 66 61 75 6c 74 5f 64 65 73 74 72 75  ,"default_destru
fdf0: 63 74 6f 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ctor")==0 ){.   
fe00: 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
fe10: 61 72 67 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e  argslot = &psp->
fe20: 67 70 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20  gp->vardest;.   
fe30: 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
fe40: 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67  lnslot = &psp->g
fe50: 70 2d 3e 76 61 72 64 65 73 74 6c 6e 3b 0a 09 7d  p->vardestln;..}
fe60: 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
fe70: 78 2c 22 74 6f 6b 65 6e 5f 70 72 65 66 69 78 22  x,"token_prefix"
fe80: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
fe90: 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c    psp->declargsl
fea0: 6f 74 20 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 74  ot = &psp->gp->t
feb0: 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 09 7d 65 6c  okenprefix;..}el
fec0: 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c  se if( strcmp(x,
fed0: 22 73 79 6e 74 61 78 5f 65 72 72 6f 72 22 29 3d  "syntax_error")=
fee0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
fef0: 70 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74  psp->declargslot
ff00: 20 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 65 72   = &(psp->gp->er
ff10: 72 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ror);.          
ff20: 70 73 70 2d 3e 64 65 63 6c 6c 6e 73 6c 6f 74 20  psp->decllnslot 
ff30: 3d 20 26 70 73 70 2d 3e 67 70 2d 3e 65 72 72 6f  = &psp->gp->erro
ff40: 72 6c 6e 3b 0a 09 7d 65 6c 73 65 20 69 66 28 20  rln;..}else if( 
ff50: 73 74 72 63 6d 70 28 78 2c 22 70 61 72 73 65 5f  strcmp(x,"parse_
ff60: 61 63 63 65 70 74 22 29 3d 3d 30 20 29 7b 0a 20  accept")==0 ){. 
ff70: 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
ff80: 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
ff90: 70 2d 3e 67 70 2d 3e 61 63 63 65 70 74 29 3b 0a  p->gp->accept);.
ffa0: 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
ffb0: 65 63 6c 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70  ecllnslot = &psp
ffc0: 2d 3e 67 70 2d 3e 61 63 63 65 70 74 6c 6e 3b 0a  ->gp->acceptln;.
ffd0: 09 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d  .}else if( strcm
ffe0: 70 28 78 2c 22 70 61 72 73 65 5f 66 61 69 6c 75  p(x,"parse_failu
fff0: 72 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  re")==0 ){.     
10000 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72       psp->declar
10010 67 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67  gslot = &(psp->g
10020 70 2d 3e 66 61 69 6c 75 72 65 29 3b 0a 20 20 20  p->failure);.   
10030 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
10040 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67  lnslot = &psp->g
10050 70 2d 3e 66 61 69 6c 75 72 65 6c 6e 3b 0a 09 7d  p->failureln;..}
10060 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
10070 78 2c 22 73 74 61 63 6b 5f 6f 76 65 72 66 6c 6f  x,"stack_overflo
10080 77 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  w")==0 ){.      
10090 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
100a0 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
100b0 2d 3e 6f 76 65 72 66 6c 6f 77 29 3b 0a 20 20 20  ->overflow);.   
100c0 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63 6c         psp->decl
100d0 6c 6e 73 6c 6f 74 20 3d 20 26 70 73 70 2d 3e 67  lnslot = &psp->g
100e0 70 2d 3e 6f 76 65 72 66 6c 6f 77 6c 6e 3b 0a 20  p->overflowln;. 
100f0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
10100 20 73 74 72 63 6d 70 28 78 2c 22 65 78 74 72 61   strcmp(x,"extra
10110 5f 61 72 67 75 6d 65 6e 74 22 29 3d 3d 30 20 29  _argument")==0 )
10120 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
10130 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26  >declargslot = &
10140 28 70 73 70 2d 3e 67 70 2d 3e 61 72 67 29 3b 0a  (psp->gp->arg);.
10150 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
10160 28 20 73 74 72 63 6d 70 28 78 2c 22 74 6f 6b 65  ( strcmp(x,"toke
10170 6e 5f 74 79 70 65 22 29 3d 3d 30 20 29 7b 0a 20  n_type")==0 ){. 
10180 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65           psp->de
10190 63 6c 61 72 67 73 6c 6f 74 20 3d 20 26 28 70 73  clargslot = &(ps
101a0 70 2d 3e 67 70 2d 3e 74 6f 6b 65 6e 74 79 70 65  p->gp->tokentype
101b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
101c0 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64   if( strcmp(x,"d
101d0 65 66 61 75 6c 74 5f 74 79 70 65 22 29 3d 3d 30  efault_type")==0
101e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73   ){.          ps
101f0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20 3d  p->declargslot =
10200 20 26 28 70 73 70 2d 3e 67 70 2d 3e 76 61 72 74   &(psp->gp->vart
10210 79 70 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  ype);.        }e
10220 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 78  lse if( strcmp(x
10230 2c 22 73 74 61 63 6b 5f 73 69 7a 65 22 29 3d 3d  ,"stack_size")==
10240 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
10250 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
10260 3d 20 26 28 70 73 70 2d 3e 67 70 2d 3e 73 74 61  = &(psp->gp->sta
10270 63 6b 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  cksize);.       
10280 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
10290 70 28 78 2c 22 73 74 61 72 74 5f 73 79 6d 62 6f  p(x,"start_symbo
102a0 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  l")==0 ){.      
102b0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 61 72 67      psp->declarg
102c0 73 6c 6f 74 20 3d 20 26 28 70 73 70 2d 3e 67 70  slot = &(psp->gp
102d0 2d 3e 73 74 61 72 74 29 3b 0a 20 20 20 20 20 20  ->start);.      
102e0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
102f0 6d 70 28 78 2c 22 6c 65 66 74 22 29 3d 3d 30 20  mp(x,"left")==0 
10300 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  ){.          psp
10310 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b  ->preccounter++;
10320 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e  .          psp->
10330 64 65 63 6c 61 73 73 6f 63 20 3d 20 4c 45 46 54  declassoc = LEFT
10340 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
10350 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
10360 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f  _FOR_PRECEDENCE_
10370 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20  SYMBOL;.        
10380 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10390 28 78 2c 22 72 69 67 68 74 22 29 3d 3d 30 20 29  (x,"right")==0 )
103a0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
103b0 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b 2b 3b 0a  >preccounter++;.
103c0 20 20 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64            psp->d
103d0 65 63 6c 61 73 73 6f 63 20 3d 20 52 49 47 48 54  eclassoc = RIGHT
103e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  ;.          psp-
103f0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
10400 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f  _FOR_PRECEDENCE_
10410 53 59 4d 42 4f 4c 3b 0a 20 20 20 20 20 20 20 20  SYMBOL;.        
10420 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
10430 28 78 2c 22 6e 6f 6e 61 73 73 6f 63 22 29 3d 3d  (x,"nonassoc")==
10440 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
10450 73 70 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 2b  sp->preccounter+
10460 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  +;.          psp
10470 2d 3e 64 65 63 6c 61 73 73 6f 63 20 3d 20 4e 4f  ->declassoc = NO
10480 4e 45 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73  NE;.          ps
10490 70 2d 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49  p->state = WAITI
104a0 4e 47 5f 46 4f 52 5f 50 52 45 43 45 44 45 4e 43  NG_FOR_PRECEDENC
104b0 45 5f 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73 65  E_SYMBOL;..}else
104c0 20 69 66 28 20 73 74 72 63 6d 70 28 78 2c 22 64   if( strcmp(x,"d
104d0 65 73 74 72 75 63 74 6f 72 22 29 3d 3d 30 20 29  estructor")==0 )
104e0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
104f0 3e 73 74 61 74 65 20 3d 20 57 41 49 54 49 4e 47  >state = WAITING
10500 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f  _FOR_DESTRUCTOR_
10510 53 59 4d 42 4f 4c 3b 0a 09 7d 65 6c 73 65 20 69  SYMBOL;..}else i
10520 66 28 20 73 74 72 63 6d 70 28 78 2c 22 74 79 70  f( strcmp(x,"typ
10530 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
10540 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d      psp->state =
10550 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41 54   WAITING_FOR_DAT
10560 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3b 0a 20 20  ATYPE_SYMBOL;.  
10570 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10580 73 74 72 63 6d 70 28 78 2c 22 66 61 6c 6c 62 61  strcmp(x,"fallba
10590 63 6b 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ck")==0 ){.     
105a0 20 20 20 20 20 70 73 70 2d 3e 66 61 6c 6c 62 61       psp->fallba
105b0 63 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ck = 0;.        
105c0 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57    psp->state = W
105d0 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c 42  AITING_FOR_FALLB
105e0 41 43 4b 5f 49 44 3b 0a 20 20 20 20 20 20 20 20  ACK_ID;.        
105f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
10600 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66   ErrorMsg(psp->f
10610 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b  ilename,psp->tok
10620 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20  enlineno,.      
10630 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20 64        "Unknown d
10640 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65 79 77 6f  eclaration keywo
10650 72 64 3a 20 5c 22 25 25 25 73 5c 22 2e 22 2c 78  rd: \"%%%s\".",x
10660 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70  );.          psp
10670 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20  ->errorcnt++;.  
10680 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
10690 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54 45  te = RESYNC_AFTE
106a0 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  R_DECL_ERROR;..}
106b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
106c0 20 20 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70        ErrorMsg(p
106d0 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70  sp->filename,psp
106e0 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20  ->tokenlineno,. 
106f0 20 20 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61           "Illega
10700 6c 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 6b 65  l declaration ke
10710 79 77 6f 72 64 3a 20 5c 22 25 73 5c 22 2e 22 2c  yword: \"%s\".",
10720 78 29 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  x);.        psp-
10730 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20  >errorcnt++;.   
10740 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10750 3d 20 52 45 53 59 4e 43 5f 41 46 54 45 52 5f 44  = RESYNC_AFTER_D
10760 45 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ECL_ERROR;.     
10770 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
10780 20 20 20 20 63 61 73 65 20 57 41 49 54 49 4e 47      case WAITING
10790 5f 46 4f 52 5f 44 45 53 54 52 55 43 54 4f 52 5f  _FOR_DESTRUCTOR_
107a0 53 59 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66  SYMBOL:.      if
107b0 28 20 21 69 73 61 6c 70 68 61 28 78 5b 30 5d 29  ( !isalpha(x[0])
107c0 20 29 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f   ){.        Erro
107d0 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
107e0 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e  me,psp->tokenlin
107f0 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22  eno,.          "
10800 53 79 6d 62 6f 6c 20 6e 61 6d 65 20 6d 69 73 73  Symbol name miss
10810 69 6e 67 20 61 66 74 65 72 20 25 64 65 73 74 72  ing after %destr
10820 75 63 74 6f 72 20 6b 65 79 77 6f 72 64 22 29 3b  uctor keyword");
10830 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
10840 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
10850 20 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52    psp->state = R
10860 45 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c  ESYNC_AFTER_DECL
10870 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65  _ERROR;.      }e
10880 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72  lse{.        str
10890 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d  uct symbol *sp =
108a0 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29 3b 0a   Symbol_new(x);.
108b0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65 63          psp->dec
108c0 6c 61 72 67 73 6c 6f 74 20 3d 20 26 73 70 2d 3e  largslot = &sp->
108d0 64 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 20 20  destructor;.    
108e0 20 20 20 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73      psp->decllns
108f0 6c 6f 74 20 3d 20 26 73 70 2d 3e 64 65 73 74 72  lot = &sp->destr
10900 75 63 74 6f 72 6c 6e 3b 0a 20 20 20 20 20 20 20  uctorln;.       
10910 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 57 41   psp->state = WA
10920 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c 5f 41  ITING_FOR_DECL_A
10930 52 47 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  RG;.      }.    
10940 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
10950 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 41  e WAITING_FOR_DA
10960 54 41 54 59 50 45 5f 53 59 4d 42 4f 4c 3a 0a 20  TATYPE_SYMBOL:. 
10970 20 20 20 20 20 69 66 28 20 21 69 73 61 6c 70 68       if( !isalph
10980 61 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  a(x[0]) ){.     
10990 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70 2d     ErrorMsg(psp-
109a0 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74  >filename,psp->t
109b0 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20  okenlineno,.    
109c0 20 20 20 20 20 20 22 53 79 6d 62 6f 6c 20 6e 61        "Symbol na
109d0 6d 65 20 6d 69 73 73 69 6e 67 20 61 66 74 65 72  me missing after
109e0 20 25 64 65 73 74 72 75 63 74 6f 72 20 6b 65 79   %destructor key
109f0 77 6f 72 64 22 29 3b 0a 20 20 20 20 20 20 20 20  word");.        
10a00 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  psp->errorcnt++;
10a10 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74  .        psp->st
10a20 61 74 65 20 3d 20 52 45 53 59 4e 43 5f 41 46 54  ate = RESYNC_AFT
10a30 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3b 0a 20  ER_DECL_ERROR;. 
10a40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10a50 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f      struct symbo
10a60 6c 20 2a 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e  l *sp = Symbol_n
10a70 65 77 28 78 29 3b 0a 20 20 20 20 20 20 20 20 70  ew(x);.        p
10a80 73 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 20  sp->declargslot 
10a90 3d 20 26 73 70 2d 3e 64 61 74 61 74 79 70 65 3b  = &sp->datatype;
10aa0 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 64 65  .        psp->de
10ab0 63 6c 6c 6e 73 6c 6f 74 20 3d 20 30 3b 0a 20 20  cllnslot = 0;.  
10ac0 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65        psp->state
10ad0 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
10ae0 45 43 4c 5f 41 52 47 3b 0a 20 20 20 20 20 20 7d  ECL_ARG;.      }
10af0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10b00 20 20 63 61 73 65 20 57 41 49 54 49 4e 47 5f 46    case WAITING_F
10b10 4f 52 5f 50 52 45 43 45 44 45 4e 43 45 5f 53 59  OR_PRECEDENCE_SY
10b20 4d 42 4f 4c 3a 0a 20 20 20 20 20 20 69 66 28 20  MBOL:.      if( 
10b30 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20  x[0]=='.' ){.   
10b40 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10b50 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
10b60 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20 20  CL_OR_RULE;.    
10b70 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 75 70    }else if( isup
10b80 70 65 72 28 78 5b 30 5d 29 20 29 7b 0a 20 20 20  per(x[0]) ){.   
10b90 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d 62       struct symb
10ba0 6f 6c 20 2a 73 70 3b 0a 20 20 20 20 20 20 20 20  ol *sp;.        
10bb0 73 70 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28  sp = Symbol_new(
10bc0 78 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  x);.        if( 
10bd0 73 70 2d 3e 70 72 65 63 3e 3d 30 20 29 7b 0a 20  sp->prec>=0 ){. 
10be0 20 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73           ErrorMs
10bf0 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
10c00 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f  psp->tokenlineno
10c10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 53  ,.            "S
10c20 79 6d 62 6f 6c 20 5c 22 25 73 5c 22 20 68 61 73  ymbol \"%s\" has
10c30 20 61 6c 72 65 61 64 79 20 62 65 20 67 69 76 65   already be give
10c40 6e 20 61 20 70 72 65 63 65 64 65 6e 63 65 2e 22  n a precedence."
10c50 2c 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ,x);.          p
10c60 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
10c70 09 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20  .}else{.        
10c80 20 20 73 70 2d 3e 70 72 65 63 20 3d 20 70 73 70    sp->prec = psp
10c90 2d 3e 70 72 65 63 63 6f 75 6e 74 65 72 3b 0a 20  ->preccounter;. 
10ca0 20 20 20 20 20 20 20 20 20 73 70 2d 3e 61 73 73           sp->ass
10cb0 6f 63 20 3d 20 70 73 70 2d 3e 64 65 63 6c 61 73  oc = psp->declas
10cc0 73 6f 63 3b 0a 09 7d 0a 20 20 20 20 20 20 7d 65  soc;..}.      }e
10cd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45 72 72  lse{.        Err
10ce0 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e  orMsg(psp->filen
10cf0 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  ame,psp->tokenli
10d00 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
10d10 22 43 61 6e 27 74 20 61 73 73 69 67 6e 20 61 20  "Can't assign a 
10d20 70 72 65 63 65 64 65 6e 63 65 20 74 6f 20 5c 22  precedence to \"
10d30 25 73 5c 22 2e 22 2c 78 29 3b 0a 20 20 20 20 20  %s\".",x);.     
10d40 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
10d50 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
10d60 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
10d70 65 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  e WAITING_FOR_DE
10d80 43 4c 5f 41 52 47 3a 0a 20 20 20 20 20 20 69 66  CL_ARG:.      if
10d90 28 20 28 78 5b 30 5d 3d 3d 27 7b 27 20 7c 7c 20  ( (x[0]=='{' || 
10da0 78 5b 30 5d 3d 3d 27 5c 22 27 20 7c 7c 20 69 73  x[0]=='\"' || is
10db0 61 6c 6e 75 6d 28 78 5b 30 5d 29 29 20 29 7b 0a  alnum(x[0])) ){.
10dc0 20 20 20 20 20 20 20 20 69 66 28 20 2a 28 70 73          if( *(ps
10dd0 70 2d 3e 64 65 63 6c 61 72 67 73 6c 6f 74 29 21  p->declargslot)!
10de0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
10df0 45 72 72 6f 72 4d 73 67 28 70 73 70 2d 3e 66 69  ErrorMsg(psp->fi
10e00 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e 74 6f 6b 65  lename,psp->toke
10e10 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20  nlineno,.       
10e20 20 20 20 20 20 22 54 68 65 20 61 72 67 75 6d 65       "The argume
10e30 6e 74 20 5c 22 25 73 5c 22 20 74 6f 20 64 65 63  nt \"%s\" to dec
10e40 6c 61 72 61 74 69 6f 6e 20 5c 22 25 25 25 73 5c  laration \"%%%s\
10e50 22 20 69 73 20 6e 6f 74 20 74 68 65 20 66 69 72  " is not the fir
10e60 73 74 2e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  st.",.          
10e70 20 20 78 5b 30 5d 3d 3d 27 5c 22 27 20 3f 20 26    x[0]=='\"' ? &
10e80 78 5b 31 5d 20 3a 20 78 2c 70 73 70 2d 3e 64 65  x[1] : x,psp->de
10e90 63 6c 6b 65 79 77 6f 72 64 29 3b 0a 20 20 20 20  clkeyword);.    
10ea0 20 20 20 20 20 20 70 73 70 2d 3e 65 72 72 6f 72        psp->error
10eb0 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
10ec0 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20 52 45   psp->state = RE
10ed0 53 59 4e 43 5f 41 46 54 45 52 5f 44 45 43 4c 5f  SYNC_AFTER_DECL_
10ee0 45 52 52 4f 52 3b 0a 09 7d 65 6c 73 65 7b 0a 20  ERROR;..}else{. 
10ef0 20 20 20 20 20 20 20 20 20 2a 28 70 73 70 2d 3e           *(psp->
10f00 64 65 63 6c 61 72 67 73 6c 6f 74 29 20 3d 20 28  declargslot) = (
10f10 78 5b 30 5d 3d 3d 27 5c 22 27 20 7c 7c 20 78 5b  x[0]=='\"' || x[
10f20 30 5d 3d 3d 27 7b 27 29 20 3f 20 26 78 5b 31 5d  0]=='{') ? &x[1]
10f30 20 3a 20 78 3b 0a 20 20 20 20 20 20 20 20 20 20   : x;.          
10f40 69 66 28 20 70 73 70 2d 3e 64 65 63 6c 6c 6e 73  if( psp->decllns
10f50 6c 6f 74 20 29 20 2a 70 73 70 2d 3e 64 65 63 6c  lot ) *psp->decl
10f60 6c 6e 73 6c 6f 74 20 3d 20 70 73 70 2d 3e 74 6f  lnslot = psp->to
10f70 6b 65 6e 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 20  kenlineno;.     
10f80 20 20 20 20 20 70 73 70 2d 3e 73 74 61 74 65 20       psp->state 
10f90 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
10fa0 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 09 7d 0a 20  CL_OR_RULE;..}. 
10fb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
10fc0 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 70      ErrorMsg(psp
10fd0 2d 3e 66 69 6c 65 6e 61 6d 65 2c 70 73 70 2d 3e  ->filename,psp->
10fe0 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 20 20 20  tokenlineno,.   
10ff0 20 20 20 20 20 20 20 22 49 6c 6c 65 67 61 6c 20         "Illegal 
11000 61 72 67 75 6d 65 6e 74 20 74 6f 20 25 25 25 73  argument to %%%s
11010 3a 20 25 73 22 2c 70 73 70 2d 3e 64 65 63 6c 6b  : %s",psp->declk
11020 65 79 77 6f 72 64 2c 78 29 3b 0a 20 20 20 20 20  eyword,x);.     
11030 20 20 20 70 73 70 2d 3e 65 72 72 6f 72 63 6e 74     psp->errorcnt
11040 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 73 70 2d  ++;.        psp-
11050 3e 73 74 61 74 65 20 3d 20 52 45 53 59 4e 43 5f  >state = RESYNC_
11060 41 46 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52  AFTER_DECL_ERROR
11070 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11080 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
11090 57 41 49 54 49 4e 47 5f 46 4f 52 5f 46 41 4c 4c  WAITING_FOR_FALL
110a0 42 41 43 4b 5f 49 44 3a 0a 20 20 20 20 20 20 69  BACK_ID:.      i
110b0 66 28 20 78 5b 30 5d 3d 3d 27 2e 27 20 29 7b 0a  f( x[0]=='.' ){.
110c0 20 20 20 20 20 20 20 20 70 73 70 2d 3e 73 74 61          psp->sta
110d0 74 65 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52  te = WAITING_FOR
110e0 5f 44 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20  _DECL_OR_RULE;. 
110f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
11100 69 73 75 70 70 65 72 28 78 5b 30 5d 29 20 29 7b  isupper(x[0]) ){
11110 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d 73  .        ErrorMs
11120 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  g(psp->filename,
11130 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69 6e 65 6e   psp->tokenlinen
11140 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 22 25 25  o,.          "%%
11150 66 61 6c 6c 62 61 63 6b 20 61 72 67 75 6d 65 6e  fallback argumen
11160 74 20 5c 22 25 73 5c 22 20 73 68 6f 75 6c 64 20  t \"%s\" should 
11170 62 65 20 61 20 74 6f 6b 65 6e 22 2c 20 78 29 3b  be a token", x);
11180 0a 20 20 20 20 20 20 20 20 70 73 70 2d 3e 65 72  .        psp->er
11190 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  rorcnt++;.      
111a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
111b0 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a 73 70  truct symbol *sp
111c0 20 3d 20 53 79 6d 62 6f 6c 5f 6e 65 77 28 78 29   = Symbol_new(x)
111d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 73  ;.        if( ps
111e0 70 2d 3e 66 61 6c 6c 62 61 63 6b 3d 3d 30 20 29  p->fallback==0 )
111f0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 73 70 2d  {.          psp-
11200 3e 66 61 6c 6c 62 61 63 6b 20 3d 20 73 70 3b 0a  >fallback = sp;.
11210 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
11220 28 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20 29  ( sp->fallback )
11230 7b 0a 20 20 20 20 20 20 20 20 20 20 45 72 72 6f  {.          Erro
11240 72 4d 73 67 28 70 73 70 2d 3e 66 69 6c 65 6e 61  rMsg(psp->filena
11250 6d 65 2c 20 70 73 70 2d 3e 74 6f 6b 65 6e 6c 69  me, psp->tokenli
11260 6e 65 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  neno,.          
11270 20 20 22 4d 6f 72 65 20 74 68 61 6e 20 6f 6e 65    "More than one
11280 20 66 61 6c 6c 62 61 63 6b 20 61 73 73 69 67 6e   fallback assign
11290 65 64 20 74 6f 20 74 6f 6b 65 6e 20 25 73 22 2c  ed to token %s",
112a0 20 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   x);.          p
112b0 73 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  sp->errorcnt++;.
112c0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
112d0 20 20 20 20 20 20 20 20 20 73 70 2d 3e 66 61 6c           sp->fal
112e0 6c 62 61 63 6b 20 3d 20 70 73 70 2d 3e 66 61 6c  lback = psp->fal
112f0 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 20  lback;.         
11300 20 70 73 70 2d 3e 67 70 2d 3e 68 61 73 5f 66 61   psp->gp->has_fa
11310 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20  llback = 1;.    
11320 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11330 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
11340 61 73 65 20 52 45 53 59 4e 43 5f 41 46 54 45 52  ase RESYNC_AFTER
11350 5f 52 55 4c 45 5f 45 52 52 4f 52 3a 0a 2f 2a 20  _RULE_ERROR:./* 
11360 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27       if( x[0]=='
11370 2e 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20  .' ) psp->state 
11380 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45  = WAITING_FOR_DE
11390 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 2a 2a 20 20  CL_OR_RULE;.**  
113a0 20 20 20 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20      break; */.  
113b0 20 20 63 61 73 65 20 52 45 53 59 4e 43 5f 41 46    case RESYNC_AF
113c0 54 45 52 5f 44 45 43 4c 5f 45 52 52 4f 52 3a 0a  TER_DECL_ERROR:.
113d0 20 20 20 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d        if( x[0]==
113e0 27 2e 27 20 29 20 70 73 70 2d 3e 73 74 61 74 65  '.' ) psp->state
113f0 20 3d 20 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44   = WAITING_FOR_D
11400 45 43 4c 5f 4f 52 5f 52 55 4c 45 3b 0a 20 20 20  ECL_OR_RULE;.   
11410 20 20 20 69 66 28 20 78 5b 30 5d 3d 3d 27 25 27     if( x[0]=='%'
11420 20 29 20 70 73 70 2d 3e 73 74 61 74 65 20 3d 20   ) psp->state = 
11430 57 41 49 54 49 4e 47 5f 46 4f 52 5f 44 45 43 4c  WAITING_FOR_DECL
11440 5f 4b 45 59 57 4f 52 44 3b 0a 20 20 20 20 20 20  _KEYWORD;.      
11450 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  break;.  }.}../*
11460 20 49 6e 20 73 70 69 74 65 20 6f 66 20 69 74 73   In spite of its
11470 20 6e 61 6d 65 2c 20 74 68 69 73 20 66 75 6e 63   name, this func
11480 74 69 6f 6e 20 69 73 20 72 65 61 6c 6c 79 20 61  tion is really a
11490 20 73 63 61 6e 6e 65 72 2e 20 20 49 74 20 72 65   scanner.  It re
114a0 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 65 6e 74  ad.** in the ent
114b0 69 72 65 20 69 6e 70 75 74 20 66 69 6c 65 20 28  ire input file (
114c0 61 6c 6c 20 61 74 20 6f 6e 63 65 29 20 74 68 65  all at once) the
114d0 6e 20 74 6f 6b 65 6e 69 7a 65 73 20 69 74 2e 20  n tokenizes it. 
114e0 20 45 61 63 68 0a 2a 2a 20 74 6f 6b 65 6e 20 69   Each.** token i
114f0 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
11500 66 75 6e 63 74 69 6f 6e 20 22 70 61 72 73 65 6f  function "parseo
11510 6e 65 74 6f 6b 65 6e 22 20 77 68 69 63 68 20 62  netoken" which b
11520 75 69 6c 64 73 20 61 6c 6c 0a 2a 2a 20 74 68 65  uilds all.** the
11530 20 61 70 70 72 6f 70 72 69 61 74 65 20 64 61 74   appropriate dat
11540 61 20 73 74 72 75 63 74 75 72 65 73 20 69 6e 20  a structures in 
11550 74 68 65 20 67 6c 6f 62 61 6c 20 73 74 61 74 65  the global state
11560 20 76 65 63 74 6f 72 20 22 67 70 22 2e 0a 2a 2f   vector "gp"..*/
11570 0a 76 6f 69 64 20 50 61 72 73 65 28 67 70 29 0a  .void Parse(gp).
11580 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 67 70  struct lemon *gp
11590 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 73 74  ;.{.  struct pst
115a0 61 74 65 20 70 73 3b 0a 20 20 46 49 4c 45 20 2a  ate ps;.  FILE *
115b0 66 70 3b 0a 20 20 63 68 61 72 20 2a 66 69 6c 65  fp;.  char *file
115c0 62 75 66 3b 0a 20 20 69 6e 74 20 66 69 6c 65 73  buf;.  int files
115d0 69 7a 65 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e  ize;.  int linen
115e0 6f 3b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 63 68  o;.  int c;.  ch
115f0 61 72 20 2a 63 70 2c 20 2a 6e 65 78 74 63 70 3b  ar *cp, *nextcp;
11600 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69 6e 65  .  int startline
11610 20 3d 20 30 3b 0a 0a 20 20 70 73 2e 67 70 20 3d   = 0;..  ps.gp =
11620 20 67 70 3b 0a 20 20 70 73 2e 66 69 6c 65 6e 61   gp;.  ps.filena
11630 6d 65 20 3d 20 67 70 2d 3e 66 69 6c 65 6e 61 6d  me = gp->filenam
11640 65 3b 0a 20 20 70 73 2e 65 72 72 6f 72 63 6e 74  e;.  ps.errorcnt
11650 20 3d 20 30 3b 0a 20 20 70 73 2e 73 74 61 74 65   = 0;.  ps.state
11660 20 3d 20 49 4e 49 54 49 41 4c 49 5a 45 3b 0a 0a   = INITIALIZE;..
11670 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 65    /* Begin by re
11680 61 64 69 6e 67 20 74 68 65 20 69 6e 70 75 74 20  ading the input 
11690 66 69 6c 65 20 2a 2f 0a 20 20 66 70 20 3d 20 66  file */.  fp = f
116a0 6f 70 65 6e 28 70 73 2e 66 69 6c 65 6e 61 6d 65  open(ps.filename
116b0 2c 22 72 62 22 29 3b 0a 20 20 69 66 28 20 66 70  ,"rb");.  if( fp
116c0 3d 3d 30 20 29 7b 0a 20 20 20 20 45 72 72 6f 72  ==0 ){.    Error
116d0 4d 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c  Msg(ps.filename,
116e0 30 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68  0,"Can't open th
116f0 69 73 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  is file for read
11700 69 6e 67 2e 22 29 3b 0a 20 20 20 20 67 70 2d 3e  ing.");.    gp->
11710 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20  errorcnt++;.    
11720 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 73  return;.  }.  fs
11730 65 65 6b 28 66 70 2c 30 2c 32 29 3b 0a 20 20 66  eek(fp,0,2);.  f
11740 69 6c 65 73 69 7a 65 20 3d 20 66 74 65 6c 6c 28  ilesize = ftell(
11750 66 70 29 3b 0a 20 20 72 65 77 69 6e 64 28 66 70  fp);.  rewind(fp
11760 29 3b 0a 20 20 66 69 6c 65 62 75 66 20 3d 20 28  );.  filebuf = (
11770 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 66  char *)malloc( f
11780 69 6c 65 73 69 7a 65 2b 31 20 29 3b 0a 20 20 69  ilesize+1 );.  i
11790 66 28 20 66 69 6c 65 62 75 66 3d 3d 30 20 29 7b  f( filebuf==0 ){
117a0 0a 20 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73  .    ErrorMsg(ps
117b0 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c 22 43 61 6e  .filename,0,"Can
117c0 27 74 20 61 6c 6c 6f 63 61 74 65 20 25 64 20 6f  't allocate %d o
117d0 66 20 6d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64  f memory to hold
117e0 20 74 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20   this file.",.  
117f0 20 20 20 20 66 69 6c 65 73 69 7a 65 2b 31 29 3b      filesize+1);
11800 0a 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e  .    gp->errorcn
11810 74 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  t++;.    return;
11820 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 61 64  .  }.  if( fread
11830 28 66 69 6c 65 62 75 66 2c 31 2c 66 69 6c 65 73  (filebuf,1,files
11840 69 7a 65 2c 66 70 29 21 3d 66 69 6c 65 73 69 7a  ize,fp)!=filesiz
11850 65 20 29 7b 0a 20 20 20 20 45 72 72 6f 72 4d 73  e ){.    ErrorMs
11860 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 30 2c  g(ps.filename,0,
11870 22 43 61 6e 27 74 20 72 65 61 64 20 69 6e 20 61  "Can't read in a
11880 6c 6c 20 25 64 20 62 79 74 65 73 20 6f 66 20 74  ll %d bytes of t
11890 68 69 73 20 66 69 6c 65 2e 22 2c 0a 20 20 20 20  his file.",.    
118a0 20 20 66 69 6c 65 73 69 7a 65 29 3b 0a 20 20 20    filesize);.   
118b0 20 66 72 65 65 28 66 69 6c 65 62 75 66 29 3b 0a   free(filebuf);.
118c0 20 20 20 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74      gp->errorcnt
118d0 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ++;.    return;.
118e0 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 70 29    }.  fclose(fp)
118f0 3b 0a 20 20 66 69 6c 65 62 75 66 5b 66 69 6c 65  ;.  filebuf[file
11900 73 69 7a 65 5d 20 3d 20 30 3b 0a 0a 20 20 2f 2a  size] = 0;..  /*
11910 20 4e 6f 77 20 73 63 61 6e 20 74 68 65 20 74 65   Now scan the te
11920 78 74 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  xt of the input 
11930 66 69 6c 65 20 2a 2f 0a 20 20 6c 69 6e 65 6e 6f  file */.  lineno
11940 20 3d 20 31 3b 0a 20 20 66 6f 72 28 63 70 3d 66   = 1;.  for(cp=f
11950 69 6c 65 62 75 66 3b 20 28 63 3d 20 2a 63 70 29  ilebuf; (c= *cp)
11960 21 3d 30 3b 20 29 7b 0a 20 20 20 20 69 66 28 20  !=0; ){.    if( 
11970 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f  c=='\n' ) lineno
11980 2b 2b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ++;             
11990 20 2f 2a 20 4b 65 65 70 20 74 72 61 63 6b 20 6f   /* Keep track o
119a0 66 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65  f the line numbe
119b0 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 73  r */.    if( iss
119c0 70 61 63 65 28 63 29 20 29 7b 20 63 70 2b 2b 3b  pace(c) ){ cp++;
119d0 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 20 20 2f 2a   continue; }  /*
119e0 20 53 6b 69 70 20 61 6c 6c 20 77 68 69 74 65 20   Skip all white 
119f0 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 69 66 28  space */.    if(
11a00 20 63 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d   c=='/' && cp[1]
11a10 3d 3d 27 2f 27 20 29 7b 20 20 20 20 20 20 20 20  =='/' ){        
11a20 20 20 2f 2a 20 53 6b 69 70 20 43 2b 2b 20 73 74    /* Skip C++ st
11a30 79 6c 65 20 63 6f 6d 6d 65 6e 74 73 20 2a 2f 0a  yle comments */.
11a40 20 20 20 20 20 20 63 70 2b 3d 32 3b 0a 20 20 20        cp+=2;.   
11a50 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63     while( (c= *c
11a60 70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27  p)!=0 && c!='\n'
11a70 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 63   ) cp++;.      c
11a80 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
11a90 20 20 20 69 66 28 20 63 3d 3d 27 2f 27 20 26 26     if( c=='/' &&
11aa0 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29 7b 20 20   cp[1]=='*' ){  
11ab0 20 20 20 20 20 20 20 20 2f 2a 20 53 6b 69 70 20          /* Skip 
11ac0 43 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e 74 73  C style comments
11ad0 20 2a 2f 0a 20 20 20 20 20 20 63 70 2b 3d 32 3b   */.      cp+=2;
11ae0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
11af0 3d 20 2a 63 70 29 21 3d 30 20 26 26 20 28 63 21  = *cp)!=0 && (c!
11b00 3d 27 2f 27 20 7c 7c 20 63 70 5b 2d 31 5d 21 3d  ='/' || cp[-1]!=
11b10 27 2a 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '*') ){.        
11b20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69  if( c=='\n' ) li
11b30 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20  neno++;.        
11b40 63 70 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  cp++;.      }.  
11b50 20 20 20 20 69 66 28 20 63 20 29 20 63 70 2b 2b      if( c ) cp++
11b60 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
11b70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 73 2e 74  ;.    }.    ps.t
11b80 6f 6b 65 6e 73 74 61 72 74 20 3d 20 63 70 3b 20  okenstart = cp; 
11b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11ba0 2a 20 4d 61 72 6b 20 74 68 65 20 62 65 67 69 6e  * Mark the begin
11bb0 6e 69 6e 67 20 6f 66 20 74 68 65 20 74 6f 6b 65  ning of the toke
11bc0 6e 20 2a 2f 0a 20 20 20 20 70 73 2e 74 6f 6b 65  n */.    ps.toke
11bd0 6e 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f  nlineno = lineno
11be0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
11bf0 69 6e 65 6e 75 6d 62 65 72 20 6f 6e 20 77 68 69  inenumber on whi
11c00 63 68 20 74 6f 6b 65 6e 20 62 65 67 69 6e 73 20  ch token begins 
11c10 2a 2f 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  */.    if( c=='\
11c20 22 27 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  "' ){           
11c30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72            /* Str
11c40 69 6e 67 20 6c 69 74 65 72 61 6c 73 20 2a 2f 0a  ing literals */.
11c50 20 20 20 20 20 20 63 70 2b 2b 3b 0a 20 20 20 20        cp++;.    
11c60 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70    while( (c= *cp
11c70 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 22 27 20  )!=0 && c!='\"' 
11c80 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
11c90 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
11ca0 2b 3b 0a 20 20 20 20 20 20 20 20 63 70 2b 2b 3b  +;.        cp++;
11cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
11cc0 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
11cd0 20 20 20 45 72 72 6f 72 4d 73 67 28 70 73 2e 66     ErrorMsg(ps.f
11ce0 69 6c 65 6e 61 6d 65 2c 73 74 61 72 74 6c 69 6e  ilename,startlin
11cf0 65 2c 0a 22 53 74 72 69 6e 67 20 73 74 61 72 74  e,."String start
11d00 69 6e 67 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65  ing on this line
11d10 20 69 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74   is not terminat
11d20 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 65 6e  ed before the en
11d30 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 22 29  d of the file.")
11d40 3b 0a 20 20 20 20 20 20 20 20 70 73 2e 65 72 72  ;.        ps.err
11d50 6f 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20  orcnt++;.       
11d60 20 6e 65 78 74 63 70 20 3d 20 63 70 3b 0a 20 20   nextcp = cp;.  
11d70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11d80 20 20 20 6e 65 78 74 63 70 20 3d 20 63 70 2b 31     nextcp = cp+1
11d90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
11da0 6c 73 65 20 69 66 28 20 63 3d 3d 27 7b 27 20 29  lse if( c=='{' )
11db0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
11dc0 2f 2a 20 41 20 62 6c 6f 63 6b 20 6f 66 20 43 20  /* A block of C 
11dd0 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  code */.      in
11de0 74 20 6c 65 76 65 6c 3b 0a 20 20 20 20 20 20 63  t level;.      c
11df0 70 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 6c  p++;.      for(l
11e00 65 76 65 6c 3d 31 3b 20 28 63 3d 20 2a 63 70 29  evel=1; (c= *cp)
11e10 21 3d 30 20 26 26 20 28 6c 65 76 65 6c 3e 31 20  !=0 && (level>1 
11e20 7c 7c 20 63 21 3d 27 7d 27 29 3b 20 63 70 2b 2b  || c!='}'); cp++
11e30 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  ){.        if( c
11e40 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 6e 6f 2b  =='\n' ) lineno+
11e50 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20  +;.        else 
11e60 69 66 28 20 63 3d 3d 27 7b 27 20 29 20 6c 65 76  if( c=='{' ) lev
11e70 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 65 6c  el++;.        el
11e80 73 65 20 69 66 28 20 63 3d 3d 27 7d 27 20 29 20  se if( c=='}' ) 
11e90 6c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 20 20 20  level--;.       
11ea0 20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2f 27   else if( c=='/'
11eb0 20 26 26 20 63 70 5b 31 5d 3d 3d 27 2a 27 20 29   && cp[1]=='*' )
11ec0 7b 20 20 2f 2a 20 53 6b 69 70 20 63 6f 6d 6d 65  {  /* Skip comme
11ed0 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  nts */.         
11ee0 20 69 6e 74 20 70 72 65 76 63 3b 0a 20 20 20 20   int prevc;.    
11ef0 20 20 20 20 20 20 63 70 20 3d 20 26 63 70 5b 32        cp = &cp[2
11f00 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 65  ];.          pre
11f10 76 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  vc = 0;.        
11f20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63 70    while( (c= *cp
11f30 29 21 3d 30 20 26 26 20 28 63 21 3d 27 2f 27 20  )!=0 && (c!='/' 
11f40 7c 7c 20 70 72 65 76 63 21 3d 27 2a 27 29 20 29  || prevc!='*') )
11f50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
11f60 28 20 63 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65  ( c=='\n' ) line
11f70 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  no++;.          
11f80 20 20 70 72 65 76 63 20 3d 20 63 3b 0a 20 20 20    prevc = c;.   
11f90 20 20 20 20 20 20 20 20 20 63 70 2b 2b 3b 0a 09           cp++;..
11fa0 20 20 7d 0a 09 7d 65 6c 73 65 20 69 66 28 20 63    }..}else if( c
11fb0 3d 3d 27 2f 27 20 26 26 20 63 70 5b 31 5d 3d 3d  =='/' && cp[1]==
11fc0 27 2f 27 20 29 7b 20 20 2f 2a 20 53 6b 69 70 20  '/' ){  /* Skip 
11fd0 43 2b 2b 20 73 74 79 6c 65 20 63 6f 6d 6d 65 6e  C++ style commen
11fe0 74 73 20 74 6f 6f 20 2a 2f 0a 20 20 20 20 20 20  ts too */.      
11ff0 20 20 20 20 63 70 20 3d 20 26 63 70 5b 32 5d 3b      cp = &cp[2];
12000 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
12010 28 20 28 63 3d 20 2a 63 70 29 21 3d 30 20 26 26  ( (c= *cp)!=0 &&
12020 20 63 21 3d 27 5c 6e 27 20 29 20 63 70 2b 2b 3b   c!='\n' ) cp++;
12030 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
12040 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 09 7d 65   ) lineno++;..}e
12050 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 27 27 20  lse if( c=='\'' 
12060 7c 7c 20 63 3d 3d 27 5c 22 27 20 29 7b 20 20 20  || c=='\"' ){   
12070 20 2f 2a 20 53 74 72 69 6e 67 20 61 20 63 68 61   /* String a cha
12080 72 61 63 74 65 72 20 6c 69 74 65 72 61 6c 73 20  racter literals 
12090 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  */.          int
120a0 20 73 74 61 72 74 63 68 61 72 2c 20 70 72 65 76   startchar, prev
120b0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  c;.          sta
120c0 72 74 63 68 61 72 20 3d 20 63 3b 0a 20 20 20 20  rtchar = c;.    
120d0 20 20 20 20 20 20 70 72 65 76 63 20 3d 20 30 3b        prevc = 0;
120e0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 63  .          for(c
120f0 70 2b 2b 3b 20 28 63 3d 20 2a 63 70 29 21 3d 30  p++; (c= *cp)!=0
12100 20 26 26 20 28 63 21 3d 73 74 61 72 74 63 68 61   && (c!=startcha
12110 72 20 7c 7c 20 70 72 65 76 63 3d 3d 27 5c 5c 27  r || prevc=='\\'
12120 29 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 20 20 20  ); cp++){.      
12130 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
12140 27 20 29 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  ' ) lineno++;.  
12150 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 72            if( pr
12160 65 76 63 3d 3d 27 5c 5c 27 20 29 20 70 72 65 76  evc=='\\' ) prev
12170 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  c = 0;.         
12180 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20     else         
12190 20 20 20 20 20 70 72 65 76 63 20 3d 20 63 3b 0a       prevc = c;.
121a0 09 20 20 7d 0a 09 7d 0a 20 20 20 20 20 20 7d 0a  .  }..}.      }.
121b0 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
121c0 7b 0a 20 20 20 20 20 20 20 20 45 72 72 6f 72 4d  {.        ErrorM
121d0 73 67 28 70 73 2e 66 69 6c 65 6e 61 6d 65 2c 70  sg(ps.filename,p
121e0 73 2e 74 6f 6b 65 6e 6c 69 6e 65 6e 6f 2c 0a 22  s.tokenlineno,."
121f0 43 20 63 6f 64 65 20 73 74 61 72 74 69 6e 67 20  C code starting 
12200 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 69 73 20  on this line is 
12210 6e 6f 74 20 74 65 72 6d 69 6e 61 74 65 64 20 62  not terminated b
12220 65 66 6f 72 65 20 74 68 65 20 65 6e 64 20 6f 66  efore the end of
12230 20 74 68 65 20 66 69 6c 65 2e 22 29 3b 0a 20 20   the file.");.  
12240 20 20 20 20 20 20 70 73 2e 65 72 72 6f 72 63 6e        ps.errorcn
12250 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e 65 78  t++;.        nex
12260 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 20 20  tcp = cp;.      
12270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
12280 65 78 74 63 70 20 3d 20 63 70 2b 31 3b 0a 20 20  extcp = cp+1;.  
12290 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
122a0 69 66 28 20 69 73 61 6c 6e 75 6d 28 63 29 20 29  if( isalnum(c) )
122b0 7b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64  {          /* Id
122c0 65 6e 74 69 66 69 65 72 73 20 2a 2f 0a 20 20 20  entifiers */.   
122d0 20 20 20 77 68 69 6c 65 28 20 28 63 3d 20 2a 63     while( (c= *c
122e0 70 29 21 3d 30 20 26 26 20 28 69 73 61 6c 6e 75  p)!=0 && (isalnu
122f0 6d 28 63 29 20 7c 7c 20 63 3d 3d 27 5f 27 29 20  m(c) || c=='_') 
12300 29 20 63 70 2b 2b 3b 0a 20 20 20 20 20 20 6e 65  ) cp++;.      ne
12310 78 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d  xtcp = cp;.    }
12320 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 3a 27 20  else if( c==':' 
12330 26 26 20 63 70 5b 31 5d 3d 3d 27 3a 27 20 26 26  && cp[1]==':' &&
12340 20 63 70 5b 32 5d 3d 3d 27 3d 27 20 29 7b 20 2f   cp[2]=='=' ){ /
12350 2a 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 22  * The operator "
12360 3a 3a 3d 22 20 2a 2f 0a 20 20 20 20 20 20 63 70  ::=" */.      cp
12370 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 6e 65 78   += 3;.      nex
12380 74 63 70 20 3d 20 63 70 3b 0a 20 20 20 20 7d 65  tcp = cp;.    }e
12390 6c 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20  lse{            
123a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
123b0 20 41 6c 6c 20 6f 74 68 65 72 20 28 6f 6e 65 20   All other (one 
123c0 63 68 61 72 61 63 74 65 72 29 20 6f 70 65 72 61  character) opera
123d0 74 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 63 70  tors */.      cp
123e0 2b 2b 3b 0a 20 20 20 20 20 20 6e 65 78 74 63 70  ++;.      nextcp
123f0 20 3d 20 63 70 3b 0a 20 20 20 20 7d 0a 20 20 20   = cp;.    }.   
12400 20 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 2a 63   c = *cp;.    *c
12410 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12430 20 4e 75 6c 6c 20 74 65 72 6d 69 6e 61 74 65 20   Null terminate 
12440 74 68 65 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20  the token */.   
12450 20 70 61 72 73 65 6f 6e 65 74 6f 6b 65 6e 28 26   parseonetoken(&
12460 70 73 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ps);            
12470 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 74 6f   /* Parse the to
12480 6b 65 6e 20 2a 2f 0a 20 20 20 20 2a 63 70 20 3d  ken */.    *cp =
12490 20 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   c;             
124a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
124b0 73 74 6f 72 65 20 74 68 65 20 62 75 66 66 65 72  store the buffer
124c0 20 2a 2f 0a 20 20 20 20 63 70 20 3d 20 6e 65 78   */.    cp = nex
124d0 74 63 70 3b 0a 20 20 7d 0a 20 20 66 72 65 65 28  tcp;.  }.  free(
124e0 66 69 6c 65 62 75 66 29 3b 20 20 20 20 20 20 20  filebuf);       
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12500 52 65 6c 65 61 73 65 20 74 68 65 20 62 75 66 66  Release the buff
12510 65 72 20 61 66 74 65 72 20 70 61 72 73 69 6e 67  er after parsing
12520 20 2a 2f 0a 20 20 67 70 2d 3e 72 75 6c 65 20 3d   */.  gp->rule =
12530 20 70 73 2e 66 69 72 73 74 72 75 6c 65 3b 0a 20   ps.firstrule;. 
12540 20 67 70 2d 3e 65 72 72 6f 72 63 6e 74 20 3d 20   gp->errorcnt = 
12550 70 73 2e 65 72 72 6f 72 63 6e 74 3b 0a 7d 0a 2f  ps.errorcnt;.}./
12560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46 72 6f 6d  *********** From
12580 20 74 68 65 20 66 69 6c 65 20 22 70 6c 69 6e 6b   the file "plink
12590 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .c" ************
125a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a  *********/./*.**
125b0 20 52 6f 75 74 69 6e 65 73 20 70 72 6f 63 65 73   Routines proces
125c0 73 69 6e 67 20 63 6f 6e 66 69 67 75 72 61 74 69  sing configurati
125d0 6f 6e 20 66 6f 6c 6c 6f 77 2d 73 65 74 20 70 72  on follow-set pr
125e0 6f 70 61 67 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a  opagation links.
125f0 2a 2a 20 69 6e 20 74 68 65 20 4c 45 4d 4f 4e 20  ** in the LEMON 
12600 70 61 72 73 65 72 20 67 65 6e 65 72 61 74 6f 72  parser generator
12610 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
12620 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 69 6e 6b 5f  ct plink *plink_
12630 66 72 65 65 6c 69 73 74 20 3d 20 30 3b 0a 0a 2f  freelist = 0;../
12640 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
12650 20 70 6c 69 6e 6b 20 2a 2f 0a 73 74 72 75 63 74   plink */.struct
12660 20 70 6c 69 6e 6b 20 2a 50 6c 69 6e 6b 5f 6e 65   plink *Plink_ne
12670 77 28 29 7b 0a 20 20 73 74 72 75 63 74 20 70 6c  w(){.  struct pl
12680 69 6e 6b 20 2a 6e 65 77 3b 0a 0a 20 20 69 66 28  ink *new;..  if(
12690 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 3d   plink_freelist=
126a0 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  =0 ){.    int i;
126b0 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 31  .    int amt = 1
126c0 30 30 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72  00;.    plink_fr
126d0 65 65 6c 69 73 74 20 3d 20 28 73 74 72 75 63 74  eelist = (struct
126e0 20 70 6c 69 6e 6b 20 2a 29 6d 61 6c 6c 6f 63 28   plink *)malloc(
126f0 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 70   sizeof(struct p
12700 6c 69 6e 6b 29 2a 61 6d 74 20 29 3b 0a 20 20 20  link)*amt );.   
12710 20 69 66 28 20 70 6c 69 6e 6b 5f 66 72 65 65 6c   if( plink_freel
12720 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
12730 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a  fprintf(stderr,.
12740 20 20 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f        "Unable to
12750 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
12760 20 66 6f 72 20 61 20 6e 65 77 20 66 6f 6c 6c 6f   for a new follo
12770 77 2d 73 65 74 20 70 72 6f 70 61 67 61 74 69 6f  w-set propagatio
12780 6e 20 6c 69 6e 6b 2e 5c 6e 22 29 3b 0a 20 20 20  n link.\n");.   
12790 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
127a0 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
127b0 3c 61 6d 74 2d 31 3b 20 69 2b 2b 29 20 70 6c 69  <amt-1; i++) pli
127c0 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 69 5d 2e 6e  nk_freelist[i].n
127d0 65 78 74 20 3d 20 26 70 6c 69 6e 6b 5f 66 72 65  ext = &plink_fre
127e0 65 6c 69 73 74 5b 69 2b 31 5d 3b 0a 20 20 20 20  elist[i+1];.    
127f0 70 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 5b 61  plink_freelist[a
12800 6d 74 2d 31 5d 2e 6e 65 78 74 20 3d 20 30 3b 0a  mt-1].next = 0;.
12810 20 20 7d 0a 20 20 6e 65 77 20 3d 20 70 6c 69 6e    }.  new = plin
12820 6b 5f 66 72 65 65 6c 69 73 74 3b 0a 20 20 70 6c  k_freelist;.  pl
12830 69 6e 6b 5f 66 72 65 65 6c 69 73 74 20 3d 20 70  ink_freelist = p
12840 6c 69 6e 6b 5f 66 72 65 65 6c 69 73 74 2d 3e 6e  link_freelist->n
12850 65 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 6e 65  ext;.  return ne
12860 77 3b 0a 7d 0a 0a 2f 2a 20 41 64 64 20 61 20 70  w;.}../* Add a p
12870 6c 69 6e 6b 20 74 6f 20 61 20 70 6c 69 6e 6b 20  link to a plink 
12880 6c 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69  list */.void Pli
12890 6e 6b 5f 61 64 64 28 70 6c 70 70 2c 63 66 70 29  nk_add(plpp,cfp)
128a0 0a 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a 2a  .struct plink **
128b0 70 6c 70 70 3b 0a 73 74 72 75 63 74 20 63 6f 6e  plpp;.struct con
128c0 66 69 67 20 2a 63 66 70 3b 0a 7b 0a 20 20 73 74  fig *cfp;.{.  st
128d0 72 75 63 74 20 70 6c 69 6e 6b 20 2a 6e 65 77 3b  ruct plink *new;
128e0 0a 20 20 6e 65 77 20 3d 20 50 6c 69 6e 6b 5f 6e  .  new = Plink_n
128f0 65 77 28 29 3b 0a 20 20 6e 65 77 2d 3e 6e 65 78  ew();.  new->nex
12900 74 20 3d 20 2a 70 6c 70 70 3b 0a 20 20 2a 70 6c  t = *plpp;.  *pl
12910 70 70 20 3d 20 6e 65 77 3b 0a 20 20 6e 65 77 2d  pp = new;.  new-
12920 3e 63 66 70 20 3d 20 63 66 70 3b 0a 7d 0a 0a 2f  >cfp = cfp;.}../
12930 2a 20 54 72 61 6e 73 66 65 72 20 65 76 65 72 79  * Transfer every
12940 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c 69   plink on the li
12950 73 74 20 22 66 72 6f 6d 22 20 74 6f 20 74 68 65  st "from" to the
12960 20 6c 69 73 74 20 22 74 6f 22 20 2a 2f 0a 76 6f   list "to" */.vo
12970 69 64 20 50 6c 69 6e 6b 5f 63 6f 70 79 28 74 6f  id Plink_copy(to
12980 2c 66 72 6f 6d 29 0a 73 74 72 75 63 74 20 70 6c  ,from).struct pl
12990 69 6e 6b 20 2a 2a 74 6f 3b 0a 73 74 72 75 63 74  ink **to;.struct
129a0 20 70 6c 69 6e 6b 20 2a 66 72 6f 6d 3b 0a 7b 0a   plink *from;.{.
129b0 20 20 73 74 72 75 63 74 20 70 6c 69 6e 6b 20 2a    struct plink *
129c0 6e 65 78 74 70 6c 3b 0a 20 20 77 68 69 6c 65 28  nextpl;.  while(
129d0 20 66 72 6f 6d 20 29 7b 0a 20 20 20 20 6e 65 78   from ){.    nex
129e0 74 70 6c 20 3d 20 66 72 6f 6d 2d 3e 6e 65 78 74  tpl = from->next
129f0 3b 0a 20 20 20 20 66 72 6f 6d 2d 3e 6e 65 78 74  ;.    from->next
12a00 20 3d 20 2a 74 6f 3b 0a 20 20 20 20 2a 74 6f 20   = *to;.    *to 
12a10 3d 20 66 72 6f 6d 3b 0a 20 20 20 20 66 72 6f 6d  = from;.    from
12a20 20 3d 20 6e 65 78 74 70 6c 3b 0a 20 20 7d 0a 7d   = nextpl;.  }.}
12a30 0a 0a 2f 2a 20 44 65 6c 65 74 65 20 65 76 65 72  ../* Delete ever
12a40 79 20 70 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 6c  y plink on the l
12a50 69 73 74 20 2a 2f 0a 76 6f 69 64 20 50 6c 69 6e  ist */.void Plin
12a60 6b 5f 64 65 6c 65 74 65 28 70 6c 70 29 0a 73 74  k_delete(plp).st
12a70 72 75 63 74 20 70 6c 69 6e 6b 20 2a 70 6c 70 3b  ruct plink *plp;
12a80 0a 7b 0a 20 20 73 74 72 75 63 74 20 70 6c 69 6e  .{.  struct plin
12a90 6b 20 2a 6e 65 78 74 70 6c 3b 0a 0a 20 20 77 68  k *nextpl;..  wh
12aa0 69 6c 65 28 20 70 6c 70 20 29 7b 0a 20 20 20 20  ile( plp ){.    
12ab0 6e 65 78 74 70 6c 20 3d 20 70 6c 70 2d 3e 6e 65  nextpl = plp->ne
12ac0 78 74 3b 0a 20 20 20 20 70 6c 70 2d 3e 6e 65 78  xt;.    plp->nex
12ad0 74 20 3d 20 70 6c 69 6e 6b 5f 66 72 65 65 6c 69  t = plink_freeli
12ae0 73 74 3b 0a 20 20 20 20 70 6c 69 6e 6b 5f 66 72  st;.    plink_fr
12af0 65 65 6c 69 73 74 20 3d 20 70 6c 70 3b 0a 20 20  eelist = plp;.  
12b00 20 20 70 6c 70 20 3d 20 6e 65 78 74 70 6c 3b 0a    plp = nextpl;.
12b10 20 20 7d 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a    }.}./*********
12b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 46  ************** F
12b30 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 22 72 65  rom the file "re
12b40 70 6f 72 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  port.c" ********
12b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b60 2a 2a 2f 0a 2f 2a 0a 2a 2a 20 50 72 6f 63 65 64  **/./*.** Proced
12b70 75 72 65 73 20 66 6f 72 20 67 65 6e 65 72 61 74  ures for generat
12b80 69 6e 67 20 72 65 70 6f 72 74 73 20 61 6e 64 20  ing reports and 
12b90 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 4c 45  tables in the LE
12ba0 4d 4f 4e 20 70 61 72 73 65 72 20 67 65 6e 65 72  MON parser gener
12bb0 61 74 6f 72 2e 0a 2a 2f 0a 0a 2f 2a 20 47 65 6e  ator..*/../* Gen
12bc0 65 72 61 74 65 20 61 20 66 69 6c 65 6e 61 6d 65  erate a filename
12bd0 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
12be0 73 75 66 66 69 78 2e 20 20 53 70 61 63 65 20 74  suffix.  Space t
12bf0 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 6e 61  o hold the.** na
12c00 6d 65 20 63 6f 6d 65 73 20 66 72 6f 6d 20 6d 61  me comes from ma
12c10 6c 6c 6f 63 28 29 20 61 6e 64 20 6d 75 73 74 20  lloc() and must 
12c20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
12c30 63 61 6c 6c 69 6e 67 0a 2a 2a 20 66 75 6e 63 74  calling.** funct
12c40 69 6f 6e 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ion..*/.PRIVATE 
12c50 63 68 61 72 20 2a 66 69 6c 65 5f 6d 61 6b 65 6e  char *file_maken
12c60 61 6d 65 28 6c 65 6d 70 2c 73 75 66 66 69 78 29  ame(lemp,suffix)
12c70 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
12c80 65 6d 70 3b 0a 63 68 61 72 20 2a 73 75 66 66 69  emp;.char *suffi
12c90 78 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 6e 61 6d  x;.{.  char *nam
12ca0 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b 0a 0a  e;.  char *cp;..
12cb0 20 20 6e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28    name = malloc(
12cc0 20 73 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 66 69   strlen(lemp->fi
12cd0 6c 65 6e 61 6d 65 29 20 2b 20 73 74 72 6c 65 6e  lename) + strlen
12ce0 28 73 75 66 66 69 78 29 20 2b 20 35 20 29 3b 0a  (suffix) + 5 );.
12cf0 20 20 69 66 28 20 6e 61 6d 65 3d 3d 30 20 29 7b    if( name==0 ){
12d00 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
12d10 65 72 72 2c 22 43 61 6e 27 74 20 61 6c 6c 6f 63  err,"Can't alloc
12d20 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 61 20  ate space for a 
12d30 66 69 6c 65 6e 61 6d 65 2e 5c 6e 22 29 3b 0a 20  filename.\n");. 
12d40 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
12d50 20 20 73 74 72 63 70 79 28 6e 61 6d 65 2c 6c 65    strcpy(name,le
12d60 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20  mp->filename);. 
12d70 20 63 70 20 3d 20 73 74 72 72 63 68 72 28 6e 61   cp = strrchr(na
12d80 6d 65 2c 27 2e 27 29 3b 0a 20 20 69 66 28 20 63  me,'.');.  if( c
12d90 70 20 29 20 2a 63 70 20 3d 20 30 3b 0a 20 20 73  p ) *cp = 0;.  s
12da0 74 72 63 61 74 28 6e 61 6d 65 2c 73 75 66 66 69  trcat(name,suffi
12db0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 61 6d  x);.  return nam
12dc0 65 3b 0a 7d 0a 0a 2f 2a 20 4f 70 65 6e 20 61 20  e;.}../* Open a 
12dd0 66 69 6c 65 20 77 69 74 68 20 61 20 6e 61 6d 65  file with a name
12de0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6e 61   based on the na
12df0 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  me of the input 
12e00 66 69 6c 65 2c 0a 2a 2a 20 62 75 74 20 77 69 74  file,.** but wit
12e10 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 28 73  h a different (s
12e20 70 65 63 69 66 69 65 64 29 20 73 75 66 66 69 78  pecified) suffix
12e30 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  , and return a p
12e40 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
12e50 20 73 74 72 65 61 6d 20 2a 2f 0a 50 52 49 56 41   stream */.PRIVA
12e60 54 45 20 46 49 4c 45 20 2a 66 69 6c 65 5f 6f 70  TE FILE *file_op
12e70 65 6e 28 6c 65 6d 70 2c 73 75 66 66 69 78 2c 6d  en(lemp,suffix,m
12e80 6f 64 65 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f  ode).struct lemo
12e90 6e 20 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73  n *lemp;.char *s
12ea0 75 66 66 69 78 3b 0a 63 68 61 72 20 2a 6d 6f 64  uffix;.char *mod
12eb0 65 3b 0a 7b 0a 20 20 46 49 4c 45 20 2a 66 70 3b  e;.{.  FILE *fp;
12ec0 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 6f 75  ..  if( lemp->ou
12ed0 74 6e 61 6d 65 20 29 20 66 72 65 65 28 6c 65 6d  tname ) free(lem
12ee0 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 6c  p->outname);.  l
12ef0 65 6d 70 2d 3e 6f 75 74 6e 61 6d 65 20 3d 20 66  emp->outname = f
12f00 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d  ile_makename(lem
12f10 70 2c 20 73 75 66 66 69 78 29 3b 0a 20 20 66 70  p, suffix);.  fp
12f20 20 3d 20 66 6f 70 65 6e 28 6c 65 6d 70 2d 3e 6f   = fopen(lemp->o
12f30 75 74 6e 61 6d 65 2c 6d 6f 64 65 29 3b 0a 20 20  utname,mode);.  
12f40 69 66 28 20 66 70 3d 3d 30 20 26 26 20 2a 6d 6f  if( fp==0 && *mo
12f50 64 65 3d 3d 27 77 27 20 29 7b 0a 20 20 20 20 66  de=='w' ){.    f
12f60 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 43  printf(stderr,"C
12f70 61 6e 27 74 20 6f 70 65 6e 20 66 69 6c 65 20 5c  an't open file \
12f80 22 25 73 5c 22 2e 5c 6e 22 2c 6c 65 6d 70 2d 3e  "%s\".\n",lemp->
12f90 6f 75 74 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65  outname);.    le
12fa0 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a  mp->errorcnt++;.
12fb0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
12fc0 7d 0a 20 20 72 65 74 75 72 6e 20 66 70 3b 0a 7d  }.  return fp;.}
12fd0 0a 0a 2f 2a 20 44 75 70 6c 69 63 61 74 65 20 74  ../* Duplicate t
12fe0 68 65 20 69 6e 70 75 74 20 66 69 6c 65 20 77 69  he input file wi
12ff0 74 68 6f 75 74 20 63 6f 6d 6d 65 6e 74 73 20 61  thout comments a
13000 6e 64 20 77 69 74 68 6f 75 74 20 61 63 74 69 6f  nd without actio
13010 6e 73 20 0a 2a 2a 20 6f 6e 20 72 75 6c 65 73 20  ns .** on rules 
13020 2a 2f 0a 76 6f 69 64 20 52 65 70 72 69 6e 74 28  */.void Reprint(
13030 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d  lemp).struct lem
13040 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74  on *lemp;.{.  st
13050 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20  ruct rule *rp;. 
13060 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
13070 73 70 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20  sp;.  int i, j, 
13080 6d 61 78 6c 65 6e 2c 20 6c 65 6e 2c 20 6e 63 6f  maxlen, len, nco
13090 6c 75 6d 6e 73 2c 20 73 6b 69 70 3b 0a 20 20 70  lumns, skip;.  p
130a0 72 69 6e 74 66 28 22 2f 2f 20 52 65 70 72 69 6e  rintf("// Reprin
130b0 74 20 6f 66 20 69 6e 70 75 74 20 66 69 6c 65 20  t of input file 
130c0 5c 22 25 73 5c 22 2e 5c 6e 2f 2f 20 53 79 6d 62  \"%s\".\n// Symb
130d0 6f 6c 73 3a 5c 6e 22 2c 6c 65 6d 70 2d 3e 66 69  ols:\n",lemp->fi
130e0 6c 65 6e 61 6d 65 29 3b 0a 20 20 6d 61 78 6c 65  lename);.  maxle
130f0 6e 20 3d 20 31 30 3b 0a 20 20 66 6f 72 28 69 3d  n = 10;.  for(i=
13100 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
13110 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70  ol; i++){.    sp
13120 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73   = lemp->symbols
13130 5b 69 5d 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  [i];.    len = s
13140 74 72 6c 65 6e 28 73 70 2d 3e 6e 61 6d 65 29 3b  trlen(sp->name);
13150 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78  .    if( len>max
13160 6c 65 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c  len ) maxlen = l
13170 65 6e 3b 0a 20 20 7d 0a 20 20 6e 63 6f 6c 75 6d  en;.  }.  ncolum
13180 6e 73 20 3d 20 37 36 2f 28 6d 61 78 6c 65 6e 2b  ns = 76/(maxlen+
13190 35 29 3b 0a 20 20 69 66 28 20 6e 63 6f 6c 75 6d  5);.  if( ncolum
131a0 6e 73 3c 31 20 29 20 6e 63 6f 6c 75 6d 6e 73 20  ns<1 ) ncolumns 
131b0 3d 20 31 3b 0a 20 20 73 6b 69 70 20 3d 20 28 6c  = 1;.  skip = (l
131c0 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6e  emp->nsymbol + n
131d0 63 6f 6c 75 6d 6e 73 20 2d 20 31 29 2f 6e 63 6f  columns - 1)/nco
131e0 6c 75 6d 6e 73 3b 0a 20 20 66 6f 72 28 69 3d 30  lumns;.  for(i=0
131f0 3b 20 69 3c 73 6b 69 70 3b 20 69 2b 2b 29 7b 0a  ; i<skip; i++){.
13200 20 20 20 20 70 72 69 6e 74 66 28 22 2f 2f 22 29      printf("//")
13210 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 3b 20 6a  ;.    for(j=i; j
13220 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20  <lemp->nsymbol; 
13230 6a 2b 3d 73 6b 69 70 29 7b 0a 20 20 20 20 20 20  j+=skip){.      
13240 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
13250 6c 73 5b 6a 5d 3b 0a 20 20 20 20 20 20 61 73 73  ls[j];.      ass
13260 65 72 74 28 20 73 70 2d 3e 69 6e 64 65 78 3d 3d  ert( sp->index==
13270 6a 20 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74  j );.      print
13280 66 28 22 20 25 33 64 20 25 2d 2a 2e 2a 73 22 2c  f(" %3d %-*.*s",
13290 6a 2c 6d 61 78 6c 65 6e 2c 6d 61 78 6c 65 6e 2c  j,maxlen,maxlen,
132a0 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  sp->name);.    }
132b0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22  .    printf("\n"
132c0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 72 70 3d  );.  }.  for(rp=
132d0 6c 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20  lemp->rule; rp; 
132e0 72 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20  rp=rp->next){.  
132f0 20 20 70 72 69 6e 74 66 28 22 25 73 22 2c 72 70    printf("%s",rp
13300 2d 3e 6c 68 73 2d 3e 6e 61 6d 65 29 3b 0a 2f 2a  ->lhs->name);./*
13310 20 20 20 20 69 66 28 20 72 70 2d 3e 6c 68 73 61      if( rp->lhsa
13320 6c 69 61 73 20 29 20 70 72 69 6e 74 66 28 22 28  lias ) printf("(
13330 25 73 29 22 2c 72 70 2d 3e 6c 68 73 61 6c 69 61  %s)",rp->lhsalia
13340 73 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74  s); */.    print
13350 66 28 22 20 3a 3a 3d 22 29 3b 0a 20 20 20 20 66  f(" ::=");.    f
13360 6f 72 28 69 3d 30 3b 20 69 3c 72 70 2d 3e 6e 72  or(i=0; i<rp->nr
13370 68 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  hs; i++){.      
13380 70 72 69 6e 74 66 28 22 20 25 73 22 2c 72 70 2d  printf(" %s",rp-
13390 3e 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a  >rhs[i]->name);.
133a0 2f 2a 20 20 20 20 20 20 69 66 28 20 72 70 2d 3e  /*      if( rp->
133b0 72 68 73 61 6c 69 61 73 5b 69 5d 20 29 20 70 72  rhsalias[i] ) pr
133c0 69 6e 74 66 28 22 28 25 73 29 22 2c 72 70 2d 3e  intf("(%s)",rp->
133d0 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 20 2a 2f  rhsalias[i]); */
133e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74  .    }.    print
133f0 66 28 22 2e 22 29 3b 0a 20 20 20 20 69 66 28 20  f(".");.    if( 
13400 72 70 2d 3e 70 72 65 63 73 79 6d 20 29 20 70 72  rp->precsym ) pr
13410 69 6e 74 66 28 22 20 5b 25 73 5d 22 2c 72 70 2d  intf(" [%s]",rp-
13420 3e 70 72 65 63 73 79 6d 2d 3e 6e 61 6d 65 29 3b  >precsym->name);
13430 0a 2f 2a 20 20 20 20 69 66 28 20 72 70 2d 3e 63  ./*    if( rp->c
13440 6f 64 65 20 29 20 70 72 69 6e 74 66 28 22 5c 6e  ode ) printf("\n
13450 20 20 20 20 25 73 22 2c 72 70 2d 3e 63 6f 64 65      %s",rp->code
13460 29 3b 20 2a 2f 0a 20 20 20 20 70 72 69 6e 74 66  ); */.    printf
13470 28 22 5c 6e 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 76  ("\n");.  }.}..v
13480 6f 69 64 20 43 6f 6e 66 69 67 50 72 69 6e 74 28  oid ConfigPrint(
13490 66 70 2c 63 66 70 29 0a 46 49 4c 45 20 2a 66 70  fp,cfp).FILE *fp
134a0 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ;.struct config 
134b0 2a 63 66 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74  *cfp;.{.  struct
134c0 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 69 6e 74   rule *rp;.  int
134d0 20 69 3b 0a 20 20 72 70 20 3d 20 63 66 70 2d 3e   i;.  rp = cfp->
134e0 72 70 3b 0a 20 20 66 70 72 69 6e 74 66 28 66 70  rp;.  fprintf(fp
134f0 2c 22 25 73 20 3a 3a 3d 22 2c 72 70 2d 3e 6c 68  ,"%s ::=",rp->lh
13500 73 2d 3e 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  s->name);.  for(
13510 69 3d 30 3b 20 69 3c 3d 72 70 2d 3e 6e 72 68 73  i=0; i<=rp->nrhs
13520 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
13530 69 3d 3d 63 66 70 2d 3e 64 6f 74 20 29 20 66 70  i==cfp->dot ) fp
13540 72 69 6e 74 66 28 66 70 2c 22 20 2a 22 29 3b 0a  rintf(fp," *");.
13550 20 20 20 20 69 66 28 20 69 3d 3d 72 70 2d 3e 6e      if( i==rp->n
13560 72 68 73 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  rhs ) break;.   
13570 20 66 70 72 69 6e 74 66 28 66 70 2c 22 20 25 73   fprintf(fp," %s
13580 22 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61  ",rp->rhs[i]->na
13590 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 23  me);.  }.}../* #
135a0 64 65 66 69 6e 65 20 54 45 53 54 20 2a 2f 0a 23  define TEST */.#
135b0 69 66 64 65 66 20 54 45 53 54 0a 2f 2a 20 50 72  ifdef TEST./* Pr
135c0 69 6e 74 20 61 20 73 65 74 20 2a 2f 0a 50 52 49  int a set */.PRI
135d0 56 41 54 45 20 76 6f 69 64 20 53 65 74 50 72 69  VATE void SetPri
135e0 6e 74 28 6f 75 74 2c 73 65 74 2c 6c 65 6d 70 29  nt(out,set,lemp)
135f0 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 63 68 61 72  .FILE *out;.char
13600 20 2a 73 65 74 3b 0a 73 74 72 75 63 74 20 6c 65   *set;.struct le
13610 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69  mon *lemp;.{.  i
13620 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 73 70  nt i;.  char *sp
13630 61 63 65 72 3b 0a 20 20 73 70 61 63 65 72 20 3d  acer;.  spacer =
13640 20 22 22 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f   "";.  fprintf(o
13650 75 74 2c 22 25 31 32 73 5b 22 2c 22 22 29 3b 0a  ut,"%12s[","");.
13660 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6d    for(i=0; i<lem
13670 70 2d 3e 6e 74 65 72 6d 69 6e 61 6c 3b 20 69 2b  p->nterminal; i+
13680 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 65 74 46  +){.    if( SetF
13690 69 6e 64 28 73 65 74 2c 69 29 20 29 7b 0a 20 20  ind(set,i) ){.  
136a0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
136b0 22 25 73 25 73 22 2c 73 70 61 63 65 72 2c 6c 65  "%s%s",spacer,le
136c0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
136d0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 70 61  name);.      spa
136e0 63 65 72 20 3d 20 22 20 22 3b 0a 20 20 20 20 7d  cer = " ";.    }
136f0 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f  .  }.  fprintf(o
13700 75 74 2c 22 5d 5c 6e 22 29 3b 0a 7d 0a 0a 2f 2a  ut,"]\n");.}../*
13710 20 50 72 69 6e 74 20 61 20 70 6c 69 6e 6b 20 63   Print a plink c
13720 68 61 69 6e 20 2a 2f 0a 50 52 49 56 41 54 45 20  hain */.PRIVATE 
13730 76 6f 69 64 20 50 6c 69 6e 6b 50 72 69 6e 74 28  void PlinkPrint(
13740 6f 75 74 2c 70 6c 70 2c 74 61 67 29 0a 46 49 4c  out,plp,tag).FIL
13750 45 20 2a 6f 75 74 3b 0a 73 74 72 75 63 74 20 70  E *out;.struct p
13760 6c 69 6e 6b 20 2a 70 6c 70 3b 0a 63 68 61 72 20  link *plp;.char 
13770 2a 74 61 67 3b 0a 7b 0a 20 20 77 68 69 6c 65 28  *tag;.{.  while(
13780 20 70 6c 70 20 29 7b 0a 20 20 20 20 66 70 72 69   plp ){.    fpri
13790 6e 74 66 28 6f 75 74 2c 22 25 31 32 73 25 73 20  ntf(out,"%12s%s 
137a0 28 73 74 61 74 65 20 25 32 64 29 20 22 2c 22 22  (state %2d) ",""
137b0 2c 74 61 67 2c 70 6c 70 2d 3e 63 66 70 2d 3e 73  ,tag,plp->cfp->s
137c0 74 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20  tp->index);.    
137d0 43 6f 6e 66 69 67 50 72 69 6e 74 28 6f 75 74 2c  ConfigPrint(out,
137e0 70 6c 70 2d 3e 63 66 70 29 3b 0a 20 20 20 20 66  plp->cfp);.    f
137f0 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e 22 29  printf(out,"\n")
13800 3b 0a 20 20 20 20 70 6c 70 20 3d 20 70 6c 70 2d  ;.    plp = plp-
13810 3e 6e 65 78 74 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  >next;.  }.}.#en
13820 64 69 66 0a 0a 2f 2a 20 50 72 69 6e 74 20 61 6e  dif../* Print an
13830 20 61 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 67   action to the g
13840 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
13850 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 46 41  ptor.  Return FA
13860 4c 53 45 20 69 66 0a 2a 2a 20 6e 6f 74 68 69 6e  LSE if.** nothin
13870 67 20 77 61 73 20 61 63 74 75 61 6c 6c 79 20 70  g was actually p
13880 72 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 50  rinted..*/.int P
13890 72 69 6e 74 41 63 74 69 6f 6e 28 73 74 72 75 63  rintAction(struc
138a0 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c 20 46 49  t action *ap, FI
138b0 4c 45 20 2a 66 70 2c 20 69 6e 74 20 69 6e 64 65  LE *fp, int inde
138c0 6e 74 29 7b 0a 20 20 69 6e 74 20 72 65 73 75 6c  nt){.  int resul
138d0 74 20 3d 20 31 3b 0a 20 20 73 77 69 74 63 68 28  t = 1;.  switch(
138e0 20 61 70 2d 3e 74 79 70 65 20 29 7b 0a 20 20 20   ap->type ){.   
138f0 20 63 61 73 65 20 53 48 49 46 54 3a 0a 20 20 20   case SHIFT:.   
13900 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25     fprintf(fp,"%
13910 2a 73 20 73 68 69 66 74 20 20 25 64 22 2c 69 6e  *s shift  %d",in
13920 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61 6d  dent,ap->sp->nam
13930 65 2c 61 70 2d 3e 78 2e 73 74 70 2d 3e 69 6e 64  e,ap->x.stp->ind
13940 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
13950 3b 0a 20 20 20 20 63 61 73 65 20 52 45 44 55 43  ;.    case REDUC
13960 45 3a 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  E:.      fprintf
13970 28 66 70 2c 22 25 2a 73 20 72 65 64 75 63 65 20  (fp,"%*s reduce 
13980 25 64 22 2c 69 6e 64 65 6e 74 2c 61 70 2d 3e 73  %d",indent,ap->s
13990 70 2d 3e 6e 61 6d 65 2c 61 70 2d 3e 78 2e 72 70  p->name,ap->x.rp
139a0 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20  ->index);.      
139b0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
139c0 41 43 43 45 50 54 3a 0a 20 20 20 20 20 20 66 70  ACCEPT:.      fp
139d0 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 61 63  rintf(fp,"%*s ac
139e0 63 65 70 74 22 2c 69 6e 64 65 6e 74 2c 61 70 2d  cept",indent,ap-
139f0 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  >sp->name);.    
13a00 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
13a10 65 20 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 66  e ERROR:.      f
13a20 70 72 69 6e 74 66 28 66 70 2c 22 25 2a 73 20 65  printf(fp,"%*s e
13a30 72 72 6f 72 22 2c 69 6e 64 65 6e 74 2c 61 70 2d  rror",indent,ap-
13a40 3e 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20  >sp->name);.    
13a50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
13a60 65 20 43 4f 4e 46 4c 49 43 54 3a 0a 20 20 20 20  e CONFLICT:.    
13a70 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 25 2a    fprintf(fp,"%*
13a80 73 20 72 65 64 75 63 65 20 25 2d 33 64 20 2a 2a  s reduce %-3d **
13a90 20 50 61 72 73 69 6e 67 20 63 6f 6e 66 6c 69 63   Parsing conflic
13aa0 74 20 2a 2a 22 2c 0a 20 20 20 20 20 20 20 20 69  t **",.        i
13ab0 6e 64 65 6e 74 2c 61 70 2d 3e 73 70 2d 3e 6e 61  ndent,ap->sp->na
13ac0 6d 65 2c 61 70 2d 3e 78 2e 72 70 2d 3e 69 6e 64  me,ap->x.rp->ind
13ad0 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
13ae0 3b 0a 20 20 20 20 63 61 73 65 20 53 48 5f 52 45  ;.    case SH_RE
13af0 53 4f 4c 56 45 44 3a 0a 20 20 20 20 63 61 73 65  SOLVED:.    case
13b00 20 52 44 5f 52 45 53 4f 4c 56 45 44 3a 0a 20 20   RD_RESOLVED:.  
13b10 20 20 63 61 73 65 20 4e 4f 54 5f 55 53 45 44 3a    case NOT_USED:
13b20 0a 20 20 20 20 20 20 72 65 73 75 6c 74 20 3d 20  .      result = 
13b30 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
13b40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73    }.  return res
13b50 75 6c 74 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72  ult;.}../* Gener
13b60 61 74 65 20 74 68 65 20 22 79 2e 6f 75 74 70 75  ate the "y.outpu
13b70 74 22 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 76  t" log file */.v
13b80 6f 69 64 20 52 65 70 6f 72 74 4f 75 74 70 75 74  oid ReportOutput
13b90 28 6c 65 6d 70 29 0a 73 74 72 75 63 74 20 6c 65  (lemp).struct le
13ba0 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69  mon *lemp;.{.  i
13bb0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
13bc0 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74 72  tate *stp;.  str
13bd0 75 63 74 20 63 6f 6e 66 69 67 20 2a 63 66 70 3b  uct config *cfp;
13be0 0a 20 20 73 74 72 75 63 74 20 61 63 74 69 6f 6e  .  struct action
13bf0 20 2a 61 70 3b 0a 20 20 46 49 4c 45 20 2a 66 70   *ap;.  FILE *fp
13c00 3b 0a 0a 20 20 66 70 20 3d 20 66 69 6c 65 5f 6f  ;..  fp = file_o
13c10 70 65 6e 28 6c 65 6d 70 2c 22 2e 6f 75 74 22 2c  pen(lemp,".out",
13c20 22 77 22 29 3b 0a 20 20 69 66 28 20 66 70 3d 3d  "w");.  if( fp==
13c30 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 70  0 ) return;.  fp
13c40 72 69 6e 74 66 28 66 70 2c 22 20 5c 62 22 29 3b  rintf(fp," \b");
13c50 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
13c60 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b 29  mp->nstate; i++)
13c70 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d 70  {.    stp = lemp
13c80 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20  ->sorted[i];.   
13c90 20 66 70 72 69 6e 74 66 28 66 70 2c 22 53 74 61   fprintf(fp,"Sta
13ca0 74 65 20 25 64 3a 5c 6e 22 2c 73 74 70 2d 3e 69  te %d:\n",stp->i
13cb0 6e 64 65 78 29 3b 0a 20 20 20 20 69 66 28 20 6c  ndex);.    if( l
13cc0 65 6d 70 2d 3e 62 61 73 69 73 66 6c 61 67 20 29  emp->basisflag )
13cd0 20 63 66 70 3d 73 74 70 2d 3e 62 70 3b 0a 20 20   cfp=stp->bp;.  
13ce0 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
13cf0 20 20 20 20 20 20 20 20 63 66 70 3d 73 74 70 2d          cfp=stp-
13d00 3e 63 66 70 3b 0a 20 20 20 20 77 68 69 6c 65 28  >cfp;.    while(
13d10 20 63 66 70 20 29 7b 0a 20 20 20 20 20 20 63 68   cfp ){.      ch
13d20 61 72 20 62 75 66 5b 32 30 5d 3b 0a 20 20 20 20  ar buf[20];.    
13d30 20 20 69 66 28 20 63 66 70 2d 3e 64 6f 74 3d 3d    if( cfp->dot==
13d40 63 66 70 2d 3e 72 70 2d 3e 6e 72 68 73 20 29 7b  cfp->rp->nrhs ){
13d50 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
13d60 28 62 75 66 2c 22 28 25 64 29 22 2c 63 66 70 2d  (buf,"(%d)",cfp-
13d70 3e 72 70 2d 3e 69 6e 64 65 78 29 3b 0a 20 20 20  >rp->index);.   
13d80 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70 2c       fprintf(fp,
13d90 22 20 20 20 20 25 35 73 20 22 2c 62 75 66 29 3b  "    %5s ",buf);
13da0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
13db0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 66 70        fprintf(fp
13dc0 2c 22 20 20 20 20 20 20 20 20 20 20 22 29 3b 0a  ,"          ");.
13dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 43 6f        }.      Co
13de0 6e 66 69 67 50 72 69 6e 74 28 66 70 2c 63 66 70  nfigPrint(fp,cfp
13df0 29 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  );.      fprintf
13e00 28 66 70 2c 22 5c 6e 22 29 3b 0a 23 69 66 64 65  (fp,"\n");.#ifde
13e10 66 20 54 45 53 54 0a 20 20 20 20 20 20 53 65 74  f TEST.      Set
13e20 50 72 69 6e 74 28 66 70 2c 63 66 70 2d 3e 66 77  Print(fp,cfp->fw
13e30 73 2c 6c 65 6d 70 29 3b 0a 20 20 20 20 20 20 50  s,lemp);.      P
13e40 6c 69 6e 6b 50 72 69 6e 74 28 66 70 2c 63 66 70  linkPrint(fp,cfp
13e50 2d 3e 66 70 6c 70 2c 22 54 6f 20 20 22 29 3b 0a  ->fplp,"To  ");.
13e60 20 20 20 20 20 20 50 6c 69 6e 6b 50 72 69 6e 74        PlinkPrint
13e70 28 66 70 2c 63 66 70 2d 3e 62 70 6c 70 2c 22 46  (fp,cfp->bplp,"F
13e80 72 6f 6d 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20  rom");.#endif.  
13e90 20 20 20 20 69 66 28 20 6c 65 6d 70 2d 3e 62 61      if( lemp->ba
13ea0 73 69 73 66 6c 61 67 20 29 20 63 66 70 3d 63 66  sisflag ) cfp=cf
13eb0 70 2d 3e 62 70 3b 0a 20 20 20 20 20 20 65 6c 73  p->bp;.      els
13ec0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
13ed0 20 20 20 63 66 70 3d 63 66 70 2d 3e 6e 65 78 74     cfp=cfp->next
13ee0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
13ef0 6e 74 66 28 66 70 2c 22 5c 6e 22 29 3b 0a 20 20  ntf(fp,"\n");.  
13f00 20 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70    for(ap=stp->ap
13f10 3b 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78  ; ap; ap=ap->nex
13f20 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 50 72  t){.      if( Pr
13f30 69 6e 74 41 63 74 69 6f 6e 28 61 70 2c 66 70 2c  intAction(ap,fp,
13f40 33 30 29 20 29 20 66 70 72 69 6e 74 66 28 66 70  30) ) fprintf(fp
13f50 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20  ,"\n");.    }.  
13f60 20 20 66 70 72 69 6e 74 66 28 66 70 2c 22 5c 6e    fprintf(fp,"\n
13f70 22 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  ");.  }.  fclose
13f80 28 66 70 29 3b 0a 20 20 72 65 74 75 72 6e 3b 0a  (fp);.  return;.
13f90 7d 0a 0a 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  }../* Search for
13fa0 20 74 68 65 20 66 69 6c 65 20 22 6e 61 6d 65 22   the file "name"
13fb0 20 77 68 69 63 68 20 69 73 20 69 6e 20 74 68 65   which is in the
13fc0 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
13fd0 61 73 0a 2a 2a 20 74 68 65 20 65 78 61 63 75 74  as.** the exacut
13fe0 61 62 6c 65 20 2a 2f 0a 50 52 49 56 41 54 45 20  able */.PRIVATE 
13ff0 63 68 61 72 20 2a 70 61 74 68 73 65 61 72 63 68  char *pathsearch
14000 28 61 72 67 76 30 2c 6e 61 6d 65 2c 6d 6f 64 65  (argv0,name,mode
14010 6d 61 73 6b 29 0a 63 68 61 72 20 2a 61 72 67 76  mask).char *argv
14020 30 3b 0a 63 68 61 72 20 2a 6e 61 6d 65 3b 0a 69  0;.char *name;.i
14030 6e 74 20 6d 6f 64 65 6d 61 73 6b 3b 0a 7b 0a 20  nt modemask;.{. 
14040 20 63 68 61 72 20 2a 70 61 74 68 6c 69 73 74 3b   char *pathlist;
14050 0a 20 20 63 68 61 72 20 2a 70 61 74 68 2c 2a 63  .  char *path,*c
14060 70 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 65  p;.  char c;.  e
14070 78 74 65 72 6e 20 69 6e 74 20 61 63 63 65 73 73  xtern int access
14080 28 29 3b 0a 0a 23 69 66 64 65 66 20 5f 5f 57 49  ();..#ifdef __WI
14090 4e 33 32 5f 5f 0a 20 20 63 70 20 3d 20 73 74 72  N32__.  cp = str
140a0 72 63 68 72 28 61 72 67 76 30 2c 27 5c 5c 27 29  rchr(argv0,'\\')
140b0 3b 0a 23 65 6c 73 65 0a 20 20 63 70 20 3d 20 73  ;.#else.  cp = s
140c0 74 72 72 63 68 72 28 61 72 67 76 30 2c 27 2f 27  trrchr(argv0,'/'
140d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
140e0 63 70 20 29 7b 0a 20 20 20 20 63 20 3d 20 2a 63  cp ){.    c = *c
140f0 70 3b 0a 20 20 20 20 2a 63 70 20 3d 20 30 3b 0a  p;.    *cp = 0;.
14100 20 20 20 20 70 61 74 68 20 3d 20 28 63 68 61 72      path = (char
14110 20 2a 29 6d 61 6c 6c 6f 63 28 20 73 74 72 6c 65   *)malloc( strle
14120 6e 28 61 72 67 76 30 29 20 2b 20 73 74 72 6c 65  n(argv0) + strle
14130 6e 28 6e 61 6d 65 29 20 2b 20 32 20 29 3b 0a 20  n(name) + 2 );. 
14140 20 20 20 69 66 28 20 70 61 74 68 20 29 20 73 70     if( path ) sp
14150 72 69 6e 74 66 28 70 61 74 68 2c 22 25 73 2f 25  rintf(path,"%s/%
14160 73 22 2c 61 72 67 76 30 2c 6e 61 6d 65 29 3b 0a  s",argv0,name);.
14170 20 20 20 20 2a 63 70 20 3d 20 63 3b 0a 20 20 7d      *cp = c;.  }
14180 65 6c 73 65 7b 0a 20 20 20 20 65 78 74 65 72 6e  else{.    extern
14190 20 63 68 61 72 20 2a 67 65 74 65 6e 76 28 29 3b   char *getenv();
141a0 0a 20 20 20 20 70 61 74 68 6c 69 73 74 20 3d 20  .    pathlist = 
141b0 67 65 74 65 6e 76 28 22 50 41 54 48 22 29 3b 0a  getenv("PATH");.
141c0 20 20 20 20 69 66 28 20 70 61 74 68 6c 69 73 74      if( pathlist
141d0 3d 3d 30 20 29 20 70 61 74 68 6c 69 73 74 20 3d  ==0 ) pathlist =
141e0 20 22 2e 3a 2f 62 69 6e 3a 2f 75 73 72 2f 62 69   ".:/bin:/usr/bi
141f0 6e 22 3b 0a 20 20 20 20 70 61 74 68 20 3d 20 28  n";.    path = (
14200 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 20 73  char *)malloc( s
14210 74 72 6c 65 6e 28 70 61 74 68 6c 69 73 74 29 2b  trlen(pathlist)+
14220 73 74 72 6c 65 6e 28 6e 61 6d 65 29 2b 32 20 29  strlen(name)+2 )
14230 3b 0a 20 20 20 20 69 66 28 20 70 61 74 68 21 3d  ;.    if( path!=
14240 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  0 ){.      while
14250 28 20 2a 70 61 74 68 6c 69 73 74 20 29 7b 0a 20  ( *pathlist ){. 
14260 20 20 20 20 20 20 20 63 70 20 3d 20 73 74 72 63         cp = strc
14270 68 72 28 70 61 74 68 6c 69 73 74 2c 27 3a 27 29  hr(pathlist,':')
14280 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 70  ;.        if( cp
14290 3d 3d 30 20 29 20 63 70 20 3d 20 26 70 61 74 68  ==0 ) cp = &path
142a0 6c 69 73 74 5b 73 74 72 6c 65 6e 28 70 61 74 68  list[strlen(path
142b0 6c 69 73 74 29 5d 3b 0a 20 20 20 20 20 20 20 20  list)];.        
142c0 63 20 3d 20 2a 63 70 3b 0a 20 20 20 20 20 20 20  c = *cp;.       
142d0 20 2a 63 70 20 3d 20 30 3b 0a 20 20 20 20 20 20   *cp = 0;.      
142e0 20 20 73 70 72 69 6e 74 66 28 70 61 74 68 2c 22    sprintf(path,"
142f0 25 73 2f 25 73 22 2c 70 61 74 68 6c 69 73 74 2c  %s/%s",pathlist,
14300 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 2a  name);.        *
14310 63 70 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  cp = c;.        
14320 69 66 28 20 63 3d 3d 30 20 29 20 70 61 74 68 6c  if( c==0 ) pathl
14330 69 73 74 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  ist = "";.      
14340 20 20 65 6c 73 65 20 70 61 74 68 6c 69 73 74 20    else pathlist 
14350 3d 20 26 63 70 5b 31 5d 3b 0a 20 20 20 20 20 20  = &cp[1];.      
14360 20 20 69 66 28 20 61 63 63 65 73 73 28 70 61 74    if( access(pat
14370 68 2c 6d 6f 64 65 6d 61 73 6b 29 3d 3d 30 20 29  h,modemask)==0 )
14380 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
14390 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
143a0 72 6e 20 70 61 74 68 3b 0a 7d 0a 0a 2f 2a 20 47  rn path;.}../* G
143b0 69 76 65 6e 20 61 6e 20 61 63 74 69 6f 6e 2c 20  iven an action, 
143c0 63 6f 6d 70 75 74 65 20 74 68 65 20 69 6e 74 65  compute the inte
143d0 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ger value for th
143e0 61 74 20 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69  at action.** whi
143f0 63 68 20 69 73 20 74 6f 20 62 65 20 70 75 74 20  ch is to be put 
14400 69 6e 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  in the action ta
14410 62 6c 65 20 6f 66 20 74 68 65 20 67 65 6e 65 72  ble of the gener
14420 61 74 65 64 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  ated machine..**
14430 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
14440 20 69 66 20 6e 6f 20 61 63 74 69 6f 6e 20 73 68   if no action sh
14450 6f 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74 65  ould be generate
14460 64 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20 69 6e  d..*/.PRIVATE in
14470 74 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e  t compute_action
14480 28 6c 65 6d 70 2c 61 70 29 0a 73 74 72 75 63 74  (lemp,ap).struct
14490 20 6c 65 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 73 74   lemon *lemp;.st
144a0 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 3b  ruct action *ap;
144b0 0a 7b 0a 20 20 69 6e 74 20 61 63 74 3b 0a 20 20  .{.  int act;.  
144c0 73 77 69 74 63 68 28 20 61 70 2d 3e 74 79 70 65  switch( ap->type
144d0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 48 49   ){.    case SHI
144e0 46 54 3a 20 20 61 63 74 20 3d 20 61 70 2d 3e 78  FT:  act = ap->x
144f0 2e 73 74 70 2d 3e 69 6e 64 65 78 3b 20 20 20 20  .stp->index;    
14500 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
14510 3b 0a 20 20 20 20 63 61 73 65 20 52 45 44 55 43  ;.    case REDUC
14520 45 3a 20 61 63 74 20 3d 20 61 70 2d 3e 78 2e 72  E: act = ap->x.r
14530 70 2d 3e 69 6e 64 65 78 20 2b 20 6c 65 6d 70 2d  p->index + lemp-
14540 3e 6e 73 74 61 74 65 3b 20 62 72 65 61 6b 3b 0a  >nstate; break;.
14550 20 20 20 20 63 61 73 65 20 45 52 52 4f 52 3a 20      case ERROR: 
14560 20 61 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74   act = lemp->nst
14570 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c  ate + lemp->nrul
14580 65 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  e;     break;.  
14590 20 20 63 61 73 65 20 41 43 43 45 50 54 3a 20 61    case ACCEPT: a
145a0 63 74 20 3d 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  ct = lemp->nstat
145b0 65 20 2b 20 6c 65 6d 70 2d 3e 6e 72 75 6c 65 20  e + lemp->nrule 
145c0 2b 20 31 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  + 1; break;.    
145d0 64 65 66 61 75 6c 74 3a 20 20 20 20 20 61 63 74  default:     act
145e0 20 3d 20 2d 31 3b 20 62 72 65 61 6b 3b 0a 20 20   = -1; break;.  
145f0 7d 0a 20 20 72 65 74 75 72 6e 20 61 63 74 3b 0a  }.  return act;.
14600 7d 0a 0a 23 64 65 66 69 6e 65 20 4c 49 4e 45 53  }..#define LINES
14610 49 5a 45 20 31 30 30 30 0a 2f 2a 20 54 68 65 20  IZE 1000./* The 
14620 6e 65 78 74 20 63 6c 75 73 74 65 72 20 6f 66 20  next cluster of 
14630 72 6f 75 74 69 6e 65 73 20 61 72 65 20 66 6f 72  routines are for
14640 20 72 65 61 64 69 6e 67 20 74 68 65 20 74 65 6d   reading the tem
14650 70 6c 61 74 65 20 66 69 6c 65 0a 2a 2a 20 61 6e  plate file.** an
14660 64 20 77 72 69 74 69 6e 67 20 74 68 65 20 72 65  d writing the re
14670 73 75 6c 74 73 20 74 6f 20 74 68 65 20 67 65 6e  sults to the gen
14680 65 72 61 74 65 64 20 70 61 72 73 65 72 20 2a 2f  erated parser */
14690 0a 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 75  ./* The first fu
146a0 6e 63 74 69 6f 6e 20 74 72 61 6e 73 66 65 72 73  nction transfers
146b0 20 64 61 74 61 20 66 72 6f 6d 20 22 69 6e 22 20   data from "in" 
146c0 74 6f 20 22 6f 75 74 22 20 75 6e 74 69 6c 0a 2a  to "out" until.*
146d0 2a 20 61 20 6c 69 6e 65 20 69 73 20 73 65 65 6e  * a line is seen
146e0 20 77 68 69 63 68 20 62 65 67 69 6e 73 20 77 69   which begins wi
146f0 74 68 20 22 25 25 22 2e 20 20 54 68 65 20 6c 69  th "%%".  The li
14700 6e 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20  ne number is.** 
14710 74 72 61 63 6b 65 64 2e 0a 2a 2a 0a 2a 2a 20 69  tracked..**.** i
14720 66 20 6e 61 6d 65 21 3d 30 2c 20 74 68 65 6e 20  f name!=0, then 
14730 61 6e 79 20 77 6f 72 64 20 74 68 61 74 20 62 65  any word that be
14740 67 69 6e 20 77 69 74 68 20 22 50 61 72 73 65 22  gin with "Parse"
14750 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 2a   is changed to.*
14760 2a 20 62 65 67 69 6e 20 77 69 74 68 20 2a 6e 61  * begin with *na
14770 6d 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 50  me instead..*/.P
14780 52 49 56 41 54 45 20 76 6f 69 64 20 74 70 6c 74  RIVATE void tplt
14790 5f 78 66 65 72 28 6e 61 6d 65 2c 69 6e 2c 6f 75  _xfer(name,in,ou
147a0 74 2c 6c 69 6e 65 6e 6f 29 0a 63 68 61 72 20 2a  t,lineno).char *
147b0 6e 61 6d 65 3b 0a 46 49 4c 45 20 2a 69 6e 3b 0a  name;.FILE *in;.
147c0 46 49 4c 45 20 2a 6f 75 74 3b 0a 69 6e 74 20 2a  FILE *out;.int *
147d0 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 6e 74 20  lineno;.{.  int 
147e0 69 2c 20 69 53 74 61 72 74 3b 0a 20 20 63 68 61  i, iStart;.  cha
147f0 72 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d  r line[LINESIZE]
14800 3b 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74 73  ;.  while( fgets
14810 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a 45 2c 69  (line,LINESIZE,i
14820 6e 29 20 26 26 20 28 6c 69 6e 65 5b 30 5d 21 3d  n) && (line[0]!=
14830 27 25 27 20 7c 7c 20 6c 69 6e 65 5b 31 5d 21 3d  '%' || line[1]!=
14840 27 25 27 29 20 29 7b 0a 20 20 20 20 28 2a 6c 69  '%') ){.    (*li
14850 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 69 53 74  neno)++;.    iSt
14860 61 72 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  art = 0;.    if(
14870 20 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 66   name ){.      f
14880 6f 72 28 69 3d 30 3b 20 6c 69 6e 65 5b 69 5d 3b  or(i=0; line[i];
14890 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
148a0 66 28 20 6c 69 6e 65 5b 69 5d 3d 3d 27 50 27 20  f( line[i]=='P' 
148b0 26 26 20 73 74 72 6e 63 6d 70 28 26 6c 69 6e 65  && strncmp(&line
148c0 5b 69 5d 2c 22 50 61 72 73 65 22 2c 35 29 3d 3d  [i],"Parse",5)==
148d0 30 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 28  0.          && (
148e0 69 3d 3d 30 20 7c 7c 20 21 69 73 61 6c 70 68 61  i==0 || !isalpha
148f0 28 6c 69 6e 65 5b 69 2d 31 5d 29 29 0a 20 20 20  (line[i-1])).   
14900 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
14910 20 20 69 66 28 20 69 3e 69 53 74 61 72 74 20 29    if( i>iStart )
14920 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e   fprintf(out,"%.
14930 2a 73 22 2c 69 2d 69 53 74 61 72 74 2c 26 6c 69  *s",i-iStart,&li
14940 6e 65 5b 69 53 74 61 72 74 5d 29 3b 0a 20 20 20  ne[iStart]);.   
14950 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
14960 75 74 2c 22 25 73 22 2c 6e 61 6d 65 29 3b 0a 20  ut,"%s",name);. 
14970 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b           i += 4;
14980 0a 20 20 20 20 20 20 20 20 20 20 69 53 74 61 72  .          iStar
14990 74 20 3d 20 69 2b 31 3b 0a 20 20 20 20 20 20 20  t = i+1;.       
149a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
149b0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
149c0 2c 22 25 73 22 2c 26 6c 69 6e 65 5b 69 53 74 61  ,"%s",&line[iSta
149d0 72 74 5d 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  rt]);.  }.}../* 
149e0 54 68 65 20 6e 65 78 74 20 66 75 6e 63 74 69 6f  The next functio
149f0 6e 20 66 69 6e 64 73 20 74 68 65 20 74 65 6d 70  n finds the temp
14a00 6c 61 74 65 20 66 69 6c 65 20 61 6e 64 20 6f 70  late file and op
14a10 65 6e 73 20 69 74 2c 20 72 65 74 75 72 6e 69 6e  ens it, returnin
14a20 67 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  g.** a pointer t
14a30 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c  o the opened fil
14a40 65 2e 20 2a 2f 0a 50 52 49 56 41 54 45 20 46 49  e. */.PRIVATE FI
14a50 4c 45 20 2a 74 70 6c 74 5f 6f 70 65 6e 28 6c 65  LE *tplt_open(le
14a60 6d 70 29 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e  mp).struct lemon
14a70 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 73 74 61 74   *lemp;.{.  stat
14a80 69 63 20 63 68 61 72 20 74 65 6d 70 6c 61 74 65  ic char template
14a90 6e 61 6d 65 5b 5d 20 3d 20 22 6c 65 6d 70 61 72  name[] = "lempar
14aa0 2e 63 22 3b 0a 20 20 63 68 61 72 20 62 75 66 5b  .c";.  char buf[
14ab0 31 30 30 30 5d 3b 0a 20 20 46 49 4c 45 20 2a 69  1000];.  FILE *i
14ac0 6e 3b 0a 20 20 63 68 61 72 20 2a 74 70 6c 74 6e  n;.  char *tpltn
14ad0 61 6d 65 3b 0a 20 20 63 68 61 72 20 2a 63 70 3b  ame;.  char *cp;
14ae0 0a 0a 20 20 63 70 20 3d 20 73 74 72 72 63 68 72  ..  cp = strrchr
14af0 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d 65 2c  (lemp->filename,
14b00 27 2e 27 29 3b 0a 20 20 69 66 28 20 63 70 20 29  '.');.  if( cp )
14b10 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 62 75  {.    sprintf(bu
14b20 66 2c 22 25 2e 2a 73 2e 6c 74 22 2c 28 69 6e 74  f,"%.*s.lt",(int
14b30 29 28 63 70 2d 6c 65 6d 70 2d 3e 66 69 6c 65 6e  )(cp-lemp->filen
14b40 61 6d 65 29 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  ame),lemp->filen
14b50 61 6d 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ame);.  }else{. 
14b60 20 20 20 73 70 72 69 6e 74 66 28 62 75 66 2c 22     sprintf(buf,"
14b70 25 73 2e 6c 74 22 2c 6c 65 6d 70 2d 3e 66 69 6c  %s.lt",lemp->fil
14b80 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66  ename);.  }.  if
14b90 28 20 61 63 63 65 73 73 28 62 75 66 2c 30 30 34  ( access(buf,004
14ba0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74  )==0 ){.    tplt
14bb0 6e 61 6d 65 20 3d 20 62 75 66 3b 0a 20 20 7d 65  name = buf;.  }e
14bc0 6c 73 65 20 69 66 28 20 61 63 63 65 73 73 28 74  lse if( access(t
14bd0 65 6d 70 6c 61 74 65 6e 61 6d 65 2c 30 30 34 29  emplatename,004)
14be0 3d 3d 30 20 29 7b 0a 20 20 20 20 74 70 6c 74 6e  ==0 ){.    tpltn
14bf0 61 6d 65 20 3d 20 74 65 6d 70 6c 61 74 65 6e 61  ame = templatena
14c00 6d 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  me;.  }else{.   
14c10 20 74 70 6c 74 6e 61 6d 65 20 3d 20 70 61 74 68   tpltname = path
14c20 73 65 61 72 63 68 28 6c 65 6d 70 2d 3e 61 72 67  search(lemp->arg
14c30 76 30 2c 74 65 6d 70 6c 61 74 65 6e 61 6d 65 2c  v0,templatename,
14c40 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 70  0);.  }.  if( tp
14c50 6c 74 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  ltname==0 ){.   
14c60 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
14c70 22 43 61 6e 27 74 20 66 69 6e 64 20 74 68 65 20  "Can't find the 
14c80 70 61 72 73 65 72 20 64 72 69 76 65 72 20 74 65  parser driver te
14c90 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c 22 25 73  mplate file \"%s
14ca0 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20 74 65 6d 70  \".\n",.    temp
14cb0 6c 61 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c  latename);.    l
14cc0 65 6d 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b  emp->errorcnt++;
14cd0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
14ce0 20 7d 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28   }.  in = fopen(
14cf0 74 70 6c 74 6e 61 6d 65 2c 22 72 22 29 3b 0a 20  tpltname,"r");. 
14d00 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 20   if( in==0 ){.  
14d10 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
14d20 2c 22 43 61 6e 27 74 20 6f 70 65 6e 20 74 68 65  ,"Can't open the
14d30 20 74 65 6d 70 6c 61 74 65 20 66 69 6c 65 20 5c   template file \
14d40 22 25 73 5c 22 2e 5c 6e 22 2c 74 65 6d 70 6c 61  "%s\".\n",templa
14d50 74 65 6e 61 6d 65 29 3b 0a 20 20 20 20 6c 65 6d  tename);.    lem
14d60 70 2d 3e 65 72 72 6f 72 63 6e 74 2b 2b 3b 0a 20  p->errorcnt++;. 
14d70 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
14d80 0a 20 20 72 65 74 75 72 6e 20 69 6e 3b 0a 7d 0a  .  return in;.}.
14d90 0a 2f 2a 20 50 72 69 6e 74 20 61 20 73 74 72 69  ./* Print a stri
14da0 6e 67 20 74 6f 20 74 68 65 20 66 69 6c 65 20 61  ng to the file a
14db0 6e 64 20 6b 65 65 70 20 74 68 65 20 6c 69 6e 65  nd keep the line
14dc0 6e 75 6d 62 65 72 20 75 70 20 74 6f 20 64 61 74  number up to dat
14dd0 65 20 2a 2f 0a 50 52 49 56 41 54 45 20 76 6f 69  e */.PRIVATE voi
14de0 64 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74  d tplt_print(out
14df0 2c 6c 65 6d 70 2c 73 74 72 2c 73 74 72 6c 6e 2c  ,lemp,str,strln,
14e00 6c 69 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a 6f 75  lineno).FILE *ou
14e10 74 3b 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  t;.struct lemon 
14e20 2a 6c 65 6d 70 3b 0a 63 68 61 72 20 2a 73 74 72  *lemp;.char *str
14e30 3b 0a 69 6e 74 20 73 74 72 6c 6e 3b 0a 69 6e 74  ;.int strln;.int
14e40 20 2a 6c 69 6e 65 6e 6f 3b 0a 7b 0a 20 20 69 66   *lineno;.{.  if
14e50 28 20 73 74 72 3d 3d 30 20 29 20 72 65 74 75 72  ( str==0 ) retur
14e60 6e 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  n;.  fprintf(out
14e70 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c  ,"#line %d \"%s\
14e80 22 5c 6e 22 2c 73 74 72 6c 6e 2c 6c 65 6d 70 2d  "\n",strln,lemp-
14e90 3e 66 69 6c 65 6e 61 6d 65 29 3b 20 28 2a 6c 69  >filename); (*li
14ea0 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 77 68 69 6c 65  neno)++;.  while
14eb0 28 20 2a 73 74 72 20 29 7b 0a 20 20 20 20 69 66  ( *str ){.    if
14ec0 28 20 2a 73 74 72 3d 3d 27 5c 6e 27 20 29 20 28  ( *str=='\n' ) (
14ed0 2a 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20  *lineno)++;.    
14ee0 70 75 74 63 28 2a 73 74 72 2c 6f 75 74 29 3b 0a  putc(*str,out);.
14ef0 20 20 20 20 73 74 72 2b 2b 3b 0a 20 20 7d 0a 20      str++;.  }. 
14f00 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 6e   fprintf(out,"\n
14f10 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c  #line %d \"%s\"\
14f20 6e 22 2c 2a 6c 69 6e 65 6e 6f 2b 32 2c 6c 65 6d  n",*lineno+2,lem
14f30 70 2d 3e 6f 75 74 6e 61 6d 65 29 3b 20 28 2a 6c  p->outname); (*l
14f40 69 6e 65 6e 6f 29 2b 3d 32 3b 0a 20 20 72 65 74  ineno)+=2;.  ret
14f50 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  urn;.}../*.** Th
14f60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
14f70 69 6e 65 20 65 6d 69 74 73 20 63 6f 64 65 20 66  ine emits code f
14f80 6f 72 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  or the destructo
14f90 72 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 79 6d  r for the.** sym
14fa0 62 6f 6c 20 73 70 0a 2a 2f 0a 76 6f 69 64 20 65  bol sp.*/.void e
14fb0 6d 69 74 5f 64 65 73 74 72 75 63 74 6f 72 5f 63  mit_destructor_c
14fc0 6f 64 65 28 6f 75 74 2c 73 70 2c 6c 65 6d 70 2c  ode(out,sp,lemp,
14fd0 6c 69 6e 65 6e 6f 29 0a 46 49 4c 45 20 2a 6f 75  lineno).FILE *ou
14fe0 74 3b 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  t;.struct symbol
14ff0 20 2a 73 70 3b 0a 73 74 72 75 63 74 20 6c 65 6d   *sp;.struct lem
15000 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20 2a 6c  on *lemp;.int *l
15010 69 6e 65 6e 6f 3b 0a 7b 0a 20 63 68 61 72 20 2a  ineno;.{. char *
15020 63 70 20 3d 20 30 3b 0a 0a 20 69 6e 74 20 6c 69  cp = 0;.. int li
15030 6e 65 63 6e 74 20 3d 20 30 3b 0a 20 69 66 28 20  necnt = 0;. if( 
15040 73 70 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e  sp->type==TERMIN
15050 41 4c 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65  AL ){.   cp = le
15060 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 3b 0a 20  mp->tokendest;. 
15070 20 20 69 66 28 20 63 70 3d 3d 30 20 29 20 72 65    if( cp==0 ) re
15080 74 75 72 6e 3b 0a 20 20 20 66 70 72 69 6e 74 66  turn;.   fprintf
15090 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25 64 20 5c  (out,"#line %d \
150a0 22 25 73 5c 22 5c 6e 7b 22 2c 6c 65 6d 70 2d 3e  "%s\"\n{",lemp->
150b0 74 6f 6b 65 6e 64 65 73 74 6c 6e 2c 6c 65 6d 70  tokendestln,lemp
150c0 2d 3e 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 7d 65  ->filename);. }e
150d0 6c 73 65 20 69 66 28 20 73 70 2d 3e 64 65 73 74  lse if( sp->dest
150e0 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 63 70 20  ructor ){.   cp 
150f0 3d 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72  = sp->destructor
15100 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  ;.   fprintf(out
15110 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c  ,"#line %d \"%s\
15120 22 5c 6e 7b 22 2c 73 70 2d 3e 64 65 73 74 72 75  "\n{",sp->destru
15130 63 74 6f 72 6c 6e 2c 6c 65 6d 70 2d 3e 66 69 6c  ctorln,lemp->fil
15140 65 6e 61 6d 65 29 3b 0a 20 7d 65 6c 73 65 20 69  ename);. }else i
15150 66 28 20 6c 65 6d 70 2d 3e 76 61 72 64 65 73 74  f( lemp->vardest
15160 20 29 7b 0a 20 20 20 63 70 20 3d 20 6c 65 6d 70   ){.   cp = lemp
15170 2d 3e 76 61 72 64 65 73 74 3b 0a 20 20 20 69 66  ->vardest;.   if
15180 28 20 63 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( cp==0 ) return
15190 3b 0a 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  ;.   fprintf(out
151a0 2c 22 23 6c 69 6e 65 20 25 64 20 5c 22 25 73 5c  ,"#line %d \"%s\
151b0 22 5c 6e 7b 22 2c 6c 65 6d 70 2d 3e 76 61 72 64  "\n{",lemp->vard
151c0 65 73 74 6c 6e 2c 6c 65 6d 70 2d 3e 66 69 6c 65  estln,lemp->file
151d0 6e 61 6d 65 29 3b 0a 20 7d 65 6c 73 65 7b 0a 20  name);. }else{. 
151e0 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 20 20    assert( 0 );  
151f0 2f 2a 20 43 61 6e 6e 6f 74 20 68 61 70 70 65 6e  /* Cannot happen
15200 20 2a 2f 0a 20 7d 0a 20 66 6f 72 28 3b 20 2a 63   */. }. for(; *c
15210 70 3b 20 63 70 2b 2b 29 7b 0a 20 20 20 69 66 28  p; cp++){.   if(
15220 20 2a 63 70 3d 3d 27 24 27 20 26 26 20 63 70 5b   *cp=='$' && cp[
15230 31 5d 3d 3d 27 24 27 20 29 7b 0a 20 20 20 20 20  1]=='$' ){.     
15240 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 28 79 79  fprintf(out,"(yy
15250 70 6d 69 6e 6f 72 2d 3e 79 79 25 64 29 22 2c 73  pminor->yy%d)",s
15260 70 2d 3e 64 74 6e 75 6d 29 3b 0a 20 20 20 20 20  p->dtnum);.     
15270 63 70 2b 2b 3b 0a 20 20 20 20 20 63 6f 6e 74 69  cp++;.     conti
15280 6e 75 65 3b 0a 20 20 20 7d 0a 20 20 20 69 66 28  nue;.   }.   if(
15290 20 2a 63 70 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e   *cp=='\n' ) lin
152a0 65 63 6e 74 2b 2b 3b 0a 20 20 20 66 70 75 74 63  ecnt++;.   fputc
152b0 28 2a 63 70 2c 6f 75 74 29 3b 0a 20 7d 0a 20 28  (*cp,out);. }. (
152c0 2a 6c 69 6e 65 6e 6f 29 20 2b 3d 20 33 20 2b 20  *lineno) += 3 + 
152d0 6c 69 6e 65 63 6e 74 3b 0a 20 66 70 72 69 6e 74  linecnt;. fprint
152e0 66 28 6f 75 74 2c 22 7d 5c 6e 23 6c 69 6e 65 20  f(out,"}\n#line 
152f0 25 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 2a 6c 69  %d \"%s\"\n",*li
15300 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f 75 74 6e 61  neno,lemp->outna
15310 6d 65 29 3b 0a 20 72 65 74 75 72 6e 3b 0a 7d 0a  me);. return;.}.
15320 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
15330 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69 66  UE (non-zero) if
15340 20 74 68 65 20 67 69 76 65 6e 20 73 79 6d 62 6f   the given symbo
15350 6c 20 68 61 73 20 61 20 64 65 73 74 72 75 63 74  l has a destruct
15360 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 68 61 73 5f 64  or..*/.int has_d
15370 65 73 74 72 75 63 74 6f 72 28 73 70 2c 20 6c 65  estructor(sp, le
15380 6d 70 29 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  mp).struct symbo
15390 6c 20 2a 73 70 3b 0a 73 74 72 75 63 74 20 6c 65  l *sp;.struct le
153a0 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 7b 0a 20 20 69  mon *lemp;.{.  i
153b0 6e 74 20 72 65 74 3b 0a 20 20 69 66 28 20 73 70  nt ret;.  if( sp
153c0 2d 3e 74 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c  ->type==TERMINAL
153d0 20 29 7b 0a 20 20 20 20 72 65 74 20 3d 20 6c 65   ){.    ret = le
153e0 6d 70 2d 3e 74 6f 6b 65 6e 64 65 73 74 21 3d 30  mp->tokendest!=0
153f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
15400 65 74 20 3d 20 6c 65 6d 70 2d 3e 76 61 72 64 65  et = lemp->varde
15410 73 74 21 3d 30 20 7c 7c 20 73 70 2d 3e 64 65 73  st!=0 || sp->des
15420 74 72 75 63 74 6f 72 21 3d 30 3b 0a 20 20 7d 0a  tructor!=0;.  }.
15430 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
15440 0a 2f 2a 20 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ./* .** Generate
15450 20 63 6f 64 65 20 77 68 69 63 68 20 65 78 65 63   code which exec
15460 75 74 65 73 20 77 68 65 6e 20 74 68 65 20 72 75  utes when the ru
15470 6c 65 20 22 72 70 22 20 69 73 20 72 65 64 75 63  le "rp" is reduc
15480 65 64 2e 20 20 57 72 69 74 65 0a 2a 2a 20 74 68  ed.  Write.** th
15490 65 20 63 6f 64 65 20 74 6f 20 22 6f 75 74 22 2e  e code to "out".
154a0 20 20 4d 61 6b 65 20 73 75 72 65 20 6c 69 6e 65    Make sure line
154b0 6e 6f 20 73 74 61 79 73 20 75 70 2d 74 6f 2d 64  no stays up-to-d
154c0 61 74 65 2e 0a 2a 2f 0a 50 52 49 56 41 54 45 20  ate..*/.PRIVATE 
154d0 76 6f 69 64 20 65 6d 69 74 5f 63 6f 64 65 28 6f  void emit_code(o
154e0 75 74 2c 72 70 2c 6c 65 6d 70 2c 6c 69 6e 65 6e  ut,rp,lemp,linen
154f0 6f 29 0a 46 49 4c 45 20 2a 6f 75 74 3b 0a 73 74  o).FILE *out;.st
15500 72 75 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 73  ruct rule *rp;.s
15510 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
15520 70 3b 0a 69 6e 74 20 2a 6c 69 6e 65 6e 6f 3b 0a  p;.int *lineno;.
15530 7b 0a 20 63 68 61 72 20 2a 63 70 2c 20 2a 78 70  {. char *cp, *xp
15540 3b 0a 20 69 6e 74 20 6c 69 6e 65 63 6e 74 20 3d  ;. int linecnt =
15550 20 30 3b 0a 20 69 6e 74 20 69 3b 0a 20 63 68 61   0;. int i;. cha
15560 72 20 6c 68 73 75 73 65 64 20 3d 20 30 3b 20 20  r lhsused = 0;  
15570 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
15580 20 4c 48 53 20 65 6c 65 6d 65 6e 74 20 68 61 73   LHS element has
15590 20 62 65 65 6e 20 75 73 65 64 20 2a 2f 0a 20 63   been used */. c
155a0 68 61 72 20 75 73 65 64 5b 4d 41 58 52 48 53 5d  har used[MAXRHS]
155b0 3b 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20  ;   /* True for 
155c0 65 61 63 68 20 52 48 53 20 65 6c 65 6d 65 6e 74  each RHS element
155d0 20 77 68 69 63 68 20 69 73 20 75 73 65 64 20 2a   which is used *
155e0 2f 0a 0a 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72  /.. for(i=0; i<r
155f0 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 20 75 73  p->nrhs; i++) us
15600 65 64 5b 69 5d 20 3d 20 30 3b 0a 20 6c 68 73 75  ed[i] = 0;. lhsu
15610 73 65 64 20 3d 20 30 3b 0a 0a 20 2f 2a 20 47 65  sed = 0;.. /* Ge
15620 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 64  nerate code to d
15630 6f 20 74 68 65 20 72 65 64 75 63 65 20 61 63 74  o the reduce act
15640 69 6f 6e 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e  ion */. if( rp->
15650 63 6f 64 65 20 29 7b 0a 20 20 20 66 70 72 69 6e  code ){.   fprin
15660 74 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 25 64  tf(out,"#line %d
15670 20 5c 22 25 73 5c 22 5c 6e 7b 22 2c 72 70 2d 3e   \"%s\"\n{",rp->
15680 6c 69 6e 65 2c 6c 65 6d 70 2d 3e 66 69 6c 65 6e  line,lemp->filen
15690 61 6d 65 29 3b 0a 20 20 20 66 6f 72 28 63 70 3d  ame);.   for(cp=
156a0 72 70 2d 3e 63 6f 64 65 3b 20 2a 63 70 3b 20 63  rp->code; *cp; c
156b0 70 2b 2b 29 7b 0a 20 20 20 20 20 69 66 28 20 69  p++){.     if( i
156c0 73 61 6c 70 68 61 28 2a 63 70 29 20 26 26 20 28  salpha(*cp) && (
156d0 63 70 3d 3d 72 70 2d 3e 63 6f 64 65 20 7c 7c 20  cp==rp->code || 
156e0 28 21 69 73 61 6c 6e 75 6d 28 63 70 5b 2d 31 5d  (!isalnum(cp[-1]
156f0 29 20 26 26 20 63 70 5b 2d 31 5d 21 3d 27 5f 27  ) && cp[-1]!='_'
15700 29 29 20 29 7b 0a 20 20 20 20 20 20 20 63 68 61  )) ){.       cha
15710 72 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20  r saved;.       
15720 66 6f 72 28 78 70 3d 20 26 63 70 5b 31 5d 3b 20  for(xp= &cp[1]; 
15730 69 73 61 6c 6e 75 6d 28 2a 78 70 29 20 7c 7c 20  isalnum(*xp) || 
15740 2a 78 70 3d 3d 27 5f 27 3b 20 78 70 2b 2b 29 3b  *xp=='_'; xp++);
15750 0a 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20  .       saved = 
15760 2a 78 70 3b 0a 20 20 20 20 20 20 20 2a 78 70 20  *xp;.       *xp 
15770 3d 20 30 3b 0a 20 20 20 20 20 20 20 69 66 28 20  = 0;.       if( 
15780 72 70 2d 3e 6c 68 73 61 6c 69 61 73 20 26 26 20  rp->lhsalias && 
15790 73 74 72 63 6d 70 28 63 70 2c 72 70 2d 3e 6c 68  strcmp(cp,rp->lh
157a0 73 61 6c 69 61 73 29 3d 3d 30 20 29 7b 0a 20 20  salias)==0 ){.  
157b0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
157c0 75 74 2c 22 79 79 67 6f 74 6f 6d 69 6e 6f 72 2e  ut,"yygotominor.
157d0 79 79 25 64 22 2c 72 70 2d 3e 6c 68 73 2d 3e 64  yy%d",rp->lhs->d
157e0 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  tnum);.         
157f0 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20 20 20  cp = xp;.       
15800 20 20 6c 68 73 75 73 65 64 20 3d 20 31 3b 0a 20    lhsused = 1;. 
15810 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15820 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
15830 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b 29 7b  <rp->nrhs; i++){
15840 0a 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20  .           if( 
15850 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b 69 5d 20  rp->rhsalias[i] 
15860 26 26 20 73 74 72 63 6d 70 28 63 70 2c 72 70 2d  && strcmp(cp,rp-
15870 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3d 3d 30  >rhsalias[i])==0
15880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
15890 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 79 79   fprintf(out,"yy
158a0 6d 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 2e 79 79  msp[%d].minor.yy
158b0 25 64 22 2c 69 2d 72 70 2d 3e 6e 72 68 73 2b 31  %d",i-rp->nrhs+1
158c0 2c 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 64 74 6e  ,rp->rhs[i]->dtn
158d0 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  um);.           
158e0 20 20 63 70 20 3d 20 78 70 3b 0a 20 20 20 20 20    cp = xp;.     
158f0 20 20 20 20 20 20 20 20 75 73 65 64 5b 69 5d 20          used[i] 
15900 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
15910 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
15920 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 7d      }.         }
15930 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  .       }.      
15940 20 2a 78 70 20 3d 20 73 61 76 65 64 3b 0a 20 20   *xp = saved;.  
15950 20 20 20 7d 0a 20 20 20 20 20 69 66 28 20 2a 63     }.     if( *c
15960 70 3d 3d 27 5c 6e 27 20 29 20 6c 69 6e 65 63 6e  p=='\n' ) linecn
15970 74 2b 2b 3b 0a 20 20 20 20 20 66 70 75 74 63 28  t++;.     fputc(
15980 2a 63 70 2c 6f 75 74 29 3b 0a 20 20 20 7d 20 2f  *cp,out);.   } /
15990 2a 20 45 6e 64 20 6c 6f 6f 70 20 2a 2f 0a 20 20  * End loop */.  
159a0 20 28 2a 6c 69 6e 65 6e 6f 29 20 2b 3d 20 33 20   (*lineno) += 3 
159b0 2b 20 6c 69 6e 65 63 6e 74 3b 0a 20 20 20 66 70  + linecnt;.   fp
159c0 72 69 6e 74 66 28 6f 75 74 2c 22 7d 5c 6e 23 6c  rintf(out,"}\n#l
159d0 69 6e 65 20 25 64 20 5c 22 25 73 5c 22 5c 6e 22  ine %d \"%s\"\n"
159e0 2c 2a 6c 69 6e 65 6e 6f 2c 6c 65 6d 70 2d 3e 6f  ,*lineno,lemp->o
159f0 75 74 6e 61 6d 65 29 3b 0a 20 7d 20 2f 2a 20 45  utname);. } /* E
15a00 6e 64 20 69 66 28 20 72 70 2d 3e 63 6f 64 65 20  nd if( rp->code 
15a10 29 20 2a 2f 0a 0a 20 2f 2a 20 43 68 65 63 6b 20  ) */.. /* Check 
15a20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65  to make sure the
15a30 20 4c 48 53 20 68 61 73 20 62 65 65 6e 20 75 73   LHS has been us
15a40 65 64 20 2a 2f 0a 20 69 66 28 20 72 70 2d 3e 6c  ed */. if( rp->l
15a50 68 73 61 6c 69 61 73 20 26 26 20 21 6c 68 73 75  hsalias && !lhsu
15a60 73 65 64 20 29 7b 0a 20 20 20 45 72 72 6f 72 4d  sed ){.   ErrorM
15a70 73 67 28 6c 65 6d 70 2d 3e 66 69 6c 65 6e 61 6d  sg(lemp->filenam
15a80 65 2c 72 70 2d 3e 72 75 6c 65 6c 69 6e 65 2c 0a  e,rp->ruleline,.
15a90 20 20 20 20 20 22 4c 61 62 65 6c 20 5c 22 25 73       "Label \"%s
15aa0 5c 22 20 66 6f 72 20 5c 22 25 73 28 25 73 29 5c  \" for \"%s(%s)\
15ab0 22 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e  " is never used.
15ac0 22 2c 0a 20 20 20 20 20 20 20 72 70 2d 3e 6c 68  ",.       rp->lh
15ad0 73 61 6c 69 61 73 2c 72 70 2d 3e 6c 68 73 2d 3e  salias,rp->lhs->
15ae0 6e 61 6d 65 2c 72 70 2d 3e 6c 68 73 61 6c 69 61  name,rp->lhsalia
15af0 73 29 3b 0a 20 20 20 6c 65 6d 70 2d 3e 65 72 72  s);.   lemp->err
15b00 6f 72 63 6e 74 2b 2b 3b 0a 20 7d 0a 0a 20 2f 2a  orcnt++;. }.. /*
15b10 20 47 65 6e 65 72 61 74 65 20 64 65 73 74 72 75   Generate destru
15b20 63 74 6f 72 20 63 6f 64 65 20 66 6f 72 20 52 48  ctor code for RH
15b30 53 20 73 79 6d 62 6f 6c 73 20 77 68 69 63 68 20  S symbols which 
15b40 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20  are not used in 
15b50 74 68 65 0a 20 2a 2a 20 72 65 64 75 63 65 20 63  the. ** reduce c
15b60 6f 64 65 20 2a 2f 0a 20 66 6f 72 28 69 3d 30 3b  ode */. for(i=0;
15b70 20 69 3c 72 70 2d 3e 6e 72 68 73 3b 20 69 2b 2b   i<rp->nrhs; i++
15b80 29 7b 0a 20 20 20 69 66 28 20 72 70 2d 3e 72 68  ){.   if( rp->rh
15b90 73 61 6c 69 61 73 5b 69 5d 20 26 26 20 21 75 73  salias[i] && !us
15ba0 65 64 5b 69 5d 20 29 7b 0a 20 20 20 20 20 45 72  ed[i] ){.     Er
15bb0 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69 6c  rorMsg(lemp->fil
15bc0 65 6e 61 6d 65 2c 72 70 2d 3e 72 75 6c 65 6c 69  ename,rp->ruleli
15bd0 6e 65 2c 0a 20 20 20 20 20 20 20 22 4c 61 62 65  ne,.       "Labe
15be0 6c 20 25 73 20 66 6f 72 20 5c 22 25 73 28 25 73  l %s for \"%s(%s
15bf0 29 5c 22 20 69 73 20 6e 65 76 65 72 20 75 73 65  )\" is never use
15c00 64 2e 22 2c 0a 20 20 20 20 20 20 20 72 70 2d 3e  d.",.       rp->
15c10 72 68 73 61 6c 69 61 73 5b 69 5d 2c 72 70 2d 3e  rhsalias[i],rp->
15c20 72 68 73 5b 69 5d 2d 3e 6e 61 6d 65 2c 72 70 2d  rhs[i]->name,rp-
15c30 3e 72 68 73 61 6c 69 61 73 5b 69 5d 29 3b 0a 20  >rhsalias[i]);. 
15c40 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f 72 63      lemp->errorc
15c50 6e 74 2b 2b 3b 0a 20 20 20 7d 65 6c 73 65 20 69  nt++;.   }else i
15c60 66 28 20 72 70 2d 3e 72 68 73 61 6c 69 61 73 5b  f( rp->rhsalias[
15c70 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 69 66  i]==0 ){.     if
15c80 28 20 68 61 73 5f 64 65 73 74 72 75 63 74 6f 72  ( has_destructor
15c90 28 72 70 2d 3e 72 68 73 5b 69 5d 2c 6c 65 6d 70  (rp->rhs[i],lemp
15ca0 29 20 29 7b 0a 20 20 20 20 20 20 20 66 70 72 69  ) ){.       fpri
15cb0 6e 74 66 28 6f 75 74 2c 22 20 20 79 79 5f 64 65  ntf(out,"  yy_de
15cc0 73 74 72 75 63 74 6f 72 28 25 64 2c 26 79 79 6d  structor(%d,&yym
15cd0 73 70 5b 25 64 5d 2e 6d 69 6e 6f 72 29 3b 5c 6e  sp[%d].minor);\n
15ce0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 72 70 2d  ",.          rp-
15cf0 3e 72 68 73 5b 69 5d 2d 3e 69 6e 64 65 78 2c 69  >rhs[i]->index,i
15d00 2d 72 70 2d 3e 6e 72 68 73 2b 31 29 3b 20 28 2a  -rp->nrhs+1); (*
15d10 6c 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20  lineno)++;.     
15d20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 66 70  }else{.       fp
15d30 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
15d40 20 20 20 2f 2a 20 4e 6f 20 64 65 73 74 72 75 63     /* No destruc
15d50 74 6f 72 20 64 65 66 69 6e 65 64 20 66 6f 72 20  tor defined for 
15d60 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 20  %s */\n",.      
15d70 20 20 72 70 2d 3e 72 68 73 5b 69 5d 2d 3e 6e 61    rp->rhs[i]->na
15d80 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 28 2a 6c  me);.        (*l
15d90 69 6e 65 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 7d  ineno)++;.     }
15da0 0a 20 20 20 7d 0a 20 7d 0a 20 72 65 74 75 72 6e  .   }. }. return
15db0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ;.}../*.** Print
15dc0 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 20   the definition 
15dd0 6f 66 20 74 68 65 20 75 6e 69 6f 6e 20 75 73 65  of the union use
15de0 64 20 66 6f 72 20 74 68 65 20 70 61 72 73 65 72  d for the parser
15df0 27 73 20 64 61 74 61 20 73 74 61 63 6b 2e 0a 2a  's data stack..*
15e00 2a 20 54 68 69 73 20 75 6e 69 6f 6e 20 63 6f 6e  * This union con
15e10 74 61 69 6e 73 20 66 69 65 6c 64 73 20 66 6f 72  tains fields for
15e20 20 65 76 65 72 79 20 70 6f 73 73 69 62 6c 65 20   every possible 
15e30 64 61 74 61 20 74 79 70 65 20 66 6f 72 20 74 6f  data type for to
15e40 6b 65 6e 73 0a 2a 2a 20 61 6e 64 20 6e 6f 6e 74  kens.** and nont
15e50 65 72 6d 69 6e 61 6c 73 2e 20 20 49 6e 20 74 68  erminals.  In th
15e60 65 20 70 72 6f 63 65 73 73 20 6f 66 20 63 6f 6d  e process of com
15e70 70 75 74 69 6e 67 20 61 6e 64 20 70 72 69 6e 74  puting and print
15e80 69 6e 67 20 74 68 69 73 0a 2a 2a 20 75 6e 69 6f  ing this.** unio
15e90 6e 2c 20 61 6c 73 6f 20 73 65 74 20 74 68 65 20  n, also set the 
15ea0 22 2e 64 74 6e 75 6d 22 20 66 69 65 6c 64 20 6f  ".dtnum" field o
15eb0 66 20 65 76 65 72 79 20 74 65 72 6d 69 6e 61 6c  f every terminal
15ec0 20 61 6e 64 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c   and nonterminal
15ed0 0a 2a 2a 20 73 79 6d 62 6f 6c 2e 0a 2a 2f 0a 76  .** symbol..*/.v
15ee0 6f 69 64 20 70 72 69 6e 74 5f 73 74 61 63 6b 5f  oid print_stack_
15ef0 75 6e 69 6f 6e 28 6f 75 74 2c 6c 65 6d 70 2c 70  union(out,lemp,p
15f00 6c 69 6e 65 6e 6f 2c 6d 68 66 6c 61 67 29 0a 46  lineno,mhflag).F
15f10 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20 20 20 20  ILE *out;       
15f20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
15f30 65 20 6f 75 74 70 75 74 20 73 74 72 65 61 6d 20  e output stream 
15f40 2a 2f 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20  */.struct lemon 
15f50 2a 6c 65 6d 70 3b 20 20 20 20 20 20 20 20 20 2f  *lemp;         /
15f60 2a 20 54 68 65 20 6d 61 69 6e 20 69 6e 66 6f 20  * The main info 
15f70 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68  structure for th
15f80 69 73 20 70 61 72 73 65 72 20 2a 2f 0a 69 6e 74  is parser */.int
15f90 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20   *plineno;      
15fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
15fb0 74 65 72 20 74 6f 20 74 68 65 20 6c 69 6e 65 20  ter to the line 
15fc0 6e 75 6d 62 65 72 20 2a 2f 0a 69 6e 74 20 6d 68  number */.int mh
15fd0 66 6c 61 67 3b 20 20 20 20 20 20 20 20 20 20 20  flag;           
15fe0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
15ff0 20 67 65 6e 65 72 61 74 69 6e 67 20 6d 61 6b 65   generating make
16000 68 65 61 64 65 72 73 20 6f 75 74 70 75 74 20 2a  headers output *
16010 2f 0a 7b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f  /.{.  int lineno
16020 20 3d 20 2a 70 6c 69 6e 65 6e 6f 3b 20 20 20 20   = *plineno;    
16030 2f 2a 20 54 68 65 20 6c 69 6e 65 20 6e 75 6d 62  /* The line numb
16040 65 72 20 6f 66 20 74 68 65 20 6f 75 74 70 75 74  er of the output
16050 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 74 79 70   */.  char **typ
16060 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
16070 2f 2a 20 41 20 68 61 73 68 20 74 61 62 6c 65 20  /* A hash table 
16080 6f 66 20 64 61 74 61 74 79 70 65 73 20 2a 2f 0a  of datatypes */.
16090 20 20 69 6e 74 20 61 72 72 61 79 73 69 7a 65 3b    int arraysize;
160a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
160b0 69 7a 65 20 6f 66 20 74 68 65 20 22 74 79 70 65  ize of the "type
160c0 73 22 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  s" array */.  in
160d0 74 20 6d 61 78 64 74 6c 65 6e 67 74 68 3b 20 20  t maxdtlength;  
160e0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
160f0 75 6d 20 6c 65 6e 67 74 68 20 6f 66 20 61 6e 79  um length of any
16100 20 22 2e 64 61 74 61 74 79 70 65 22 20 66 69 65   ".datatype" fie
16110 6c 64 2e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 73  ld. */.  char *s
16120 74 64 64 74 3b 20 20 20 20 20 20 20 20 20 20 20  tddt;           
16130 20 20 20 2f 2a 20 53 74 61 6e 64 61 72 64 69 7a     /* Standardiz
16140 65 64 20 6e 61 6d 65 20 66 6f 72 20 61 20 64 61  ed name for a da
16150 74 61 74 79 70 65 20 2a 2f 0a 20 20 69 6e 74 20  tatype */.  int 
16160 69 2c 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20  i,j;            
16170 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
16180 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
16190 68 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20  hash;           
161a0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 68 61 73        /* For has
161b0 68 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66  hing the name of
161c0 20 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61   a type */.  cha
161d0 72 20 2a 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  r *name;        
161e0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
161f0 66 20 74 68 65 20 70 61 72 73 65 72 20 2a 2f 0a  f the parser */.
16200 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
16210 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 79  nd initialize ty
16220 70 65 73 5b 5d 20 61 6e 64 20 61 6c 6c 6f 63 61  pes[] and alloca
16230 74 65 20 73 74 64 64 74 5b 5d 20 2a 2f 0a 20 20  te stddt[] */.  
16240 61 72 72 61 79 73 69 7a 65 20 3d 20 6c 65 6d 70  arraysize = lemp
16250 2d 3e 6e 73 79 6d 62 6f 6c 20 2a 20 32 3b 0a 20  ->nsymbol * 2;. 
16260 20 74 79 70 65 73 20 3d 20 28 63 68 61 72 2a 2a   types = (char**
16270 29 6d 61 6c 6c 6f 63 28 20 61 72 72 61 79 73 69  )malloc( arraysi
16280 7a 65 20 2a 20 73 69 7a 65 6f 66 28 63 68 61 72  ze * sizeof(char
16290 2a 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  *) );.  for(i=0;
162a0 20 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69 2b   i<arraysize; i+
162b0 2b 29 20 74 79 70 65 73 5b 69 5d 20 3d 20 30 3b  +) types[i] = 0;
162c0 0a 20 20 6d 61 78 64 74 6c 65 6e 67 74 68 20 3d  .  maxdtlength =
162d0 20 30 3b 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e   0;.  if( lemp->
162e0 76 61 72 74 79 70 65 20 29 7b 0a 20 20 20 20 6d  vartype ){.    m
162f0 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 73 74 72  axdtlength = str
16300 6c 65 6e 28 6c 65 6d 70 2d 3e 76 61 72 74 79 70  len(lemp->vartyp
16310 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  e);.  }.  for(i=
16320 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62  0; i<lemp->nsymb
16330 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ol; i++){.    in
16340 74 20 6c 65 6e 3b 0a 20 20 20 20 73 74 72 75 63  t len;.    struc
16350 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
16360 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
16370 0a 20 20 20 20 69 66 28 20 73 70 2d 3e 64 61 74  .    if( sp->dat
16380 61 74 79 70 65 3d 3d 30 20 29 20 63 6f 6e 74 69  atype==0 ) conti
16390 6e 75 65 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 73  nue;.    len = s
163a0 74 72 6c 65 6e 28 73 70 2d 3e 64 61 74 61 74 79  trlen(sp->dataty
163b0 70 65 29 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e  pe);.    if( len
163c0 3e 6d 61 78 64 74 6c 65 6e 67 74 68 20 29 20 6d  >maxdtlength ) m
163d0 61 78 64 74 6c 65 6e 67 74 68 20 3d 20 6c 65 6e  axdtlength = len
163e0 3b 0a 20 20 7d 0a 20 20 73 74 64 64 74 20 3d 20  ;.  }.  stddt = 
163f0 28 63 68 61 72 2a 29 6d 61 6c 6c 6f 63 28 20 6d  (char*)malloc( m
16400 61 78 64 74 6c 65 6e 67 74 68 2a 32 20 2b 20 31  axdtlength*2 + 1
16410 20 29 3b 0a 20 20 69 66 28 20 74 79 70 65 73 3d   );.  if( types=
16420 3d 30 20 7c 7c 20 73 74 64 64 74 3d 3d 30 20 29  =0 || stddt==0 )
16430 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
16440 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d 65 6d  derr,"Out of mem
16450 6f 72 79 2e 5c 6e 22 29 3b 0a 20 20 20 20 65 78  ory.\n");.    ex
16460 69 74 28 31 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  it(1);.  }..  /*
16470 20 42 75 69 6c 64 20 61 20 68 61 73 68 20 74 61   Build a hash ta
16480 62 6c 65 20 6f 66 20 64 61 74 61 74 79 70 65 73  ble of datatypes
16490 2e 20 54 68 65 20 22 2e 64 74 6e 75 6d 22 20 66  . The ".dtnum" f
164a0 69 65 6c 64 20 6f 66 20 65 61 63 68 20 73 79 6d  ield of each sym
164b0 62 6f 6c 0a 20 20 2a 2a 20 69 73 20 66 69 6c 6c  bol.  ** is fill
164c0 65 64 20 69 6e 20 77 69 74 68 20 74 68 65 20 68  ed in with the h
164d0 61 73 68 20 69 6e 64 65 78 20 70 6c 75 73 20 31  ash index plus 1
164e0 2e 20 20 41 20 22 2e 64 74 6e 75 6d 22 20 76 61  .  A ".dtnum" va
164f0 6c 75 65 20 6f 66 20 30 20 69 73 0a 20 20 2a 2a  lue of 0 is.  **
16500 20 75 73 65 64 20 66 6f 72 20 74 65 72 6d 69 6e   used for termin
16510 61 6c 20 73 79 6d 62 6f 6c 73 2e 20 20 49 66 20  al symbols.  If 
16520 74 68 65 72 65 20 69 73 20 6e 6f 20 25 64 65 66  there is no %def
16530 61 75 6c 74 5f 74 79 70 65 20 64 65 66 69 6e 65  ault_type define
16540 64 20 74 68 65 6e 0a 20 20 2a 2a 20 30 20 69 73  d then.  ** 0 is
16550 20 61 6c 73 6f 20 75 73 65 64 20 61 73 20 74 68   also used as th
16560 65 20 2e 64 74 6e 75 6d 20 76 61 6c 75 65 20 66  e .dtnum value f
16570 6f 72 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 73 20  or nonterminals 
16580 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 73 70 65  which do not spe
16590 63 69 66 79 0a 20 20 2a 2a 20 61 20 64 61 74 61  cify.  ** a data
165a0 74 79 70 65 20 75 73 69 6e 67 20 74 68 65 20 25  type using the %
165b0 74 79 70 65 20 64 69 72 65 63 74 69 76 65 2e 0a  type directive..
165c0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
165d0 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b  i<lemp->nsymbol;
165e0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63   i++){.    struc
165f0 74 20 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c  t symbol *sp = l
16600 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b  emp->symbols[i];
16610 0a 20 20 20 20 63 68 61 72 20 2a 63 70 3b 0a 20  .    char *cp;. 
16620 20 20 20 69 66 28 20 73 70 3d 3d 6c 65 6d 70 2d     if( sp==lemp-
16630 3e 65 72 72 73 79 6d 20 29 7b 0a 20 20 20 20 20  >errsym ){.     
16640 20 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 61 72 72   sp->dtnum = arr
16650 61 79 73 69 7a 65 2b 31 3b 0a 20 20 20 20 20 20  aysize+1;.      
16660 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
16670 20 20 20 20 69 66 28 20 73 70 2d 3e 74 79 70 65      if( sp->type
16680 21 3d 4e 4f 4e 54 45 52 4d 49 4e 41 4c 20 7c 7c  !=NONTERMINAL ||
16690 20 28 73 70 2d 3e 64 61 74 61 74 79 70 65 3d 3d   (sp->datatype==
166a0 30 20 26 26 20 6c 65 6d 70 2d 3e 76 61 72 74 79  0 && lemp->varty
166b0 70 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  pe==0) ){.      
166c0 73 70 2d 3e 64 74 6e 75 6d 20 3d 20 30 3b 0a 20  sp->dtnum = 0;. 
166d0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
166e0 20 20 20 7d 0a 20 20 20 20 63 70 20 3d 20 73 70     }.    cp = sp
166f0 2d 3e 64 61 74 61 74 79 70 65 3b 0a 20 20 20 20  ->datatype;.    
16700 69 66 28 20 63 70 3d 3d 30 20 29 20 63 70 20 3d  if( cp==0 ) cp =
16710 20 6c 65 6d 70 2d 3e 76 61 72 74 79 70 65 3b 0a   lemp->vartype;.
16720 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 77      j = 0;.    w
16730 68 69 6c 65 28 20 69 73 73 70 61 63 65 28 2a 63  hile( isspace(*c
16740 70 29 20 29 20 63 70 2b 2b 3b 0a 20 20 20 20 77  p) ) cp++;.    w
16750 68 69 6c 65 28 20 2a 63 70 20 29 20 73 74 64 64  hile( *cp ) stdd
16760 74 5b 6a 2b 2b 5d 20 3d 20 2a 63 70 2b 2b 3b 0a  t[j++] = *cp++;.
16770 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26      while( j>0 &
16780 26 20 69 73 73 70 61 63 65 28 73 74 64 64 74 5b  & isspace(stddt[
16790 6a 2d 31 5d 29 20 29 20 6a 2d 2d 3b 0a 20 20 20  j-1]) ) j--;.   
167a0 20 73 74 64 64 74 5b 6a 5d 20 3d 20 30 3b 0a 20   stddt[j] = 0;. 
167b0 20 20 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 20     hash = 0;.   
167c0 20 66 6f 72 28 6a 3d 30 3b 20 73 74 64 64 74 5b   for(j=0; stddt[
167d0 6a 5d 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  j]; j++){.      
167e0 68 61 73 68 20 3d 20 68 61 73 68 2a 35 33 20 2b  hash = hash*53 +
167f0 20 73 74 64 64 74 5b 6a 5d 3b 0a 20 20 20 20 7d   stddt[j];.    }
16800 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73  .    hash = (has
16810 68 20 26 20 30 78 37 66 66 66 66 66 66 66 29 25  h & 0x7fffffff)%
16820 61 72 72 61 79 73 69 7a 65 3b 0a 20 20 20 20 77  arraysize;.    w
16830 68 69 6c 65 28 20 74 79 70 65 73 5b 68 61 73 68  hile( types[hash
16840 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ] ){.      if( s
16850 74 72 63 6d 70 28 74 79 70 65 73 5b 68 61 73 68  trcmp(types[hash
16860 5d 2c 73 74 64 64 74 29 3d 3d 30 20 29 7b 0a 20  ],stddt)==0 ){. 
16870 20 20 20 20 20 20 20 73 70 2d 3e 64 74 6e 75 6d         sp->dtnum
16880 20 3d 20 68 61 73 68 20 2b 20 31 3b 0a 20 20 20   = hash + 1;.   
16890 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
168a0 20 20 7d 0a 20 20 20 20 20 20 68 61 73 68 2b 2b    }.      hash++
168b0 3b 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 68  ;.      if( hash
168c0 3e 3d 61 72 72 61 79 73 69 7a 65 20 29 20 68 61  >=arraysize ) ha
168d0 73 68 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  sh = 0;.    }.  
168e0 20 20 69 66 28 20 74 79 70 65 73 5b 68 61 73 68    if( types[hash
168f0 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 70  ]==0 ){.      sp
16900 2d 3e 64 74 6e 75 6d 20 3d 20 68 61 73 68 20 2b  ->dtnum = hash +
16910 20 31 3b 0a 20 20 20 20 20 20 74 79 70 65 73 5b   1;.      types[
16920 68 61 73 68 5d 20 3d 20 28 63 68 61 72 2a 29 6d  hash] = (char*)m
16930 61 6c 6c 6f 63 28 20 73 74 72 6c 65 6e 28 73 74  alloc( strlen(st
16940 64 64 74 29 2b 31 20 29 3b 0a 20 20 20 20 20 20  ddt)+1 );.      
16950 69 66 28 20 74 79 70 65 73 5b 68 61 73 68 5d 3d  if( types[hash]=
16960 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 70  =0 ){.        fp
16970 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 4f 75  rintf(stderr,"Ou
16980 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 5c 6e 22 29  t of memory.\n")
16990 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31  ;.        exit(1
169a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
169b0 20 73 74 72 63 70 79 28 74 79 70 65 73 5b 68 61   strcpy(types[ha
169c0 73 68 5d 2c 73 74 64 64 74 29 3b 0a 20 20 20 20  sh],stddt);.    
169d0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 69 6e  }.  }..  /* Prin
169e0 74 20 6f 75 74 20 74 68 65 20 64 65 66 69 6e 69  t out the defini
169f0 74 69 6f 6e 20 6f 66 20 59 59 54 4f 4b 45 4e 54  tion of YYTOKENT
16a00 59 50 45 20 61 6e 64 20 59 59 4d 49 4e 4f 52 54  YPE and YYMINORT
16a10 59 50 45 20 2a 2f 0a 20 20 6e 61 6d 65 20 3d 20  YPE */.  name = 
16a20 6c 65 6d 70 2d 3e 6e 61 6d 65 20 3f 20 6c 65 6d  lemp->name ? lem
16a30 70 2d 3e 6e 61 6d 65 20 3a 20 22 50 61 72 73 65  p->name : "Parse
16a40 22 3b 0a 20 20 6c 69 6e 65 6e 6f 20 3d 20 2a 70  ";.  lineno = *p
16a50 6c 69 6e 65 6e 6f 3b 0a 20 20 69 66 28 20 6d 68  lineno;.  if( mh
16a60 66 6c 61 67 20 29 7b 20 66 70 72 69 6e 74 66 28  flag ){ fprintf(
16a70 6f 75 74 2c 22 23 69 66 20 49 4e 54 45 52 46 41  out,"#if INTERFA
16a80 43 45 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  CE\n"); lineno++
16a90 3b 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75  ; }.  fprintf(ou
16aa0 74 2c 22 23 64 65 66 69 6e 65 20 25 73 54 4f 4b  t,"#define %sTOK
16ab0 45 4e 54 59 50 45 20 25 73 5c 6e 22 2c 6e 61 6d  ENTYPE %s\n",nam
16ac0 65 2c 0a 20 20 20 20 6c 65 6d 70 2d 3e 74 6f 6b  e,.    lemp->tok
16ad0 65 6e 74 79 70 65 3f 6c 65 6d 70 2d 3e 74 6f 6b  entype?lemp->tok
16ae0 65 6e 74 79 70 65 3a 22 76 6f 69 64 2a 22 29 3b  entype:"void*");
16af0 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 69 66    lineno++;.  if
16b00 28 20 6d 68 66 6c 61 67 20 29 7b 20 66 70 72 69  ( mhflag ){ fpri
16b10 6e 74 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c  ntf(out,"#endif\
16b20 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 20 7d  n"); lineno++; }
16b30 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
16b40 74 79 70 65 64 65 66 20 75 6e 69 6f 6e 20 7b 5c  typedef union {\
16b50 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
16b60 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
16b70 25 73 54 4f 4b 45 4e 54 59 50 45 20 79 79 30 3b  %sTOKENTYPE yy0;
16b80 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e  \n",name); linen
16b90 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  o++;.  for(i=0; 
16ba0 69 3c 61 72 72 61 79 73 69 7a 65 3b 20 69 2b 2b  i<arraysize; i++
16bb0 29 7b 0a 20 20 20 20 69 66 28 20 74 79 70 65 73  ){.    if( types
16bc0 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  [i]==0 ) continu
16bd0 65 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f  e;.    fprintf(o
16be0 75 74 2c 22 20 20 25 73 20 79 79 25 64 3b 5c 6e  ut,"  %s yy%d;\n
16bf0 22 2c 74 79 70 65 73 5b 69 5d 2c 69 2b 31 29 3b  ",types[i],i+1);
16c00 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
16c10 72 65 65 28 74 79 70 65 73 5b 69 5d 29 3b 0a 20  ree(types[i]);. 
16c20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74   }.  fprintf(out
16c30 2c 22 20 20 69 6e 74 20 79 79 25 64 3b 5c 6e 22  ,"  int yy%d;\n"
16c40 2c 6c 65 6d 70 2d 3e 65 72 72 73 79 6d 2d 3e 64  ,lemp->errsym->d
16c50 74 6e 75 6d 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  tnum); lineno++;
16c60 0a 20 20 66 72 65 65 28 73 74 64 64 74 29 3b 0a  .  free(stddt);.
16c70 20 20 66 72 65 65 28 74 79 70 65 73 29 3b 0a 20    free(types);. 
16c80 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 7d 20   fprintf(out,"} 
16c90 59 59 4d 49 4e 4f 52 54 59 50 45 3b 5c 6e 22 29  YYMINORTYPE;\n")
16ca0 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 2a 70  ; lineno++;.  *p
16cb0 6c 69 6e 65 6e 6f 20 3d 20 6c 69 6e 65 6e 6f 3b  lineno = lineno;
16cc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
16cd0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 43   the name of a C
16ce0 20 64 61 74 61 74 79 70 65 20 61 62 6c 65 20 74   datatype able t
16cf0 6f 20 72 65 70 72 65 73 65 6e 74 20 76 61 6c 75  o represent valu
16d00 65 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 6c 77  es between.** lw
16d10 72 20 61 6e 64 20 75 70 72 2c 20 69 6e 63 6c 75  r and upr, inclu
16d20 73 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sive..*/.static 
16d30 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 69 6e 69  const char *mini
16d40 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 69 6e  mum_size_type(in
16d50 74 20 6c 77 72 2c 20 69 6e 74 20 75 70 72 29 7b  t lwr, int upr){
16d60 0a 20 20 69 66 28 20 6c 77 72 3e 3d 30 20 29 7b  .  if( lwr>=0 ){
16d70 0a 20 20 20 20 69 66 28 20 75 70 72 3c 3d 32 35  .    if( upr<=25
16d80 35 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  5 ){.      retur
16d90 6e 20 22 75 6e 73 69 67 6e 65 64 20 63 68 61 72  n "unsigned char
16da0 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
16db0 20 75 70 72 3c 36 35 35 33 35 20 29 7b 0a 20 20   upr<65535 ){.  
16dc0 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69      return "unsi
16dd0 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 22 3b  gned short int";
16de0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16df0 20 20 72 65 74 75 72 6e 20 22 75 6e 73 69 67 6e    return "unsign
16e00 65 64 20 69 6e 74 22 3b 0a 20 20 20 20 7d 0a 20  ed int";.    }. 
16e10 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
16e20 2d 31 32 37 20 26 26 20 75 70 72 3c 3d 31 32 37  -127 && upr<=127
16e30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22   ){.    return "
16e40 73 69 67 6e 65 64 20 63 68 61 72 22 3b 0a 20 20  signed char";.  
16e50 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d 2d  }else if( lwr>=-
16e60 33 32 37 36 37 20 26 26 20 75 70 72 3c 33 32 37  32767 && upr<327
16e70 36 37 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  67 ){.    return
16e80 20 22 73 68 6f 72 74 22 3b 0a 20 20 7d 65 6c 73   "short";.  }els
16e90 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22 69  e{.    return "i
16ea0 6e 74 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  nt";.  }.}../*.*
16eb0 2a 20 45 61 63 68 20 73 74 61 74 65 20 63 6f 6e  * Each state con
16ec0 74 61 69 6e 73 20 61 20 73 65 74 20 6f 66 20 74  tains a set of t
16ed0 6f 6b 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e  oken transaction
16ee0 20 61 6e 64 20 61 20 73 65 74 20 6f 66 0a 2a 2a   and a set of.**
16ef0 20 6e 6f 6e 74 65 72 6d 69 6e 61 6c 20 74 72 61   nonterminal tra
16f00 6e 73 61 63 74 69 6f 6e 73 2e 20 20 45 61 63 68  nsactions.  Each
16f10 20 6f 66 20 74 68 65 73 65 20 73 65 74 73 20 6d   of these sets m
16f20 61 6b 65 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  akes an instance
16f30 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
16f40 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20  wing structure. 
16f50 20 41 6e 20 61 72 72 61 79 20 6f 66 20 74 68 65   An array of the
16f60 73 65 20 73 74 72 75 63 74 75 72 65 73 20 69 73  se structures is
16f70 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6f 72 64 65   used.** to orde
16f80 72 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  r the creation o
16f90 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
16fa0 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 74 61 62   yy_action[] tab
16fb0 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 61 78  le..*/.struct ax
16fc0 73 65 74 20 7b 0a 20 20 73 74 72 75 63 74 20 73  set {.  struct s
16fd0 74 61 74 65 20 2a 73 74 70 3b 20 20 20 2f 2a 20  tate *stp;   /* 
16fe0 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  A pointer to a s
16ff0 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73  tate */.  int is
17000 54 6b 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Tkn;           /
17010 2a 20 54 72 75 65 20 74 6f 20 75 73 65 20 74 6f  * True to use to
17020 6b 65 6e 73 2e 20 20 46 61 6c 73 65 20 66 6f 72  kens.  False for
17030 20 6e 6f 6e 2d 74 65 72 6d 69 6e 61 6c 73 20 2a   non-terminals *
17040 2f 0a 20 20 69 6e 74 20 6e 41 63 74 69 6f 6e 3b  /.  int nAction;
17050 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
17060 65 72 20 6f 66 20 61 63 74 69 6f 6e 73 20 2a 2f  er of actions */
17070 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  .};../*.** Compa
17080 72 65 20 74 6f 20 61 78 73 65 74 20 73 74 72 75  re to axset stru
17090 63 74 75 72 65 73 20 66 6f 72 20 73 6f 72 74 69  ctures for sorti
170a0 6e 67 20 70 75 72 70 6f 73 65 73 0a 2a 2f 0a 73  ng purposes.*/.s
170b0 74 61 74 69 63 20 69 6e 74 20 61 78 73 65 74 5f  tatic int axset_
170c0 63 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 76 6f  compare(const vo
170d0 69 64 20 2a 61 2c 20 63 6f 6e 73 74 20 76 6f 69  id *a, const voi
170e0 64 20 2a 62 29 7b 0a 20 20 73 74 72 75 63 74 20  d *b){.  struct 
170f0 61 78 73 65 74 20 2a 70 31 20 3d 20 28 73 74 72  axset *p1 = (str
17100 75 63 74 20 61 78 73 65 74 2a 29 61 3b 0a 20 20  uct axset*)a;.  
17110 73 74 72 75 63 74 20 61 78 73 65 74 20 2a 70 32  struct axset *p2
17120 20 3d 20 28 73 74 72 75 63 74 20 61 78 73 65 74   = (struct axset
17130 2a 29 62 3b 0a 20 20 72 65 74 75 72 6e 20 70 32  *)b;.  return p2
17140 2d 3e 6e 41 63 74 69 6f 6e 20 2d 20 70 31 2d 3e  ->nAction - p1->
17150 6e 41 63 74 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 20 47  nAction;.}../* G
17160 65 6e 65 72 61 74 65 20 43 20 73 6f 75 72 63 65  enerate C source
17170 20 63 6f 64 65 20 66 6f 72 20 74 68 65 20 70 61   code for the pa
17180 72 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70  rser */.void Rep
17190 6f 72 74 54 61 62 6c 65 28 6c 65 6d 70 2c 20 6d  ortTable(lemp, m
171a0 68 66 6c 61 67 29 0a 73 74 72 75 63 74 20 6c 65  hflag).struct le
171b0 6d 6f 6e 20 2a 6c 65 6d 70 3b 0a 69 6e 74 20 6d  mon *lemp;.int m
171c0 68 66 6c 61 67 3b 20 20 20 20 20 2f 2a 20 4f 75  hflag;     /* Ou
171d0 74 70 75 74 20 69 6e 20 6d 61 6b 65 68 65 61 64  tput in makehead
171e0 65 72 73 20 66 6f 72 6d 61 74 20 69 66 20 74 72  ers format if tr
171f0 75 65 20 2a 2f 0a 7b 0a 20 20 46 49 4c 45 20 2a  ue */.{.  FILE *
17200 6f 75 74 2c 20 2a 69 6e 3b 0a 20 20 63 68 61 72  out, *in;.  char
17210 20 6c 69 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b   line[LINESIZE];
17220 0a 20 20 69 6e 74 20 20 6c 69 6e 65 6e 6f 3b 0a  .  int  lineno;.
17230 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20 2a    struct state *
17240 73 74 70 3b 0a 20 20 73 74 72 75 63 74 20 61 63  stp;.  struct ac
17250 74 69 6f 6e 20 2a 61 70 3b 0a 20 20 73 74 72 75  tion *ap;.  stru
17260 63 74 20 72 75 6c 65 20 2a 72 70 3b 0a 20 20 73  ct rule *rp;.  s
17270 74 72 75 63 74 20 61 63 74 74 61 62 20 2a 70 41  truct acttab *pA
17280 63 74 74 61 62 3b 0a 20 20 69 6e 74 20 69 2c 20  cttab;.  int i, 
17290 6a 2c 20 6e 3b 0a 20 20 63 68 61 72 20 2a 6e 61  j, n;.  char *na
172a0 6d 65 3b 0a 20 20 69 6e 74 20 6d 6e 54 6b 6e 4f  me;.  int mnTknO
172b0 66 73 74 2c 20 6d 78 54 6b 6e 4f 66 73 74 3b 0a  fst, mxTknOfst;.
172c0 20 20 69 6e 74 20 6d 6e 4e 74 4f 66 73 74 2c 20    int mnNtOfst, 
172d0 6d 78 4e 74 4f 66 73 74 3b 0a 20 20 73 74 72 75  mxNtOfst;.  stru
172e0 63 74 20 61 78 73 65 74 20 2a 61 78 3b 0a 0a 20  ct axset *ax;.. 
172f0 20 69 6e 20 3d 20 74 70 6c 74 5f 6f 70 65 6e 28   in = tplt_open(
17300 6c 65 6d 70 29 3b 0a 20 20 69 66 28 20 69 6e 3d  lemp);.  if( in=
17310 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f  =0 ) return;.  o
17320 75 74 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28 6c  ut = file_open(l
17330 65 6d 70 2c 22 2e 63 22 2c 22 77 22 29 3b 0a 20  emp,".c","w");. 
17340 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b 0a 20   if( out==0 ){. 
17350 20 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20     fclose(in);. 
17360 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
17370 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 74   lineno = 1;.  t
17380 70 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e  plt_xfer(lemp->n
17390 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65  ame,in,out,&line
173a0 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72  no);..  /* Gener
173b0 61 74 65 20 74 68 65 20 69 6e 63 6c 75 64 65 20  ate the include 
173c0 63 6f 64 65 2c 20 69 66 20 61 6e 79 20 2a 2f 0a  code, if any */.
173d0 20 20 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74    tplt_print(out
173e0 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 69 6e 63 6c  ,lemp,lemp->incl
173f0 75 64 65 2c 6c 65 6d 70 2d 3e 69 6e 63 6c 75 64  ude,lemp->includ
17400 65 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  eln,&lineno);.  
17410 69 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20  if( mhflag ){.  
17420 20 20 63 68 61 72 20 2a 6e 61 6d 65 20 3d 20 66    char *name = f
17430 69 6c 65 5f 6d 61 6b 65 6e 61 6d 65 28 6c 65 6d  ile_makename(lem
17440 70 2c 20 22 2e 68 22 29 3b 0a 20 20 20 20 66 70  p, ".h");.    fp
17450 72 69 6e 74 66 28 6f 75 74 2c 22 23 69 6e 63 6c  rintf(out,"#incl
17460 75 64 65 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 6e  ude \"%s\"\n", n
17470 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  ame); lineno++;.
17480 20 20 20 20 66 72 65 65 28 6e 61 6d 65 29 3b 0a      free(name);.
17490 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28    }.  tplt_xfer(
174a0 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
174b0 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
174c0 2a 20 47 65 6e 65 72 61 74 65 20 23 64 65 66 69  * Generate #defi
174d0 6e 65 73 20 66 6f 72 20 61 6c 6c 20 74 6f 6b 65  nes for all toke
174e0 6e 73 20 2a 2f 0a 20 20 69 66 28 20 6d 68 66 6c  ns */.  if( mhfl
174f0 61 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  ag ){.    char *
17500 70 72 65 66 69 78 3b 0a 20 20 20 20 66 70 72 69  prefix;.    fpri
17510 6e 74 66 28 6f 75 74 2c 22 23 69 66 20 49 4e 54  ntf(out,"#if INT
17520 45 52 46 41 43 45 5c 6e 22 29 3b 20 6c 69 6e 65  ERFACE\n"); line
17530 6e 6f 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6c 65  no++;.    if( le
17540 6d 70 2d 3e 74 6f 6b 65 6e 70 72 65 66 69 78 20  mp->tokenprefix 
17550 29 20 70 72 65 66 69 78 20 3d 20 6c 65 6d 70 2d  ) prefix = lemp-
17560 3e 74 6f 6b 65 6e 70 72 65 66 69 78 3b 0a 20 20  >tokenprefix;.  
17570 20 20 65 6c 73 65 20 20 20 20 20 20 20 20 20 20    else          
17580 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78            prefix
17590 20 3d 20 22 22 3b 0a 20 20 20 20 66 6f 72 28 69   = "";.    for(i
175a0 3d 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72  =1; i<lemp->nter
175b0 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  minal; i++){.   
175c0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
175d0 23 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20  #define %s%-30s 
175e0 25 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65  %2d\n",prefix,le
175f0 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e  mp->symbols[i]->
17600 6e 61 6d 65 2c 69 29 3b 0a 20 20 20 20 20 20 6c  name,i);.      l
17610 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ineno++;.    }. 
17620 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
17630 23 65 6e 64 69 66 5c 6e 22 29 3b 20 6c 69 6e 65  #endif\n"); line
17640 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74  no++;.  }.  tplt
17650 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65  _xfer(lemp->name
17660 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29  ,in,out,&lineno)
17670 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65  ;..  /* Generate
17680 20 74 68 65 20 64 65 66 69 6e 65 73 20 2a 2f 0a   the defines */.
17690 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 2f    fprintf(out,"/
176a0 2a 20 5c 30 30 31 20 2a 2f 5c 6e 22 29 3b 0a 20  * \001 */\n");. 
176b0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
176c0 65 66 69 6e 65 20 59 59 43 4f 44 45 54 59 50 45  efine YYCODETYPE
176d0 20 25 73 5c 6e 22 2c 0a 20 20 20 20 6d 69 6e 69   %s\n",.    mini
176e0 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 30 2c  mum_size_type(0,
176f0 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 2b 35   lemp->nsymbol+5
17700 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  )); lineno++;.  
17710 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
17720 66 69 6e 65 20 59 59 4e 4f 43 4f 44 45 20 25 64  fine YYNOCODE %d
17730 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f  \n",lemp->nsymbo
17740 6c 2b 31 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  l+1);  lineno++;
17750 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
17760 23 64 65 66 69 6e 65 20 59 59 41 43 54 49 4f 4e  #define YYACTION
17770 54 59 50 45 20 25 73 5c 6e 22 2c 0a 20 20 20 20  TYPE %s\n",.    
17780 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79 70  minimum_size_typ
17790 65 28 30 2c 20 6c 65 6d 70 2d 3e 6e 73 74 61 74  e(0, lemp->nstat
177a0 65 2b 6c 65 6d 70 2d 3e 6e 72 75 6c 65 2b 35 29  e+lemp->nrule+5)
177b0 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  );  lineno++;.  
177c0 70 72 69 6e 74 5f 73 74 61 63 6b 5f 75 6e 69 6f  print_stack_unio
177d0 6e 28 6f 75 74 2c 6c 65 6d 70 2c 26 6c 69 6e 65  n(out,lemp,&line
177e0 6e 6f 2c 6d 68 66 6c 61 67 29 3b 0a 20 20 69 66  no,mhflag);.  if
177f0 28 20 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a  ( lemp->stacksiz
17800 65 20 29 7b 0a 20 20 20 20 69 66 28 20 61 74 6f  e ){.    if( ato
17810 69 28 6c 65 6d 70 2d 3e 73 74 61 63 6b 73 69 7a  i(lemp->stacksiz
17820 65 29 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 45  e)<=0 ){.      E
17830 72 72 6f 72 4d 73 67 28 6c 65 6d 70 2d 3e 66 69  rrorMsg(lemp->fi
17840 6c 65 6e 61 6d 65 2c 30 2c 0a 22 49 6c 6c 65 67  lename,0,."Illeg
17850 61 6c 20 73 74 61 63 6b 20 73 69 7a 65 3a 20 5b  al stack size: [
17860 25 73 5d 2e 20 20 54 68 65 20 73 74 61 63 6b 20  %s].  The stack 
17870 73 69 7a 65 20 73 68 6f 75 6c 64 20 62 65 20 61  size should be a
17880 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73 74 61  n integer consta
17890 6e 74 2e 22 2c 0a 20 20 20 20 20 20 20 20 6c 65  nt.",.        le
178a0 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 29 3b 0a  mp->stacksize);.
178b0 20 20 20 20 20 20 6c 65 6d 70 2d 3e 65 72 72 6f        lemp->erro
178c0 72 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 6c 65  rcnt++;.      le
178d0 6d 70 2d 3e 73 74 61 63 6b 73 69 7a 65 20 3d 20  mp->stacksize = 
178e0 22 31 30 30 22 3b 0a 20 20 20 20 7d 0a 20 20 20  "100";.    }.   
178f0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
17900 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44 45 50  efine YYSTACKDEP
17910 54 48 20 25 73 5c 6e 22 2c 6c 65 6d 70 2d 3e 73  TH %s\n",lemp->s
17920 74 61 63 6b 73 69 7a 65 29 3b 20 20 6c 69 6e 65  tacksize);  line
17930 6e 6f 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  no++;.  }else{. 
17940 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
17950 23 64 65 66 69 6e 65 20 59 59 53 54 41 43 4b 44  #define YYSTACKD
17960 45 50 54 48 20 31 30 30 5c 6e 22 29 3b 20 20 6c  EPTH 100\n");  l
17970 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 69  ineno++;.  }.  i
17980 66 28 20 6d 68 66 6c 61 67 20 29 7b 0a 20 20 20  f( mhflag ){.   
17990 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 69   fprintf(out,"#i
179a0 66 20 49 4e 54 45 52 46 41 43 45 5c 6e 22 29 3b  f INTERFACE\n");
179b0 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20   lineno++;.  }. 
179c0 20 6e 61 6d 65 20 3d 20 6c 65 6d 70 2d 3e 6e 61   name = lemp->na
179d0 6d 65 20 3f 20 6c 65 6d 70 2d 3e 6e 61 6d 65 20  me ? lemp->name 
179e0 3a 20 22 50 61 72 73 65 22 3b 0a 20 20 69 66 28  : "Parse";.  if(
179f0 20 6c 65 6d 70 2d 3e 61 72 67 20 26 26 20 6c 65   lemp->arg && le
17a00 6d 70 2d 3e 61 72 67 5b 30 5d 20 29 7b 0a 20 20  mp->arg[0] ){.  
17a10 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 20 3d    int i;.    i =
17a20 20 73 74 72 6c 65 6e 28 6c 65 6d 70 2d 3e 61 72   strlen(lemp->ar
17a30 67 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  g);.    while( i
17a40 3e 3d 31 20 26 26 20 69 73 73 70 61 63 65 28 6c  >=1 && isspace(l
17a50 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d 29 20 29  emp->arg[i-1]) )
17a60 20 69 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28   i--;.    while(
17a70 20 69 3e 3d 31 20 26 26 20 28 69 73 61 6c 6e 75   i>=1 && (isalnu
17a80 6d 28 6c 65 6d 70 2d 3e 61 72 67 5b 69 2d 31 5d  m(lemp->arg[i-1]
17a90 29 20 7c 7c 20 6c 65 6d 70 2d 3e 61 72 67 5b 69  ) || lemp->arg[i
17aa0 2d 31 5d 3d 3d 27 5f 27 29 20 29 20 69 2d 2d 3b  -1]=='_') ) i--;
17ab0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
17ac0 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
17ad0 53 44 45 43 4c 20 25 73 3b 5c 6e 22 2c 6e 61 6d  SDECL %s;\n",nam
17ae0 65 2c 6c 65 6d 70 2d 3e 61 72 67 29 3b 20 20 6c  e,lemp->arg);  l
17af0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
17b00 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
17b10 65 20 25 73 41 52 47 5f 50 44 45 43 4c 20 2c 25  e %sARG_PDECL ,%
17b20 73 5c 6e 22 2c 6e 61 6d 65 2c 6c 65 6d 70 2d 3e  s\n",name,lemp->
17b30 61 72 67 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  arg);  lineno++;
17b40 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74  .    fprintf(out
17b50 2c 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f  ,"#define %sARG_
17b60 46 45 54 43 48 20 25 73 20 3d 20 79 79 70 50 61  FETCH %s = yypPa
17b70 72 73 65 72 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20  rser->%s\n",.   
17b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61                na
17b90 6d 65 2c 6c 65 6d 70 2d 3e 61 72 67 2c 26 6c 65  me,lemp->arg,&le
17ba0 6d 70 2d 3e 61 72 67 5b 69 5d 29 3b 20 20 6c 69  mp->arg[i]);  li
17bb0 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69  neno++;.    fpri
17bc0 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65  ntf(out,"#define
17bd0 20 25 73 41 52 47 5f 53 54 4f 52 45 20 79 79 70   %sARG_STORE yyp
17be0 50 61 72 73 65 72 2d 3e 25 73 20 3d 20 25 73 5c  Parser->%s = %s\
17bf0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
17c00 20 20 20 20 20 6e 61 6d 65 2c 26 6c 65 6d 70 2d       name,&lemp-
17c10 3e 61 72 67 5b 69 5d 2c 26 6c 65 6d 70 2d 3e 61  >arg[i],&lemp->a
17c20 72 67 5b 69 5d 29 3b 20 20 6c 69 6e 65 6e 6f 2b  rg[i]);  lineno+
17c30 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
17c40 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64 65  fprintf(out,"#de
17c50 66 69 6e 65 20 25 73 41 52 47 5f 53 44 45 43 4c  fine %sARG_SDECL
17c60 5c 6e 22 2c 6e 61 6d 65 29 3b 20 20 6c 69 6e 65  \n",name);  line
17c70 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72 69 6e 74  no++;.    fprint
17c80 66 28 6f 75 74 2c 22 23 64 65 66 69 6e 65 20 25  f(out,"#define %
17c90 73 41 52 47 5f 50 44 45 43 4c 5c 6e 22 2c 6e 61  sARG_PDECL\n",na
17ca0 6d 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  me);  lineno++;.
17cb0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
17cc0 22 23 64 65 66 69 6e 65 20 25 73 41 52 47 5f 46  "#define %sARG_F
17cd0 45 54 43 48 5c 6e 22 2c 6e 61 6d 65 29 3b 20 6c  ETCH\n",name); l
17ce0 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66 70 72  ineno++;.    fpr
17cf0 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
17d00 65 20 25 73 41 52 47 5f 53 54 4f 52 45 5c 6e 22  e %sARG_STORE\n"
17d10 2c 6e 61 6d 65 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ,name); lineno++
17d20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 68 66 6c  ;.  }.  if( mhfl
17d30 61 67 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74  ag ){.    fprint
17d40 66 28 6f 75 74 2c 22 23 65 6e 64 69 66 5c 6e 22  f(out,"#endif\n"
17d50 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
17d60 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
17d70 23 64 65 66 69 6e 65 20 59 59 4e 53 54 41 54 45  #define YYNSTATE
17d80 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 73 74   %d\n",lemp->nst
17d90 61 74 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b  ate);  lineno++;
17da0 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22  .  fprintf(out,"
17db0 23 64 65 66 69 6e 65 20 59 59 4e 52 55 4c 45 20  #define YYNRULE 
17dc0 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 6e 72 75 6c  %d\n",lemp->nrul
17dd0 65 29 3b 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  e);  lineno++;. 
17de0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23 64   fprintf(out,"#d
17df0 65 66 69 6e 65 20 59 59 45 52 52 4f 52 53 59 4d  efine YYERRORSYM
17e00 42 4f 4c 20 25 64 5c 6e 22 2c 6c 65 6d 70 2d 3e  BOL %d\n",lemp->
17e10 65 72 72 73 79 6d 2d 3e 69 6e 64 65 78 29 3b 20  errsym->index); 
17e20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 70 72   lineno++;.  fpr
17e30 69 6e 74 66 28 6f 75 74 2c 22 23 64 65 66 69 6e  intf(out,"#defin
17e40 65 20 59 59 45 52 52 53 59 4d 44 54 20 79 79 25  e YYERRSYMDT yy%
17e50 64 5c 6e 22 2c 6c 65 6d 70 2d 3e 65 72 72 73 79  d\n",lemp->errsy
17e60 6d 2d 3e 64 74 6e 75 6d 29 3b 20 20 6c 69 6e 65  m->dtnum);  line
17e70 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 6c 65 6d 70  no++;.  if( lemp
17e80 2d 3e 68 61 73 5f 66 61 6c 6c 62 61 63 6b 20 29  ->has_fallback )
17e90 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75  {.    fprintf(ou
17ea0 74 2c 22 23 64 65 66 69 6e 65 20 59 59 46 41 4c  t,"#define YYFAL
17eb0 4c 42 41 43 4b 20 31 5c 6e 22 29 3b 20 20 6c 69  LBACK 1\n");  li
17ec0 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d 0a 20 20 74 70  neno++;.  }.  tp
17ed0 6c 74 5f 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61  lt_xfer(lemp->na
17ee0 6d 65 2c 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e  me,in,out,&linen
17ef0 6f 29 3b 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61  o);..  /* Genera
17f00 74 65 20 74 68 65 20 61 63 74 69 6f 6e 20 74 61  te the action ta
17f10 62 6c 65 20 61 6e 64 20 69 74 73 20 61 73 73 6f  ble and its asso
17f20 63 69 61 74 65 73 3a 0a 20 20 2a 2a 0a 20 20 2a  ciates:.  **.  *
17f30 2a 20 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 20  *  yy_action[]  
17f40 20 20 20 20 20 20 41 20 73 69 6e 67 6c 65 20 74        A single t
17f50 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
17f60 61 6c 6c 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a  all actions..  *
17f70 2a 20 20 79 79 5f 6c 6f 6f 6b 61 68 65 61 64 5b  *  yy_lookahead[
17f80 5d 20 20 20 20 20 41 20 74 61 62 6c 65 20 63 6f  ]     A table co
17f90 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 6f 6f  ntaining the loo
17fa0 6b 61 68 65 61 64 20 66 6f 72 20 65 61 63 68 20  kahead for each 
17fb0 65 6e 74 72 79 20 69 6e 0a 20 20 2a 2a 20 20 20  entry in.  **   
17fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fd0 20 20 79 79 5f 61 63 74 69 6f 6e 2e 20 20 55 73    yy_action.  Us
17fe0 65 64 20 74 6f 20 64 65 74 65 63 74 20 68 61 73  ed to detect has
17ff0 68 20 63 6f 6c 6c 69 73 69 6f 6e 73 2e 0a 20 20  h collisions..  
18000 2a 2a 20 20 79 79 5f 73 68 69 66 74 5f 6f 66 73  **  yy_shift_ofs
18010 74 5b 5d 20 20 20 20 46 6f 72 20 65 61 63 68 20  t[]    For each 
18020 73 74 61 74 65 2c 20 74 68 65 20 6f 66 66 73 65  state, the offse
18030 74 20 69 6e 74 6f 20 79 79 5f 61 63 74 69 6f 6e  t into yy_action
18040 20 66 6f 72 0a 20 20 2a 2a 20 20 20 20 20 20 20   for.  **       
18050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68                sh
18060 69 66 74 69 6e 67 20 74 65 72 6d 69 6e 61 6c 73  ifting terminals
18070 2e 0a 20 20 2a 2a 20 20 79 79 5f 72 65 64 75 63  ..  **  yy_reduc
18080 65 5f 6f 66 73 74 5b 5d 20 20 20 46 6f 72 20 65  e_ofst[]   For e
18090 61 63 68 20 73 74 61 74 65 2c 20 74 68 65 20 6f  ach state, the o
180a0 66 66 73 65 74 20 69 6e 74 6f 20 79 79 5f 61 63  ffset into yy_ac
180b0 74 69 6f 6e 20 66 6f 72 0a 20 20 2a 2a 20 20 20  tion for.  **   
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180d0 20 20 73 68 69 66 74 69 6e 67 20 6e 6f 6e 2d 74    shifting non-t
180e0 65 72 6d 69 6e 61 6c 73 20 61 66 74 65 72 20 61  erminals after a
180f0 20 72 65 64 75 63 65 2e 0a 20 20 2a 2a 20 20 79   reduce..  **  y
18100 79 5f 64 65 66 61 75 6c 74 5b 5d 20 20 20 20 20  y_default[]     
18110 20 20 44 65 66 61 75 6c 74 20 61 63 74 69 6f 6e    Default action
18120 20 66 6f 72 20 65 61 63 68 20 73 74 61 74 65 2e   for each state.
18130 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70  .  */..  /* Comp
18140 75 74 65 20 74 68 65 20 61 63 74 69 6f 6e 73 20  ute the actions 
18150 6f 6e 20 61 6c 6c 20 73 74 61 74 65 73 20 61 6e  on all states an
18160 64 20 63 6f 75 6e 74 20 74 68 65 6d 20 75 70 20  d count them up 
18170 2a 2f 0a 20 20 61 78 20 3d 20 6d 61 6c 6c 6f 63  */.  ax = malloc
18180 28 20 73 69 7a 65 6f 66 28 61 78 5b 30 5d 29 2a  ( sizeof(ax[0])*
18190 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 20 29  lemp->nstate*2 )
181a0 3b 0a 20 20 69 66 28 20 61 78 3d 3d 30 20 29 7b  ;.  if( ax==0 ){
181b0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
181c0 65 72 72 2c 22 6d 61 6c 6c 6f 63 20 66 61 69 6c  err,"malloc fail
181d0 65 64 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74  ed\n");.    exit
181e0 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  (1);.  }.  for(i
181f0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
18200 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  te; i++){.    st
18210 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64  p = lemp->sorted
18220 5b 69 5d 3b 0a 20 20 20 20 73 74 70 2d 3e 6e 54  [i];.    stp->nT
18230 6b 6e 41 63 74 20 3d 20 73 74 70 2d 3e 6e 4e 74  knAct = stp->nNt
18240 41 63 74 20 3d 20 30 3b 0a 20 20 20 20 73 74 70  Act = 0;.    stp
18250 2d 3e 69 44 66 6c 74 20 3d 20 6c 65 6d 70 2d 3e  ->iDflt = lemp->
18260 6e 73 74 61 74 65 20 2b 20 6c 65 6d 70 2d 3e 6e  nstate + lemp->n
18270 72 75 6c 65 3b 0a 20 20 20 20 73 74 70 2d 3e 69  rule;.    stp->i
18280 54 6b 6e 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46  TknOfst = NO_OFF
18290 53 45 54 3b 0a 20 20 20 20 73 74 70 2d 3e 69 4e  SET;.    stp->iN
182a0 74 4f 66 73 74 20 3d 20 4e 4f 5f 4f 46 46 53 45  tOfst = NO_OFFSE
182b0 54 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 73 74  T;.    for(ap=st
182c0 70 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70  p->ap; ap; ap=ap
182d0 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
182e0 66 28 20 63 6f 6d 70 75 74 65 5f 61 63 74 69 6f  f( compute_actio
182f0 6e 28 6c 65 6d 70 2c 61 70 29 3e 3d 30 20 29 7b  n(lemp,ap)>=0 ){
18300 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70 2d  .        if( ap-
18310 3e 73 70 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d  >sp->index<lemp-
18320 3e 6e 74 65 72 6d 69 6e 61 6c 20 29 7b 0a 20 20  >nterminal ){.  
18330 20 20 20 20 20 20 20 20 73 74 70 2d 3e 6e 54 6b          stp->nTk
18340 6e 41 63 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nAct++;.        
18350 7d 65 6c 73 65 20 69 66 28 20 61 70 2d 3e 73 70  }else if( ap->sp
18360 2d 3e 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 73  ->index<lemp->ns
18370 79 6d 62 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  ymbol ){.       
18380 20 20 20 73 74 70 2d 3e 6e 4e 74 41 63 74 2b 2b     stp->nNtAct++
18390 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
183a0 0a 20 20 20 20 20 20 20 20 20 20 73 74 70 2d 3e  .          stp->
183b0 69 44 66 6c 74 20 3d 20 63 6f 6d 70 75 74 65 5f  iDflt = compute_
183c0 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29  action(lemp, ap)
183d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
183e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 78    }.    }.    ax
183f0 5b 69 2a 32 5d 2e 73 74 70 20 3d 20 73 74 70 3b  [i*2].stp = stp;
18400 0a 20 20 20 20 61 78 5b 69 2a 32 5d 2e 69 73 54  .    ax[i*2].isT
18410 6b 6e 20 3d 20 31 3b 0a 20 20 20 20 61 78 5b 69  kn = 1;.    ax[i
18420 2a 32 5d 2e 6e 41 63 74 69 6f 6e 20 3d 20 73 74  *2].nAction = st
18430 70 2d 3e 6e 54 6b 6e 41 63 74 3b 0a 20 20 20 20  p->nTknAct;.    
18440 61 78 5b 69 2a 32 2b 31 5d 2e 73 74 70 20 3d 20  ax[i*2+1].stp = 
18450 73 74 70 3b 0a 20 20 20 20 61 78 5b 69 2a 32 2b  stp;.    ax[i*2+
18460 31 5d 2e 69 73 54 6b 6e 20 3d 20 30 3b 0a 20 20  1].isTkn = 0;.  
18470 20 20 61 78 5b 69 2a 32 2b 31 5d 2e 6e 41 63 74    ax[i*2+1].nAct
18480 69 6f 6e 20 3d 20 73 74 70 2d 3e 6e 4e 74 41 63  ion = stp->nNtAc
18490 74 3b 0a 20 20 7d 0a 20 20 6d 78 54 6b 6e 4f 66  t;.  }.  mxTknOf
184a0 73 74 20 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20 3d  st = mnTknOfst =
184b0 20 30 3b 0a 20 20 6d 78 4e 74 4f 66 73 74 20 3d   0;.  mxNtOfst =
184c0 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 30 3b 0a 0a   mnNtOfst = 0;..
184d0 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74 68 65    /* Compute the
184e0 20 61 63 74 69 6f 6e 20 74 61 62 6c 65 2e 20 20   action table.  
184f0 49 6e 20 6f 72 64 65 72 20 74 6f 20 74 72 79 20  In order to try 
18500 74 6f 20 6b 65 65 70 20 74 68 65 20 73 69 7a 65  to keep the size
18510 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 61 63 74   of the.  ** act
18520 69 6f 6e 20 74 61 62 6c 65 20 74 6f 20 61 20 6d  ion table to a m
18530 69 6e 69 6d 75 6d 2c 20 74 68 65 20 68 65 75 72  inimum, the heur
18540 69 73 74 69 63 20 6f 66 20 70 6c 61 63 69 6e 67  istic of placing
18550 20 74 68 65 20 6c 61 72 67 65 73 74 20 61 63 74   the largest act
18560 69 6f 6e 0a 20 20 2a 2a 20 73 65 74 73 20 66 69  ion.  ** sets fi
18570 72 73 74 20 69 73 20 75 73 65 64 2e 0a 20 20 2a  rst is used..  *
18580 2f 0a 20 20 71 73 6f 72 74 28 61 78 2c 20 6c 65  /.  qsort(ax, le
18590 6d 70 2d 3e 6e 73 74 61 74 65 2a 32 2c 20 73 69  mp->nstate*2, si
185a0 7a 65 6f 66 28 61 78 5b 30 5d 29 2c 20 61 78 73  zeof(ax[0]), axs
185b0 65 74 5f 63 6f 6d 70 61 72 65 29 3b 0a 20 20 70  et_compare);.  p
185c0 41 63 74 74 61 62 20 3d 20 61 63 74 74 61 62 5f  Acttab = acttab_
185d0 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69  alloc();.  for(i
185e0 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 74 61  =0; i<lemp->nsta
185f0 74 65 2a 32 20 26 26 20 61 78 5b 69 5d 2e 6e 41  te*2 && ax[i].nA
18600 63 74 69 6f 6e 3e 30 3b 20 69 2b 2b 29 7b 0a 20  ction>0; i++){. 
18610 20 20 20 73 74 70 20 3d 20 61 78 5b 69 5d 2e 73     stp = ax[i].s
18620 74 70 3b 0a 20 20 20 20 69 66 28 20 61 78 5b 69  tp;.    if( ax[i
18630 5d 2e 69 73 54 6b 6e 20 29 7b 0a 20 20 20 20 20  ].isTkn ){.     
18640 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
18650 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
18660 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
18670 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 69  ction;.        i
18680 66 28 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78  f( ap->sp->index
18690 3e 3d 6c 65 6d 70 2d 3e 6e 74 65 72 6d 69 6e 61  >=lemp->ntermina
186a0 6c 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  l ) continue;.  
186b0 20 20 20 20 20 20 61 63 74 69 6f 6e 20 3d 20 63        action = c
186c0 6f 6d 70 75 74 65 5f 61 63 74 69 6f 6e 28 6c 65  ompute_action(le
186d0 6d 70 2c 20 61 70 29 3b 0a 20 20 20 20 20 20 20  mp, ap);.       
186e0 20 69 66 28 20 61 63 74 69 6f 6e 3c 30 20 29 20   if( action<0 ) 
186f0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
18700 20 20 61 63 74 74 61 62 5f 61 63 74 69 6f 6e 28    acttab_action(
18710 70 41 63 74 74 61 62 2c 20 61 70 2d 3e 73 70 2d  pActtab, ap->sp-
18720 3e 69 6e 64 65 78 2c 20 61 63 74 69 6f 6e 29 3b  >index, action);
18730 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
18740 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 20 3d 20 61  tp->iTknOfst = a
18750 63 74 74 61 62 5f 69 6e 73 65 72 74 28 70 41 63  cttab_insert(pAc
18760 74 74 61 62 29 3b 0a 20 20 20 20 20 20 69 66 28  ttab);.      if(
18770 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3c 6d   stp->iTknOfst<m
18780 6e 54 6b 6e 4f 66 73 74 20 29 20 6d 6e 54 6b 6e  nTknOfst ) mnTkn
18790 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e  Ofst = stp->iTkn
187a0 4f 66 73 74 3b 0a 20 20 20 20 20 20 69 66 28 20  Ofst;.      if( 
187b0 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3e 6d 78  stp->iTknOfst>mx
187c0 54 6b 6e 4f 66 73 74 20 29 20 6d 78 54 6b 6e 4f  TknOfst ) mxTknO
187d0 66 73 74 20 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f  fst = stp->iTknO
187e0 66 73 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  fst;.    }else{.
187f0 20 20 20 20 20 20 66 6f 72 28 61 70 3d 73 74 70        for(ap=stp
18800 2d 3e 61 70 3b 20 61 70 3b 20 61 70 3d 61 70 2d  ->ap; ap; ap=ap-
18810 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  >next){.        
18820 69 6e 74 20 61 63 74 69 6f 6e 3b 0a 20 20 20 20  int action;.    
18830 20 20 20 20 69 66 28 20 61 70 2d 3e 73 70 2d 3e      if( ap->sp->
18840 69 6e 64 65 78 3c 6c 65 6d 70 2d 3e 6e 74 65 72  index<lemp->nter
18850 6d 69 6e 61 6c 20 29 20 63 6f 6e 74 69 6e 75 65  minal ) continue
18860 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 70  ;.        if( ap
18870 2d 3e 73 70 2d 3e 69 6e 64 65 78 3d 3d 6c 65 6d  ->sp->index==lem
18880 70 2d 3e 6e 73 79 6d 62 6f 6c 20 29 20 63 6f 6e  p->nsymbol ) con
18890 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 61  tinue;.        a
188a0 63 74 69 6f 6e 20 3d 20 63 6f 6d 70 75 74 65 5f  ction = compute_
188b0 61 63 74 69 6f 6e 28 6c 65 6d 70 2c 20 61 70 29  action(lemp, ap)
188c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 63  ;.        if( ac
188d0 74 69 6f 6e 3c 30 20 29 20 63 6f 6e 74 69 6e 75  tion<0 ) continu
188e0 65 3b 0a 20 20 20 20 20 20 20 20 61 63 74 74 61  e;.        actta
188f0 62 5f 61 63 74 69 6f 6e 28 70 41 63 74 74 61 62  b_action(pActtab
18900 2c 20 61 70 2d 3e 73 70 2d 3e 69 6e 64 65 78 2c  , ap->sp->index,
18910 20 61 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20   action);.      
18920 7d 0a 20 20 20 20 20 20 73 74 70 2d 3e 69 4e 74  }.      stp->iNt
18930 4f 66 73 74 20 3d 20 61 63 74 74 61 62 5f 69 6e  Ofst = acttab_in
18940 73 65 72 74 28 70 41 63 74 74 61 62 29 3b 0a 20  sert(pActtab);. 
18950 20 20 20 20 20 69 66 28 20 73 74 70 2d 3e 69 4e       if( stp->iN
18960 74 4f 66 73 74 3c 6d 6e 4e 74 4f 66 73 74 20 29  tOfst<mnNtOfst )
18970 20 6d 6e 4e 74 4f 66 73 74 20 3d 20 73 74 70 2d   mnNtOfst = stp-
18980 3e 69 4e 74 4f 66 73 74 3b 0a 20 20 20 20 20 20  >iNtOfst;.      
18990 69 66 28 20 73 74 70 2d 3e 69 4e 74 4f 66 73 74  if( stp->iNtOfst
189a0 3e 6d 78 4e 74 4f 66 73 74 20 29 20 6d 78 4e 74  >mxNtOfst ) mxNt
189b0 4f 66 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f  Ofst = stp->iNtO
189c0 66 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  fst;.    }.  }. 
189d0 20 66 72 65 65 28 61 78 29 3b 0a 0a 20 20 2f 2a   free(ax);..  /*
189e0 20 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 61   Output the yy_a
189f0 63 74 69 6f 6e 20 74 61 62 6c 65 20 2a 2f 0a 20  ction table */. 
18a00 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 73 74   fprintf(out,"st
18a10 61 74 69 63 20 59 59 41 43 54 49 4f 4e 54 59 50  atic YYACTIONTYP
18a20 45 20 79 79 5f 61 63 74 69 6f 6e 5b 5d 20 3d 20  E yy_action[] = 
18a30 7b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  {\n"); lineno++;
18a40 0a 20 20 6e 20 3d 20 61 63 74 74 61 62 5f 73 69  .  n = acttab_si
18a50 7a 65 28 70 41 63 74 74 61 62 29 3b 0a 20 20 66  ze(pActtab);.  f
18a60 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
18a70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 63 74  ++){.    int act
18a80 69 6f 6e 20 3d 20 61 63 74 74 61 62 5f 79 79 61  ion = acttab_yya
18a90 63 74 69 6f 6e 28 70 41 63 74 74 61 62 2c 20 69  ction(pActtab, i
18aa0 29 3b 0a 20 20 20 20 69 66 28 20 61 63 74 69 6f  );.    if( actio
18ab0 6e 3c 30 20 29 20 61 63 74 69 6f 6e 20 3d 20 6c  n<0 ) action = l
18ac0 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 2b 20 6c  emp->nsymbol + l
18ad0 65 6d 70 2d 3e 6e 72 75 6c 65 20 2b 20 32 3b 0a  emp->nrule + 2;.
18ae0 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66      if( j==0 ) f
18af0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
18b00 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20  %5d */ ", i);.  
18b10 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
18b20 20 25 34 64 2c 22 2c 20 61 63 74 69 6f 6e 29 3b   %4d,", action);
18b30 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
18b40 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
18b50 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
18b60 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
18b70 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
18b80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
18b90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
18ba0 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
18bb0 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20  "); lineno++;.. 
18bc0 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79   /* Output the y
18bd0 79 5f 6c 6f 6f 6b 61 68 65 61 64 20 74 61 62 6c  y_lookahead tabl
18be0 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f  e */.  fprintf(o
18bf0 75 74 2c 22 73 74 61 74 69 63 20 59 59 43 4f 44  ut,"static YYCOD
18c00 45 54 59 50 45 20 79 79 5f 6c 6f 6f 6b 61 68 65  ETYPE yy_lookahe
18c10 61 64 5b 5d 20 3d 20 7b 5c 6e 22 29 3b 20 6c 69  ad[] = {\n"); li
18c20 6e 65 6e 6f 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d  neno++;.  for(i=
18c30 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
18c40 20 20 20 20 69 6e 74 20 6c 61 20 3d 20 61 63 74      int la = act
18c50 74 61 62 5f 79 79 6c 6f 6f 6b 61 68 65 61 64 28  tab_yylookahead(
18c60 70 41 63 74 74 61 62 2c 20 69 29 3b 0a 20 20 20  pActtab, i);.   
18c70 20 69 66 28 20 6c 61 3c 30 20 29 20 6c 61 20 3d   if( la<0 ) la =
18c80 20 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 0a   lemp->nsymbol;.
18c90 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20 66      if( j==0 ) f
18ca0 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a 20  printf(out," /* 
18cb0 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20 20  %5d */ ", i);.  
18cc0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
18cd0 20 25 34 64 2c 22 2c 20 6c 61 29 3b 0a 20 20 20   %4d,", la);.   
18ce0 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20 69 3d 3d   if( j==9 || i==
18cf0 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 70 72  n-1 ){.      fpr
18d00 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
18d10 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 20   lineno++;.     
18d20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73   j = 0;.    }els
18d30 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20  e{.      j++;.  
18d40 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74    }.  }.  fprint
18d50 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22 29 3b 20  f(out, "};\n"); 
18d60 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20  lineno++;..  /* 
18d70 4f 75 74 70 75 74 20 74 68 65 20 79 79 5f 73 68  Output the yy_sh
18d80 69 66 74 5f 6f 66 73 74 5b 5d 20 74 61 62 6c 65  ift_ofst[] table
18d90 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 6f 75   */.  fprintf(ou
18da0 74 2c 20 22 23 64 65 66 69 6e 65 20 59 59 5f 53  t, "#define YY_S
18db0 48 49 46 54 5f 55 53 45 5f 44 46 4c 54 20 28 25  HIFT_USE_DFLT (%
18dc0 64 29 5c 6e 22 2c 20 6d 6e 54 6b 6e 4f 66 73 74  d)\n", mnTknOfst
18dd0 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  -1); lineno++;. 
18de0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 73   fprintf(out, "s
18df0 74 61 74 69 63 20 25 73 20 79 79 5f 73 68 69 66  tatic %s yy_shif
18e00 74 5f 6f 66 73 74 5b 5d 20 3d 20 7b 5c 6e 22 2c  t_ofst[] = {\n",
18e10 20 0a 20 20 20 20 20 20 20 20 20 20 6d 69 6e 69   .          mini
18e20 6d 75 6d 5f 73 69 7a 65 5f 74 79 70 65 28 6d 6e  mum_size_type(mn
18e30 54 6b 6e 4f 66 73 74 2d 31 2c 20 6d 78 54 6b 6e  TknOfst-1, mxTkn
18e40 4f 66 73 74 29 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  Ofst)); lineno++
18e50 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d 3e 6e 73  ;.  n = lemp->ns
18e60 74 61 74 65 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d  tate;.  for(i=j=
18e70 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<n; i++){.  
18e80 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20 20 20 20    int ofst;.    
18e90 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73 6f 72 74  stp = lemp->sort
18ea0 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66 73 74 20  ed[i];.    ofst 
18eb0 3d 20 73 74 70 2d 3e 69 54 6b 6e 4f 66 73 74 3b  = stp->iTknOfst;
18ec0 0a 20 20 20 20 69 66 28 20 6f 66 73 74 3d 3d 4e  .    if( ofst==N
18ed0 4f 5f 4f 46 46 53 45 54 20 29 20 6f 66 73 74 20  O_OFFSET ) ofst 
18ee0 3d 20 6d 6e 54 6b 6e 4f 66 73 74 20 2d 20 31 3b  = mnTknOfst - 1;
18ef0 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29 20  .    if( j==0 ) 
18f00 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f 2a  fprintf(out," /*
18f10 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a 20   %5d */ ", i);. 
18f20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
18f30 22 20 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b 0a  " %4d,", ofst);.
18f40 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c 20      if( j==9 || 
18f50 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20 20  i==n-1 ){.      
18f60 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
18f70 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20  "); lineno++;.  
18f80 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 7d      j = 0;.    }
18f90 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b 3b  else{.      j++;
18fa0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 72  .    }.  }.  fpr
18fb0 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e 22  intf(out, "};\n"
18fc0 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20 20  ); lineno++;..  
18fd0 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 79 79  /* Output the yy
18fe0 5f 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 74  _reduce_ofst[] t
18ff0 61 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74  able */.  fprint
19000 66 28 6f 75 74 2c 20 22 23 64 65 66 69 6e 65 20  f(out, "#define 
19010 59 59 5f 52 45 44 55 43 45 5f 55 53 45 5f 44 46  YY_REDUCE_USE_DF
19020 4c 54 20 28 25 64 29 5c 6e 22 2c 20 6d 6e 4e 74  LT (%d)\n", mnNt
19030 4f 66 73 74 2d 31 29 3b 20 6c 69 6e 65 6e 6f 2b  Ofst-1); lineno+
19040 2b 3b 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74  +;.  fprintf(out
19050 2c 20 22 73 74 61 74 69 63 20 25 73 20 79 79 5f  , "static %s yy_
19060 72 65 64 75 63 65 5f 6f 66 73 74 5b 5d 20 3d 20  reduce_ofst[] = 
19070 7b 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20  {\n", .         
19080 20 6d 69 6e 69 6d 75 6d 5f 73 69 7a 65 5f 74 79   minimum_size_ty
19090 70 65 28 6d 6e 4e 74 4f 66 73 74 2d 31 2c 20 6d  pe(mnNtOfst-1, m
190a0 78 4e 74 4f 66 73 74 29 29 3b 20 6c 69 6e 65 6e  xNtOfst)); linen
190b0 6f 2b 2b 3b 0a 20 20 6e 20 3d 20 6c 65 6d 70 2d  o++;.  n = lemp-
190c0 3e 6e 73 74 61 74 65 3b 0a 20 20 66 6f 72 28 69  >nstate;.  for(i
190d0 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
190e0 0a 20 20 20 20 69 6e 74 20 6f 66 73 74 3b 0a 20  .    int ofst;. 
190f0 20 20 20 73 74 70 20 3d 20 6c 65 6d 70 2d 3e 73     stp = lemp->s
19100 6f 72 74 65 64 5b 69 5d 3b 0a 20 20 20 20 6f 66  orted[i];.    of
19110 73 74 20 3d 20 73 74 70 2d 3e 69 4e 74 4f 66 73  st = stp->iNtOfs
19120 74 3b 0a 20 20 20 20 69 66 28 20 6f 66 73 74 3d  t;.    if( ofst=
19130 3d 4e 4f 5f 4f 46 46 53 45 54 20 29 20 6f 66 73  =NO_OFFSET ) ofs
19140 74 20 3d 20 6d 6e 4e 74 4f 66 73 74 20 2d 20 31  t = mnNtOfst - 1
19150 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29  ;.    if( j==0 )
19160 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f   fprintf(out," /
19170 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a  * %5d */ ", i);.
19180 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
19190 20 22 20 25 34 64 2c 22 2c 20 6f 66 73 74 29 3b   " %4d,", ofst);
191a0 0a 20 20 20 20 69 66 28 20 6a 3d 3d 39 20 7c 7c  .    if( j==9 ||
191b0 20 69 3d 3d 6e 2d 31 20 29 7b 0a 20 20 20 20 20   i==n-1 ){.     
191c0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
191d0 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
191e0 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
191f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6a 2b 2b  }else{.      j++
19200 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
19210 72 69 6e 74 66 28 6f 75 74 2c 20 22 7d 3b 5c 6e  rintf(out, "};\n
19220 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 0a 20  "); lineno++;.. 
19230 20 2f 2a 20 4f 75 74 70 75 74 20 74 68 65 20 64   /* Output the d
19240 65 66 61 75 6c 74 20 61 63 74 69 6f 6e 20 74 61  efault action ta
19250 62 6c 65 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66  ble */.  fprintf
19260 28 6f 75 74 2c 20 22 73 74 61 74 69 63 20 59 59  (out, "static YY
19270 41 43 54 49 4f 4e 54 59 50 45 20 79 79 5f 64 65  ACTIONTYPE yy_de
19280 66 61 75 6c 74 5b 5d 20 3d 20 7b 5c 6e 22 29 3b  fault[] = {\n");
19290 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 6e 20 3d   lineno++;.  n =
192a0 20 6c 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 0a 20   lemp->nstate;. 
192b0 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b   for(i=j=0; i<n;
192c0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 70 20 3d   i++){.    stp =
192d0 20 6c 65 6d 70 2d 3e 73 6f 72 74 65 64 5b 69 5d   lemp->sorted[i]
192e0 3b 0a 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 29  ;.    if( j==0 )
192f0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 2f   fprintf(out," /
19300 2a 20 25 35 64 20 2a 2f 20 22 2c 20 69 29 3b 0a  * %5d */ ", i);.
19310 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
19320 20 22 20 25 34 64 2c 22 2c 20 73 74 70 2d 3e 69   " %4d,", stp->i
19330 44 66 6c 74 29 3b 0a 20 20 20 20 69 66 28 20 6a  Dflt);.    if( j
19340 3d 3d 39 20 7c 7c 20 69 3d 3d 6e 2d 31 20 29 7b  ==9 || i==n-1 ){
19350 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
19360 75 74 2c 20 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e  ut, "\n"); linen
19370 6f 2b 2b 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30  o++;.      j = 0
19380 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19390 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20     j++;.    }.  
193a0 7d 0a 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  }.  fprintf(out,
193b0 20 22 7d 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f   "};\n"); lineno
193c0 2b 2b 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  ++;.  tplt_xfer(
193d0 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
193e0 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
193f0 2a 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74  * Generate the t
19400 61 62 6c 65 20 6f 66 20 66 61 6c 6c 62 61 63 6b  able of fallback
19410 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20   tokens..  */.  
19420 69 66 28 20 6c 65 6d 70 2d 3e 68 61 73 5f 66 61  if( lemp->has_fa
19430 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 66 6f  llback ){.    fo
19440 72 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e  r(i=0; i<lemp->n
19450 74 65 72 6d 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a  terminal; i++){.
19460 20 20 20 20 20 20 73 74 72 75 63 74 20 73 79 6d        struct sym
19470 62 6f 6c 20 2a 70 20 3d 20 6c 65 6d 70 2d 3e 73  bol *p = lemp->s
19480 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20  ymbols[i];.     
19490 20 69 66 28 20 70 2d 3e 66 61 6c 6c 62 61 63 6b   if( p->fallback
194a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
194b0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 20  printf(out, "   
194c0 20 30 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20   0,  /* %10s => 
194d0 6e 6f 74 68 69 6e 67 20 2a 2f 5c 6e 22 2c 20 70  nothing */\n", p
194e0 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  ->name);.      }
194f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70  else{.        fp
19500 72 69 6e 74 66 28 6f 75 74 2c 20 22 20 20 25 33  rintf(out, "  %3
19510 64 2c 20 20 2f 2a 20 25 31 30 73 20 3d 3e 20 25  d,  /* %10s => %
19520 73 20 2a 2f 5c 6e 22 2c 20 70 2d 3e 66 61 6c 6c  s */\n", p->fall
19530 62 61 63 6b 2d 3e 69 6e 64 65 78 2c 0a 20 20 20  back->index,.   
19540 20 20 20 20 20 20 20 70 2d 3e 6e 61 6d 65 2c 20         p->name, 
19550 70 2d 3e 66 61 6c 6c 62 61 63 6b 2d 3e 6e 61 6d  p->fallback->nam
19560 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
19570 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
19580 7d 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65  }.  }.  tplt_xfe
19590 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 20 69 6e  r(lemp->name, in
195a0 2c 20 6f 75 74 2c 20 26 6c 69 6e 65 6e 6f 29 3b  , out, &lineno);
195b0 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
195c0 61 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  a table containi
195d0 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20  ng the symbolic 
195e0 6e 61 6d 65 20 6f 66 20 65 76 65 72 79 20 73 79  name of every sy
195f0 6d 62 6f 6c 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  mbol.  */.  for(
19600 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
19610 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
19620 73 70 72 69 6e 74 66 28 6c 69 6e 65 2c 22 5c 22  sprintf(line,"\"
19630 25 73 5c 22 2c 22 2c 6c 65 6d 70 2d 3e 73 79 6d  %s\",",lemp->sym
19640 62 6f 6c 73 5b 69 5d 2d 3e 6e 61 6d 65 29 3b 0a  bols[i]->name);.
19650 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
19660 22 20 20 25 2d 31 35 73 22 2c 6c 69 6e 65 29 3b  "  %-15s",line);
19670 0a 20 20 20 20 69 66 28 20 28 69 26 33 29 3d 3d  .    if( (i&3)==
19680 33 20 29 7b 20 66 70 72 69 6e 74 66 28 6f 75 74  3 ){ fprintf(out
19690 2c 22 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  ,"\n"); lineno++
196a0 3b 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 69  ; }.  }.  if( (i
196b0 26 33 29 21 3d 30 20 29 7b 20 66 70 72 69 6e 74  &3)!=0 ){ fprint
196c0 66 28 6f 75 74 2c 22 5c 6e 22 29 3b 20 6c 69 6e  f(out,"\n"); lin
196d0 65 6e 6f 2b 2b 3b 20 7d 0a 20 20 74 70 6c 74 5f  eno++; }.  tplt_
196e0 78 66 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c  xfer(lemp->name,
196f0 69 6e 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b  in,out,&lineno);
19700 0a 0a 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20  ..  /* Generate 
19710 61 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  a table containi
19720 6e 67 20 61 20 74 65 78 74 20 73 74 72 69 6e 67  ng a text string
19730 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
19740 65 76 65 72 79 0a 20 20 2a 2a 20 72 75 6c 65 20  every.  ** rule 
19750 69 6e 20 74 68 65 20 72 75 6c 65 20 73 65 74 20  in the rule set 
19760 6f 66 20 74 68 65 20 67 72 61 6d 6d 65 72 2e 20  of the grammer. 
19770 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
19780 6e 20 69 73 20 75 73 65 64 0a 20 20 2a 2a 20 77  n is used.  ** w
19790 68 65 6e 20 74 72 61 63 69 6e 67 20 52 45 44 55  hen tracing REDU
197a0 43 45 20 61 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f  CE actions..  */
197b0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 72 70 3d 6c  .  for(i=0, rp=l
197c0 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
197d0 70 3d 72 70 2d 3e 6e 65 78 74 2c 20 69 2b 2b 29  p=rp->next, i++)
197e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 70  {.    assert( rp
197f0 2d 3e 69 6e 64 65 78 3d 3d 69 20 29 3b 0a 20 20  ->index==i );.  
19800 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20    fprintf(out," 
19810 2f 2a 20 25 33 64 20 2a 2f 20 5c 22 25 73 20 3a  /* %3d */ \"%s :
19820 3a 3d 22 2c 20 69 2c 20 72 70 2d 3e 6c 68 73 2d  :=", i, rp->lhs-
19830 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 28  >name);.    for(
19840 6a 3d 30 3b 20 6a 3c 72 70 2d 3e 6e 72 68 73 3b  j=0; j<rp->nrhs;
19850 20 6a 2b 2b 29 20 66 70 72 69 6e 74 66 28 6f 75   j++) fprintf(ou
19860 74 2c 22 20 25 73 22 2c 72 70 2d 3e 72 68 73 5b  t," %s",rp->rhs[
19870 6a 5d 2d 3e 6e 61 6d 65 29 3b 0a 20 20 20 20 66  j]->name);.    f
19880 70 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22 2c 5c  printf(out,"\",\
19890 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20  n"); lineno++;. 
198a0 20 7d 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c   }.  tplt_xfer(l
198b0 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
198c0 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
198d0 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77   Generate code w
198e0 68 69 63 68 20 65 78 65 63 75 74 65 73 20 65 76  hich executes ev
198f0 65 72 79 20 74 69 6d 65 20 61 20 73 79 6d 62 6f  ery time a symbo
19900 6c 20 69 73 20 70 6f 70 70 65 64 20 66 72 6f 6d  l is popped from
19910 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 63 6b 20  .  ** the stack 
19920 77 68 69 6c 65 20 70 72 6f 63 65 73 73 69 6e 67  while processing
19930 20 65 72 72 6f 72 73 20 6f 72 20 77 68 69 6c 65   errors or while
19940 20 64 65 73 74 72 6f 79 69 6e 67 20 74 68 65 20   destroying the 
19950 70 61 72 73 65 72 2e 20 0a 20 20 2a 2a 20 28 49  parser. .  ** (I
19960 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 67  n other words, g
19970 65 6e 65 72 61 74 65 20 74 68 65 20 25 64 65 73  enerate the %des
19980 74 72 75 63 74 6f 72 20 61 63 74 69 6f 6e 73 29  tructor actions)
19990 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 65 6d 70  .  */.  if( lemp
199a0 2d 3e 74 6f 6b 65 6e 64 65 73 74 20 29 7b 0a 20  ->tokendest ){. 
199b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65     for(i=0; i<le
199c0 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 3b 20 69 2b 2b  mp->nsymbol; i++
199d0 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
199e0 73 79 6d 62 6f 6c 20 2a 73 70 20 3d 20 6c 65 6d  symbol *sp = lem
199f0 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 3b 0a 20  p->symbols[i];. 
19a00 20 20 20 20 20 69 66 28 20 73 70 3d 3d 30 20 7c       if( sp==0 |
19a10 7c 20 73 70 2d 3e 74 79 70 65 21 3d 54 45 52 4d  | sp->type!=TERM
19a20 49 4e 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  INAL ) continue;
19a30 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
19a40 75 74 2c 22 20 20 20 20 63 61 73 65 20 25 64 3a  ut,"    case %d:
19a50 5c 6e 22 2c 73 70 2d 3e 69 6e 64 65 78 29 3b 20  \n",sp->index); 
19a60 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a  lineno++;.    }.
19a70 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c      for(i=0; i<l
19a80 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20 26 26 20  emp->nsymbol && 
19a90 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
19aa0 2d 3e 74 79 70 65 21 3d 54 45 52 4d 49 4e 41 4c  ->type!=TERMINAL
19ab0 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 69 66 28 20  ; i++);.    if( 
19ac0 69 3c 6c 65 6d 70 2d 3e 6e 73 79 6d 62 6f 6c 20  i<lemp->nsymbol 
19ad0 29 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f 64 65  ){.      emit_de
19ae0 73 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75  structor_code(ou
19af0 74 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  t,lemp->symbols[
19b00 69 5d 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29  i],lemp,&lineno)
19b10 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
19b20 6f 75 74 2c 22 20 20 20 20 20 20 62 72 65 61 6b  out,"      break
19b30 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b  ;\n"); lineno++;
19b40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
19b50 28 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73  (i=0; i<lemp->ns
19b60 79 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  ymbol; i++){.   
19b70 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a   struct symbol *
19b80 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62 6f  sp = lemp->symbo
19b90 6c 73 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 73  ls[i];.    if( s
19ba0 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74 79 70 65  p==0 || sp->type
19bb0 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c 20 73 70  ==TERMINAL || sp
19bc0 2d 3e 64 65 73 74 72 75 63 74 6f 72 3d 3d 30 20  ->destructor==0 
19bd0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
19be0 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20  fprintf(out,"   
19bf0 20 63 61 73 65 20 25 64 3a 5c 6e 22 2c 73 70 2d   case %d:\n",sp-
19c00 3e 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b  >index); lineno+
19c10 2b 3b 0a 20 20 20 20 65 6d 69 74 5f 64 65 73 74  +;.    emit_dest
19c20 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74 2c  ructor_code(out,
19c30 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d  lemp->symbols[i]
19c40 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  ,lemp,&lineno);.
19c50 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
19c60 22 20 20 20 20 20 20 62 72 65 61 6b 3b 5c 6e 22  "      break;\n"
19c70 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 7d  ); lineno++;.  }
19c80 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 76 61 72  .  if( lemp->var
19c90 64 65 73 74 20 29 7b 0a 20 20 20 20 73 74 72 75  dest ){.    stru
19ca0 63 74 20 73 79 6d 62 6f 6c 20 2a 64 66 6c 74 5f  ct symbol *dflt_
19cb0 73 70 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  sp = 0;.    for(
19cc0 69 3d 30 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 73 79  i=0; i<lemp->nsy
19cd0 6d 62 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mbol; i++){.    
19ce0 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20    struct symbol 
19cf0 2a 73 70 20 3d 20 6c 65 6d 70 2d 3e 73 79 6d 62  *sp = lemp->symb
19d00 6f 6c 73 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  ols[i];.      if
19d10 28 20 73 70 3d 3d 30 20 7c 7c 20 73 70 2d 3e 74  ( sp==0 || sp->t
19d20 79 70 65 3d 3d 54 45 52 4d 49 4e 41 4c 20 7c 7c  ype==TERMINAL ||
19d30 0a 20 20 20 20 20 20 20 20 20 20 73 70 2d 3e 69  .          sp->i
19d40 6e 64 65 78 3c 3d 30 20 7c 7c 20 73 70 2d 3e 64  ndex<=0 || sp->d
19d50 65 73 74 72 75 63 74 6f 72 21 3d 30 20 29 20 63  estructor!=0 ) c
19d60 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 66  ontinue;.      f
19d70 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20  printf(out,"    
19d80 63 61 73 65 20 25 64 3a 5c 6e 22 2c 73 70 2d 3e  case %d:\n",sp->
19d90 69 6e 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b  index); lineno++
19da0 3b 0a 20 20 20 20 20 20 64 66 6c 74 5f 73 70 20  ;.      dflt_sp 
19db0 3d 20 73 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = sp;.    }.    
19dc0 69 66 28 20 64 66 6c 74 5f 73 70 21 3d 30 20 29  if( dflt_sp!=0 )
19dd0 7b 0a 20 20 20 20 20 20 65 6d 69 74 5f 64 65 73  {.      emit_des
19de0 74 72 75 63 74 6f 72 5f 63 6f 64 65 28 6f 75 74  tructor_code(out
19df0 2c 64 66 6c 74 5f 73 70 2c 6c 65 6d 70 2c 26 6c  ,dflt_sp,lemp,&l
19e00 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 66 70  ineno);.      fp
19e10 72 69 6e 74 66 28 6f 75 74 2c 22 20 20 20 20 20  rintf(out,"     
19e20 20 62 72 65 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e   break;\n"); lin
19e30 65 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  eno++;.    }.  }
19e40 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c 65 6d  .  tplt_xfer(lem
19e50 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74 2c 26  p->name,in,out,&
19e60 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 47  lineno);..  /* G
19e70 65 6e 65 72 61 74 65 20 63 6f 64 65 20 77 68 69  enerate code whi
19e80 63 68 20 65 78 65 63 75 74 65 73 20 77 68 65 6e  ch executes when
19e90 65 76 65 72 20 74 68 65 20 70 61 72 73 65 72 20  ever the parser 
19ea0 73 74 61 63 6b 20 6f 76 65 72 66 6c 6f 77 73 20  stack overflows 
19eb0 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69 6e 74 28  */.  tplt_print(
19ec0 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70 2d 3e 6f  out,lemp,lemp->o
19ed0 76 65 72 66 6c 6f 77 2c 6c 65 6d 70 2d 3e 6f 76  verflow,lemp->ov
19ee0 65 72 66 6c 6f 77 6c 6e 2c 26 6c 69 6e 65 6e 6f  erflowln,&lineno
19ef0 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  );.  tplt_xfer(l
19f00 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
19f10 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
19f20 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 74 61   Generate the ta
19f30 62 6c 65 20 6f 66 20 72 75 6c 65 20 69 6e 66 6f  ble of rule info
19f40 72 6d 61 74 69 6f 6e 20 0a 20 20 2a 2a 0a 20 20  rmation .  **.  
19f50 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 63 6f  ** Note: This co
19f60 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  de depends on th
19f70 65 20 66 61 63 74 20 74 68 61 74 20 72 75 6c 65  e fact that rule
19f80 73 20 61 72 65 20 6e 75 6d 62 65 72 0a 20 20 2a  s are number.  *
19f90 2a 20 73 65 71 75 65 6e 74 75 61 6c 6c 79 20 62  * sequentually b
19fa0 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 30 2e  eginning with 0.
19fb0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 72 70 3d 6c  .  */.  for(rp=l
19fc0 65 6d 70 2d 3e 72 75 6c 65 3b 20 72 70 3b 20 72  emp->rule; rp; r
19fd0 70 3d 72 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=rp->next){.   
19fe0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 20 20   fprintf(out,"  
19ff0 7b 20 25 64 2c 20 25 64 20 7d 2c 5c 6e 22 2c 72  { %d, %d },\n",r
1a000 70 2d 3e 6c 68 73 2d 3e 69 6e 64 65 78 2c 72 70  p->lhs->index,rp
1a010 2d 3e 6e 72 68 73 29 3b 20 6c 69 6e 65 6e 6f 2b  ->nrhs); lineno+
1a020 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  +;.  }.  tplt_xf
1a030 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1a040 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1a050 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1a060 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 69  de which executi
1a070 6f 6e 20 64 75 72 69 6e 67 20 65 61 63 68 20 52  on during each R
1a080 45 44 55 43 45 20 61 63 74 69 6f 6e 20 2a 2f 0a  EDUCE action */.
1a090 20 20 66 6f 72 28 72 70 3d 6c 65 6d 70 2d 3e 72    for(rp=lemp->r
1a0a0 75 6c 65 3b 20 72 70 3b 20 72 70 3d 72 70 2d 3e  ule; rp; rp=rp->
1a0b0 6e 65 78 74 29 7b 0a 20 20 20 20 66 70 72 69 6e  next){.    fprin
1a0c0 74 66 28 6f 75 74 2c 22 20 20 20 20 20 20 63 61  tf(out,"      ca
1a0d0 73 65 20 25 64 3a 5c 6e 22 2c 72 70 2d 3e 69 6e  se %d:\n",rp->in
1a0e0 64 65 78 29 3b 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a  dex); lineno++;.
1a0f0 20 20 20 20 65 6d 69 74 5f 63 6f 64 65 28 6f 75      emit_code(ou
1a100 74 2c 72 70 2c 6c 65 6d 70 2c 26 6c 69 6e 65 6e  t,rp,lemp,&linen
1a110 6f 29 3b 0a 20 20 20 20 66 70 72 69 6e 74 66 28  o);.    fprintf(
1a120 6f 75 74 2c 22 20 20 20 20 20 20 20 20 62 72 65  out,"        bre
1a130 61 6b 3b 5c 6e 22 29 3b 20 6c 69 6e 65 6e 6f 2b  ak;\n"); lineno+
1a140 2b 3b 0a 20 20 7d 0a 20 20 74 70 6c 74 5f 78 66  +;.  }.  tplt_xf
1a150 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1a160 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1a170 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1a180 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
1a190 73 20 69 66 20 61 20 70 61 72 73 65 20 66 61 69  s if a parse fai
1a1a0 6c 73 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72 69  ls */.  tplt_pri
1a1b0 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d 70  nt(out,lemp,lemp
1a1c0 2d 3e 66 61 69 6c 75 72 65 2c 6c 65 6d 70 2d 3e  ->failure,lemp->
1a1d0 66 61 69 6c 75 72 65 6c 6e 2c 26 6c 69 6e 65 6e  failureln,&linen
1a1e0 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28  o);.  tplt_xfer(
1a1f0 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75  lemp->name,in,ou
1a200 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f  t,&lineno);..  /
1a210 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1a220 77 68 69 63 68 20 65 78 65 63 75 74 65 73 20 77  which executes w
1a230 68 65 6e 20 61 20 73 79 6e 74 61 78 20 65 72 72  hen a syntax err
1a240 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 20 20 74  or occurs */.  t
1a250 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c 65  plt_print(out,le
1a260 6d 70 2c 6c 65 6d 70 2d 3e 65 72 72 6f 72 2c 6c  mp,lemp->error,l
1a270 65 6d 70 2d 3e 65 72 72 6f 72 6c 6e 2c 26 6c 69  emp->errorln,&li
1a280 6e 65 6e 6f 29 3b 0a 20 20 74 70 6c 74 5f 78 66  neno);.  tplt_xf
1a290 65 72 28 6c 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e  er(lemp->name,in
1a2a0 2c 6f 75 74 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a  ,out,&lineno);..
1a2b0 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    /* Generate co
1a2c0 64 65 20 77 68 69 63 68 20 65 78 65 63 75 74 65  de which execute
1a2d0 73 20 77 68 65 6e 20 74 68 65 20 70 61 72 73 65  s when the parse
1a2e0 72 20 61 63 63 65 70 74 73 20 69 74 73 20 69 6e  r accepts its in
1a2f0 70 75 74 20 2a 2f 0a 20 20 74 70 6c 74 5f 70 72  put */.  tplt_pr
1a300 69 6e 74 28 6f 75 74 2c 6c 65 6d 70 2c 6c 65 6d  int(out,lemp,lem
1a310 70 2d 3e 61 63 63 65 70 74 2c 6c 65 6d 70 2d 3e  p->accept,lemp->
1a320 61 63 63 65 70 74 6c 6e 2c 26 6c 69 6e 65 6e 6f  acceptln,&lineno
1a330 29 3b 0a 20 20 74 70 6c 74 5f 78 66 65 72 28 6c  );.  tplt_xfer(l
1a340 65 6d 70 2d 3e 6e 61 6d 65 2c 69 6e 2c 6f 75 74  emp->name,in,out
1a350 2c 26 6c 69 6e 65 6e 6f 29 3b 0a 0a 20 20 2f 2a  ,&lineno);..  /*
1a360 20 41 70 70 65 6e 64 20 61 6e 79 20 61 64 64 69   Append any addi
1a370 74 69 6f 6e 20 63 6f 64 65 20 74 68 65 20 75 73  tion code the us
1a380 65 72 20 64 65 73 69 72 65 73 20 2a 2f 0a 20 20  er desires */.  
1a390 74 70 6c 74 5f 70 72 69 6e 74 28 6f 75 74 2c 6c  tplt_print(out,l
1a3a0 65 6d 70 2c 6c 65 6d 70 2d 3e 65 78 74 72 61 63  emp,lemp->extrac
1a3b0 6f 64 65 2c 6c 65 6d 70 2d 3e 65 78 74 72 61 63  ode,lemp->extrac
1a3c0 6f 64 65 6c 6e 2c 26 6c 69 6e 65 6e 6f 29 3b 0a  odeln,&lineno);.
1a3d0 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20  .  fclose(in);. 
1a3e0 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20   fclose(out);.  
1a3f0 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 47 65  return;.}../* Ge
1a400 6e 65 72 61 74 65 20 61 20 68 65 61 64 65 72 20  nerate a header 
1a410 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 72  file for the par
1a420 73 65 72 20 2a 2f 0a 76 6f 69 64 20 52 65 70 6f  ser */.void Repo
1a430 72 74 48 65 61 64 65 72 28 6c 65 6d 70 29 0a 73  rtHeader(lemp).s
1a440 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c 65 6d  truct lemon *lem
1a450 70 3b 0a 7b 0a 20 20 46 49 4c 45 20 2a 6f 75 74  p;.{.  FILE *out
1a460 2c 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 2a 70  , *in;.  char *p
1a470 72 65 66 69 78 3b 0a 20 20 63 68 61 72 20 6c 69  refix;.  char li
1a480 6e 65 5b 4c 49 4e 45 53 49 5a 45 5d 3b 0a 20 20  ne[LINESIZE];.  
1a490 63 68 61 72 20 70 61 74 74 65 72 6e 5b 4c 49 4e  char pattern[LIN
1a4a0 45 53 49 5a 45 5d 3b 0a 20 20 69 6e 74 20 69 3b  ESIZE];.  int i;
1a4b0 0a 0a 20 20 69 66 28 20 6c 65 6d 70 2d 3e 74 6f  ..  if( lemp->to
1a4c0 6b 65 6e 70 72 65 66 69 78 20 29 20 70 72 65 66  kenprefix ) pref
1a4d0 69 78 20 3d 20 6c 65 6d 70 2d 3e 74 6f 6b 65 6e  ix = lemp->token
1a4e0 70 72 65 66 69 78 3b 0a 20 20 65 6c 73 65 20 20  prefix;.  else  
1a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a500 20 20 70 72 65 66 69 78 20 3d 20 22 22 3b 0a 20    prefix = "";. 
1a510 20 69 6e 20 3d 20 66 69 6c 65 5f 6f 70 65 6e 28   in = file_open(
1a520 6c 65 6d 70 2c 22 2e 68 22 2c 22 72 22 29 3b 0a  lemp,".h","r");.
1a530 20 20 69 66 28 20 69 6e 20 29 7b 0a 20 20 20 20    if( in ){.    
1a540 66 6f 72 28 69 3d 31 3b 20 69 3c 6c 65 6d 70 2d  for(i=1; i<lemp-
1a550 3e 6e 74 65 72 6d 69 6e 61 6c 20 26 26 20 66 67  >nterminal && fg
1a560 65 74 73 28 6c 69 6e 65 2c 4c 49 4e 45 53 49 5a  ets(line,LINESIZ
1a570 45 2c 69 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  E,in); i++){.   
1a580 20 20 20 73 70 72 69 6e 74 66 28 70 61 74 74 65     sprintf(patte
1a590 72 6e 2c 22 23 64 65 66 69 6e 65 20 25 73 25 2d  rn,"#define %s%-
1a5a0 33 30 73 20 25 32 64 5c 6e 22 2c 70 72 65 66 69  30s %2d\n",prefi
1a5b0 78 2c 6c 65 6d 70 2d 3e 73 79 6d 62 6f 6c 73 5b  x,lemp->symbols[
1a5c0 69 5d 2d 3e 6e 61 6d 65 2c 69 29 3b 0a 20 20 20  i]->name,i);.   
1a5d0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 6c 69     if( strcmp(li
1a5e0 6e 65 2c 70 61 74 74 65 72 6e 29 20 29 20 62 72  ne,pattern) ) br
1a5f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  eak;.    }.    f
1a600 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 20 20 69  close(in);.    i
1a610 66 28 20 69 3d 3d 6c 65 6d 70 2d 3e 6e 74 65 72  f( i==lemp->nter
1a620 6d 69 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f  minal ){.      /
1a630 2a 20 4e 6f 20 63 68 61 6e 67 65 20 69 6e 20 74  * No change in t
1a640 68 65 20 66 69 6c 65 2e 20 20 44 6f 6e 27 74 20  he file.  Don't 
1a650 72 65 77 72 69 74 65 20 69 74 2e 20 2a 2f 0a 20  rewrite it. */. 
1a660 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
1a670 20 7d 0a 20 20 7d 0a 20 20 6f 75 74 20 3d 20 66   }.  }.  out = f
1a680 69 6c 65 5f 6f 70 65 6e 28 6c 65 6d 70 2c 22 2e  ile_open(lemp,".
1a690 68 22 2c 22 77 22 29 3b 0a 20 20 69 66 28 20 6f  h","w");.  if( o
1a6a0 75 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ut ){.    for(i=
1a6b0 31 3b 20 69 3c 6c 65 6d 70 2d 3e 6e 74 65 72 6d  1; i<lemp->nterm
1a6c0 69 6e 61 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  inal; i++){.    
1a6d0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22 23    fprintf(out,"#
1a6e0 64 65 66 69 6e 65 20 25 73 25 2d 33 30 73 20 25  define %s%-30s %
1a6f0 32 64 5c 6e 22 2c 70 72 65 66 69 78 2c 6c 65 6d  2d\n",prefix,lem
1a700 70 2d 3e 73 79 6d 62 6f 6c 73 5b 69 5d 2d 3e 6e  p->symbols[i]->n
1a710 61 6d 65 2c 69 29 3b 0a 20 20 20 20 7d 0a 20 20  ame,i);.    }.  
1a720 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 20 20    fclose(out);  
1a730 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
1a740 0a 0a 2f 2a 20 52 65 64 75 63 65 20 74 68 65 20  ../* Reduce the 
1a750 73 69 7a 65 20 6f 66 20 74 68 65 20 61 63 74 69  size of the acti
1a760 6f 6e 20 74 61 62 6c 65 73 2c 20 69 66 20 70 6f  on tables, if po
1a770 73 73 69 62 6c 65 2c 20 62 79 20 6d 61 6b 69 6e  ssible, by makin
1a780 67 20 75 73 65 0a 2a 2a 20 6f 66 20 64 65 66 61  g use.** of defa
1a790 75 6c 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74  ults..**.** In t
1a7a0 68 69 73 20 76 65 72 73 69 6f 6e 2c 20 77 65 20  his version, we 
1a7b0 74 61 6b 65 20 74 68 65 20 6d 6f 73 74 20 66 72  take the most fr
1a7c0 65 71 75 65 6e 74 20 52 45 44 55 43 45 20 61 63  equent REDUCE ac
1a7d0 74 69 6f 6e 20 61 6e 64 20 6d 61 6b 65 0a 2a 2a  tion and make.**
1a7e0 20 69 74 20 74 68 65 20 64 65 66 61 75 6c 74 2e   it the default.
1a7f0 20 20 4f 6e 6c 79 20 64 65 66 61 75 6c 74 20 61    Only default a
1a800 20 72 65 64 75 63 65 20 69 66 20 74 68 65 72 65   reduce if there
1a810 20 61 72 65 20 6d 6f 72 65 20 74 68 61 6e 20 6f   are more than o
1a820 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 43 6f 6d 70  ne..*/.void Comp
1a830 72 65 73 73 54 61 62 6c 65 73 28 6c 65 6d 70 29  ressTables(lemp)
1a840 0a 73 74 72 75 63 74 20 6c 65 6d 6f 6e 20 2a 6c  .struct lemon *l
1a850 65 6d 70 3b 0a 7b 0a 20 20 73 74 72 75 63 74 20  emp;.{.  struct 
1a860 73 74 61 74 65 20 2a 73 74 70 3b 0a 20 20 73 74  state *stp;.  st
1a870 72 75 63 74 20 61 63 74 69 6f 6e 20 2a 61 70 2c  ruct action *ap,
1a880 20 2a 61 70 32 3b 0a 20 20 73 74 72 75 63 74 20   *ap2;.  struct 
1a890 72 75 6c 65 20 2a 72 70 2c 20 2a 72 70 32 2c 20  rule *rp, *rp2, 
1a8a0 2a 72 62 65 73 74 3b 0a 20 20 69 6e 74 20 6e 62  *rbest;.  int nb
1a8b0 65 73 74 2c 20 6e 3b 0a 20 20 69 6e 74 20 69 3b  est, n;.  int i;
1a8c0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c  ..  for(i=0; i<l
1a8d0 65 6d 70 2d 3e 6e 73 74 61 74 65 3b 20 69 2b 2b  emp->nstate; i++
1a8e0 29 7b 0a 20 20 20 20 73 74 70 20 3d 20 6c 65 6d  ){.    stp = lem
1a8f0 70 2d 3e 73 6f 72 74 65 64 5b 69 5d 3b 0a 20 20  p->sorted[i];.  
1a900 20 20 6e 62 65 73 74 20 3d 20 30 3b 0a 20 20 20    nbest = 0;.   
1a910 20 72 62 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20   rbest = 0;..   
1a920 20 66 6f 72 28 61 70 3d 73 74 70 2d 3e 61 70 3b   for(ap=stp->ap;
1a930 20 61 70 3b 20 61 70 3d 61 70 2d 3e 6e 65 78 74   ap; ap=ap->next
1a940 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 70 2d  ){.      if( ap-
1a950 3e 74 79 70 65 21 3d 52 45 44 55 43 45 20 29 20  >type!=REDUCE ) 
1a960 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
1a970 72 70 20 3d 20 61 70 2d 3e 78 2e 72 70 3b 0a 20  rp = ap->x.rp;. 
1a980 20 20 20 20 20 69 66 28 20 72 70 3d 3d 72 62 65       if( rp==rbe
1a990 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  st ) continue;. 
1a9a0 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20       n = 1;.    
1a9b0 20 20 66 6f 72 28 61 70 32 3d 61 70 2d 3e 6e 65    for(ap2=ap->ne
1a9c0 78 74 3b 20 61 70 32 3b 20 61 70 32 3d 61 70 32  xt; ap2; ap2=ap2
1a9d0 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  ->next){.       
1a9e0 20 69 66 28 20 61 70 32 2d 3e 74 79 70 65 21 3d   if( ap2->type!=
1a9f0 52 45 44 55 43 45 20 29 20 63 6f 6e 74 69 6e 75  REDUCE ) continu
1aa00 65 3b 0a 20 20 20 20 20 20 20 20 72 70 32 20 3d  e;.        rp2 =
1aa10 20 61 70 32 2d 3e 78 2e 72 70 3b 0a 20 20 20 20   ap2->x.rp;.    
1aa20 20 20 20 20 69 66 28 20 72 70 32 3d 3d 72 62 65      if( rp2==rbe
1aa30 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  st ) continue;. 
1aa40 20 20 20 20 20 20 20 69 66 28 20 72 70 32 3d 3d         if( rp2==
1aa50 72 70 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 20 20  rp ) n++;.      
1aa60 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 62  }.      if( n>nb
1aa70 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  est ){.        n
1aa80 62 65 73 74 20 3d 20 6e 3b 0a 20 20 20 20 20 20  best = n;.      
1aa90 20 20 72 62 65 73 74 20 3d 20 72 70 3b 0a 20 20    rbest = rp;.  
1aaa0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 0a 20 20      }.    }. .  
1aab0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 6d 61 6b 65    /* Do not make
1aac0 20 61 20 64 65 66 61 75 6c 74 20 69 66 20 74 68   a default if th
1aad0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 75 6c 65  e number of rule
1aae0 73 20 74 6f 20 64 65 66 61 75 6c 74 0a 20 20 20  s to default.   
1aaf0 20 2a 2a 20 69 73 20 6e 6f 74 20 61 74 20 6c 65   ** is not at le
1ab00 61 73 74 20 32 20 2a 2f 0a 20 20 20 20 69 66 28  ast 2 */.    if(
1ab10 20 6e 62 65 73 74 3c 32 20 29 20 63 6f 6e 74 69   nbest<2 ) conti
1ab20 6e 75 65 3b 0a 0a 0a 20 20 20 20 2f 2a 20 43 6f  nue;...    /* Co
1ab30 6d 62 69 6e 65 20 6d 61 74 63 68 69 6e 67 20 52  mbine matching R
1ab40 45 44 55 43 45 20 61 63 74 69 6f 6e 73 20 69 6e  EDUCE actions in
1ab50 74 6f 20 61 20 73 69 6e 67 6c 65 20 64 65 66 61  to a single defa
1ab60 75 6c 74 20 2a 2f 0a 20 20 20 20 66 6f 72 28 61  ult */.    for(a
1ab70 70 3d 73 74 70 2d 3e 61 70 3b 20 61 70 3b 20 61  p=stp->ap; ap; a
1ab80 70 3d 61 70 2d 3e 6e 65 78 74 29 7b 0a 20 20 20  p=ap->next){.   
1ab90 20 20 20 69 66 28 20 61 70 2d 3e 74 79 70 65 3d     if( ap->type=
1aba0 3d 52 45 44 55 43 45 20 26 26 20 61 70 2d 3e 78  =REDUCE && ap->x
1abb0 2e 72 70 3d 3d 72 62 65 73 74 20 29 20 62 72 65  .rp==rbest ) bre
1abc0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  ak;.    }.    as
1abd0 73 65 72 74 28 20 61 70 20 29 3b 0a 20 20 20 20  sert( ap );.    
1abe0 61 70 2d 3e 73 70 20 3d 20 53 79 6d 62 6f 6c 5f  ap->sp = Symbol_
1abf0 6e 65 77 28 22 7b 64 65 66 61 75 6c 74 7d 22 29  new("{default}")
1ac00 3b 0a 20 20 20 20 66 6f 72 28 61 70 3d 61 70 2d  ;.    for(ap=ap-
1ac10 3e 6e 65 78 74 3b 20 61 70 3b 20 61 70 3d 61 70  >next; ap; ap=ap
1ac20 2d 3e 6e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  ->next){.      i
1ac30 66 28 20 61 70 2d 3e 74 79 70 65 3d 3d 52 45 44  f( ap->type==RED
1ac40 55 43 45 20 26 26 20 61 70 2d 3e 78 2e 72 70 3d  UCE && ap->x.rp=
1ac50 3d 72 62 65 73 74 20 29 20 61 70 2d 3e 74 79 70  =rbest ) ap->typ
1ac60 65 20 3d 20 4e 4f 54 5f 55 53 45 44 3b 0a 20 20  e = NOT_USED;.  
1ac70 20 20 7d 0a 20 20 20 20 73 74 70 2d 3e 61 70 20    }.    stp->ap 
1ac80 3d 20 41 63 74 69 6f 6e 5f 73 6f 72 74 28 73 74  = Action_sort(st
1ac90 70 2d 3e 61 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  p->ap);.  }.}../
1aca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1acb0 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * From the file 
1acc0 22 73 65 74 2e 63 22 20 2a 2a 2a 2a 2a 2a 2a 2a  "set.c" ********
1acd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ace0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
1acf0 0a 2a 2a 20 53 65 74 20 6d 61 6e 69 70 75 6c 61  .** Set manipula
1ad00 74 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 66 6f  tion routines fo
1ad10 72 20 74 68 65 20 4c 45 4d 4f 4e 20 70 61 72 73  r the LEMON pars
1ad20 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2f  er generator..*/
1ad30 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 73 69 7a  ..static int siz
1ad40 65 20 3d 20 30 3b 0a 0a 2f 2a 20 53 65 74 20 74  e = 0;../* Set t
1ad50 68 65 20 73 65 74 20 73 69 7a 65 20 2a 2f 0a 76  he set size */.v
1ad60 6f 69 64 20 53 65 74 53 69 7a 65 28 6e 29 0a 69  oid SetSize(n).i
1ad70 6e 74 20 6e 3b 0a 7b 0a 20 20 73 69 7a 65 20 3d  nt n;.{.  size =
1ad80 20 6e 2b 31 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c 6f   n+1;.}../* Allo
1ad90 63 61 74 65 20 61 20 6e 65 77 20 73 65 74 20 2a  cate a new set *
1ada0 2f 0a 63 68 61 72 20 2a 53 65 74 4e 65 77 28 29  /.char *SetNew()
1adb0 7b 0a 20 20 63 68 61 72 20 2a 73 3b 0a 20 20 69  {.  char *s;.  i
1adc0 6e 74 20 69 3b 0a 20 20 73 20 3d 20 28 63 68 61  nt i;.  s = (cha
1add0 72 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 20  r*)malloc( size 
1ade0 29 3b 0a 20 20 69 66 28 20 73 3d 3d 30 20 29 7b  );.  if( s==0 ){
1adf0 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64  .    extern void
1ae00 20 6d 65 6d 6f 72 79 5f 65 72 72 6f 72 28 29 3b   memory_error();
1ae10 0a 20 20 20 20 6d 65 6d 6f 72 79 5f 65 72 72 6f  .    memory_erro
1ae20 72 28 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  r();.  }.  for(i
1ae30 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29  =0; i<size; i++)
1ae40 20 73 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74   s[i] = 0;.  ret
1ae50 75 72 6e 20 73 3b 0a 7d 0a 0a 2f 2a 20 44 65 61  urn s;.}../* Dea
1ae60 6c 6c 6f 63 61 74 65 20 61 20 73 65 74 20 2a 2f  llocate a set */
1ae70 0a 76 6f 69 64 20 53 65 74 46 72 65 65 28 73 29  .void SetFree(s)
1ae80 0a 63 68 61 72 20 2a 73 3b 0a 7b 0a 20 20 66 72  .char *s;.{.  fr
1ae90 65 65 28 73 29 3b 0a 7d 0a 0a 2f 2a 20 41 64 64  ee(s);.}../* Add
1aea0 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
1aeb0 6f 20 74 68 65 20 73 65 74 2e 20 20 52 65 74 75  o the set.  Retu
1aec0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 65  rn TRUE if the e
1aed0 6c 65 6d 65 6e 74 20 77 61 73 20 61 64 64 65 64  lement was added
1aee0 0a 2a 2a 20 61 6e 64 20 46 41 4c 53 45 20 69 66  .** and FALSE if
1aef0 20 69 74 20 77 61 73 20 61 6c 72 65 61 64 79 20   it was already 
1af00 74 68 65 72 65 2e 20 2a 2f 0a 69 6e 74 20 53 65  there. */.int Se
1af10 74 41 64 64 28 73 2c 65 29 0a 63 68 61 72 20 2a  tAdd(s,e).char *
1af20 73 3b 0a 69 6e 74 20 65 3b 0a 7b 0a 20 20 69 6e  s;.int e;.{.  in
1af30 74 20 72 76 3b 0a 20 20 72 76 20 3d 20 73 5b 65  t rv;.  rv = s[e
1af40 5d 3b 0a 20 20 73 5b 65 5d 20 3d 20 31 3b 0a 20  ];.  s[e] = 1;. 
1af50 20 72 65 74 75 72 6e 20 21 72 76 3b 0a 7d 0a 0a   return !rv;.}..
1af60 2f 2a 20 41 64 64 20 65 76 65 72 79 20 65 6c 65  /* Add every ele
1af70 6d 65 6e 74 20 6f 66 20 73 32 20 74 6f 20 73 31  ment of s2 to s1
1af80 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  .  Return TRUE i
1af90 66 20 73 31 20 63 68 61 6e 67 65 73 2e 20 2a 2f  f s1 changes. */
1afa0 0a 69 6e 74 20 53 65 74 55 6e 69 6f 6e 28 73 31  .int SetUnion(s1
1afb0 2c 73 32 29 0a 63 68 61 72 20 2a 73 31 3b 0a 63  ,s2).char *s1;.c
1afc0 68 61 72 20 2a 73 32 3b 0a 7b 0a 20 20 69 6e 74  har *s2;.{.  int
1afd0 20 69 2c 20 70 72 6f 67 72 65 73 73 3b 0a 20 20   i, progress;.  
1afe0 70 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20  progress = 0;.  
1aff0 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b  for(i=0; i<size;
1b000 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
1b010 32 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  2[i]==0 ) contin
1b020 75 65 3b 0a 20 20 20 20 69 66 28 20 73 31 5b 69  ue;.    if( s1[i
1b030 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 72  ]==0 ){.      pr
1b040 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20 20  ogress = 1;.    
1b050 20 20 73 31 5b 69 5d 20 3d 20 31 3b 0a 20 20 20    s1[i] = 1;.   
1b060 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1b070 70 72 6f 67 72 65 73 73 3b 0a 7d 0a 2f 2a 2a 2a  progress;.}./***
1b080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b090 2a 2a 2a 20 46 72 6f 6d 20 74 68 65 20 66 69 6c  *** From the fil
1b0a0 65 20 22 74 61 62 6c 65 2e 63 22 20 2a 2a 2a 2a  e "table.c" ****
1b0b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1b0c0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 0a 2a 2a 20  ********/./*.** 
1b0d0 41 6c 6c 20 63 6f 64 65 20 69 6e 20 74 68 69 73  All code in this
1b0e0 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 61   file has been a
1b0f0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e  utomatically gen
1b100 65 72 61 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 61  erated.** from a
1b110 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 69   specification i
1b120 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 20 20  n the file.**   
1b130 20 20 20 20 20 20 20 20 20 20 20 22 74 61 62 6c             "tabl
1b140 65 2e 71 22 0a 2a 2a 20 62 79 20 74 68 65 20 61  e.q".** by the a
1b150 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
1b160 20 63 6f 64 65 20 62 75 69 6c 64 69 6e 67 20 70   code building p
1b170 72 6f 67 72 61 6d 20 22 61 61 67 65 6e 22 2e 0a  rogram "aagen"..
1b180 2a 2a 20 44 6f 20 6e 6f 74 20 65 64 69 74 20 74  ** Do not edit t
1b190 68 69 73 20 66 69 6c 65 21 20 20 49 6e 73 74 65  his file!  Inste
1b1a0 61 64 2c 20 65 64 69 74 20 74 68 65 20 73 70 65  ad, edit the spe
1b1b0 63 69 66 69 63 61 74 69 6f 6e 0a 2a 2a 20 66 69  cification.** fi
1b1c0 6c 65 2c 20 74 68 65 6e 20 72 65 72 75 6e 20 61  le, then rerun a
1b1d0 61 67 65 6e 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 43  agen..*/./*.** C
1b1e0 6f 64 65 20 66 6f 72 20 70 72 6f 63 65 73 73 69  ode for processi
1b1f0 6e 67 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65  ng tables in the
1b200 20 4c 45 4d 4f 4e 20 70 61 72 73 65 72 20 67 65   LEMON parser ge
1b210 6e 65 72 61 74 6f 72 2e 0a 2a 2f 0a 0a 50 52 49  nerator..*/..PRI
1b220 56 41 54 45 20 69 6e 74 20 73 74 72 68 61 73 68  VATE int strhash
1b230 28 78 29 0a 63 68 61 72 20 2a 78 3b 0a 7b 0a 20  (x).char *x;.{. 
1b240 20 69 6e 74 20 68 20 3d 20 30 3b 0a 20 20 77 68   int h = 0;.  wh
1b250 69 6c 65 28 20 2a 78 29 20 68 20 3d 20 68 2a 31  ile( *x) h = h*1
1b260 33 20 2b 20 2a 28 78 2b 2b 29 3b 0a 20 20 72 65  3 + *(x++);.  re
1b270 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 57 6f  turn h;.}../* Wo
1b280 72 6b 73 20 6c 69 6b 65 20 73 74 72 64 75 70 2c  rks like strdup,
1b290 20 73 6f 72 74 20 6f 66 2e 20 20 53 61 76 65 20   sort of.  Save 
1b2a0 61 20 73 74 72 69 6e 67 20 69 6e 20 6d 61 6c 6c  a string in mall
1b2b0 6f 63 65 64 20 6d 65 6d 6f 72 79 2c 20 62 75 74  oced memory, but
1b2c0 0a 2a 2a 20 6b 65 65 70 20 73 74 72 69 6e 67 73  .** keep strings
1b2d0 20 69 6e 20 61 20 74 61 62 6c 65 20 73 6f 20 74   in a table so t
1b2e0 68 61 74 20 74 68 65 20 73 61 6d 65 20 73 74 72  hat the same str
1b2f0 69 6e 67 20 69 73 20 6e 6f 74 20 69 6e 20 6d 6f  ing is not in mo
1b300 72 65 0a 2a 2a 20 74 68 61 6e 20 6f 6e 65 20 70  re.** than one p
1b310 6c 61 63 65 2e 0a 2a 2f 0a 63 68 61 72 20 2a 53  lace..*/.char *S
1b320 74 72 73 61 66 65 28 79 29 0a 63 68 61 72 20 2a  trsafe(y).char *
1b330 79 3b 0a 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  y;.{.  char *z;.
1b340 0a 20 20 7a 20 3d 20 53 74 72 73 61 66 65 5f 66  .  z = Strsafe_f
1b350 69 6e 64 28 79 29 3b 0a 20 20 69 66 28 20 7a 3d  ind(y);.  if( z=
1b360 3d 30 20 26 26 20 28 7a 3d 6d 61 6c 6c 6f 63 28  =0 && (z=malloc(
1b370 20 73 74 72 6c 65 6e 28 79 29 2b 31 20 29 29 21   strlen(y)+1 ))!
1b380 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 63 70 79  =0 ){.    strcpy
1b390 28 7a 2c 79 29 3b 0a 20 20 20 20 53 74 72 73 61  (z,y);.    Strsa
1b3a0 66 65 5f 69 6e 73 65 72 74 28 7a 29 3b 0a 20 20  fe_insert(z);.  
1b3b0 7d 0a 20 20 4d 65 6d 6f 72 79 43 68 65 63 6b 28  }.  MemoryCheck(
1b3c0 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  z);.  return z;.
1b3d0 7d 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f  }../* There is o
1b3e0 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
1b3f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
1b400 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68 0a  ucture for each.
1b410 2a 2a 20 61 73 73 6f 63 69 61 74 69 76 65 20 61  ** associative a
1b420 72 72 61 79 20 6f 66 20 74 79 70 65 20 22 78 31  rray of type "x1
1b430 22 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 5f 78  "..*/.struct s_x
1b440 31 20 7b 0a 20 20 69 6e 74 20 73 69 7a 65 3b 20  1 {.  int size; 
1b450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b460 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61   The number of a
1b470 76 61 69 6c 61 62 6c 65 20 73 6c 6f 74 73 2e 20  vailable slots. 
1b480 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  */.             
1b490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b4a0 20 20 4d 75 73 74 20 62 65 20 61 20 70 6f 77 65    Must be a powe
1b4b0 72 20 6f 66 20 32 20 67 72 65 61 74 65 72 20 74  r of 2 greater t
1b4c0 68 61 6e 20 6f 72 20 2a 2f 0a 20 20 20 20 20 20  han or */.      
1b4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4e0 20 20 20 20 2f 2a 20 20 20 65 71 75 61 6c 20 74      /*   equal t
1b4f0 6f 20 31 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75  o 1 */.  int cou
1b500 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
1b510 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75   /* Number of cu
1b520 72 72 65 6e 74 6c 79 20 73 6c 6f 74 73 20 66 69  rrently slots fi
1b530 6c 6c 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  lled */.  struct
1b540 20 73 5f 78 31 6e 6f 64 65 20 2a 74 62 6c 3b 20   s_x1node *tbl; 
1b550 20 2f 2a 20 54 68 65 20 64 61 74 61 20 73 74 6f   /* The data sto
1b560 72 65 64 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  red here */.  st
1b570 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a  ruct s_x1node **
1b580 68 74 3b 20 20 2f 2a 20 48 61 73 68 20 74 61 62  ht;  /* Hash tab
1b590 6c 65 20 66 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a  le for lookups *
1b5a0 2f 0a 7d 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69  /.};../* There i
1b5b0 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f  s one instance o
1b5c0 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
1b5d0 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 20   for every data 
1b5e0 65 6c 65 6d 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e  element.** in an
1b5f0 20 61 73 73 6f 63 69 61 74 69 76 65 20 61 72 72   associative arr
1b600 61 79 20 6f 66 20 74 79 70 65 20 22 78 31 22 2e  ay of type "x1".
1b610 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
1b620 63 74 20 73 5f 78 31 6e 6f 64 65 20 7b 0a 20 20  ct s_x1node {.  
1b630 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20 20  char *data;     
1b640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b650 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 73 74  The data */.  st
1b660 72 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 6e  ruct s_x1node *n
1b670 65 78 74 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65  ext;   /* Next e
1b680 6e 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61  ntry with the sa
1b690 6d 65 20 68 61 73 68 20 2a 2f 0a 20 20 73 74 72  me hash */.  str
1b6a0 75 63 74 20 73 5f 78 31 6e 6f 64 65 20 2a 2a 66  uct s_x1node **f
1b6b0 72 6f 6d 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75  rom;  /* Previou
1b6c0 73 20 6c 69 6e 6b 20 2a 2f 0a 7d 20 78 31 6e 6f  s link */.} x1no
1b6d0 64 65 3b 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73  de;../* There is
1b6e0 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e   only one instan
1b6f0 63 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2c  ce of the array,
1b700 20 77 68 69 63 68 20 69 73 20 74 68 65 20 66 6f   which is the fo
1b710 6c 6c 6f 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69  llowing */.stati
1b720 63 20 73 74 72 75 63 74 20 73 5f 78 31 20 2a 78  c struct s_x1 *x
1b730 31 61 3b 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65  1a;../* Allocate
1b740 20 61 20 6e 65 77 20 61 73 73 6f 63 69 61 74 69   a new associati
1b750 76 65 20 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64  ve array */.void
1b760 20 53 74 72 73 61 66 65 5f 69 6e 69 74 28 29 7b   Strsafe_init(){
1b770 0a 20 20 69 66 28 20 78 31 61 20 29 20 72 65 74  .  if( x1a ) ret
1b780 75 72 6e 3b 0a 20 20 78 31 61 20 3d 20 28 73 74  urn;.  x1a = (st
1b790 72 75 63 74 20 73 5f 78 31 2a 29 6d 61 6c 6c 6f  ruct s_x1*)mallo
1b7a0 63 28 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  c( sizeof(struct
1b7b0 20 73 5f 78 31 29 20 29 3b 0a 20 20 69 66 28 20   s_x1) );.  if( 
1b7c0 78 31 61 20 29 7b 0a 20 20 20 20 78 31 61 2d 3e  x1a ){.    x1a->
1b7d0 73 69 7a 65 20 3d 20 31 30 32 34 3b 0a 20 20 20  size = 1024;.   
1b7e0 20 78 31 61 2d 3e 63 6f 75 6e 74 20 3d 20 30 3b   x1a->count = 0;
1b7f0 0a 20 20 20 20 78 31 61 2d 3e 74 62 6c 20 3d 20  .    x1a->tbl = 
1b800 28 78 31 6e 6f 64 65 2a 29 6d 61 6c 6c 6f 63 28  (x1node*)malloc(
1b810 20 0a 20 20 20 20 20 20 28 73 69 7a 65 6f 66 28   .      (sizeof(
1b820 78 31 6e 6f 64 65 29 20 2b 20 73 69 7a 65 6f 66  x1node) + sizeof
1b830 28 78 31 6e 6f 64 65 2a 29 29 2a 31 30 32 34 20  (x1node*))*1024 
1b840 29 3b 0a 20 20 20 20 69 66 28 20 78 31 61 2d 3e  );.    if( x1a->
1b850 74 62 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tbl==0 ){.      
1b860 66 72 65 65 28 78 31 61 29 3b 0a 20 20 20 20 20  free(x1a);.     
1b870 20 78 31 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65   x1a = 0;.    }e
1b880 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
1b890 3b 0a 20 20 20 20 20 20 78 31 61 2d 3e 68 74 20  ;.      x1a->ht 
1b8a0 3d 20 28 78 31 6e 6f 64 65 2a 2a 29 26 28 78 31  = (x1node**)&(x1
1b8b0 61 2d 3e 74 62 6c 5b 31 30 32 34 5d 29 3b 0a 20  a->tbl[1024]);. 
1b8c0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
1b8d0 31 30 32 34 3b 20 69 2b 2b 29 20 78 31 61 2d 3e  1024; i++) x1a->
1b8e0 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ht[i] = 0;.    }
1b8f0 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72 74  .  }.}./* Insert
1b900 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e   a new record in
1b910 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20 52  to the array.  R
1b920 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73 75  eturn TRUE if su
1b930 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72 69  ccessful..** Pri
1b940 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68 65  or data with the
1b950 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f 54   same key is NOT
1b960 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f 0a   overwritten */.
1b970 69 6e 74 20 53 74 72 73 61 66 65 5f 69 6e 73 65  int Strsafe_inse
1b980 72 74 28 64 61 74 61 29 0a 63 68 61 72 20 2a 64  rt(data).char *d
1b990 61 74 61 3b 0a 7b 0a 20 20 78 31 6e 6f 64 65 20  ata;.{.  x1node 
1b9a0 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20  *np;.  int h;.  
1b9b0 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78  int ph;..  if( x
1b9c0 31 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  1a==0 ) return 0
1b9d0 3b 0a 20 20 70 68 20 3d 20 73 74 72 68 61 73 68  ;.  ph = strhash
1b9e0 28 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70 68  (data);.  h = ph
1b9f0 20 26 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29   & (x1a->size-1)
1ba00 3b 0a 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74  ;.  np = x1a->ht
1ba10 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70  [h];.  while( np
1ba20 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63   ){.    if( strc
1ba30 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 64 61 74 61  mp(np->data,data
1ba40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  )==0 ){.      /*
1ba50 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   An existing ent
1ba60 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ry with the same
1ba70 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20 2a   key is found. *
1ba80 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 20  /.      /* Fail 
1ba90 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69 74  because overwrit
1baa0 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e  e is not allows.
1bab0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1bac0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 70   0;.    }.    np
1bad0 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d   = np->next;.  }
1bae0 0a 20 20 69 66 28 20 78 31 61 2d 3e 63 6f 75 6e  .  if( x1a->coun
1baf0 74 3e 3d 78 31 61 2d 3e 73 69 7a 65 20 29 7b 0a  t>=x1a->size ){.
1bb00 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d      /* Need to m
1bb10 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61 62  ake the hash tab
1bb20 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20 20  le bigger */.   
1bb30 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20 20   int i,size;.   
1bb40 20 73 74 72 75 63 74 20 73 5f 78 31 20 61 72 72   struct s_x1 arr
1bb50 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73 69  ay;.    array.si
1bb60 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 31 61 2d  ze = size = x1a-
1bb70 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72 72  >size*2;.    arr
1bb80 61 79 2e 63 6f 75 6e 74 20 3d 20 78 31 61 2d 3e  ay.count = x1a->
1bb90 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61 79  count;.    array
1bba0 2e 74 62 6c 20 3d 20 28 78 31 6e 6f 64 65 2a 29  .tbl = (x1node*)
1bbb0 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28 73  malloc(.      (s
1bbc0 69 7a 65 6f 66 28 78 31 6e 6f 64 65 29 20 2b 20  izeof(x1node) + 
1bbd0 73 69 7a 65 6f 66 28 78 31 6e 6f 64 65 2a 29 29  sizeof(x1node*))
1bbe0 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28  *size );.    if(
1bbf0 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29 20   array.tbl==0 ) 
1bc00 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46 61  return 0;  /* Fa
1bc10 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63  il due to malloc
1bc20 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20 20   failure */.    
1bc30 61 72 72 61 79 2e 68 74 20 3d 20 28 78 31 6e 6f  array.ht = (x1no
1bc40 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62 6c  de**)&(array.tbl
1bc50 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f 72  [size]);.    for
1bc60 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b  (i=0; i<size; i+
1bc70 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20 3d  +) array.ht[i] =
1bc80 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
1bc90 20 69 3c 78 31 61 2d 3e 63 6f 75 6e 74 3b 20 69   i<x1a->count; i
1bca0 2b 2b 29 7b 0a 20 20 20 20 20 20 78 31 6e 6f 64  ++){.      x1nod
1bcb0 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70  e *oldnp, *newnp
1bcc0 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d 20  ;.      oldnp = 
1bcd0 26 28 78 31 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a  &(x1a->tbl[i]);.
1bce0 20 20 20 20 20 20 68 20 3d 20 73 74 72 68 61 73        h = strhas
1bcf0 68 28 6f 6c 64 6e 70 2d 3e 64 61 74 61 29 20 26  h(oldnp->data) &
1bd00 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20   (size-1);.     
1bd10 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72 61 79   newnp = &(array
1bd20 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  .tbl[i]);.      
1bd30 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68 5d 20  if( array.ht[h] 
1bd40 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d 3e 66  ) array.ht[h]->f
1bd50 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d 3e 6e  rom = &(newnp->n
1bd60 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  ext);.      newn
1bd70 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61 79 2e  p->next = array.
1bd80 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e 65 77  ht[h];.      new
1bd90 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e 70  np->data = oldnp
1bda0 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e 65  ->data;.      ne
1bdb0 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61 72  wnp->from = &(ar
1bdc0 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20 20  ray.ht[h]);.    
1bdd0 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d 20    array.ht[h] = 
1bde0 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20 20  newnp;.    }.   
1bdf0 20 66 72 65 65 28 78 31 61 2d 3e 74 62 6c 29 3b   free(x1a->tbl);
1be00 0a 20 20 20 20 2a 78 31 61 20 3d 20 61 72 72 61  .    *x1a = arra
1be10 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73 65  y;.  }.  /* Inse
1be20 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61 20  rt the new data 
1be30 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28 78  */.  h = ph & (x
1be40 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20 6e  1a->size-1);.  n
1be50 70 20 3d 20 26 28 78 31 61 2d 3e 74 62 6c 5b 78  p = &(x1a->tbl[x
1be60 31 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a 20  1a->count++]);. 
1be70 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61 74 61   np->data = data
1be80 3b 0a 20 20 69 66 28 20 78 31 61 2d 3e 68 74 5b  ;.  if( x1a->ht[
1be90 68 5d 20 29 20 78 31 61 2d 3e 68 74 5b 68 5d 2d  h] ) x1a->ht[h]-
1bea0 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e 6e 65  >from = &(np->ne
1beb0 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78 74 20  xt);.  np->next 
1bec0 3d 20 78 31 61 2d 3e 68 74 5b 68 5d 3b 0a 20 20  = x1a->ht[h];.  
1bed0 78 31 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e 70 3b  x1a->ht[h] = np;
1bee0 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28  .  np->from = &(
1bef0 78 31 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20 20 72  x1a->ht[h]);.  r
1bf00 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 20 52  eturn 1;.}../* R
1bf10 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1bf20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e 65 64  to data assigned
1bf30 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20 6b 65   to the given ke
1bf40 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 0a  y.  Return NULL.
1bf50 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20 6b 65  ** if no such ke
1bf60 79 2e 20 2a 2f 0a 63 68 61 72 20 2a 53 74 72 73  y. */.char *Strs
1bf70 61 66 65 5f 66 69 6e 64 28 6b 65 79 29 0a 63 68  afe_find(key).ch
1bf80 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74  ar *key;.{.  int
1bf90 20 68 3b 0a 20 20 78 31 6e 6f 64 65 20 2a 6e 70   h;.  x1node *np
1bfa0 3b 0a 0a 20 20 69 66 28 20 78 31 61 3d 3d 30 20  ;..  if( x1a==0 
1bfb0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68 20  ) return 0;.  h 
1bfc0 3d 20 73 74 72 68 61 73 68 28 6b 65 79 29 20 26  = strhash(key) &
1bfd0 20 28 78 31 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x1a->size-1);.
1bfe0 20 20 6e 70 20 3d 20 78 31 61 2d 3e 68 74 5b 68    np = x1a->ht[h
1bff0 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
1c000 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
1c010 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79 29 3d 3d  (np->data,key)==
1c020 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6e  0 ) break;.    n
1c030 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
1c040 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20 3f 20  }.  return np ? 
1c050 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a 7d 0a  np->data : 0;.}.
1c060 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
1c070 6e 74 65 72 20 74 6f 20 74 68 65 20 28 74 65 72  nter to the (ter
1c080 6d 69 6e 61 6c 20 6f 72 20 6e 6f 6e 74 65 72 6d  minal or nonterm
1c090 69 6e 61 6c 29 20 73 79 6d 62 6f 6c 20 22 78 22  inal) symbol "x"
1c0a0 2e 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  ..** Create a ne
1c0b0 77 20 73 79 6d 62 6f 6c 20 69 66 20 74 68 69 73  w symbol if this
1c0c0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 69   is the first ti
1c0d0 6d 65 20 22 78 22 20 68 61 73 20 62 65 65 6e 20  me "x" has been 
1c0e0 73 65 65 6e 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  seen..*/.struct 
1c0f0 73 79 6d 62 6f 6c 20 2a 53 79 6d 62 6f 6c 5f 6e  symbol *Symbol_n
1c100 65 77 28 78 29 0a 63 68 61 72 20 2a 78 3b 0a 7b  ew(x).char *x;.{
1c110 0a 20 20 73 74 72 75 63 74 20 73 79 6d 62 6f 6c  .  struct symbol
1c120 20 2a 73 70 3b 0a 0a 20 20 73 70 20 3d 20 53 79   *sp;..  sp = Sy
1c130 6d 62 6f 6c 5f 66 69 6e 64 28 78 29 3b 0a 20 20  mbol_find(x);.  
1c140 69 66 28 20 73 70 3d 3d 30 20 29 7b 0a 20 20 20  if( sp==0 ){.   
1c150 20 73 70 20 3d 20 28 73 74 72 75 63 74 20 73 79   sp = (struct sy
1c160 6d 62 6f 6c 20 2a 29 6d 61 6c 6c 6f 63 28 20 73  mbol *)malloc( s
1c170 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 79 6d  izeof(struct sym
1c180 62 6f 6c 29 20 29 3b 0a 20 20 20 20 4d 65 6d 6f  bol) );.    Memo
1c190 72 79 43 68 65 63 6b 28 73 70 29 3b 0a 20 20 20  ryCheck(sp);.   
1c1a0 20 73 70 2d 3e 6e 61 6d 65 20 3d 20 53 74 72 73   sp->name = Strs
1c1b0 61 66 65 28 78 29 3b 0a 20 20 20 20 73 70 2d 3e  afe(x);.    sp->
1c1c0 74 79 70 65 20 3d 20 69 73 75 70 70 65 72 28 2a  type = isupper(*
1c1d0 78 29 20 3f 20 54 45 52 4d 49 4e 41 4c 20 3a 20  x) ? TERMINAL : 
1c1e0 4e 4f 4e 54 45 52 4d 49 4e 41 4c 3b 0a 20 20 20  NONTERMINAL;.   
1c1f0 20 73 70 2d 3e 72 75 6c 65 20 3d 20 30 3b 0a 20   sp->rule = 0;. 
1c200 20 20 20 73 70 2d 3e 66 61 6c 6c 62 61 63 6b 20     sp->fallback 
1c210 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 70 72 65  = 0;.    sp->pre
1c220 63 20 3d 20 2d 31 3b 0a 20 20 20 20 73 70 2d 3e  c = -1;.    sp->
1c230 61 73 73 6f 63 20 3d 20 55 4e 4b 3b 0a 20 20 20  assoc = UNK;.   
1c240 20 73 70 2d 3e 66 69 72 73 74 73 65 74 20 3d 20   sp->firstset = 
1c250 30 3b 0a 20 20 20 20 73 70 2d 3e 6c 61 6d 62 64  0;.    sp->lambd
1c260 61 20 3d 20 42 5f 46 41 4c 53 45 3b 0a 20 20 20  a = B_FALSE;.   
1c270 20 73 70 2d 3e 64 65 73 74 72 75 63 74 6f 72 20   sp->destructor 
1c280 3d 20 30 3b 0a 20 20 20 20 73 70 2d 3e 64 61 74  = 0;.    sp->dat
1c290 61 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 53  atype = 0;.    S
1c2a0 79 6d 62 6f 6c 5f 69 6e 73 65 72 74 28 73 70 2c  ymbol_insert(sp,
1c2b0 73 70 2d 3e 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20  sp->name);.  }. 
1c2c0 20 72 65 74 75 72 6e 20 73 70 3b 0a 7d 0a 0a 2f   return sp;.}../
1c2d0 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 73 79  * Compare two sy
1c2e0 6d 62 6f 6c 73 20 66 6f 72 20 77 6f 72 6b 69 6e  mbols for workin
1c2f0 67 20 70 75 72 70 6f 73 65 73 0a 2a 2a 0a 2a 2a  g purposes.**.**
1c300 20 53 79 6d 62 6f 6c 73 20 74 68 61 74 20 62 65   Symbols that be
1c310 67 69 6e 20 77 69 74 68 20 75 70 70 65 72 20 63  gin with upper c
1c320 61 73 65 20 6c 65 74 74 65 72 73 20 28 74 65 72  ase letters (ter
1c330 6d 69 6e 61 6c 73 20 6f 72 20 74 6f 6b 65 6e 73  minals or tokens
1c340 29 0a 2a 2a 20 6d 75 73 74 20 73 6f 72 74 20 62  ).** must sort b
1c350 65 66 6f 72 65 20 73 79 6d 62 6f 6c 73 20 74 68  efore symbols th
1c360 61 74 20 62 65 67 69 6e 20 77 69 74 68 20 6c 6f  at begin with lo
1c370 77 65 72 20 63 61 73 65 20 6c 65 74 74 65 72 73  wer case letters
1c380 0a 2a 2a 20 28 6e 6f 6e 2d 74 65 72 6d 69 6e 61  .** (non-termina
1c390 6c 73 29 2e 20 20 4f 74 68 65 72 20 74 68 61 6e  ls).  Other than
1c3a0 20 74 68 61 74 2c 20 74 68 65 20 6f 72 64 65 72   that, the order
1c3b0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
1c3c0 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 66 69 6e 64 20  ..**.** We find 
1c3d0 65 78 70 65 72 69 6d 65 6e 74 61 6c 6c 79 20 74  experimentally t
1c3e0 68 61 74 20 6c 65 61 76 69 6e 67 20 74 68 65 20  hat leaving the 
1c3f0 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65 69 72  symbols in their
1c400 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 6f 72 64   original.** ord
1c410 65 72 20 28 74 68 65 20 6f 72 64 65 72 20 74 68  er (the order th
1c420 65 79 20 61 70 70 65 61 72 65 64 20 69 6e 20 74  ey appeared in t
1c430 68 65 20 67 72 61 6d 6d 61 72 20 66 69 6c 65 29  he grammar file)
1c440 20 67 69 76 65 73 20 74 68 65 0a 2a 2a 20 73 6d   gives the.** sm
1c450 61 6c 6c 65 73 74 20 70 61 72 73 65 72 20 74 61  allest parser ta
1c460 62 6c 65 73 20 69 6e 20 53 51 4c 69 74 65 2e 0a  bles in SQLite..
1c470 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 63 6d 70  */.int Symbolcmp
1c480 70 28 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  p(struct symbol 
1c490 2a 2a 61 2c 20 73 74 72 75 63 74 20 73 79 6d 62  **a, struct symb
1c4a0 6f 6c 20 2a 2a 62 29 7b 0a 20 20 69 6e 74 20 69  ol **b){.  int i
1c4b0 31 20 3d 20 28 2a 2a 61 29 2e 69 6e 64 65 78 20  1 = (**a).index 
1c4c0 2b 20 31 30 30 30 30 30 30 30 2a 28 28 2a 2a 61  + 10000000*((**a
1c4d0 29 2e 6e 61 6d 65 5b 30 5d 3e 27 5a 27 29 3b 0a  ).name[0]>'Z');.
1c4e0 20 20 69 6e 74 20 69 32 20 3d 20 28 2a 2a 62 29    int i2 = (**b)
1c4f0 2e 69 6e 64 65 78 20 2b 20 31 30 30 30 30 30 30  .index + 1000000
1c500 30 2a 28 28 2a 2a 62 29 2e 6e 61 6d 65 5b 30 5d  0*((**b).name[0]
1c510 3e 27 5a 27 29 3b 0a 20 20 72 65 74 75 72 6e 20  >'Z');.  return 
1c520 69 31 2d 69 32 3b 0a 7d 0a 0a 2f 2a 20 54 68 65  i1-i2;.}../* The
1c530 72 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e  re is one instan
1c540 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
1c550 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 66 6f  ing structure fo
1c560 72 20 65 61 63 68 0a 2a 2a 20 61 73 73 6f 63 69  r each.** associ
1c570 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20 74  ative array of t
1c580 79 70 65 20 22 78 32 22 2e 0a 2a 2f 0a 73 74 72  ype "x2"..*/.str
1c590 75 63 74 20 73 5f 78 32 20 7b 0a 20 20 69 6e 74  uct s_x2 {.  int
1c5a0 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20   size;          
1c5b0 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62       /* The numb
1c5c0 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
1c5d0 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20  slots. */.      
1c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5f0 20 20 20 20 2f 2a 20 20 20 4d 75 73 74 20 62 65      /*   Must be
1c600 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 67 72   a power of 2 gr
1c610 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 2a 2f  eater than or */
1c620 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
1c640 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f 0a 20 20  equal to 1 */.  
1c650 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20 20 20 20  int count;      
1c660 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1c670 72 20 6f 66 20 63 75 72 72 65 6e 74 6c 79 20 73  r of currently s
1c680 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a 2f 0a 20  lots filled */. 
1c690 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f 64 65   struct s_x2node
1c6a0 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68 65 20 64   *tbl;  /* The d
1c6b0 61 74 61 20 73 74 6f 72 65 64 20 68 65 72 65 20  ata stored here 
1c6c0 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 32  */.  struct s_x2
1c6d0 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f 2a 20 48  node **ht;  /* H
1c6e0 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 6c 6f  ash table for lo
1c6f0 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  okups */.};../* 
1c700 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
1c710 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
1c720 72 75 63 74 75 72 65 20 66 6f 72 20 65 76 65 72  ructure for ever
1c730 79 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 0a 2a  y data element.*
1c740 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63 69 61 74  * in an associat
1c750 69 76 65 20 61 72 72 61 79 20 6f 66 20 74 79 70  ive array of typ
1c760 65 20 22 78 32 22 2e 0a 2a 2f 0a 74 79 70 65 64  e "x2"..*/.typed
1c770 65 66 20 73 74 72 75 63 74 20 73 5f 78 32 6e 6f  ef struct s_x2no
1c780 64 65 20 7b 0a 20 20 73 74 72 75 63 74 20 73 79  de {.  struct sy
1c790 6d 62 6f 6c 20 2a 64 61 74 61 3b 20 20 20 20 20  mbol *data;     
1c7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c7b0 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 63 68  The data */.  ch
1c7c0 61 72 20 2a 6b 65 79 3b 20 20 20 20 20 20 20 20  ar *key;        
1c7d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1c7e0 65 20 6b 65 79 20 2a 2f 0a 20 20 73 74 72 75 63  e key */.  struc
1c7f0 74 20 73 5f 78 32 6e 6f 64 65 20 2a 6e 65 78 74  t s_x2node *next
1c800 3b 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72  ;   /* Next entr
1c810 79 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  y with the same 
1c820 68 61 73 68 20 2a 2f 0a 20 20 73 74 72 75 63 74  hash */.  struct
1c830 20 73 5f 78 32 6e 6f 64 65 20 2a 2a 66 72 6f 6d   s_x2node **from
1c840 3b 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 6c  ;  /* Previous l
1c850 69 6e 6b 20 2a 2f 0a 7d 20 78 32 6e 6f 64 65 3b  ink */.} x2node;
1c860 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
1c870 6c 79 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20  ly one instance 
1c880 6f 66 20 74 68 65 20 61 72 72 61 79 2c 20 77 68  of the array, wh
1c890 69 63 68 20 69 73 20 74 68 65 20 66 6f 6c 6c 6f  ich is the follo
1c8a0 77 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 73  wing */.static s
1c8b0 74 72 75 63 74 20 73 5f 78 32 20 2a 78 32 61 3b  truct s_x2 *x2a;
1c8c0 0a 0a 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20  ../* Allocate a 
1c8d0 6e 65 77 20 61 73 73 6f 63 69 61 74 69 76 65 20  new associative 
1c8e0 61 72 72 61 79 20 2a 2f 0a 76 6f 69 64 20 53 79  array */.void Sy
1c8f0 6d 62 6f 6c 5f 69 6e 69 74 28 29 7b 0a 20 20 69  mbol_init(){.  i
1c900 66 28 20 78 32 61 20 29 20 72 65 74 75 72 6e 3b  f( x2a ) return;
1c910 0a 20 20 78 32 61 20 3d 20 28 73 74 72 75 63 74  .  x2a = (struct
1c920 20 73 5f 78 32 2a 29 6d 61 6c 6c 6f 63 28 20 73   s_x2*)malloc( s
1c930 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 5f 78  izeof(struct s_x
1c940 32 29 20 29 3b 0a 20 20 69 66 28 20 78 32 61 20  2) );.  if( x2a 
1c950 29 7b 0a 20 20 20 20 78 32 61 2d 3e 73 69 7a 65  ){.    x2a->size
1c960 20 3d 20 31 32 38 3b 0a 20 20 20 20 78 32 61 2d   = 128;.    x2a-
1c970 3e 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  >count = 0;.    
1c980 78 32 61 2d 3e 74 62 6c 20 3d 20 28 78 32 6e 6f  x2a->tbl = (x2no
1c990 64 65 2a 29 6d 61 6c 6c 6f 63 28 20 0a 20 20 20  de*)malloc( .   
1c9a0 20 20 20 28 73 69 7a 65 6f 66 28 78 32 6e 6f 64     (sizeof(x2nod
1c9b0 65 29 20 2b 20 73 69 7a 65 6f 66 28 78 32 6e 6f  e) + sizeof(x2no
1c9c0 64 65 2a 29 29 2a 31 32 38 20 29 3b 0a 20 20 20  de*))*128 );.   
1c9d0 20 69 66 28 20 78 32 61 2d 3e 74 62 6c 3d 3d 30   if( x2a->tbl==0
1c9e0 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 28 78   ){.      free(x
1c9f0 32 61 29 3b 0a 20 20 20 20 20 20 78 32 61 20 3d  2a);.      x2a =
1ca00 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1ca10 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
1ca20 20 20 78 32 61 2d 3e 68 74 20 3d 20 28 78 32 6e    x2a->ht = (x2n
1ca30 6f 64 65 2a 2a 29 26 28 78 32 61 2d 3e 74 62 6c  ode**)&(x2a->tbl
1ca40 5b 31 32 38 5d 29 3b 0a 20 20 20 20 20 20 66 6f  [128]);.      fo
1ca50 72 28 69 3d 30 3b 20 69 3c 31 32 38 3b 20 69 2b  r(i=0; i<128; i+
1ca60 2b 29 20 78 32 61 2d 3e 68 74 5b 69 5d 20 3d 20  +) x2a->ht[i] = 
1ca70 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 2f  0;.    }.  }.}./
1ca80 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72  * Insert a new r
1ca90 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 61  ecord into the a
1caa0 72 72 61 79 2e 20 20 52 65 74 75 72 6e 20 54 52  rray.  Return TR
1cab0 55 45 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  UE if successful
1cac0 2e 0a 2a 2a 20 50 72 69 6f 72 20 64 61 74 61 20  ..** Prior data 
1cad0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65  with the same ke
1cae0 79 20 69 73 20 4e 4f 54 20 6f 76 65 72 77 72 69  y is NOT overwri
1caf0 74 74 65 6e 20 2a 2f 0a 69 6e 74 20 53 79 6d 62  tten */.int Symb
1cb00 6f 6c 5f 69 6e 73 65 72 74 28 64 61 74 61 2c 6b  ol_insert(data,k
1cb10 65 79 29 0a 73 74 72 75 63 74 20 73 79 6d 62 6f  ey).struct symbo
1cb20 6c 20 2a 64 61 74 61 3b 0a 63 68 61 72 20 2a 6b  l *data;.char *k
1cb30 65 79 3b 0a 7b 0a 20 20 78 32 6e 6f 64 65 20 2a  ey;.{.  x2node *
1cb40 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69  np;.  int h;.  i
1cb50 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 32  nt ph;..  if( x2
1cb60 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  a==0 ) return 0;
1cb70 0a 20 20 70 68 20 3d 20 73 74 72 68 61 73 68 28  .  ph = strhash(
1cb80 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70 68 20 26  key);.  h = ph &
1cb90 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x2a->size-1);.
1cba0 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68 74 5b 68    np = x2a->ht[h
1cbb0 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
1cbc0 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
1cbd0 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29 3d 3d 30  (np->key,key)==0
1cbe0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20   ){.      /* An 
1cbf0 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20 77  existing entry w
1cc00 69 74 68 20 74 68 65 20 73 61 6d 65 20 6b 65 79  ith the same key
1cc10 20 69 73 20 66 6f 75 6e 64 2e 20 2a 2f 0a 20 20   is found. */.  
1cc20 20 20 20 20 2f 2a 20 46 61 69 6c 20 62 65 63 61      /* Fail beca
1cc30 75 73 65 20 6f 76 65 72 77 72 69 74 65 20 69 73  use overwrite is
1cc40 20 6e 6f 74 20 61 6c 6c 6f 77 73 2e 20 2a 2f 0a   not allows. */.
1cc50 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1cc60 20 20 20 20 7d 0a 20 20 20 20 6e 70 20 3d 20 6e      }.    np = n
1cc70 70 2d 3e 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  p->next;.  }.  i
1cc80 66 28 20 78 32 61 2d 3e 63 6f 75 6e 74 3e 3d 78  f( x2a->count>=x
1cc90 32 61 2d 3e 73 69 7a 65 20 29 7b 0a 20 20 20 20  2a->size ){.    
1cca0 2f 2a 20 4e 65 65 64 20 74 6f 20 6d 61 6b 65 20  /* Need to make 
1ccb0 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 62  the hash table b
1ccc0 69 67 67 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74  igger */.    int
1ccd0 20 69 2c 73 69 7a 65 3b 0a 20 20 20 20 73 74 72   i,size;.    str
1cce0 75 63 74 20 73 5f 78 32 20 61 72 72 61 79 3b 0a  uct s_x2 array;.
1ccf0 20 20 20 20 61 72 72 61 79 2e 73 69 7a 65 20 3d      array.size =
1cd00 20 73 69 7a 65 20 3d 20 78 32 61 2d 3e 73 69 7a   size = x2a->siz
1cd10 65 2a 32 3b 0a 20 20 20 20 61 72 72 61 79 2e 63  e*2;.    array.c
1cd20 6f 75 6e 74 20 3d 20 78 32 61 2d 3e 63 6f 75 6e  ount = x2a->coun
1cd30 74 3b 0a 20 20 20 20 61 72 72 61 79 2e 74 62 6c  t;.    array.tbl
1cd40 20 3d 20 28 78 32 6e 6f 64 65 2a 29 6d 61 6c 6c   = (x2node*)mall
1cd50 6f 63 28 0a 20 20 20 20 20 20 28 73 69 7a 65 6f  oc(.      (sizeo
1cd60 66 28 78 32 6e 6f 64 65 29 20 2b 20 73 69 7a 65  f(x2node) + size
1cd70 6f 66 28 78 32 6e 6f 64 65 2a 29 29 2a 73 69 7a  of(x2node*))*siz
1cd80 65 20 29 3b 0a 20 20 20 20 69 66 28 20 61 72 72  e );.    if( arr
1cd90 61 79 2e 74 62 6c 3d 3d 30 20 29 20 72 65 74 75  ay.tbl==0 ) retu
1cda0 72 6e 20 30 3b 20 20 2f 2a 20 46 61 69 6c 20 64  rn 0;  /* Fail d
1cdb0 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 61 69  ue to malloc fai
1cdc0 6c 75 72 65 20 2a 2f 0a 20 20 20 20 61 72 72 61  lure */.    arra
1cdd0 79 2e 68 74 20 3d 20 28 78 32 6e 6f 64 65 2a 2a  y.ht = (x2node**
1cde0 29 26 28 61 72 72 61 79 2e 74 62 6c 5b 73 69 7a  )&(array.tbl[siz
1cdf0 65 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  e]);.    for(i=0
1ce00 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20 61  ; i<size; i++) a
1ce10 72 72 61 79 2e 68 74 5b 69 5d 20 3d 20 30 3b 0a  rray.ht[i] = 0;.
1ce20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78      for(i=0; i<x
1ce30 32 61 2d 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 7b  2a->count; i++){
1ce40 0a 20 20 20 20 20 20 78 32 6e 6f 64 65 20 2a 6f  .      x2node *o
1ce50 6c 64 6e 70 2c 20 2a 6e 65 77 6e 70 3b 0a 20 20  ldnp, *newnp;.  
1ce60 20 20 20 20 6f 6c 64 6e 70 20 3d 20 26 28 78 32      oldnp = &(x2
1ce70 61 2d 3e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  a->tbl[i]);.    
1ce80 20 20 68 20 3d 20 73 74 72 68 61 73 68 28 6f 6c    h = strhash(ol
1ce90 64 6e 70 2d 3e 6b 65 79 29 20 26 20 28 73 69 7a  dnp->key) & (siz
1cea0 65 2d 31 29 3b 0a 20 20 20 20 20 20 6e 65 77 6e  e-1);.      newn
1ceb0 70 20 3d 20 26 28 61 72 72 61 79 2e 74 62 6c 5b  p = &(array.tbl[
1cec0 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  i]);.      if( a
1ced0 72 72 61 79 2e 68 74 5b 68 5d 20 29 20 61 72 72  rray.ht[h] ) arr
1cee0 61 79 2e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d  ay.ht[h]->from =
1cef0 20 26 28 6e 65 77 6e 70 2d 3e 6e 65 78 74 29 3b   &(newnp->next);
1cf00 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6e 65  .      newnp->ne
1cf10 78 74 20 3d 20 61 72 72 61 79 2e 68 74 5b 68 5d  xt = array.ht[h]
1cf20 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 6b  ;.      newnp->k
1cf30 65 79 20 3d 20 6f 6c 64 6e 70 2d 3e 6b 65 79 3b  ey = oldnp->key;
1cf40 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61  .      newnp->da
1cf50 74 61 20 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61  ta = oldnp->data
1cf60 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66  ;.      newnp->f
1cf70 72 6f 6d 20 3d 20 26 28 61 72 72 61 79 2e 68 74  rom = &(array.ht
1cf80 5b 68 5d 29 3b 0a 20 20 20 20 20 20 61 72 72 61  [h]);.      arra
1cf90 79 2e 68 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b  y.ht[h] = newnp;
1cfa0 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
1cfb0 78 32 61 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a  x2a->tbl);.    *
1cfc0 78 32 61 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d  x2a = array;.  }
1cfd0 0a 20 20 2f 2a 20 49 6e 73 65 72 74 20 74 68 65  .  /* Insert the
1cfe0 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 20 20 68   new data */.  h
1cff0 20 3d 20 70 68 20 26 20 28 78 32 61 2d 3e 73 69   = ph & (x2a->si
1d000 7a 65 2d 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28  ze-1);.  np = &(
1d010 78 32 61 2d 3e 74 62 6c 5b 78 32 61 2d 3e 63 6f  x2a->tbl[x2a->co
1d020 75 6e 74 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 6b  unt++]);.  np->k
1d030 65 79 20 3d 20 6b 65 79 3b 0a 20 20 6e 70 2d 3e  ey = key;.  np->
1d040 64 61 74 61 20 3d 20 64 61 74 61 3b 0a 20 20 69  data = data;.  i
1d050 66 28 20 78 32 61 2d 3e 68 74 5b 68 5d 20 29 20  f( x2a->ht[h] ) 
1d060 78 32 61 2d 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d  x2a->ht[h]->from
1d070 20 3d 20 26 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a   = &(np->next);.
1d080 20 20 6e 70 2d 3e 6e 65 78 74 20 3d 20 78 32 61    np->next = x2a
1d090 2d 3e 68 74 5b 68 5d 3b 0a 20 20 78 32 61 2d 3e  ->ht[h];.  x2a->
1d0a0 68 74 5b 68 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70  ht[h] = np;.  np
1d0b0 2d 3e 66 72 6f 6d 20 3d 20 26 28 78 32 61 2d 3e  ->from = &(x2a->
1d0c0 68 74 5b 68 5d 29 3b 0a 20 20 72 65 74 75 72 6e  ht[h]);.  return
1d0d0 20 31 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e   1;.}../* Return
1d0e0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61   a pointer to da
1d0f0 74 61 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74  ta assigned to t
1d100 68 65 20 67 69 76 65 6e 20 6b 65 79 2e 20 20 52  he given key.  R
1d110 65 74 75 72 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66  eturn NULL.** if
1d120 20 6e 6f 20 73 75 63 68 20 6b 65 79 2e 20 2a 2f   no such key. */
1d130 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20 2a  .struct symbol *
1d140 53 79 6d 62 6f 6c 5f 66 69 6e 64 28 6b 65 79 29  Symbol_find(key)
1d150 0a 63 68 61 72 20 2a 6b 65 79 3b 0a 7b 0a 20 20  .char *key;.{.  
1d160 69 6e 74 20 68 3b 0a 20 20 78 32 6e 6f 64 65 20  int h;.  x2node 
1d170 2a 6e 70 3b 0a 0a 20 20 69 66 28 20 78 32 61 3d  *np;..  if( x2a=
1d180 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1d190 20 68 20 3d 20 73 74 72 68 61 73 68 28 6b 65 79   h = strhash(key
1d1a0 29 20 26 20 28 78 32 61 2d 3e 73 69 7a 65 2d 31  ) & (x2a->size-1
1d1b0 29 3b 0a 20 20 6e 70 20 3d 20 78 32 61 2d 3e 68  );.  np = x2a->h
1d1c0 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
1d1d0 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  p ){.    if( str
1d1e0 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65 79 29  cmp(np->key,key)
1d1f0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
1d200 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a   np = np->next;.
1d210 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70 20    }.  return np 
1d220 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b 0a  ? np->data : 0;.
1d230 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  }../* Return the
1d240 20 6e 2d 74 68 20 64 61 74 61 2e 20 20 52 65 74   n-th data.  Ret
1d250 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 20 69 73  urn NULL if n is
1d260 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 2a   out of range. *
1d270 2f 0a 73 74 72 75 63 74 20 73 79 6d 62 6f 6c 20  /.struct symbol 
1d280 2a 53 79 6d 62 6f 6c 5f 4e 74 68 28 6e 29 0a 69  *Symbol_Nth(n).i
1d290 6e 74 20 6e 3b 0a 7b 0a 20 20 73 74 72 75 63 74  nt n;.{.  struct
1d2a0 20 73 79 6d 62 6f 6c 20 2a 64 61 74 61 3b 0a 20   symbol *data;. 
1d2b0 20 69 66 28 20 78 32 61 20 26 26 20 6e 3e 30 20   if( x2a && n>0 
1d2c0 26 26 20 6e 3c 3d 78 32 61 2d 3e 63 6f 75 6e 74  && n<=x2a->count
1d2d0 20 29 7b 0a 20 20 20 20 64 61 74 61 20 3d 20 78   ){.    data = x
1d2e0 32 61 2d 3e 74 62 6c 5b 6e 2d 31 5d 2e 64 61 74  2a->tbl[n-1].dat
1d2f0 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
1d300 64 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  data = 0;.  }.  
1d310 72 65 74 75 72 6e 20 64 61 74 61 3b 0a 7d 0a 0a  return data;.}..
1d320 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69  /* Return the si
1d330 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ze of the array 
1d340 2a 2f 0a 69 6e 74 20 53 79 6d 62 6f 6c 5f 63 6f  */.int Symbol_co
1d350 75 6e 74 28 29 0a 7b 0a 20 20 72 65 74 75 72 6e  unt().{.  return
1d360 20 78 32 61 20 3f 20 78 32 61 2d 3e 63 6f 75 6e   x2a ? x2a->coun
1d370 74 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 74  t : 0;.}../* Ret
1d380 75 72 6e 20 61 6e 20 61 72 72 61 79 20 6f 66 20  urn an array of 
1d390 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20  pointers to all 
1d3a0 64 61 74 61 20 69 6e 20 74 68 65 20 74 61 62 6c  data in the tabl
1d3b0 65 2e 0a 2a 2a 20 54 68 65 20 61 72 72 61 79 20  e..** The array 
1d3c0 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
1d3d0 20 6d 61 6c 6c 6f 63 2e 20 20 52 65 74 75 72 6e   malloc.  Return
1d3e0 20 4e 55 4c 4c 20 69 66 20 6d 65 6d 6f 72 79 20   NULL if memory 
1d3f0 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 70 72  allocation.** pr
1d400 6f 62 6c 65 6d 73 2c 20 6f 72 20 69 66 20 74 68  oblems, or if th
1d410 65 20 61 72 72 61 79 20 69 73 20 65 6d 70 74 79  e array is empty
1d420 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73 79 6d 62  . */.struct symb
1d430 6f 6c 20 2a 2a 53 79 6d 62 6f 6c 5f 61 72 72 61  ol **Symbol_arra
1d440 79 6f 66 28 29 0a 7b 0a 20 20 73 74 72 75 63 74  yof().{.  struct
1d450 20 73 79 6d 62 6f 6c 20 2a 2a 61 72 72 61 79 3b   symbol **array;
1d460 0a 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20  .  int i,size;. 
1d470 20 69 66 28 20 78 32 61 3d 3d 30 20 29 20 72 65   if( x2a==0 ) re
1d480 74 75 72 6e 20 30 3b 0a 20 20 73 69 7a 65 20 3d  turn 0;.  size =
1d490 20 78 32 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 61   x2a->count;.  a
1d4a0 72 72 61 79 20 3d 20 28 73 74 72 75 63 74 20 73  rray = (struct s
1d4b0 79 6d 62 6f 6c 20 2a 2a 29 6d 61 6c 6c 6f 63 28  ymbol **)malloc(
1d4c0 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73   sizeof(struct s
1d4d0 79 6d 62 6f 6c 20 2a 29 2a 73 69 7a 65 20 29 3b  ymbol *)*size );
1d4e0 0a 20 20 69 66 28 20 61 72 72 61 79 20 29 7b 0a  .  if( array ){.
1d4f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
1d500 69 7a 65 3b 20 69 2b 2b 29 20 61 72 72 61 79 5b  ize; i++) array[
1d510 69 5d 20 3d 20 78 32 61 2d 3e 74 62 6c 5b 69 5d  i] = x2a->tbl[i]
1d520 2e 64 61 74 61 3b 0a 20 20 7d 0a 20 20 72 65 74  .data;.  }.  ret
1d530 75 72 6e 20 61 72 72 61 79 3b 0a 7d 0a 0a 2f 2a  urn array;.}../*
1d540 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 63 6f 6e   Compare two con
1d550 66 69 67 75 72 61 74 69 6f 6e 73 20 2a 2f 0a 69  figurations */.i
1d560 6e 74 20 43 6f 6e 66 69 67 63 6d 70 28 61 2c 62  nt Configcmp(a,b
1d570 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ).struct config 
1d580 2a 61 3b 0a 73 74 72 75 63 74 20 63 6f 6e 66 69  *a;.struct confi
1d590 67 20 2a 62 3b 0a 7b 0a 20 20 69 6e 74 20 78 3b  g *b;.{.  int x;
1d5a0 0a 20 20 78 20 3d 20 61 2d 3e 72 70 2d 3e 69 6e  .  x = a->rp->in
1d5b0 64 65 78 20 2d 20 62 2d 3e 72 70 2d 3e 69 6e 64  dex - b->rp->ind
1d5c0 65 78 3b 0a 20 20 69 66 28 20 78 3d 3d 30 20 29  ex;.  if( x==0 )
1d5d0 20 78 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d   x = a->dot - b-
1d5e0 3e 64 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 78  >dot;.  return x
1d5f0 3b 0a 7d 0a 0a 2f 2a 20 43 6f 6d 70 61 72 65 20  ;.}../* Compare 
1d600 74 77 6f 20 73 74 61 74 65 73 20 2a 2f 0a 50 52  two states */.PR
1d610 49 56 41 54 45 20 69 6e 74 20 73 74 61 74 65 63  IVATE int statec
1d620 6d 70 28 61 2c 62 29 0a 73 74 72 75 63 74 20 63  mp(a,b).struct c
1d630 6f 6e 66 69 67 20 2a 61 3b 0a 73 74 72 75 63 74  onfig *a;.struct
1d640 20 63 6f 6e 66 69 67 20 2a 62 3b 0a 7b 0a 20 20   config *b;.{.  
1d650 69 6e 74 20 72 63 3b 0a 20 20 66 6f 72 28 72 63  int rc;.  for(rc
1d660 3d 30 3b 20 72 63 3d 3d 30 20 26 26 20 61 20 26  =0; rc==0 && a &
1d670 26 20 62 3b 20 20 61 3d 61 2d 3e 62 70 2c 20 62  & b;  a=a->bp, b
1d680 3d 62 2d 3e 62 70 29 7b 0a 20 20 20 20 72 63 20  =b->bp){.    rc 
1d690 3d 20 61 2d 3e 72 70 2d 3e 69 6e 64 65 78 20 2d  = a->rp->index -
1d6a0 20 62 2d 3e 72 70 2d 3e 69 6e 64 65 78 3b 0a 20   b->rp->index;. 
1d6b0 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72     if( rc==0 ) r
1d6c0 63 20 3d 20 61 2d 3e 64 6f 74 20 2d 20 62 2d 3e  c = a->dot - b->
1d6d0 64 6f 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  dot;.  }.  if( r
1d6e0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  c==0 ){.    if( 
1d6f0 61 20 29 20 72 63 20 3d 20 31 3b 0a 20 20 20 20  a ) rc = 1;.    
1d700 69 66 28 20 62 20 29 20 72 63 20 3d 20 2d 31 3b  if( b ) rc = -1;
1d710 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1d720 3b 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 73  ;.}../* Hash a s
1d730 74 61 74 65 20 2a 2f 0a 50 52 49 56 41 54 45 20  tate */.PRIVATE 
1d740 69 6e 74 20 73 74 61 74 65 68 61 73 68 28 61 29  int statehash(a)
1d750 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
1d760 61 3b 0a 7b 0a 20 20 69 6e 74 20 68 3d 30 3b 0a  a;.{.  int h=0;.
1d770 20 20 77 68 69 6c 65 28 20 61 20 29 7b 0a 20 20    while( a ){.  
1d780 20 20 68 20 3d 20 68 2a 35 37 31 20 2b 20 61 2d    h = h*571 + a-
1d790 3e 72 70 2d 3e 69 6e 64 65 78 2a 33 37 20 2b 20  >rp->index*37 + 
1d7a0 61 2d 3e 64 6f 74 3b 0a 20 20 20 20 61 20 3d 20  a->dot;.    a = 
1d7b0 61 2d 3e 62 70 3b 0a 20 20 7d 0a 20 20 72 65 74  a->bp;.  }.  ret
1d7c0 75 72 6e 20 68 3b 0a 7d 0a 0a 2f 2a 20 41 6c 6c  urn h;.}../* All
1d7d0 6f 63 61 74 65 20 61 20 6e 65 77 20 73 74 61 74  ocate a new stat
1d7e0 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 73  e structure */.s
1d7f0 74 72 75 63 74 20 73 74 61 74 65 20 2a 53 74 61  truct state *Sta
1d800 74 65 5f 6e 65 77 28 29 0a 7b 0a 20 20 73 74 72  te_new().{.  str
1d810 75 63 74 20 73 74 61 74 65 20 2a 6e 65 77 3b 0a  uct state *new;.
1d820 20 20 6e 65 77 20 3d 20 28 73 74 72 75 63 74 20    new = (struct 
1d830 73 74 61 74 65 20 2a 29 6d 61 6c 6c 6f 63 28 20  state *)malloc( 
1d840 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 73 74  sizeof(struct st
1d850 61 74 65 29 20 29 3b 0a 20 20 4d 65 6d 6f 72 79  ate) );.  Memory
1d860 43 68 65 63 6b 28 6e 65 77 29 3b 0a 20 20 72 65  Check(new);.  re
1d870 74 75 72 6e 20 6e 65 77 3b 0a 7d 0a 0a 2f 2a 20  turn new;.}../* 
1d880 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
1d890 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
1d8a0 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
1d8b0 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61 73 73   for each.** ass
1d8c0 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
1d8d0 66 20 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a  f type "x3"..*/.
1d8e0 73 74 72 75 63 74 20 73 5f 78 33 20 7b 0a 20 20  struct s_x3 {.  
1d8f0 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
1d900 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
1d910 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
1d920 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20 20 20  le slots. */.   
1d930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d940 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75 73 74         /*   Must
1d950 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
1d960 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
1d970 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1d980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d990 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20 2a 2f     equal to 1 */
1d9a0 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20 20 20  .  int count;   
1d9b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1d9c0 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e 74 6c  mber of currentl
1d9d0 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64 20 2a  y slots filled *
1d9e0 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33 6e  /.  struct s_x3n
1d9f0 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20 54 68  ode *tbl;  /* Th
1da00 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 68 65  e data stored he
1da10 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  re */.  struct s
1da20 5f 78 33 6e 6f 64 65 20 2a 2a 68 74 3b 20 20 2f  _x3node **ht;  /
1da30 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
1da40 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b 0a 0a   lookups */.};..
1da50 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  /* There is one 
1da60 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
1da70 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 65   structure for e
1da80 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d 65 6e  very data elemen
1da90 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73 6f 63  t.** in an assoc
1daa0 69 61 74 69 76 65 20 61 72 72 61 79 20 6f 66 20  iative array of 
1dab0 74 79 70 65 20 22 78 33 22 2e 0a 2a 2f 0a 74 79  type "x3"..*/.ty
1dac0 70 65 64 65 66 20 73 74 72 75 63 74 20 73 5f 78  pedef struct s_x
1dad0 33 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75 63 74  3node {.  struct
1dae0 20 73 74 61 74 65 20 2a 64 61 74 61 3b 20 20 20   state *data;   
1daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1db00 2a 20 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20  * The data */.  
1db10 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 6b  struct config *k
1db20 65 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ey;             
1db30 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79        /* The key
1db40 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
1db50 33 6e 6f 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f  3node *next;   /
1db60 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 77 69 74  * Next entry wit
1db70 68 20 74 68 65 20 73 61 6d 65 20 68 61 73 68 20  h the same hash 
1db80 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78 33  */.  struct s_x3
1db90 6e 6f 64 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a  node **from;  /*
1dba0 20 50 72 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a   Previous link *
1dbb0 2f 0a 7d 20 78 33 6e 6f 64 65 3b 0a 0a 2f 2a 20  /.} x3node;../* 
1dbc0 54 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e  There is only on
1dbd0 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
1dbe0 65 20 61 72 72 61 79 2c 20 77 68 69 63 68 20 69  e array, which i
1dbf0 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
1dc00 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
1dc10 20 73 5f 78 33 20 2a 78 33 61 3b 0a 0a 2f 2a 20   s_x3 *x3a;../* 
1dc20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 61  Allocate a new a
1dc30 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
1dc40 20 2a 2f 0a 76 6f 69 64 20 53 74 61 74 65 5f 69   */.void State_i
1dc50 6e 69 74 28 29 7b 0a 20 20 69 66 28 20 78 33 61  nit(){.  if( x3a
1dc60 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 78 33 61   ) return;.  x3a
1dc70 20 3d 20 28 73 74 72 75 63 74 20 73 5f 78 33 2a   = (struct s_x3*
1dc80 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  )malloc( sizeof(
1dc90 73 74 72 75 63 74 20 73 5f 78 33 29 20 29 3b 0a  struct s_x3) );.
1dca0 20 20 69 66 28 20 78 33 61 20 29 7b 0a 20 20 20    if( x3a ){.   
1dcb0 20 78 33 61 2d 3e 73 69 7a 65 20 3d 20 31 32 38   x3a->size = 128
1dcc0 3b 0a 20 20 20 20 78 33 61 2d 3e 63 6f 75 6e 74  ;.    x3a->count
1dcd0 20 3d 20 30 3b 0a 20 20 20 20 78 33 61 2d 3e 74   = 0;.    x3a->t
1dce0 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a 29 6d 61  bl = (x3node*)ma
1dcf0 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28 73 69  lloc( .      (si
1dd00 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b 20 73  zeof(x3node) + s
1dd10 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29 29 2a  izeof(x3node*))*
1dd20 31 32 38 20 29 3b 0a 20 20 20 20 69 66 28 20 78  128 );.    if( x
1dd30 33 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20 20  3a->tbl==0 ){.  
1dd40 20 20 20 20 66 72 65 65 28 78 33 61 29 3b 0a 20      free(x3a);. 
1dd50 20 20 20 20 20 78 33 61 20 3d 20 30 3b 0a 20 20       x3a = 0;.  
1dd60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1dd70 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 33 61 2d  nt i;.      x3a-
1dd80 3e 68 74 20 3d 20 28 78 33 6e 6f 64 65 2a 2a 29  >ht = (x3node**)
1dd90 26 28 78 33 61 2d 3e 74 62 6c 5b 31 32 38 5d 29  &(x3a->tbl[128])
1dda0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1ddb0 20 69 3c 31 32 38 3b 20 69 2b 2b 29 20 78 33 61   i<128; i++) x3a
1ddc0 2d 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  ->ht[i] = 0;.   
1ddd0 20 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65   }.  }.}./* Inse
1dde0 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
1ddf0 69 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20  into the array. 
1de00 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1de10 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50  successful..** P
1de20 72 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74  rior data with t
1de30 68 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e  he same key is N
1de40 4f 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a  OT overwritten *
1de50 2f 0a 69 6e 74 20 53 74 61 74 65 5f 69 6e 73 65  /.int State_inse
1de60 72 74 28 64 61 74 61 2c 6b 65 79 29 0a 73 74 72  rt(data,key).str
1de70 75 63 74 20 73 74 61 74 65 20 2a 64 61 74 61 3b  uct state *data;
1de80 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a  .struct config *
1de90 6b 65 79 3b 0a 7b 0a 20 20 78 33 6e 6f 64 65 20  key;.{.  x3node 
1dea0 2a 6e 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20  *np;.  int h;.  
1deb0 69 6e 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78  int ph;..  if( x
1dec0 33 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  3a==0 ) return 0
1ded0 3b 0a 20 20 70 68 20 3d 20 73 74 61 74 65 68 61  ;.  ph = stateha
1dee0 73 68 28 6b 65 79 29 3b 0a 20 20 68 20 3d 20 70  sh(key);.  h = p
1def0 68 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31  h & (x3a->size-1
1df00 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68  );.  np = x3a->h
1df10 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
1df20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61  p ){.    if( sta
1df30 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65  tecmp(np->key,ke
1df40 79 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  y)==0 ){.      /
1df50 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 65 6e  * An existing en
1df60 74 72 79 20 77 69 74 68 20 74 68 65 20 73 61 6d  try with the sam
1df70 65 20 6b 65 79 20 69 73 20 66 6f 75 6e 64 2e 20  e key is found. 
1df80 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46 61 69 6c  */.      /* Fail
1df90 20 62 65 63 61 75 73 65 20 6f 76 65 72 77 72 69   because overwri
1dfa0 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 73  te is not allows
1dfb0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  . */.      retur
1dfc0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  n 0;.    }.    n
1dfd0 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b 0a 20 20  p = np->next;.  
1dfe0 7d 0a 20 20 69 66 28 20 78 33 61 2d 3e 63 6f 75  }.  if( x3a->cou
1dff0 6e 74 3e 3d 78 33 61 2d 3e 73 69 7a 65 20 29 7b  nt>=x3a->size ){
1e000 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20  .    /* Need to 
1e010 6d 61 6b 65 20 74 68 65 20 68 61 73 68 20 74 61  make the hash ta
1e020 62 6c 65 20 62 69 67 67 65 72 20 2a 2f 0a 20 20  ble bigger */.  
1e030 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b 0a 20 20    int i,size;.  
1e040 20 20 73 74 72 75 63 74 20 73 5f 78 33 20 61 72    struct s_x3 ar
1e050 72 61 79 3b 0a 20 20 20 20 61 72 72 61 79 2e 73  ray;.    array.s
1e060 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20 78 33 61  ize = size = x3a
1e070 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20 20 61 72  ->size*2;.    ar
1e080 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78 33 61 2d  ray.count = x3a-
1e090 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61 72 72 61  >count;.    arra
1e0a0 79 2e 74 62 6c 20 3d 20 28 78 33 6e 6f 64 65 2a  y.tbl = (x3node*
1e0b0 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 28  )malloc(.      (
1e0c0 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 29 20 2b  sizeof(x3node) +
1e0d0 20 73 69 7a 65 6f 66 28 78 33 6e 6f 64 65 2a 29   sizeof(x3node*)
1e0e0 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20 20 69 66  )*size );.    if
1e0f0 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d 30 20 29  ( array.tbl==0 )
1e100 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 46   return 0;  /* F
1e110 61 69 6c 20 64 75 65 20 74 6f 20 6d 61 6c 6c 6f  ail due to mallo
1e120 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 20  c failure */.   
1e130 20 61 72 72 61 79 2e 68 74 20 3d 20 28 78 33 6e   array.ht = (x3n
1e140 6f 64 65 2a 2a 29 26 28 61 72 72 61 79 2e 74 62  ode**)&(array.tb
1e150 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20 20 66 6f  l[size]);.    fo
1e160 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 3b 20 69  r(i=0; i<size; i
1e170 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b 69 5d 20  ++) array.ht[i] 
1e180 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 0;.    for(i=0
1e190 3b 20 69 3c 78 33 61 2d 3e 63 6f 75 6e 74 3b 20  ; i<x3a->count; 
1e1a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78 33 6e 6f  i++){.      x3no
1e1b0 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e 65 77 6e  de *oldnp, *newn
1e1c0 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e 70 20 3d  p;.      oldnp =
1e1d0 20 26 28 78 33 61 2d 3e 74 62 6c 5b 69 5d 29 3b   &(x3a->tbl[i]);
1e1e0 0a 20 20 20 20 20 20 68 20 3d 20 73 74 61 74 65  .      h = state
1e1f0 68 61 73 68 28 6f 6c 64 6e 70 2d 3e 6b 65 79 29  hash(oldnp->key)
1e200 20 26 20 28 73 69 7a 65 2d 31 29 3b 0a 20 20 20   & (size-1);.   
1e210 20 20 20 6e 65 77 6e 70 20 3d 20 26 28 61 72 72     newnp = &(arr
1e220 61 79 2e 74 62 6c 5b 69 5d 29 3b 0a 20 20 20 20  ay.tbl[i]);.    
1e230 20 20 69 66 28 20 61 72 72 61 79 2e 68 74 5b 68    if( array.ht[h
1e240 5d 20 29 20 61 72 72 61 79 2e 68 74 5b 68 5d 2d  ] ) array.ht[h]-
1e250 3e 66 72 6f 6d 20 3d 20 26 28 6e 65 77 6e 70 2d  >from = &(newnp-
1e260 3e 6e 65 78 74 29 3b 0a 20 20 20 20 20 20 6e 65  >next);.      ne
1e270 77 6e 70 2d 3e 6e 65 78 74 20 3d 20 61 72 72 61  wnp->next = arra
1e280 79 2e 68 74 5b 68 5d 3b 0a 20 20 20 20 20 20 6e  y.ht[h];.      n
1e290 65 77 6e 70 2d 3e 6b 65 79 20 3d 20 6f 6c 64 6e  ewnp->key = oldn
1e2a0 70 2d 3e 6b 65 79 3b 0a 20 20 20 20 20 20 6e 65  p->key;.      ne
1e2b0 77 6e 70 2d 3e 64 61 74 61 20 3d 20 6f 6c 64 6e  wnp->data = oldn
1e2c0 70 2d 3e 64 61 74 61 3b 0a 20 20 20 20 20 20 6e  p->data;.      n
1e2d0 65 77 6e 70 2d 3e 66 72 6f 6d 20 3d 20 26 28 61  ewnp->from = &(a
1e2e0 72 72 61 79 2e 68 74 5b 68 5d 29 3b 0a 20 20 20  rray.ht[h]);.   
1e2f0 20 20 20 61 72 72 61 79 2e 68 74 5b 68 5d 20 3d     array.ht[h] =
1e300 20 6e 65 77 6e 70 3b 0a 20 20 20 20 7d 0a 20 20   newnp;.    }.  
1e310 20 20 66 72 65 65 28 78 33 61 2d 3e 74 62 6c 29    free(x3a->tbl)
1e320 3b 0a 20 20 20 20 2a 78 33 61 20 3d 20 61 72 72  ;.    *x3a = arr
1e330 61 79 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 6e 73  ay;.  }.  /* Ins
1e340 65 72 74 20 74 68 65 20 6e 65 77 20 64 61 74 61  ert the new data
1e350 20 2a 2f 0a 20 20 68 20 3d 20 70 68 20 26 20 28   */.  h = ph & (
1e360 78 33 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a 20 20  x3a->size-1);.  
1e370 6e 70 20 3d 20 26 28 78 33 61 2d 3e 74 62 6c 5b  np = &(x3a->tbl[
1e380 78 33 61 2d 3e 63 6f 75 6e 74 2b 2b 5d 29 3b 0a  x3a->count++]);.
1e390 20 20 6e 70 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b    np->key = key;
1e3a0 0a 20 20 6e 70 2d 3e 64 61 74 61 20 3d 20 64 61  .  np->data = da
1e3b0 74 61 3b 0a 20 20 69 66 28 20 78 33 61 2d 3e 68  ta;.  if( x3a->h
1e3c0 74 5b 68 5d 20 29 20 78 33 61 2d 3e 68 74 5b 68  t[h] ) x3a->ht[h
1e3d0 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e 70 2d 3e  ]->from = &(np->
1e3e0 6e 65 78 74 29 3b 0a 20 20 6e 70 2d 3e 6e 65 78  next);.  np->nex
1e3f0 74 20 3d 20 78 33 61 2d 3e 68 74 5b 68 5d 3b 0a  t = x3a->ht[h];.
1e400 20 20 78 33 61 2d 3e 68 74 5b 68 5d 20 3d 20 6e    x3a->ht[h] = n
1e410 70 3b 0a 20 20 6e 70 2d 3e 66 72 6f 6d 20 3d 20  p;.  np->from = 
1e420 26 28 78 33 61 2d 3e 68 74 5b 68 5d 29 3b 0a 20  &(x3a->ht[h]);. 
1e430 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
1e440 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1e450 72 20 74 6f 20 64 61 74 61 20 61 73 73 69 67 6e  r to data assign
1e460 65 64 20 74 6f 20 74 68 65 20 67 69 76 65 6e 20  ed to the given 
1e470 6b 65 79 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  key.  Return NUL
1e480 4c 0a 2a 2a 20 69 66 20 6e 6f 20 73 75 63 68 20  L.** if no such 
1e490 6b 65 79 2e 20 2a 2f 0a 73 74 72 75 63 74 20 73  key. */.struct s
1e4a0 74 61 74 65 20 2a 53 74 61 74 65 5f 66 69 6e 64  tate *State_find
1e4b0 28 6b 65 79 29 0a 73 74 72 75 63 74 20 63 6f 6e  (key).struct con
1e4c0 66 69 67 20 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e  fig *key;.{.  in
1e4d0 74 20 68 3b 0a 20 20 78 33 6e 6f 64 65 20 2a 6e  t h;.  x3node *n
1e4e0 70 3b 0a 0a 20 20 69 66 28 20 78 33 61 3d 3d 30  p;..  if( x3a==0
1e4f0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 68   ) return 0;.  h
1e500 20 3d 20 73 74 61 74 65 68 61 73 68 28 6b 65 79   = statehash(key
1e510 29 20 26 20 28 78 33 61 2d 3e 73 69 7a 65 2d 31  ) & (x3a->size-1
1e520 29 3b 0a 20 20 6e 70 20 3d 20 78 33 61 2d 3e 68  );.  np = x3a->h
1e530 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
1e540 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61  p ){.    if( sta
1e550 74 65 63 6d 70 28 6e 70 2d 3e 6b 65 79 2c 6b 65  tecmp(np->key,ke
1e560 79 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  y)==0 ) break;. 
1e570 20 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74     np = np->next
1e580 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
1e590 70 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30  p ? np->data : 0
1e5a0 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61  ;.}../* Return a
1e5b0 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74  n array of point
1e5c0 65 72 73 20 74 6f 20 61 6c 6c 20 64 61 74 61 20  ers to all data 
1e5d0 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  in the table..**
1e5e0 20 54 68 65 20 61 72 72 61 79 20 69 73 20 6f 62   The array is ob
1e5f0 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c  tained from mall
1e600 6f 63 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  oc.  Return NULL
1e610 20 69 66 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   if memory alloc
1e620 61 74 69 6f 6e 0a 2a 2a 20 70 72 6f 62 6c 65 6d  ation.** problem
1e630 73 2c 20 6f 72 20 69 66 20 74 68 65 20 61 72 72  s, or if the arr
1e640 61 79 20 69 73 20 65 6d 70 74 79 2e 20 2a 2f 0a  ay is empty. */.
1e650 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 53  struct state **S
1e660 74 61 74 65 5f 61 72 72 61 79 6f 66 28 29 0a 7b  tate_arrayof().{
1e670 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 65 20  .  struct state 
1e680 2a 2a 61 72 72 61 79 3b 0a 20 20 69 6e 74 20 69  **array;.  int i
1e690 2c 73 69 7a 65 3b 0a 20 20 69 66 28 20 78 33 61  ,size;.  if( x3a
1e6a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1e6b0 20 20 73 69 7a 65 20 3d 20 78 33 61 2d 3e 63 6f    size = x3a->co
1e6c0 75 6e 74 3b 0a 20 20 61 72 72 61 79 20 3d 20 28  unt;.  array = (
1e6d0 73 74 72 75 63 74 20 73 74 61 74 65 20 2a 2a 29  struct state **)
1e6e0 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 73  malloc( sizeof(s
1e6f0 74 72 75 63 74 20 73 74 61 74 65 20 2a 29 2a 73  truct state *)*s
1e700 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 61 72 72  ize );.  if( arr
1e710 61 79 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  ay ){.    for(i=
1e720 30 3b 20 69 3c 73 69 7a 65 3b 20 69 2b 2b 29 20  0; i<size; i++) 
1e730 61 72 72 61 79 5b 69 5d 20 3d 20 78 33 61 2d 3e  array[i] = x3a->
1e740 74 62 6c 5b 69 5d 2e 64 61 74 61 3b 0a 20 20 7d  tbl[i].data;.  }
1e750 0a 20 20 72 65 74 75 72 6e 20 61 72 72 61 79 3b  .  return array;
1e760 0a 7d 0a 0a 2f 2a 20 48 61 73 68 20 61 20 63 6f  .}../* Hash a co
1e770 6e 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 50  nfiguration */.P
1e780 52 49 56 41 54 45 20 69 6e 74 20 63 6f 6e 66 69  RIVATE int confi
1e790 67 68 61 73 68 28 61 29 0a 73 74 72 75 63 74 20  ghash(a).struct 
1e7a0 63 6f 6e 66 69 67 20 2a 61 3b 0a 7b 0a 20 20 69  config *a;.{.  i
1e7b0 6e 74 20 68 3d 30 3b 0a 20 20 68 20 3d 20 68 2a  nt h=0;.  h = h*
1e7c0 35 37 31 20 2b 20 61 2d 3e 72 70 2d 3e 69 6e 64  571 + a->rp->ind
1e7d0 65 78 2a 33 37 20 2b 20 61 2d 3e 64 6f 74 3b 0a  ex*37 + a->dot;.
1e7e0 20 20 72 65 74 75 72 6e 20 68 3b 0a 7d 0a 0a 2f    return h;.}../
1e7f0 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69  * There is one i
1e800 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
1e810 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1e820 72 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 61  re for each.** a
1e830 73 73 6f 63 69 61 74 69 76 65 20 61 72 72 61 79  ssociative array
1e840 20 6f 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a   of type "x4"..*
1e850 2f 0a 73 74 72 75 63 74 20 73 5f 78 34 20 7b 0a  /.struct s_x4 {.
1e860 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
1e870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e880 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c   number of avail
1e890 61 62 6c 65 20 73 6c 6f 74 73 2e 20 2a 2f 0a 20  able slots. */. 
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8b0 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 4d 75           /*   Mu
1e8c0 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66  st be a power of
1e8d0 20 32 20 67 72 65 61 74 65 72 20 74 68 61 6e 20   2 greater than 
1e8e0 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  or */.          
1e8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e900 2f 2a 20 20 20 65 71 75 61 6c 20 74 6f 20 31 20  /*   equal to 1 
1e910 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e 74 3b 20  */.  int count; 
1e920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e930 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65 6e  Number of curren
1e940 74 6c 79 20 73 6c 6f 74 73 20 66 69 6c 6c 65 64  tly slots filled
1e950 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 5f 78   */.  struct s_x
1e960 34 6e 6f 64 65 20 2a 74 62 6c 3b 20 20 2f 2a 20  4node *tbl;  /* 
1e970 54 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20  The data stored 
1e980 68 65 72 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  here */.  struct
1e990 20 73 5f 78 34 6e 6f 64 65 20 2a 2a 68 74 3b 20   s_x4node **ht; 
1e9a0 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66   /* Hash table f
1e9b0 6f 72 20 6c 6f 6f 6b 75 70 73 20 2a 2f 0a 7d 3b  or lookups */.};
1e9c0 0a 0a 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e  ../* There is on
1e9d0 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  e instance of th
1e9e0 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  is structure for
1e9f0 20 65 76 65 72 79 20 64 61 74 61 20 65 6c 65 6d   every data elem
1ea00 65 6e 74 0a 2a 2a 20 69 6e 20 61 6e 20 61 73 73  ent.** in an ass
1ea10 6f 63 69 61 74 69 76 65 20 61 72 72 61 79 20 6f  ociative array o
1ea20 66 20 74 79 70 65 20 22 78 34 22 2e 0a 2a 2f 0a  f type "x4"..*/.
1ea30 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 73  typedef struct s
1ea40 5f 78 34 6e 6f 64 65 20 7b 0a 20 20 73 74 72 75  _x4node {.  stru
1ea50 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74 61 3b  ct config *data;
1ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea70 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a 2f    /* The data */
1ea80 0a 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f  .  struct s_x4no
1ea90 64 65 20 2a 6e 65 78 74 3b 20 20 20 2f 2a 20 4e  de *next;   /* N
1eaa0 65 78 74 20 65 6e 74 72 79 20 77 69 74 68 20 74  ext entry with t
1eab0 68 65 20 73 61 6d 65 20 68 61 73 68 20 2a 2f 0a  he same hash */.
1eac0 20 20 73 74 72 75 63 74 20 73 5f 78 34 6e 6f 64    struct s_x4nod
1ead0 65 20 2a 2a 66 72 6f 6d 3b 20 20 2f 2a 20 50 72  e **from;  /* Pr
1eae0 65 76 69 6f 75 73 20 6c 69 6e 6b 20 2a 2f 0a 7d  evious link */.}
1eaf0 20 78 34 6e 6f 64 65 3b 0a 0a 2f 2a 20 54 68 65   x4node;../* The
1eb00 72 65 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 69  re is only one i
1eb10 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 61  nstance of the a
1eb20 72 72 61 79 2c 20 77 68 69 63 68 20 69 73 20 74  rray, which is t
1eb30 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
1eb40 73 74 61 74 69 63 20 73 74 72 75 63 74 20 73 5f  static struct s_
1eb50 78 34 20 2a 78 34 61 3b 0a 0a 2f 2a 20 41 6c 6c  x4 *x4a;../* All
1eb60 6f 63 61 74 65 20 61 20 6e 65 77 20 61 73 73 6f  ocate a new asso
1eb70 63 69 61 74 69 76 65 20 61 72 72 61 79 20 2a 2f  ciative array */
1eb80 0a 76 6f 69 64 20 43 6f 6e 66 69 67 74 61 62 6c  .void Configtabl
1eb90 65 5f 69 6e 69 74 28 29 7b 0a 20 20 69 66 28 20  e_init(){.  if( 
1eba0 78 34 61 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  x4a ) return;.  
1ebb0 78 34 61 20 3d 20 28 73 74 72 75 63 74 20 73 5f  x4a = (struct s_
1ebc0 78 34 2a 29 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  x4*)malloc( size
1ebd0 6f 66 28 73 74 72 75 63 74 20 73 5f 78 34 29 20  of(struct s_x4) 
1ebe0 29 3b 0a 20 20 69 66 28 20 78 34 61 20 29 7b 0a  );.  if( x4a ){.
1ebf0 20 20 20 20 78 34 61 2d 3e 73 69 7a 65 20 3d 20      x4a->size = 
1ec00 36 34 3b 0a 20 20 20 20 78 34 61 2d 3e 63 6f 75  64;.    x4a->cou
1ec10 6e 74 20 3d 20 30 3b 0a 20 20 20 20 78 34 61 2d  nt = 0;.    x4a-
1ec20 3e 74 62 6c 20 3d 20 28 78 34 6e 6f 64 65 2a 29  >tbl = (x4node*)
1ec30 6d 61 6c 6c 6f 63 28 20 0a 20 20 20 20 20 20 28  malloc( .      (
1ec40 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 29 20 2b  sizeof(x4node) +
1ec50 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65 2a 29   sizeof(x4node*)
1ec60 29 2a 36 34 20 29 3b 0a 20 20 20 20 69 66 28 20  )*64 );.    if( 
1ec70 78 34 61 2d 3e 74 62 6c 3d 3d 30 20 29 7b 0a 20  x4a->tbl==0 ){. 
1ec80 20 20 20 20 20 66 72 65 65 28 78 34 61 29 3b 0a       free(x4a);.
1ec90 20 20 20 20 20 20 78 34 61 20 3d 20 30 3b 0a 20        x4a = 0;. 
1eca0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ecb0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 78 34 61  int i;.      x4a
1ecc0 2d 3e 68 74 20 3d 20 28 78 34 6e 6f 64 65 2a 2a  ->ht = (x4node**
1ecd0 29 26 28 78 34 61 2d 3e 74 62 6c 5b 36 34 5d 29  )&(x4a->tbl[64])
1ece0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
1ecf0 20 69 3c 36 34 3b 20 69 2b 2b 29 20 78 34 61 2d   i<64; i++) x4a-
1ed00 3e 68 74 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  >ht[i] = 0;.    
1ed10 7d 0a 20 20 7d 0a 7d 0a 2f 2a 20 49 6e 73 65 72  }.  }.}./* Inser
1ed20 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 69  t a new record i
1ed30 6e 74 6f 20 74 68 65 20 61 72 72 61 79 2e 20 20  nto the array.  
1ed40 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 73  Return TRUE if s
1ed50 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2a 20 50 72  uccessful..** Pr
1ed60 69 6f 72 20 64 61 74 61 20 77 69 74 68 20 74 68  ior data with th
1ed70 65 20 73 61 6d 65 20 6b 65 79 20 69 73 20 4e 4f  e same key is NO
1ed80 54 20 6f 76 65 72 77 72 69 74 74 65 6e 20 2a 2f  T overwritten */
1ed90 0a 69 6e 74 20 43 6f 6e 66 69 67 74 61 62 6c 65  .int Configtable
1eda0 5f 69 6e 73 65 72 74 28 64 61 74 61 29 0a 73 74  _insert(data).st
1edb0 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 64 61 74  ruct config *dat
1edc0 61 3b 0a 7b 0a 20 20 78 34 6e 6f 64 65 20 2a 6e  a;.{.  x4node *n
1edd0 70 3b 0a 20 20 69 6e 74 20 68 3b 0a 20 20 69 6e  p;.  int h;.  in
1ede0 74 20 70 68 3b 0a 0a 20 20 69 66 28 20 78 34 61  t ph;..  if( x4a
1edf0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1ee00 20 20 70 68 20 3d 20 63 6f 6e 66 69 67 68 61 73    ph = confighas
1ee10 68 28 64 61 74 61 29 3b 0a 20 20 68 20 3d 20 70  h(data);.  h = p
1ee20 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31  h & (x4a->size-1
1ee30 29 3b 0a 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68  );.  np = x4a->h
1ee40 74 5b 68 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e  t[h];.  while( n
1ee50 70 20 29 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e  p ){.    if( Con
1ee60 66 69 67 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c  figcmp(np->data,
1ee70 64 61 74 61 29 3d 3d 30 20 29 7b 0a 20 20 20 20  data)==0 ){.    
1ee80 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
1ee90 20 65 6e 74 72 79 20 77 69 74 68 20 74 68 65 20   entry with the 
1eea0 73 61 6d 65 20 6b 65 79 20 69 73 20 66 6f 75 6e  same key is foun
1eeb0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 46  d. */.      /* F
1eec0 61 69 6c 20 62 65 63 61 75 73 65 20 6f 76 65 72  ail because over
1eed0 77 72 69 74 65 20 69 73 20 6e 6f 74 20 61 6c 6c  write is not all
1eee0 6f 77 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 65  ows. */.      re
1eef0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1ef00 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
1ef10 0a 20 20 7d 0a 20 20 69 66 28 20 78 34 61 2d 3e  .  }.  if( x4a->
1ef20 63 6f 75 6e 74 3e 3d 78 34 61 2d 3e 73 69 7a 65  count>=x4a->size
1ef30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 65 64 20   ){.    /* Need 
1ef40 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73 68  to make the hash
1ef50 20 74 61 62 6c 65 20 62 69 67 67 65 72 20 2a 2f   table bigger */
1ef60 0a 20 20 20 20 69 6e 74 20 69 2c 73 69 7a 65 3b  .    int i,size;
1ef70 0a 20 20 20 20 73 74 72 75 63 74 20 73 5f 78 34  .    struct s_x4
1ef80 20 61 72 72 61 79 3b 0a 20 20 20 20 61 72 72 61   array;.    arra
1ef90 79 2e 73 69 7a 65 20 3d 20 73 69 7a 65 20 3d 20  y.size = size = 
1efa0 78 34 61 2d 3e 73 69 7a 65 2a 32 3b 0a 20 20 20  x4a->size*2;.   
1efb0 20 61 72 72 61 79 2e 63 6f 75 6e 74 20 3d 20 78   array.count = x
1efc0 34 61 2d 3e 63 6f 75 6e 74 3b 0a 20 20 20 20 61  4a->count;.    a
1efd0 72 72 61 79 2e 74 62 6c 20 3d 20 28 78 34 6e 6f  rray.tbl = (x4no
1efe0 64 65 2a 29 6d 61 6c 6c 6f 63 28 0a 20 20 20 20  de*)malloc(.    
1eff0 20 20 28 73 69 7a 65 6f 66 28 78 34 6e 6f 64 65    (sizeof(x4node
1f000 29 20 2b 20 73 69 7a 65 6f 66 28 78 34 6e 6f 64  ) + sizeof(x4nod
1f010 65 2a 29 29 2a 73 69 7a 65 20 29 3b 0a 20 20 20  e*))*size );.   
1f020 20 69 66 28 20 61 72 72 61 79 2e 74 62 6c 3d 3d   if( array.tbl==
1f030 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 2f  0 ) return 0;  /
1f040 2a 20 46 61 69 6c 20 64 75 65 20 74 6f 20 6d 61  * Fail due to ma
1f050 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a  lloc failure */.
1f060 20 20 20 20 61 72 72 61 79 2e 68 74 20 3d 20 28      array.ht = (
1f070 78 34 6e 6f 64 65 2a 2a 29 26 28 61 72 72 61 79  x4node**)&(array
1f080 2e 74 62 6c 5b 73 69 7a 65 5d 29 3b 0a 20 20 20  .tbl[size]);.   
1f090 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
1f0a0 3b 20 69 2b 2b 29 20 61 72 72 61 79 2e 68 74 5b  ; i++) array.ht[
1f0b0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  i] = 0;.    for(
1f0c0 69 3d 30 3b 20 69 3c 78 34 61 2d 3e 63 6f 75 6e  i=0; i<x4a->coun
1f0d0 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 78  t; i++){.      x
1f0e0 34 6e 6f 64 65 20 2a 6f 6c 64 6e 70 2c 20 2a 6e  4node *oldnp, *n
1f0f0 65 77 6e 70 3b 0a 20 20 20 20 20 20 6f 6c 64 6e  ewnp;.      oldn
1f100 70 20 3d 20 26 28 78 34 61 2d 3e 74 62 6c 5b 69  p = &(x4a->tbl[i
1f110 5d 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 63 6f  ]);.      h = co
1f120 6e 66 69 67 68 61 73 68 28 6f 6c 64 6e 70 2d 3e  nfighash(oldnp->
1f130 64 61 74 61 29 20 26 20 28 73 69 7a 65 2d 31 29  data) & (size-1)
1f140 3b 0a 20 20 20 20 20 20 6e 65 77 6e 70 20 3d 20  ;.      newnp = 
1f150 26 28 61 72 72 61 79 2e 74 62 6c 5b 69 5d 29 3b  &(array.tbl[i]);
1f160 0a 20 20 20 20 20 20 69 66 28 20 61 72 72 61 79  .      if( array
1f170 2e 68 74 5b 68 5d 20 29 20 61 72 72 61 79 2e 68  .ht[h] ) array.h
1f180 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26 28 6e  t[h]->from = &(n
1f190 65 77 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 20  ewnp->next);.   
1f1a0 20 20 20 6e 65 77 6e 70 2d 3e 6e 65 78 74 20 3d     newnp->next =
1f1b0 20 61 72 72 61 79 2e 68 74 5b 68 5d 3b 0a 20 20   array.ht[h];.  
1f1c0 20 20 20 20 6e 65 77 6e 70 2d 3e 64 61 74 61 20      newnp->data 
1f1d0 3d 20 6f 6c 64 6e 70 2d 3e 64 61 74 61 3b 0a 20  = oldnp->data;. 
1f1e0 20 20 20 20 20 6e 65 77 6e 70 2d 3e 66 72 6f 6d       newnp->from
1f1f0 20 3d 20 26 28 61 72 72 61 79 2e 68 74 5b 68 5d   = &(array.ht[h]
1f200 29 3b 0a 20 20 20 20 20 20 61 72 72 61 79 2e 68  );.      array.h
1f210 74 5b 68 5d 20 3d 20 6e 65 77 6e 70 3b 0a 20 20  t[h] = newnp;.  
1f220 20 20 7d 0a 20 20 20 20 66 72 65 65 28 78 34 61    }.    free(x4a
1f230 2d 3e 74 62 6c 29 3b 0a 20 20 20 20 2a 78 34 61  ->tbl);.    *x4a
1f240 20 3d 20 61 72 72 61 79 3b 0a 20 20 7d 0a 20 20   = array;.  }.  
1f250 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e 65  /* Insert the ne
1f260 77 20 64 61 74 61 20 2a 2f 0a 20 20 68 20 3d 20  w data */.  h = 
1f270 70 68 20 26 20 28 78 34 61 2d 3e 73 69 7a 65 2d  ph & (x4a->size-
1f280 31 29 3b 0a 20 20 6e 70 20 3d 20 26 28 78 34 61  1);.  np = &(x4a
1f290 2d 3e 74 62 6c 5b 78 34 61 2d 3e 63 6f 75 6e 74  ->tbl[x4a->count
1f2a0 2b 2b 5d 29 3b 0a 20 20 6e 70 2d 3e 64 61 74 61  ++]);.  np->data
1f2b0 20 3d 20 64 61 74 61 3b 0a 20 20 69 66 28 20 78   = data;.  if( x
1f2c0 34 61 2d 3e 68 74 5b 68 5d 20 29 20 78 34 61 2d  4a->ht[h] ) x4a-
1f2d0 3e 68 74 5b 68 5d 2d 3e 66 72 6f 6d 20 3d 20 26  >ht[h]->from = &
1f2e0 28 6e 70 2d 3e 6e 65 78 74 29 3b 0a 20 20 6e 70  (np->next);.  np
1f2f0 2d 3e 6e 65 78 74 20 3d 20 78 34 61 2d 3e 68 74  ->next = x4a->ht
1f300 5b 68 5d 3b 0a 20 20 78 34 61 2d 3e 68 74 5b 68  [h];.  x4a->ht[h
1f310 5d 20 3d 20 6e 70 3b 0a 20 20 6e 70 2d 3e 66 72  ] = np;.  np->fr
1f320 6f 6d 20 3d 20 26 28 78 34 61 2d 3e 68 74 5b 68  om = &(x4a->ht[h
1f330 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ]);.  return 1;.
1f340 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70  }../* Return a p
1f350 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20 61  ointer to data a
1f360 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 20 67  ssigned to the g
1f370 69 76 65 6e 20 6b 65 79 2e 20 20 52 65 74 75 72  iven key.  Retur
1f380 6e 20 4e 55 4c 4c 0a 2a 2a 20 69 66 20 6e 6f 20  n NULL.** if no 
1f390 73 75 63 68 20 6b 65 79 2e 20 2a 2f 0a 73 74 72  such key. */.str
1f3a0 75 63 74 20 63 6f 6e 66 69 67 20 2a 43 6f 6e 66  uct config *Conf
1f3b0 69 67 74 61 62 6c 65 5f 66 69 6e 64 28 6b 65 79  igtable_find(key
1f3c0 29 0a 73 74 72 75 63 74 20 63 6f 6e 66 69 67 20  ).struct config 
1f3d0 2a 6b 65 79 3b 0a 7b 0a 20 20 69 6e 74 20 68 3b  *key;.{.  int h;
1f3e0 0a 20 20 78 34 6e 6f 64 65 20 2a 6e 70 3b 0a 0a  .  x4node *np;..
1f3f0 20 20 69 66 28 20 78 34 61 3d 3d 30 20 29 20 72    if( x4a==0 ) r
1f400 65 74 75 72 6e 20 30 3b 0a 20 20 68 20 3d 20 63  eturn 0;.  h = c
1f410 6f 6e 66 69 67 68 61 73 68 28 6b 65 79 29 20 26  onfighash(key) &
1f420 20 28 78 34 61 2d 3e 73 69 7a 65 2d 31 29 3b 0a   (x4a->size-1);.
1f430 20 20 6e 70 20 3d 20 78 34 61 2d 3e 68 74 5b 68    np = x4a->ht[h
1f440 5d 3b 0a 20 20 77 68 69 6c 65 28 20 6e 70 20 29  ];.  while( np )
1f450 7b 0a 20 20 20 20 69 66 28 20 43 6f 6e 66 69 67  {.    if( Config
1f460 63 6d 70 28 6e 70 2d 3e 64 61 74 61 2c 6b 65 79  cmp(np->data,key
1f470 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
1f480 20 20 6e 70 20 3d 20 6e 70 2d 3e 6e 65 78 74 3b    np = np->next;
1f490 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 70  .  }.  return np
1f4a0 20 3f 20 6e 70 2d 3e 64 61 74 61 20 3a 20 30 3b   ? np->data : 0;
1f4b0 0a 7d 0a 0a 2f 2a 20 52 65 6d 6f 76 65 20 61 6c  .}../* Remove al
1f4c0 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  l data from the 
1f4d0 74 61 62 6c 65 2e 20 20 50 61 73 73 20 65 61 63  table.  Pass eac
1f4e0 68 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 75  h data to the fu
1f4f0 6e 63 74 69 6f 6e 20 22 66 22 0a 2a 2a 20 61 73  nction "f".** as
1f500 20 69 74 20 69 73 20 72 65 6d 6f 76 65 64 2e 20   it is removed. 
1f510 20 28 22 66 22 20 6d 61 79 20 62 65 20 6e 75 6c   ("f" may be nul
1f520 6c 20 74 6f 20 61 76 6f 69 64 20 74 68 69 73 20  l to avoid this 
1f530 73 74 65 70 2e 29 20 2a 2f 0a 76 6f 69 64 20 43  step.) */.void C
1f540 6f 6e 66 69 67 74 61 62 6c 65 5f 63 6c 65 61 72  onfigtable_clear
1f550 28 66 29 0a 69 6e 74 28 2a 66 29 28 2f 2a 20 73  (f).int(*f)(/* s
1f560 74 72 75 63 74 20 63 6f 6e 66 69 67 20 2a 20 2a  truct config * *
1f570 2f 29 3b 0a 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  /);.{.  int i;. 
1f580 20 69 66 28 20 78 34 61 3d 3d 30 20 7c 7c 20 78   if( x4a==0 || x
1f590 34 61 2d 3e 63 6f 75 6e 74 3d 3d 30 20 29 20 72  4a->count==0 ) r
1f5a0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 66 20 29  eturn;.  if( f )
1f5b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 78 34 61 2d   for(i=0; i<x4a-
1f5c0 3e 63 6f 75 6e 74 3b 20 69 2b 2b 29 20 28 2a 66  >count; i++) (*f
1f5d0 29 28 78 34 61 2d 3e 74 62 6c 5b 69 5d 2e 64 61  )(x4a->tbl[i].da
1f5e0 74 61 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ta);.  for(i=0; 
1f5f0 69 3c 78 34 61 2d 3e 73 69 7a 65 3b 20 69 2b 2b  i<x4a->size; i++
1f600 29 20 78 34 61 2d 3e 68 74 5b 69 5d 20 3d 20 30  ) x4a->ht[i] = 0
1f610 3b 0a 20 20 78 34 61 2d 3e 63 6f 75 6e 74 20 3d  ;.  x4a->count =
1f620 20 30 3b 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a   0;.  return;.}.